All pastes #27963 Raw Edit

Untitled

public text v1 · immutable
#27963 ·published 2005-11-08 06:44 UTC
rendered paste body
Index: corelib/openpbx.c
===================================================================
--- corelib/openpbx.c	(revision 855)
+++ corelib/openpbx.c	(working copy)
@@ -2016,42 +2016,75 @@
 		runuser = opbx_config_OPBX_RUN_USER;
 	if (!rungroup)
 		rungroup = opbx_config_OPBX_RUN_GROUP;
-	if (!is_child_of_nonroot && rungroup) {
+	if (!is_child_of_nonroot) {
 		struct group *gr;
+		struct passwd *pw;
+
 		gr = getgrnam(rungroup);
 		if (!gr) {
-			opbx_log(LOG_WARNING, "No such group '%s'!\n", rungroup);
+			opbx_log(LOG_ERROR, "No such group '%s'!\n", rungroup);
 			exit(1);
 		}
+		pw = getpwnam(runuser);
+		if (!pw) {
+			opbx_log(LOG_ERROR, "No such user '%s'!\n", runuser);
+			exit(1);
+		}
+		
+		if (initgroups(pw->pw_name, gr->gr_gid) == -1) {
+			opbx_log(LOG_ERROR, "Unable to initgroups(\"%s\", %d)\n", pw->pw_name, gr->gr_gid);
+			exit(1);
+		}
 #ifdef __Darwin__
 		if (setgid(gr->gr_gid)) {
 #else
 		if (setregid(gr->gr_gid, gr->gr_gid)) {
 #endif
-			opbx_log(LOG_WARNING, "Unable to setgid to %d (%s)\n", gr->gr_gid, rungroup);
+			opbx_log(LOG_ERROR, "Unable to setgid to '%s' (%d)\n", gr->gr_name, gr->gr_gid);
 			exit(1);
 		}
-		if (option_verbose)
-			opbx_verbose("Running as group '%s'\n", rungroup);
-	}
-	if (!is_child_of_nonroot && runuser) {
-		struct passwd *pw;
-		pw = getpwnam(runuser);
-		if (!pw) {
-			opbx_log(LOG_WARNING, "No such user '%s'!\n", runuser);
-			exit(1);
+		if (option_verbose) {
+			int ngroups;
+			gid_t gid_list[NGROUPS_MAX];
+			int i;
+			struct group *gr2;
+
+			gr2 = getgrgid(getegid());
+			if (gr2) {
+				opbx_verbose("Now running as group '%s' (%d)\n", gr2->gr_name, gr2->gr_gid);
+			} else {
+				opbx_verbose("Now running as group %d\n", getegid());
+			}
+
+			opbx_verbose("Supplementary groups:\n");
+			ngroups = getgroups(NGROUPS_MAX, gid_list);
+			for (i = 0; i < ngroups; i++) {
+				gr2 = getgrgid(gid_list[i]);
+				if (gr2) {
+					opbx_verbose("   %s (%d)\n", gr2->gr_name, gr2->gr_gid);
+				} else {
+					opbx_verbose("   %d\n", gid_list[i]);
+				}
+			}
 		}
 #ifdef __Darwin__
 		if (setuid(pw->pw_uid)) {
 #else
 		if (setreuid(pw->pw_uid, pw->pw_uid)) {
 #endif
-			opbx_log(LOG_WARNING, "Unable to setuid to %d (%s)\n", pw->pw_uid, runuser);
+			opbx_log(LOG_ERROR, "Unable to setuid to '%s' (%d)\n", pw->pw_name, pw->pw_uid);
 			exit(1);
 		}
 		setenv("OPENPBX_ALREADY_NONROOT","yes",1);
-		if (option_verbose)
-			opbx_verbose("Running as user '%s'\n", runuser);
+		if (option_verbose) {
+			struct passwd *pw2;
+			pw2 = getpwuid(geteuid());
+			if (pw2) {
+				opbx_verbose("Now running as user '%s' (%d)\n", pw2->pw_name, pw2->pw_uid);
+			} else {
+				opbx_verbose("Now running as user (%d)\n", getegid());
+			}
+		}
 	}
 
 	/* Check if we're root */