changeset 2648:cc2e39912eb3 HEAD

Added preinit() call to userdb/passdbs, which is called before dropping privileges. init() is called after. SQL/LDAP now parses the config file in preinit, but does the actual connecting only in init(). This fixes LDAP crashing at startup.
author Timo Sirainen <tss@iki.fi>
date Tue, 21 Sep 2004 00:47:30 +0300
parents a17d7463a4dc
children ec268f32e69e
files src/auth/db-ldap.c src/auth/db-ldap.h src/auth/db-mysql.c src/auth/db-mysql.h src/auth/db-pgsql.c src/auth/db-pgsql.h src/auth/passdb-bsdauth.c src/auth/passdb-checkpassword.c src/auth/passdb-ldap.c src/auth/passdb-mysql.c src/auth/passdb-pam.c src/auth/passdb-passwd-file.c src/auth/passdb-passwd.c src/auth/passdb-pgsql.c src/auth/passdb-shadow.c src/auth/passdb-vpopmail.c src/auth/passdb.c src/auth/passdb.h src/auth/userdb-ldap.c src/auth/userdb-mysql.c src/auth/userdb-passwd-file.c src/auth/userdb-passwd.c src/auth/userdb-pgsql.c src/auth/userdb-static.c src/auth/userdb-vpopmail.c src/auth/userdb.c src/auth/userdb.h
diffstat 27 files changed, 94 insertions(+), 34 deletions(-) [+]
line wrap: on
line diff
--- a/src/auth/db-ldap.c	Tue Sep 21 00:27:43 2004 +0300
+++ b/src/auth/db-ldap.c	Tue Sep 21 00:47:30 2004 +0300
@@ -67,7 +67,6 @@
 
 static struct ldap_connection *ldap_connections = NULL;
 
-static int ldap_conn_open(struct ldap_connection *conn);
 static void ldap_conn_close(struct ldap_connection *conn);
 
 static int deref2str(const char *str)
@@ -117,7 +116,7 @@
 	int msgid;
 
 	if (!conn->connected) {
-		if (!ldap_conn_open(conn)) {
+		if (!db_ldap_connect(conn)) {
 			request->callback(conn, request, NULL);
 			return;
 		}
@@ -177,7 +176,7 @@
 	}
 }
 
