[dovecot-cvs] dovecot/src/auth auth-request.c, 1.34, 1.35 auth-worker-client.c, 1.16, 1.17 userdb-ldap.c, 1.34, 1.35 userdb-passdb.c, 1.8, 1.9 userdb-passwd-file.c, 1.17, 1.18 userdb-passwd.c, 1.17, 1.18 userdb-sql.c, 1.11, 1.12 userdb-static.c, 1.16, 1.17 userdb-vpopmail.c, 1.18, 1.19 userdb.c, 1.21, 1.22 userdb.h, 1.23, 1.24

cras at dovecot.org cras at dovecot.org
Sun Oct 16 17:34:42 EEST 2005


Update of /var/lib/cvs/dovecot/src/auth
In directory talvi:/tmp/cvs-serv4884

Modified Files:
	auth-request.c auth-worker-client.c userdb-ldap.c 
	userdb-passdb.c userdb-passwd-file.c userdb-passwd.c 
	userdb-sql.c userdb-static.c userdb-vpopmail.c userdb.c 
	userdb.h 
Log Message:
Separated userdb_module's interface and the actual data struct.
Now it's possible to have multiple userdbs of same type but with different
settings.



Index: auth-request.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/auth/auth-request.c,v
retrieving revision 1.34
retrieving revision 1.35
diff -u -d -r1.34 -r1.35
--- auth-request.c	16 Oct 2005 14:06:59 -0000	1.34
+++ auth-request.c	16 Oct 2005 14:34:39 -0000	1.35
@@ -464,7 +464,7 @@
 	if (userdb->blocking)
 		userdb_blocking_lookup(request);
 	else
-		userdb->lookup(request, auth_request_userdb_callback);
+		userdb->iface->lookup(request, auth_request_userdb_callback);
 }
 
 int auth_request_set_username(struct auth_request *request,

Index: auth-worker-client.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/auth/auth-worker-client.c,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -d -r1.16 -r1.17
--- auth-worker-client.c	16 Oct 2005 14:06:59 -0000	1.16
+++ auth-worker-client.c	16 Oct 2005 14:34:39 -0000	1.17
@@ -273,7 +273,7 @@
 		}
 	}
 
-	auth_request->userdb->userdb->
+	auth_request->userdb->userdb->iface->
 		lookup(auth_request, lookup_user_callback);
 }
 

Index: userdb-ldap.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/auth/userdb-ldap.c,v
retrieving revision 1.34
retrieving revision 1.35
diff -u -d -r1.34 -r1.35
--- userdb-ldap.c	7 Aug 2005 11:41:19 -0000	1.34
+++ userdb-ldap.c	16 Oct 2005 14:34:39 -0000	1.35
@@ -13,8 +13,10 @@
 #include <ldap.h>
 #include <stdlib.h>
 
