passdb.c revision bcb4e51a409d94ae670de96afb8483a4f7855294
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch/* Copyright (c) 2002-2018 Dovecot authors, see the included COPYING file */
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Boschstatic ARRAY(struct passdb_module_interface *) passdb_interfaces;
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Boschstatic ARRAY(struct passdb_module *) passdb_modules;
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Boschstatic const struct passdb_module_interface passdb_iface_deinit = {
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Boschstatic struct passdb_module_interface *passdb_interface_find(const char *name)
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch struct passdb_module_interface *const *ifaces;
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch struct passdb_module_interface *iface = *ifaces;
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Boschvoid passdb_register_module(struct passdb_module_interface *iface)
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch old_iface = passdb_interface_find(iface->name);
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch if (old_iface != NULL && old_iface->verify_plain == NULL) {
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch /* replacing a "support not compiled in" passdb */
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch i_panic("passdb_register_module(%s): Already registered",
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Boschvoid passdb_unregister_module(struct passdb_module_interface *iface)
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch struct passdb_module_interface *const *ifaces;
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch unsigned int idx;
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch idx = array_foreach_idx(&passdb_interfaces, ifaces);
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch i_panic("passdb_unregister_module(%s): Not registered", iface->name);
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Boschbool passdb_get_credentials(struct auth_request *auth_request,
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch const unsigned char **credentials_r, size_t *size_r)
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch const char *wanted_scheme = auth_request->credentials_scheme;
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch struct password_generate_params pwd_gen_params;
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch password_scheme_is_alias(input_scheme, "PLAIN")) {
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch /* we've a plaintext scheme and we prefer to get it instead
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch of converting it to the fallback scheme */
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch auth_request_log_error(auth_request, AUTH_SUBSYS_DB,
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch "Password data is not valid for scheme %s: %s",
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch auth_request_log_error(auth_request, AUTH_SUBSYS_DB,
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch /* anything goes. change the credentials_scheme to what we
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch actually got, so blocking passdbs work. */
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch p_strdup(auth_request->pool, t_strcut(input_scheme, '.'));
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch if (!password_scheme_is_alias(input_scheme, wanted_scheme)) {
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch if (!password_scheme_is_alias(input_scheme, "PLAIN")) {
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch "Requested %s scheme, but we have only %s",
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch auth_request_log_info(auth_request, AUTH_SUBSYS_DB,
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch /* we can generate anything out of plaintext passwords */
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch plaintext = t_strndup(*credentials_r, *size_r);
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch pwd_gen_params.user = auth_request->original_username;
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch /* domain must not be used as realm. add the @realm. */
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch pwd_gen_params.user = t_strconcat(pwd_gen_params.user, "@",
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch auth_request_log_debug(auth_request, AUTH_SUBSYS_DB,
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch "Generating %s from user '%s', password '%s'",
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch wanted_scheme, pwd_gen_params.user, plaintext);
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch if (!password_generate(plaintext, &pwd_gen_params,
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch auth_request_log_error(auth_request, AUTH_SUBSYS_DB,
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Bosch "Requested unknown scheme %s", wanted_scheme);
74bc7e646663255703e10e0c0b7242ad7ad52f94Stephan Boschvoid passdb_handle_credentials(enum passdb_result result,
static struct passdb_module *
unsigned int i, count;
for (i = 0; i < count; i++) {
*idx_r = i;
return passdbs[i];
return NULL;
struct passdb_module *
static unsigned int auth_passdb_id = 0;
unsigned int idx;
return passdb;
return passdb;
unsigned int idx;
i_unreached();
unsigned int i, count;
for (i = 0; i < count; i++) {
#ifdef HAVE_LUA
void passdbs_init(void)
#ifdef HAVE_LUA
void passdbs_deinit(void)