-static int ldap_conn_open(struct ldap_connection *conn)
+int db_ldap_connect(struct ldap_connection *conn)
 {
 	int ret, fd;
 
@@ -373,8 +372,6 @@
         conn->set.ldap_deref = deref2str(conn->set.deref);
         conn->set.ldap_scope = scope2str(conn->set.scope);
 
-	(void)ldap_conn_open(conn);
-
 	conn->next = ldap_connections;
         ldap_connections = conn;
 	return conn;
--- a/src/auth/db-ldap.h	Tue Sep 21 00:27:43 2004 +0300
+++ b/src/auth/db-ldap.h	Tue Sep 21 00:47:30 2004 +0300
@@ -63,6 +63,8 @@
 struct ldap_connection *db_ldap_init(const char *config_path);
 void db_ldap_unref(struct ldap_connection *conn);
 
+int db_ldap_connect(struct ldap_connection *conn);
+
 const char *ldap_escape(const char *str);
 const char *ldap_get_error(struct ldap_connection *conn);
 
--- a/src/auth/db-mysql.c	Tue Sep 21 00:27:43 2004 +0300
+++ b/src/auth/db-mysql.c	Tue Sep 21 00:47:30 2004 +0300
@@ -54,7 +54,6 @@
 
 static struct mysql_connection *mysql_connections = NULL;
 
-static int mysql_conn_open(struct mysql_connection *conn);
 static void mysql_conn_close(struct mysql_connection *conn);
 
 void db_mysql_query(struct mysql_connection *conn, const char *query,
@@ -67,7 +66,7 @@
 		i_info("MySQL: Performing query: %s", query);
 
 	if (!conn->connected) {
-		if (!mysql_conn_open(conn)) {
+		if (!db_mysql_connect(conn)) {
 			request->callback(conn, request, NULL);
 			return;
 		}
@@ -110,7 +109,7 @@
 	i_free(request);
 }
 
-static int mysql_conn_open(struct mysql_connection *conn)
+int db_mysql_connect(struct mysql_connection *conn)
 {
 	int use_ssl = FALSE;
 
@@ -214,8 +213,6 @@
 	if (conn->set.db_user == NULL)
 		i_fatal("MySQL: db_user variable isn't set in config file");
 
-	(void)mysql_conn_open(conn);
-
 	conn->next = mysql_connections;
 	mysql_connections = conn;
 	return conn;
--- a/src/auth/db-mysql.h	Tue Sep 21 00:27:43 2004 +0300
+++ b/src/auth/db-mysql.h	Tue Sep 21 00:47:30 2004 +0300
@@ -54,4 +54,6 @@
 struct mysql_connection *db_mysql_init(const char *config_path);
 void db_mysql_unref(struct mysql_connection *conn);
 
+int db_mysql_connect(struct mysql_connection *conn);
+
 #endif
--- a/src/auth/db-pgsql.c	Tue Sep 21 00:27:43 2004 +0300
+++ b/src/auth/db-pgsql.c	Tue Sep 21 00:47:30 2004 +0300
@@ -32,7 +32,6 @@
 
 static struct pgsql_connection *pgsql_connections = NULL;
 
-static int pgsql_conn_open(struct pgsql_connection *conn);
 static void pgsql_conn_close(struct pgsql_connection *conn);
 
 const char *db_pgsql_escape(const char *str)
@@ -53,7 +52,7 @@
 	int failed;
 
 	if (!conn->connected) {
-		if (!pgsql_conn_open(conn)) {
+		if (!db_pgsql_connect(conn)) {
 			request->callback(conn, request, NULL);
 			return;
 		}
@@ -92,7 +91,7 @@
 	i_free(request);
 }
 
-static int pgsql_conn_open(struct pgsql_connection *conn)
+int db_pgsql_connect(struct pgsql_connection *conn)
 {
 	if (conn->connected)
 		return TRUE;
@@ -165,8 +164,6 @@
 	if (!settings_read(config_path, NULL, parse_setting, NULL, conn))
 		exit(FATAL_DEFAULT);
 
-	(void)pgsql_conn_open(conn);
-
 	conn->next = pgsql_connections;
 	pgsql_connections = conn;
 	return conn;
--- a/src/auth/db-pgsql.h	Tue Sep 21 00:27:43 2004 +0300
+++ b/src/auth/db-pgsql.h	Tue Sep 21 00:47:30 2004 +0300
@@ -45,4 +45,6 @@
 struct pgsql_connection *db_pgsql_init(const char *config_path);
 void db_pgsql_unref(struct pgsql_connection *conn);
 
+int db_pgsql_connect(struct pgsql_connection *conn);
+
 #endif
--- a/src/auth/passdb-bsdauth.c	Tue Sep 21 00:27:43 2004 +0300
+++ b/src/auth/passdb-bsdauth.c	Tue Sep 21 00:47:30 2004 +0300
@@ -65,7 +65,7 @@
 }
 
 struct passdb_module passdb_bsdauth = {
-	NULL,
+	NULL, NULL,
 	bsdauth_deinit,
 
 	bsdauth_verify_plain,
--- a/src/auth/passdb-checkpassword.c	Tue Sep 21 00:27:43 2004 +0300
+++ b/src/auth/passdb-checkpassword.c	Tue Sep 21 00:47:30 2004 +0300
@@ -311,6 +311,7 @@
 }
 
 struct passdb_module passdb_checkpassword = {
+	NULL,
 	checkpassword_init,
 	checkpassword_deinit,
 
--- a/src/auth/passdb-ldap.c	Tue Sep 21 00:27:43 2004 +0300
+++ b/src/auth/passdb-ldap.c	Tue Sep 21 00:47:30 2004 +0300
@@ -201,7 +201,7 @@
         ldap_lookup_pass(request, &ldap_request->request);
 }
 
-static void passdb_ldap_init(const char *args)
+static void passdb_ldap_preinit(const char *args)
 {
 	struct ldap_connection *conn;
 
@@ -214,6 +214,11 @@
 			  &passdb_ldap_conn->attr_names);
 }
 
+static void passdb_ldap_init(const char *args __attr_unused__)
+{
+	(void)db_ldap_connect(passdb_ldap_conn->conn);
+}
+
 static void passdb_ldap_deinit(void)
 {
 	db_ldap_unref(passdb_ldap_conn->conn);
@@ -221,6 +226,7 @@
 }
 
 struct passdb_module passdb_ldap = {
+	passdb_ldap_preinit,
 	passdb_ldap_init,
 	passdb_ldap_deinit,
 
--- a/src/auth/passdb-mysql.c	Tue Sep 21 00:27:43 2004 +0300
+++ b/src/auth/passdb-mysql.c	Tue Sep 21 00:47:30 2004 +0300
@@ -153,7 +153,7 @@
         mysql_lookup_pass(request, &mysql_request->request);
 }
 
-static void passdb_mysql_init(const char *args)
+static void passdb_mysql_preinit(const char *args)
 {
 	struct mysql_connection *conn;
 
@@ -161,6 +161,11 @@
 	passdb_mysql_conn->conn = conn = db_mysql_init(args);
 }
 
+static void passdb_mysql_init(const char *args __attr_unused__)
+{
+	(void)db_mysql_connect(passdb_mysql_conn->conn);
+}
+
 static void passdb_mysql_deinit(void)
 {
 	db_mysql_unref(passdb_mysql_conn->conn);
@@ -168,6 +173,7 @@
 }
 
 struct passdb_module passdb_mysql = {
+	passdb_mysql_preinit,
 	passdb_mysql_init,
 	passdb_mysql_deinit,
 
--- a/src/auth/passdb-pam.c	Tue Sep 21 00:27:43 2004 +0300
+++ b/src/auth/passdb-pam.c	Tue Sep 21 00:47:30 2004 +0300
@@ -404,6 +404,7 @@
 }
 
 struct passdb_module passdb_pam = {
+	NULL,
 	pam_init,
 	pam_deinit,
 
--- a/src/auth/passdb-passwd-file.c	Tue Sep 21 00:27:43 2004 +0300
+++ b/src/auth/passdb-passwd-file.c	Tue Sep 21 00:47:30 2004 +0300
@@ -83,6 +83,7 @@
 }
 
 struct passdb_module passdb_passwd_file = {
+	NULL,
 	passwd_file_init,
 	passwd_file_deinit,
 
--- a/src/auth/passdb-passwd.c	Tue Sep 21 00:27:43 2004 +0300
+++ b/src/auth/passdb-passwd.c	Tue Sep 21 00:47:30 2004 +0300
@@ -62,7 +62,7 @@
 }
 
 struct passdb_module passdb_passwd = {
-	NULL,
+	NULL, NULL,
 	passwd_deinit,
 
 	passwd_verify_plain,
--- a/src/auth/passdb-pgsql.c	Tue Sep 21 00:27:43 2004 +0300
+++ b/src/auth/passdb-pgsql.c	Tue Sep 21 00:47:30 2004 +0300
@@ -150,7 +150,7 @@
         pgsql_lookup_pass(request, &pgsql_request->request);
 }
 
-static void passdb_pgsql_init(const char *args)
+static void passdb_pgsql_preinit(const char *args)
 {
 	struct pgsql_connection *conn;
 
@@ -158,6 +158,11 @@
 	passdb_pgsql_conn->conn = conn = db_pgsql_init(args);
 }
 
+static void passdb_pgsql_init(const char *args __attr_unused__)
+{
+	(void)db_pgsql_connect(passdb_pgsql_conn->conn);
+}
+
 static void passdb_pgsql_deinit(void)
 {
 	db_pgsql_unref(passdb_pgsql_conn->conn);
@@ -165,6 +170,7 @@
 }
 
 struct passdb_module passdb_pgsql = {
+	passdb_pgsql_preinit,
 	passdb_pgsql_init,
 	passdb_pgsql_deinit,
 
--- a/src/auth/passdb-shadow.c	Tue Sep 21 00:27:43 2004 +0300
+++ b/src/auth/passdb-shadow.c	Tue Sep 21 00:47:30 2004 +0300
@@ -62,7 +62,7 @@
 }
 
 struct passdb_module passdb_shadow = {
-	NULL,
+	NULL, NULL,
 	shadow_deinit,
 
 	shadow_verify_plain,
--- a/src/auth/passdb-vpopmail.c	Tue Sep 21 00:27:43 2004 +0300
+++ b/src/auth/passdb-vpopmail.c	Tue Sep 21 00:47:30 2004 +0300
@@ -98,7 +98,7 @@
 }
 
 struct passdb_module passdb_vpopmail = {
-	NULL,
+	NULL, NULL,
 	vpopmail_deinit,
 
 	vpopmail_verify_plain,
--- a/src/auth/passdb.c	Tue Sep 21 00:27:43 2004 +0300
+++ b/src/auth/passdb.c	Tue Sep 21 00:47:30 2004 +0300
@@ -13,6 +13,7 @@
 #endif
 
 struct passdb_module *passdb;
+static char *passdb_args;
 
 static const char *
 passdb_credentials_to_str(enum passdb_credentials credentials)
@@ -98,7 +99,7 @@
 	}
 }
 
-void passdb_init(void)
+void passdb_preinit(void)
 {
 	const char *name, *args;
 
@@ -115,6 +116,8 @@
 	while (*args == ' ' || *args == '\t')
 		args++;
 
+	passdb_args = i_strdup(args);
+
 #ifdef PASSDB_PASSWD
 	if (strcasecmp(name, "passwd") == 0)
 		passdb = &passdb_passwd;
@@ -166,13 +169,18 @@
 	if (passdb == NULL)
 		i_fatal("Unknown passdb type '%s'", name);
 
-	/* initialize */
-	if (passdb->init != NULL)
-		passdb->init(args);
+	if (passdb->preinit != NULL)
+		passdb->preinit(passdb_args);
 
 	mech_list_verify_passdb(passdb, name);
 }
 
+void passdb_init(void)
+{
+	if (passdb->init != NULL)
+		passdb->init(passdb_args);
+}
+
 void passdb_deinit(void)
 {
 	if (passdb != NULL && passdb->deinit != NULL)
@@ -181,4 +189,5 @@
 	if (passdb_module != NULL)
                 auth_module_close(passdb_module);
 #endif
+	i_free(passdb_args);
 }
--- a/src/auth/passdb.h	Tue Sep 21 00:27:43 2004 +0300
+++ b/src/auth/passdb.h	Tue Sep 21 00:47:30 2004 +0300
@@ -33,6 +33,7 @@
 					   struct auth_request *request);
 
 struct passdb_module {
+	void (*preinit)(const char *args);
 	void (*init)(const char *args);
 	void (*deinit)(void);
 
@@ -66,6 +67,7 @@
 extern struct passdb_module passdb_pgsql;
 extern struct passdb_module passdb_mysql;
 
+void passdb_preinit(void);
 void passdb_init(void);
 void passdb_deinit(void);
 
--- a/src/auth/userdb-ldap.c	Tue Sep 21 00:27:43 2004 +0300
+++ b/src/auth/userdb-ldap.c	Tue Sep 21 00:47:30 2004 +0300
@@ -179,7 +179,7 @@
 		       &request->request);
 }
 
-static void userdb_ldap_init(const char *args)
+static void userdb_ldap_preinit(const char *args)
 {
 	struct ldap_connection *conn;
 
@@ -192,6 +192,11 @@
 			  &userdb_ldap_conn->attr_names);
 }
 