-static const char *default_attr_map[] = {
-	"", "home", "mail", "system_user", "uid", "gid", NULL
+struct ldap_userdb_module {
+	struct userdb_module module;
+
+	struct ldap_connection *conn;
 };
 
 struct userdb_ldap_request {
@@ -23,7 +25,9 @@
         userdb_callback_t *userdb_callback;
 };
 
-static struct ldap_connection *userdb_ldap_conn;
+static const char *default_attr_map[] = {
+	"", "home", "mail", "system_user", "uid", "gid", NULL
+};
 
 static int append_uid_list(struct auth_request *auth_request,
                            struct auth_stream_reply *reply,
@@ -75,7 +79,7 @@
 
 	attr = ldap_first_attribute(conn->ld, entry, &ber);
 	while (attr != NULL) {
-		name = hash_lookup(userdb_ldap_conn->user_attr_map, attr);
+		name = hash_lookup(conn->user_attr_map, attr);
 		vals = ldap_get_values(conn->ld, entry, attr);
 
 		if (name != NULL && vals != NULL && vals[0] != NULL) {
@@ -165,10 +169,12 @@
 static void userdb_ldap_lookup(struct auth_request *auth_request,
 			       userdb_callback_t *callback)
 {
-	struct ldap_connection *conn = userdb_ldap_conn;
+	struct userdb_module *_module = auth_request->userdb->userdb;
+	struct ldap_userdb_module *module =
+		(struct ldap_userdb_module *)_module;
+	struct ldap_connection *conn = module->conn;
         const struct var_expand_table *vars;
-	const char **attr_names =
-		(const char **)userdb_ldap_conn->user_attr_names;
+	const char **attr_names = (const char **)conn->user_attr_names;
 	struct userdb_ldap_request *request;
 	const char *filter, *base;
 	string_t *str;
@@ -193,37 +199,46 @@
 			       base, conn->set.scope, filter,
 			       t_strarray_join(attr_names, ","));
 
-	db_ldap_search(conn, base, conn->set.ldap_scope,
-		       filter, userdb_ldap_conn->user_attr_names,
-		       &request->request);
+	db_ldap_search(conn, base, conn->set.ldap_scope, filter,
+		       conn->user_attr_names, &request->request);
 }
 
-static void userdb_ldap_preinit(const char *args)
+static struct userdb_module *
+userdb_ldap_preinit(struct auth_userdb *auth_userdb, const char *args)
 {
-	userdb_ldap_conn = db_ldap_init(args);
-	userdb_ldap_conn->user_attr_map =
-		hash_create(default_pool, userdb_ldap_conn->pool, 0, str_hash,
+	struct ldap_userdb_module *module;
+	struct ldap_connection *conn;
+
+	module = p_new(auth_userdb->auth->pool, struct ldap_userdb_module, 1);
+	module->conn = conn = db_ldap_init(args);
+	conn->user_attr_map =
+		hash_create(default_pool, conn->pool, 0, str_hash,
 			    (hash_cmp_callback_t *)strcmp);
 
-	db_ldap_set_attrs(userdb_ldap_conn, userdb_ldap_conn->set.user_attrs,
-                          &userdb_ldap_conn->user_attr_names,
-			  userdb_ldap_conn->user_attr_map,
-			  default_attr_map);
+	db_ldap_set_attrs(conn, conn->set.user_attrs, &conn->user_attr_names,
+			  conn->user_attr_map, default_attr_map);
+	return &module->module;
 }
 
-static void userdb_ldap_init(const char *args __attr_unused__)
+static void userdb_ldap_init(struct userdb_module *_module,
+			     const char *args __attr_unused__)
 {
-	(void)db_ldap_connect(userdb_ldap_conn);
+	struct ldap_userdb_module *module =
+		(struct ldap_userdb_module *)_module;
+
+	(void)db_ldap_connect(module->conn);
 }
 
-static void userdb_ldap_deinit(void)
+static void userdb_ldap_deinit(struct userdb_module *_module)
 {
-	db_ldap_unref(userdb_ldap_conn);
+	struct ldap_userdb_module *module =
+		(struct ldap_userdb_module *)_module;
+
+	db_ldap_unref(module->conn);
 }
 
-struct userdb_module userdb_ldap = {
+struct userdb_module_interface userdb_ldap = {
 	"ldap",
-	FALSE,
 
 	userdb_ldap_preinit,
 	userdb_ldap_init,

Index: userdb-passdb.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/auth/userdb-passdb.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -d -r1.8 -r1.9
--- userdb-passdb.c	14 Aug 2005 18:25:22 -0000	1.8
+++ userdb-passdb.c	16 Oct 2005 14:34:39 -0000	1.9
@@ -90,9 +90,8 @@
 	t_pop();
 }
 
-struct userdb_module userdb_passdb = {
+struct userdb_module_interface userdb_passdb = {
 	"passdb",
-	FALSE,
 
 	NULL,
 	NULL,

Index: userdb-passwd-file.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/auth/userdb-passwd-file.c,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -d -r1.17 -r1.18
--- userdb-passwd-file.c	16 Oct 2005 14:06:59 -0000	1.17
+++ userdb-passwd-file.c	16 Oct 2005 14:34:39 -0000	1.18
@@ -8,15 +8,22 @@
 #include "userdb.h"
 #include "db-passwd-file.h"
 
-struct db_passwd_file *userdb_pwf = NULL;
+struct passwd_file_userdb_module {
+        struct userdb_module module;
+
+	struct db_passwd_file *pwf;
+};
 
 static void passwd_file_lookup(struct auth_request *auth_request,
 			       userdb_callback_t *callback)
 {
+	struct userdb_module *_module = auth_request->userdb->userdb;
+	struct passwd_file_userdb_module *module =
+		(struct passwd_file_userdb_module *)_module;
 	struct auth_stream_reply *reply;
 	struct passwd_user *pu;
 
-	pu = db_passwd_file_lookup(userdb_pwf, auth_request);
+	pu = db_passwd_file_lookup(module->pwf, auth_request);
 	if (pu == NULL) {
 		callback(NULL, auth_request);
 		return;
@@ -35,21 +42,37 @@
 	callback(reply, auth_request);
 }
 
-static void passwd_file_init(const char *args)
+static struct userdb_module *
+passwd_file_preinit(struct auth_userdb *auth_userdb,
+		    const char *args __attr_unused__)
 {
-	userdb_pwf = db_passwd_file_parse(args, TRUE);
+	struct passwd_file_userdb_module *module;
+
+	module = p_new(auth_userdb->auth->pool,
+		       struct passwd_file_userdb_module, 1);
+	return &module->module;
 }
 
-static void passwd_file_deinit(void)
+static void passwd_file_init(struct userdb_module *_module, const char *args)
 {
-	db_passwd_file_unref(userdb_pwf);
+	struct passwd_file_userdb_module *module =
+		(struct passwd_file_userdb_module *)_module;
+
+	module->pwf = db_passwd_file_parse(args, TRUE);
 }
 
-struct userdb_module userdb_passwd_file = {
+static void passwd_file_deinit(struct userdb_module *_module)
+{
+	struct passwd_file_userdb_module *module =
+		(struct passwd_file_userdb_module *)_module;
+
+	db_passwd_file_unref(module->pwf);
+}
+
+struct userdb_module_interface userdb_passwd_file = {
 	"passwd-file",
-	FALSE,
 
-	NULL,
+	passwd_file_preinit,
 	passwd_file_init,
 	passwd_file_deinit,
 

Index: userdb-passwd.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/auth/userdb-passwd.c,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -d -r1.17 -r1.18
--- userdb-passwd.c	7 Aug 2005 11:41:19 -0000	1.17
+++ userdb-passwd.c	16 Oct 2005 14:34:39 -0000	1.18
@@ -39,9 +39,8 @@
 	callback(reply, auth_request);
 }
 
-struct userdb_module userdb_passwd = {
+struct userdb_module_interface userdb_passwd = {
 	"passwd",
-	FALSE,
 
 	NULL, NULL, NULL,
 	passwd_lookup

Index: userdb-sql.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/auth/userdb-sql.c,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -d -r1.11 -r1.12
--- userdb-sql.c	7 Aug 2005 11:41:19 -0000	1.11
+++ userdb-sql.c	16 Oct 2005 14:34:39 -0000	1.12
@@ -13,15 +13,17 @@
 #include <stdlib.h>
 #include <string.h>
 
+struct sql_userdb_module {
+	struct userdb_module module;
+
+	struct sql_connection *conn;
+};
+
 struct userdb_sql_request {
 	struct auth_request *auth_request;
 	userdb_callback_t *callback;
 };
 
-extern struct userdb_module userdb_sql;
-
-static struct sql_connection *userdb_sql_conn;
-
 static struct auth_stream_reply *
 sql_query_get_result(struct sql_result *result,
 		     struct auth_request *auth_request)
@@ -99,11 +101,14 @@
 static void userdb_sql_lookup(struct auth_request *auth_request,
 			      userdb_callback_t *callback)
 {
+	struct userdb_module *_module = auth_request->userdb->userdb;
+	struct sql_userdb_module *module =
+		(struct sql_userdb_module *)_module;
 	struct userdb_sql_request *sql_request;
 	string_t *query;
 
 	query = t_str_new(512);
-	var_expand(query, userdb_sql_conn->set.user_query,
+	var_expand(query, module->conn->set.user_query,
 		   auth_request_get_var_expand_table(auth_request,
 						     str_escape));
 
@@ -113,34 +118,44 @@
 
 	auth_request_log_debug(auth_request, "sql", "%s", str_c(query));
 
-	sql_query(userdb_sql_conn->db, str_c(query),
+	sql_query(module->conn->db, str_c(query),
 		  sql_query_callback, sql_request);
 }
 
-static void userdb_sql_preinit(const char *args)
+static struct userdb_module *
+userdb_sql_preinit(struct auth_userdb *auth_userdb, const char *args)
 {
-	userdb_sql_conn = db_sql_init(args);
+	struct sql_userdb_module *module;
+
+	module = p_new(auth_userdb->auth->pool, struct sql_userdb_module, 1);
+	module->conn = db_sql_init(args);
+	return &module->module;
 }
 
-static void userdb_sql_init(const char *args __attr_unused__)
+static void userdb_sql_init(struct userdb_module *_module,
+			    const char *args __attr_unused__)
 {
+	struct sql_userdb_module *module =
+		(struct sql_userdb_module *)_module;
 	enum sql_db_flags flags;
 
-	flags = sql_get_flags(userdb_sql_conn->db);
-	userdb_sql.blocking = (flags & SQL_DB_FLAG_BLOCKING) != 0;
+	flags = sql_get_flags(module->conn->db);
+	_module->blocking = (flags & SQL_DB_FLAG_BLOCKING) != 0;
 
-	if (!userdb_sql.blocking || worker)
-		sql_connect(userdb_sql_conn->db);
+	if (!_module->blocking || worker)
+		sql_connect(module->conn->db);
 }
 
-static void userdb_sql_deinit(void)
+static void userdb_sql_deinit(struct userdb_module *_module)
 {
-	db_sql_unref(userdb_sql_conn);
+	struct sql_userdb_module *module =
+		(struct sql_userdb_module *)_module;
+
+	db_sql_unref(module->conn);
 }
 
-struct userdb_module userdb_sql = {
+struct userdb_module_interface userdb_sql = {
 	"sql",
-	FALSE,
 
 	userdb_sql_preinit,
 	userdb_sql_init,

Index: userdb-static.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/auth/userdb-static.c,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -d -r1.16 -r1.17
--- userdb-static.c	5 Oct 2005 19:24:34 -0000	1.16
+++ userdb-static.c	16 Oct 2005 14:34:39 -0000	1.17
@@ -11,12 +11,18 @@
 
 #include <stdlib.h>
 
-static pool_t static_pool;
-static array_t ARRAY_DEFINE(static_template, const char *);
+struct static_userdb_module {
+	struct userdb_module module;
+
+	array_t ARRAY_DEFINE(template, const char *);
+};
 
 static void static_lookup(struct auth_request *auth_request,
 			  userdb_callback_t *callback)
 {
+	struct userdb_module *_module = auth_request->userdb->userdb;
+	struct static_userdb_module *module =
+		(struct static_userdb_module *)_module;
         const struct var_expand_table *table;
 	struct auth_stream_reply *reply;
 	string_t *str;
@@ -30,7 +36,7 @@
 	reply = auth_stream_reply_init(auth_request);
 	auth_stream_reply_add(reply, NULL, auth_request->user);
 
-	args = array_get(&static_template, &count);
+	args = array_get(&module->template, &count);
 	i_assert((count % 2) == 0);
 	for (i = 0; i < count; i += 2) {
 		if (args[i+1] == NULL)
@@ -47,20 +53,25 @@
 	t_pop();
 }
 
-static void static_init(const char *args)
+static struct userdb_module *
+static_preinit(struct auth_userdb *auth_userdb, const char *args)
 {
+	struct static_userdb_module *module;
 	const char *const *tmp, *key, *value;
 	uid_t uid;
 	gid_t gid;
 
-	static_pool = pool_alloconly_create("static userdb", 256);
+	module = p_new(auth_userdb->auth->pool, struct static_userdb_module, 1);
+
 	uid = (uid_t)-1;
 	gid = (gid_t)-1;
 
-	ARRAY_CREATE(&static_template, static_pool, const char *, 16);
+	tmp = t_strsplit_spaces(args, " ");
+	ARRAY_CREATE(&module->template, auth_userdb->auth->pool,
+		     const char *, strarray_length(tmp));
 
 	t_push();
-	for (tmp = t_strsplit_spaces(args, " "); *tmp != NULL; tmp++) {
+	for (; *tmp != NULL; tmp++) {
 		value = strchr(*tmp, '=');
 		if (value == NULL)
 			key = *tmp;
@@ -84,11 +95,11 @@
 			}
 			value = dec2str(gid);
 		}
-		key = p_strdup(static_pool, key);
-		value = p_strdup(static_pool, value);
+		key = p_strdup(auth_userdb->auth->pool, key);
+		value = p_strdup(auth_userdb->auth->pool, value);
 
-		array_append(&static_template, &key, 1);
-		array_append(&static_template, &value, 1);
+		array_append(&module->template, &key, 1);
+		array_append(&module->template, &value, 1);
 	}
 	t_pop();
 
@@ -96,20 +107,15 @@
 		i_fatal("static userdb: uid missing");
 	if (gid == (gid_t)-1)
 		i_fatal("static userdb: gid missing");
+	return &module->module;
 }
 
-static void static_deinit(void)
-{
-	pool_unref(static_pool);
-}
-
-struct userdb_module userdb_static = {
+struct userdb_module_interface userdb_static = {
 	"static",
-	FALSE,
 
+	static_preinit,
+	NULL,
 	NULL,
-	static_init,
-	static_deinit,
 
 	static_lookup
 };

Index: userdb-vpopmail.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/auth/userdb-vpopmail.c,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -d -r1.18 -r1.19
--- userdb-vpopmail.c	11 Sep 2005 13:03:48 -0000	1.18
+++ userdb-vpopmail.c	16 Oct 2005 14:34:39 -0000	1.19
@@ -93,9 +93,8 @@
 	callback(reply, auth_request);
 }
 
-struct userdb_module userdb_vpopmail = {
+struct userdb_module_interface userdb_vpopmail = {
 	"vpopmail",
-	FALSE,
 
 	NULL, NULL, NULL,
 	vpopmail_lookup

Index: userdb.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/auth/userdb.c,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -d -r1.21 -r1.22
--- userdb.c	5 Oct 2005 19:16:32 -0000	1.21
+++ userdb.c	16 Oct 2005 14:34:40 -0000	1.22
@@ -9,15 +9,15 @@
 #include <pwd.h>
 #include <grp.h>
 
-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;
-extern struct userdb_module userdb_vpopmail;
-extern struct userdb_module userdb_ldap;
-extern struct userdb_module userdb_sql;
+extern struct userdb_module_interface userdb_passdb;
+extern struct userdb_module_interface userdb_static;
+extern struct userdb_module_interface userdb_passwd;
+extern struct userdb_module_interface userdb_passwd_file;
+extern struct userdb_module_interface userdb_vpopmail;
+extern struct userdb_module_interface userdb_ldap;
+extern struct userdb_module_interface userdb_sql;
 
-struct userdb_module *userdbs[] = {
+struct userdb_module_interface *userdb_interfaces[] = {
 #ifdef USERDB_PASSWD
 	&userdb_passwd,
 #endif
@@ -86,7 +86,7 @@
 
 void userdb_preinit(struct auth *auth, const char *driver, const char *args)
 {
-	struct userdb_module **p;
+	struct userdb_module_interface **p, *iface;
         struct auth_userdb *auth_userdb, **dest;
 
 	if (args == NULL) args = "";
@@ -99,9 +99,10 @@
 		auth_userdb->num++;
 	*dest = auth_userdb;
 
-	for (p = userdbs; *p != NULL; p++) {
+	iface = NULL;
+	for (p = userdb_interfaces; *p != NULL; p++) {
 		if (strcmp((*p)->name, driver) == 0) {
-			auth_userdb->userdb = *p;
+			iface = *p;
 			break;
 		}
 	}
@@ -110,23 +111,28 @@
 	if (auth_userdb->userdb == NULL)
 		auth_userdb->module = auth_module_open(driver);
 	if (auth_userdb->module != NULL) {
-		auth_userdb->userdb =
-			auth_module_sym(auth_userdb->module,
+		iface = auth_module_sym(auth_userdb->module,
 					t_strconcat("userdb_", driver, NULL));
 	}
 #endif
 
-	if (auth_userdb->userdb == NULL)
+	if (iface == NULL)
 		i_fatal("Unknown userdb driver '%s'", driver);
 
-	if (auth_userdb->userdb->preinit != NULL)
-		auth_userdb->userdb->preinit(auth_userdb->args);
+	if (iface->preinit == NULL) {
+		auth_userdb->userdb =
+			p_new(auth->pool, struct userdb_module, 1);
+	} else {
+		auth_userdb->userdb =
+			iface->preinit(auth_userdb, auth_userdb->args);
+	}
+	auth_userdb->userdb->iface = iface;
 }
 
 void userdb_init(struct auth_userdb *userdb)
 {
-	if (userdb->userdb->init != NULL)
-		userdb->userdb->init(userdb->args);
+	if (userdb->userdb->iface->init != NULL)
+		userdb->userdb->iface->init(userdb->userdb, userdb->args);
 
 	if (userdb->userdb->blocking && !worker) {
 		/* blocking userdb - we need an auth server */
@@ -136,8 +142,8 @@
 
 void userdb_deinit(struct auth_userdb *userdb)
 {
-	if (userdb->userdb->deinit != NULL)
-		userdb->userdb->deinit();
+	if (userdb->userdb->iface->deinit != NULL)
+		userdb->userdb->iface->deinit(userdb->userdb);
 #ifdef HAVE_MODULES
 	if (userdb->module != NULL)
                 auth_module_close(userdb->module);

Index: userdb.h
===================================================================
RCS file: /var/lib/cvs/dovecot/src/auth/userdb.h,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -d -r1.23 -r1.24
--- userdb.h	7 Aug 2005 11:41:19 -0000	1.23
+++ userdb.h	16 Oct 2005 14:34:40 -0000	1.24
@@ -9,15 +9,20 @@
 			       struct auth_request *request);
 
 struct userdb_module {
-	const char *name;
-
 	/* If blocking is set to TRUE, use child processes to access
-	   this passdb. */
+	   this userdb. */
 	int blocking;
 
-	void (*preinit)(const char *args);
-	void (*init)(const char *args);
-	void (*deinit)(void);
+	const struct userdb_module_interface *iface;
+};
+
+struct userdb_module_interface {
+	const char *name;
+
+	struct userdb_module *
+		(*preinit)(struct auth_userdb *auth_userdb, const char *args);
+	void (*init)(struct userdb_module *module, const char *args);
+	void (*deinit)(struct userdb_module *module);
 
 	void (*lookup)(struct auth_request *auth_request,
 		       userdb_callback_t *callback);
@@ -27,8 +32,8 @@
 gid_t userdb_parse_gid(struct auth_request *request, const char *str);
 
 void userdb_preinit(struct auth *auth, const char *driver, const char *args);
-void userdb_init(struct auth_userdb *passdb);
-void userdb_deinit(struct auth_userdb *passdb);
+void userdb_init(struct auth_userdb *userdb);
+void userdb_deinit(struct auth_userdb *userdb);
 
 #include "auth-request.h"
 



More information about the dovecot-cvs mailing list