Changeset

3471:482275e38224

util.pposix, prosodyctl, mod_posix: Add initgroups() function, and bump module version. prosodyctl inits groups with the groups of prosody_user. (thanks dbb)
author Matthew Wild <mwild1@gmail.com>
date Sat, 28 Aug 2010 14:31:48 +0100
parents 3470:0e59b5cdd57b
children 3472:61cf3e7d7f07
files plugins/mod_posix.lua prosodyctl util-src/pposix.c
diffstat 3 files changed, 63 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/plugins/mod_posix.lua	Fri Aug 27 18:33:45 2010 +0100
+++ b/plugins/mod_posix.lua	Sat Aug 28 14:31:48 2010 +0100
@@ -7,7 +7,7 @@
 --
 
 
-local want_pposix_version = "0.3.3";
+local want_pposix_version = "0.3.4";
 
 local pposix = assert(require "util.pposix");
 if pposix._VERSION ~= want_pposix_version then module:log("warn", "Unknown version (%s) of binary pposix module, expected %s", tostring(pposix._VERSION), want_pposix_version); end
--- a/prosodyctl	Fri Aug 27 18:33:45 2010 +0100
+++ b/prosodyctl	Sat Aug 28 14:31:48 2010 +0100
@@ -79,7 +79,7 @@
 -- Switch away from root and into the prosody user --
 local switched_user, current_uid;
 
-local want_pposix_version = "0.3.3";
+local want_pposix_version = "0.3.4";
 local ok, pposix = pcall(require, "util.pposix");
 
 if ok and pposix then
@@ -91,6 +91,9 @@
 		local desired_group = config.get("*", "core", "prosody_group") or desired_user;
 		local ok, err = pposix.setgid(desired_group);
 		if ok then
+			ok, err = pposix.initgroups(desired_user);
+		end
+		if ok then
 			ok, err = pposix.setuid(desired_user);
 			if ok then
 				-- Yay!
--- a/util-src/pposix.c	Fri Aug 27 18:33:45 2010 +0100
+++ b/util-src/pposix.c	Sat Aug 28 14:31:48 2010 +0100
@@ -13,7 +13,7 @@
 * POSIX support functions for Lua
 */
 
-#define MODULE_VERSION "0.3.3"
+#define MODULE_VERSION "0.3.4"
 
 #include <stdlib.h>
 #include <math.h>
@@ -359,6 +359,62 @@
 	return 2;
 }
 
+int lc_initgroups(lua_State* L)
+{
+	int ret;
+	gid_t gid;
+	struct passwd *p;
+
+	if(!lua_isstring(L, 1))
+	{
+		lua_pushnil(L);
+		lua_pushstring(L, "invalid-username");
+		return 2;
+	}
+	p = getpwnam(lua_tostring(L, 1));
+	if(!p)
+	{
+		lua_pushnil(L);
+		lua_pushstring(L, "no-such-user");
+		return 2;
+	}
+	if(lua_gettop(L) < 2)
+		lua_pushnil(L);
+	switch(lua_type(L, 2))
+	{
+	case LUA_TNIL:
+		gid = p->pw_gid;
+		break;
+	case LUA_TNUMBER:
+		gid = lua_tointeger(L, 2);
+		break;
+	default:
+		lua_pushnil(L);
+		lua_pushstring(L, "invalid-gid");
+		return 2;
+	}
+	ret = initgroups(lua_tostring(L, 1), gid);
+	switch(errno)
+	{
+	case 0:
+		lua_pushboolean(L, 1);
+		lua_pushnil(L);
+		break;
+	case ENOMEM:
+		lua_pushnil(L);
+		lua_pushstring(L, "no-memory");
+		break;
+	case EPERM:
+		lua_pushnil(L);
+		lua_pushstring(L, "permission-denied");
+		break;
+	default:
+		lua_pushnil(L);
+		lua_pushstring(L, "unknown-error");
+	}
+	return 2;
+}
+
 int lc_umask(lua_State* L)
 {
 	char old_mode_string[7];
@@ -517,6 +573,7 @@
 
 		{ "setuid", lc_setuid },
 		{ "setgid", lc_setgid },
+		{ "initgroups", lc_initgroups },
 
 		{ "umask", lc_umask },