+static void userdb_ldap_init(const char *args __attr_unused__)
+{
+	(void)db_ldap_connect(userdb_ldap_conn->conn);
+}
+
 static void userdb_ldap_deinit(void)
 {
 	db_ldap_unref(userdb_ldap_conn->conn);
@@ -199,6 +204,7 @@
 }
 
 struct userdb_module userdb_ldap = {
+	userdb_ldap_preinit,
 	userdb_ldap_init,
 	userdb_ldap_deinit,
 
--- a/src/auth/userdb-mysql.c	Tue Sep 21 00:27:43 2004 +0300
+++ b/src/auth/userdb-mysql.c	Tue Sep 21 00:47:30 2004 +0300
@@ -138,7 +138,7 @@
 	db_mysql_query(conn, query, &request->request);
 }
 
-static void userdb_mysql_init(const char *args)
+static void userdb_mysql_preinit(const char *args)
 {
 	struct mysql_connection *conn;
 
@@ -146,6 +146,11 @@
 	userdb_mysql_conn->conn = conn = db_mysql_init(args);
 }
 
+static void userdb_mysql_init(const char *args)
+{
+	(void)db_mysql_connect(userdb_mysql_conn->conn);
+}
+
 static void userdb_mysql_deinit(void)
 {
 	db_mysql_unref(userdb_mysql_conn->conn);
@@ -153,6 +158,7 @@
 }
 
 struct userdb_module userdb_mysql = {
+	userdb_mysql_preinit,
 	userdb_mysql_init,
 	userdb_mysql_deinit,
 
--- a/src/auth/userdb-passwd-file.c	Tue Sep 21 00:27:43 2004 +0300
+++ b/src/auth/userdb-passwd-file.c	Tue Sep 21 00:47:30 2004 +0300
@@ -54,6 +54,7 @@
 }
 
 struct userdb_module userdb_passwd_file = {
+	NULL,
 	passwd_file_init,
 	passwd_file_deinit,
 
--- a/src/auth/userdb-passwd.c	Tue Sep 21 00:27:43 2004 +0300
+++ b/src/auth/userdb-passwd.c	Tue Sep 21 00:47:30 2004 +0300
@@ -37,7 +37,7 @@
 }
 
 struct userdb_module userdb_passwd = {
-	NULL, NULL,
+	NULL, NULL, NULL,
 	passwd_lookup
 };
 
