changeset 3062:5e2e4cdbfe2e HEAD

Added "passdb" userdb. It works only if passdb gives all the information needed for userdb. For example with SQL you can use ".. uid AS userdb_uid, gid AS userdb_gid, home AS userdb_home .." in password_query.
author Timo Sirainen <tss@iki.fi>
date Fri, 07 Jan 2005 20:15:14 +0200
parents 42c1ca1f7a45
children a0fbf92b41c3
files configure.in src/auth/Makefile.am src/auth/auth-client-connection.c src/auth/userdb-passdb.c src/auth/userdb.c src/auth/userdb.h
diffstat 6 files changed, 129 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/configure.in	Fri Jan 07 20:09:40 2005 +0200
+++ b/configure.in	Fri Jan 07 20:15:14 2005 +0200
@@ -138,6 +138,15 @@
 	fi,
 	want_static_userdb=yes)
 
+AC_ARG_WITH(passdb-userdb,
+[  --with-passdb-userdb    Build with passdb userdb support (default)],
+	if test x$withval = xno; then
+		want_passdb_userdb=no
+	else
+		want_passdb_userdb=yes
+	fi,
+	want_passdb_userdb=yes)
+
 AC_ARG_WITH(pgsql,
 [  --with-pgsql            Build with PostgreSQL support],
 	if test x$withval = xno; then
@@ -999,6 +1008,11 @@
 	userdb="$userdb static"
 fi
 
+if test $want_passdb_userdb = yes; then
+        AC_DEFINE(USERDB_PASSDB,, Build with passdb userdb support)
+	userdb="$userdb passdb"
+fi
+
 if test $want_passwd = yes; then
 	need_crypt=yes
         AC_DEFINE(USERDB_PASSWD,, Build with passwd support)
--- a/src/auth/Makefile.am	Fri Jan 07 20:09:40 2005 +0200
+++ b/src/auth/Makefile.am	Fri Jan 07 20:15:14 2005 +0200
@@ -62,6 +62,7 @@
 	passdb-sql.c \
 	userdb.c \
 	userdb-ldap.c \
+	userdb-passdb.c \
 	userdb-passwd.c \
 	userdb-passwd-file.c \
 	userdb-static.c \
--- a/src/auth/auth-client-connection.c	Fri Jan 07 20:09:40 2005 +0200
+++ b/src/auth/auth-client-connection.c	Fri Jan 07 20:15:14 2005 +0200
@@ -52,11 +52,33 @@
 	t_pop();
 }
 
+static const char *get_client_extra_fields(struct auth_request *request)
+{
+	const char **fields;
+	unsigned int src, dest;
+
+	if (request->extra_fields == NULL)
+		return NULL;
+
+	/* we only wish to remove all fields prefixed with "userdb_" */
+	if (strstr(request->extra_fields, "userdb_") == NULL)
+		return request->extra_fields;
+
+	fields = t_strsplit(request->extra_fields, "\t");
+	for (src = dest = 0; fields[src] != NULL; src++) {
+		if (strncmp(fields[src], "userdb_", 7) == 0)
+			fields[dest++] = fields[src];
+	}
+	fields[dest] = NULL;
+	return t_strarray_join(fields, "\t");
+}
+
 static void auth_callback(struct auth_request *request,
 			  enum auth_client_result result,
 			  const void *reply, size_t reply_size)
 {
 	string_t *str = NULL;
+	const char *fields;
 	ssize_t ret;
 
 	t_push();
@@ -75,22 +97,28 @@
 			str_append(str, "\tresp=");
 			base64_encode(reply, reply_size, str);
 		}
