passdb.c revision 446e518e4fe86ff40e33543445f4e99edf840a21
02c335c23bf5fa225a467c19f2c063fb0dc7b8c3Timo Sirainen/* Copyright (c) 2002-2009 Dovecot authors, see the included COPYING file */
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainenstatic ARRAY_DEFINE(passdb_interfaces, struct passdb_module_interface *);
9e86ad9eb313004cd4c8b5427daeb4c241b57af6Timo Sirainenstatic struct passdb_module_interface *passdb_interface_find(const char *name)
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainen struct passdb_module_interface *const *ifaces;
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainen unsigned int i, count;
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainen ifaces = array_get(&passdb_interfaces, &count);
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainen for (i = 0; i < count; i++) {
6e77746e501c2b45850b1c530836058ed75e09eeTimo Sirainenvoid passdb_register_module(struct passdb_module_interface *iface)
6e77746e501c2b45850b1c530836058ed75e09eeTimo Sirainen if (passdb_interface_find(iface->name) != NULL) {
6e77746e501c2b45850b1c530836058ed75e09eeTimo Sirainen i_panic("passdb_register_module(%s): Already registered",
6e77746e501c2b45850b1c530836058ed75e09eeTimo Sirainenvoid passdb_unregister_module(struct passdb_module_interface *iface)
6e77746e501c2b45850b1c530836058ed75e09eeTimo Sirainen struct passdb_module_interface *const *ifaces;
6e77746e501c2b45850b1c530836058ed75e09eeTimo Sirainen unsigned int i, count;
8c8f7ac580b661aee3d8b8dd37df4a9b41c77000Timo Sirainen ifaces = array_get(&passdb_interfaces, &count);
8c8f7ac580b661aee3d8b8dd37df4a9b41c77000Timo Sirainen for (i = 0; i < count; i++) {
8c8f7ac580b661aee3d8b8dd37df4a9b41c77000Timo Sirainen i_panic("passdb_unregister_module(%s): Not registered", iface->name);
8c8f7ac580b661aee3d8b8dd37df4a9b41c77000Timo Sirainenbool passdb_get_credentials(struct auth_request *auth_request,
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainen const unsigned char **credentials_r, size_t *size_r)
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainen const char *wanted_scheme = auth_request->credentials_scheme;
0dc7891233a973829f00371b27810f849b987c66Timo Sirainen password_scheme_is_alias(input_scheme, "PLAIN")) {
0dc7891233a973829f00371b27810f849b987c66Timo Sirainen /* we've a plaintext scheme and we prefer to get it instead
0dc7891233a973829f00371b27810f849b987c66Timo Sirainen of converting it to the fallback scheme */
0dc7891233a973829f00371b27810f849b987c66Timo Sirainen ret = password_decode(input, input_scheme, credentials_r, size_r);
b5ff746939712c6a9bef71405fa786d5471cf177Timo Sirainen auth_request_log_error(auth_request, "password",
b5ff746939712c6a9bef71405fa786d5471cf177Timo Sirainen "Invalid password format for scheme %s",
b5ff746939712c6a9bef71405fa786d5471cf177Timo Sirainen auth_request_log_error(auth_request, "password",
b5ff746939712c6a9bef71405fa786d5471cf177Timo Sirainen /* anything goes. change the credentials_scheme to what we
b5ff746939712c6a9bef71405fa786d5471cf177Timo Sirainen actually got, so blocking passdbs work. */
b5ff746939712c6a9bef71405fa786d5471cf177Timo Sirainen if (!password_scheme_is_alias(input_scheme, wanted_scheme)) {
b5ff746939712c6a9bef71405fa786d5471cf177Timo Sirainen if (!password_scheme_is_alias(input_scheme, "PLAIN")) {
b5ff746939712c6a9bef71405fa786d5471cf177Timo Sirainen "Requested %s scheme, but we have only %s",
b5ff746939712c6a9bef71405fa786d5471cf177Timo Sirainen if (auth_request->auth->verbose_debug_passwords) {
b5ff746939712c6a9bef71405fa786d5471cf177Timo Sirainen auth_request_log_info(auth_request, "password",
d9a7e950a9cd21f2b4a90ec7759fca9e8fcc7995Timo Sirainen /* we can generate anything out of plaintext passwords */
b5ff746939712c6a9bef71405fa786d5471cf177Timo Sirainen plaintext = t_strndup(*credentials_r, *size_r);
b5ff746939712c6a9bef71405fa786d5471cf177Timo Sirainen /* domain must not be used as realm. add the @realm. */
b5ff746939712c6a9bef71405fa786d5471cf177Timo Sirainen if (auth_request->auth->verbose_debug_passwords) {
b5ff746939712c6a9bef71405fa786d5471cf177Timo Sirainen auth_request_log_info(auth_request, "password",
b5ff746939712c6a9bef71405fa786d5471cf177Timo Sirainen "Generating %s from user '%s', password '%s'",
b5ff746939712c6a9bef71405fa786d5471cf177Timo Sirainen auth_request_log_error(auth_request, "password",
b5ff746939712c6a9bef71405fa786d5471cf177Timo Sirainen "Requested unknown scheme %s", wanted_scheme);
b5ff746939712c6a9bef71405fa786d5471cf177Timo Sirainenvoid passdb_handle_credentials(enum passdb_result result,
b5ff746939712c6a9bef71405fa786d5471cf177Timo Sirainen const unsigned char *credentials;
b5ff746939712c6a9bef71405fa786d5471cf177Timo Sirainen auth_request_log_info(auth_request, "password",
1107c86ff3fa4f29796c2e76134b78d0b4a0db50Timo Sirainen "Requested %s scheme, but we have a NULL password",
b5ff746939712c6a9bef71405fa786d5471cf177Timo Sirainen } else if (!passdb_get_credentials(auth_request, password, scheme,
b5ff746939712c6a9bef71405fa786d5471cf177Timo Sirainen callback(result, credentials, size, auth_request);
b5ff746939712c6a9bef71405fa786d5471cf177Timo Sirainenstruct auth_passdb *passdb_preinit(struct auth *auth, const char *driver,
a8b37b688ceaa3ed3d40b3ccbdba5bb75cfb64b0Timo Sirainen auth_passdb = p_new(auth->pool, struct auth_passdb, 1);
4eb418849d5c6bf77b2721e4e6aef2e97deaa197Timo Sirainen auth_passdb->args = p_strdup(auth->pool, args);
02b32cf39a098edf60981fc228e4b034f11f3b90Timo Sirainen i_fatal("Unknown passdb driver '%s'", driver);
4eb418849d5c6bf77b2721e4e6aef2e97deaa197Timo Sirainen i_fatal("Support not compiled in for passdb driver '%s'",
02b32cf39a098edf60981fc228e4b034f11f3b90Timo Sirainen if (iface->preinit == NULL && iface->init == NULL &&
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainen i_fatal("passdb %s: No args are supported: %s",
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainen iface->preinit(auth_passdb, auth_passdb->args);
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainen passdb->passdb->iface.init(passdb->passdb, passdb->args);
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainen i_assert(passdb->passdb->default_pass_scheme != NULL ||
f83fd83f9c6708d198748e714aa947cad9362c02Timo Sirainen /* blocking passdb - we need an auth server */
0dc7891233a973829f00371b27810f849b987c66Timo Sirainenextern struct passdb_module_interface passdb_passwd;
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainenextern struct passdb_module_interface passdb_bsdauth;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainenextern struct passdb_module_interface passdb_shadow;
9e86ad9eb313004cd4c8b5427daeb4c241b57af6Timo Sirainenextern struct passdb_module_interface passdb_passwd_file;
4eb418849d5c6bf77b2721e4e6aef2e97deaa197Timo Sirainenextern struct passdb_module_interface passdb_pam;
9e86ad9eb313004cd4c8b5427daeb4c241b57af6Timo Sirainenextern struct passdb_module_interface passdb_checkpassword;
0dc7891233a973829f00371b27810f849b987c66Timo Sirainenextern struct passdb_module_interface passdb_vpopmail;
0dc7891233a973829f00371b27810f849b987c66Timo Sirainenextern struct passdb_module_interface passdb_ldap;
b5ff746939712c6a9bef71405fa786d5471cf177Timo Sirainenextern struct passdb_module_interface passdb_sql;
b5ff746939712c6a9bef71405fa786d5471cf177Timo Sirainenextern struct passdb_module_interface passdb_sia;