--- a/src/auth/userdb-pgsql.c	Tue Sep 21 00:27:43 2004 +0300
+++ b/src/auth/userdb-pgsql.c	Tue Sep 21 00:47:30 2004 +0300
@@ -108,7 +108,7 @@
 	db_pgsql_query(conn, query, &request->request);
 }
 
-static void userdb_pgsql_init(const char *args)
+static void userdb_pgsql_preinit(const char *args)
 {
 	struct pgsql_connection *conn;
 
@@ -116,6 +116,11 @@
 	userdb_pgsql_conn->conn = conn = db_pgsql_init(args);
 }
 
+static void userdb_pgsql_init(const char *args __attr_unused__)
+{
+	(void)db_pgsql_connect(userdb_pgsql_conn->conn);
+}
+
 static void userdb_pgsql_deinit(void)
 {
 	db_pgsql_unref(userdb_pgsql_conn->conn);
@@ -123,6 +128,7 @@
 }
 
 struct userdb_module userdb_pgsql = {
+	userdb_pgsql_preinit,
 	userdb_pgsql_init,
 	userdb_pgsql_deinit,
 
--- a/src/auth/userdb-static.c	Tue Sep 21 00:27:43 2004 +0300
+++ b/src/auth/userdb-static.c	Tue Sep 21 00:47:30 2004 +0300
@@ -84,6 +84,7 @@
 }
 
 struct userdb_module userdb_static = {
+	NULL,
 	static_init,
 	static_deinit,
 
--- a/src/auth/userdb-vpopmail.c	Tue Sep 21 00:27:43 2004 +0300
+++ b/src/auth/userdb-vpopmail.c	Tue Sep 21 00:47:30 2004 +0300
@@ -106,7 +106,7 @@
 }
 
 struct userdb_module userdb_vpopmail = {
-	NULL, NULL,
+	NULL, NULL, NULL,
 	vpopmail_lookup
 };
 