-		if (request->extra_fields) {
+		t_push();
+		fields = get_client_extra_fields(request);
+		if (fields != NULL) {
 			str_append_c(str, '\t');
-			str_append(str, request->extra_fields);
+			str_append(str, fields);
 		}
+		t_pop();
 		break;
 	case AUTH_CLIENT_RESULT_FAILURE:
 		str = t_str_new(128);
 		str_printfa(str, "FAIL\t%u", request->id);
 		if (request->user != NULL)
 			str_printfa(str, "\tuser=%s", request->user);
-		if (request->extra_fields) {
-			str_append_c(str, '\t');
-			str_append(str, request->extra_fields);
-		}
 		if (request->internal_failure)
 			str_append(str, "\ttemp");
+		t_push();
+		fields = get_client_extra_fields(request);
+		if (fields != NULL) {
+			str_append_c(str, '\t');
+			str_append(str, fields);
+		}
+		t_pop();
 		break;
 	}
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/auth/userdb-passdb.c	Fri Jan 07 20:15:14 2005 +0200
@@ -0,0 +1,76 @@
+/* Copyright (C) 2004 Timo Sirainen */
+
+#include "config.h"
+#undef HAVE_CONFIG_H
+
+#ifdef USERDB_PASSDB
+
+#include "common.h"
+#include "str.h"
+#include "var-expand.h"
+#include "userdb.h"
+
+#include <stdlib.h>
+
+static void passdb_lookup(struct auth_request *auth_request,
+			  userdb_callback_t *callback, void *context)
+{
+	struct user_data data;
+	const char *const *args;
+	int uid_seen, gid_seen;
+
+	memset(&data, 0, sizeof(data));
+	data.virtual_user = auth_request->user;
+
+	uid_seen = gid_seen = FALSE;
+	data.uid = (uid_t)-1;
+	data.gid = (gid_t)-1;
+
+	t_push();
+	args = t_strsplit(auth_request->extra_fields, "\t");
+	for (; *args != NULL; args++) {
+		const char *arg = *args;
+
+		if (strncmp(arg, "userdb_", 7) != 0)
+			continue;
+		arg += 7;
+
+		if (strncmp(arg, "uid=", 4) == 0) {
+			uid_seen = TRUE;
+                        data.uid = userdb_parse_uid(auth_request, arg+4);
+		} else if (strncmp(arg, "gid=", 4) == 0) {
+			gid_seen = TRUE;
+			data.gid = userdb_parse_gid(auth_request, arg+4);
+		} else if (strncmp(arg, "home=", 5) == 0)
+			data.home = arg + 5;
+		else if (strncmp(arg, "mail=", 5) == 0)
+			data.mail = arg + 5;
+	}
+
+	if (!uid_seen) {
+		i_error("passdb(%s): userdb_uid not returned",
+			get_log_prefix(auth_request));
+	}
+	if (!gid_seen) {
+		i_error("passdb(%s): userdb_gid not returned",
+			get_log_prefix(auth_request));
+	}
+
+	if (data.uid == (uid_t)-1 || data.gid == (gid_t)-1)
+		callback(NULL, context);
+	else
+		callback(&data, context);
+	t_pop();
+}
+
+struct userdb_module userdb_passdb = {
+	"passdb",
+
+	NULL,
+	NULL,
+	NULL,
+
+	passdb_lookup
+};
+
+#endif
--- a/src/auth/userdb.c	Fri Jan 07 20:09:40 2005 +0200
+++ b/src/auth/userdb.c	Fri Jan 07 20:15:14 2005 +0200
@@ -19,6 +19,9 @@
 #ifdef USERDB_PASSWD_FILE
 	&userdb_passwd_file,
 #endif
+#ifdef USERDB_PASSDB
+	&userdb_passdb,
+#endif
 #ifdef USERDB_STATIC
 	&userdb_static,
 #endif
--- a/src/auth/userdb.h	Fri Jan 07 20:09:40 2005 +0200
+++ b/src/auth/userdb.h	Fri Jan 07 20:15:14 2005 +0200
@@ -28,6 +28,7 @@
 
 extern struct userdb_module *userdb;
 
+extern struct userdb_module userdb_passdb;
 extern struct userdb_module userdb_static;
 extern struct userdb_module userdb_passwd;
 extern struct userdb_module userdb_passwd_file;