|
|
@@ -47,6 +47,7 @@
|
|
|
#include <signal.h>
|
|
|
#include <errno.h>
|
|
|
#include <glob.h>
|
|
|
+#include <pwd.h>
|
|
|
|
|
|
#include <set>
|
|
|
#include <algorithm>
|
|
|
@@ -2050,3 +2051,19 @@ bool Rename(std::string From, std::string To)
|
|
|
}
|
|
|
return true;
|
|
|
}
|
|
|
+
|
|
|
+bool DropPrivs()
|
|
|
+{
|
|
|
+ if (getuid() != 0)
|
|
|
+ return true;
|
|
|
+
|
|
|
+ const std::string nobody = _config->Find("APT::User::Nobody", "nobody");
|
|
|
+ struct passwd *pw = getpwnam(nobody.c_str());
|
|
|
+ if (pw == NULL)
|
|
|
+ return _error->Warning("No user %s, can not drop rights", nobody.c_str());
|
|
|
+ if (setgid(pw->pw_gid) != 0)
|
|
|
+ return _error->Errno("setgid", "Failed to setgid");
|
|
|
+ if (setuid(pw->pw_uid) != 0)
|
|
|
+ return _error->Errno("setuid", "Failed to setuid");
|
|
|
+ return true;
|
|
|
+}
|