--- a/src/auth/userdb.c	Tue Sep 21 00:27:43 2004 +0300
+++ b/src/auth/userdb.c	Tue Sep 21 00:47:30 2004 +0300
@@ -11,8 +11,9 @@
 #endif
 
 struct userdb_module *userdb;
+static char *userdb_args;
 
-void userdb_init(void)
+void userdb_preinit(void)
 {
 	const char *name, *args;
 
@@ -29,6 +30,8 @@
 	while (*args == ' ' || *args == '\t')
 		args++;
 
+	userdb_args = i_strdup(args);
+
 #ifdef USERDB_PASSWD
 	if (strcasecmp(name, "passwd") == 0)
 		userdb = &userdb_passwd;
@@ -68,9 +71,14 @@
 	if (userdb == NULL)
 		i_fatal("Unknown userdb type '%s'", name);
 
-	/* initialize */
+	if (userdb->preinit != NULL)
+		userdb->preinit(args);
+}
+
+void userdb_init(void)
+{
 	if (userdb->init != NULL)
-		userdb->init(args);
+		userdb->init(userdb_args);
 }
 
 void userdb_deinit(void)
@@ -81,4 +89,5 @@
 	if (userdb_module != NULL)
                 auth_module_close(userdb_module);
 #endif
+	i_free(userdb_args);
 }
--- a/src/auth/userdb.h	Tue Sep 21 00:27:43 2004 +0300
+++ b/src/auth/userdb.h	Tue Sep 21 00:47:30 2004 +0300
@@ -16,6 +16,7 @@
 typedef void userdb_callback_t(struct user_data *user, void *context);
 
 struct userdb_module {
+	void (*preinit)(const char *args);
 	void (*init)(const char *args);
 	void (*deinit)(void);
 
@@ -33,6 +34,7 @@
 extern struct userdb_module userdb_pgsql;
 extern struct userdb_module userdb_mysql;
 
+void userdb_preinit(void);
 void userdb_init(void);
 void userdb_deinit(void);