Mercurial > dovecot > core-2.2
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);