passdb.c revision 43a66a0b16299bd4f7615acd85e98bd3832c54d5
5a580c3a38ced62d4bcc95b8ac7c4f2935b5d294Timo Sirainen/* Copyright (C) 2002-2003 Timo Sirainen */
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainenstatic ARRAY_DEFINE(passdb_interfaces, struct passdb_module_interface *);
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainenstatic struct passdb_module_interface *passdb_interface_find(const char *name)
8c02331f9f569d8b30e74b6bc8550734d65f9daeTimo Sirainen struct passdb_module_interface *const *ifaces;
8c02331f9f569d8b30e74b6bc8550734d65f9daeTimo Sirainen unsigned int i, count;
9bf2dc275ec21bff3d468ab1bc4fddc8874f7d1bTimo Sirainen ifaces = array_get(&passdb_interfaces, &count);
9bf2dc275ec21bff3d468ab1bc4fddc8874f7d1bTimo Sirainen for (i = 0; i < count; i++) {
9bf2dc275ec21bff3d468ab1bc4fddc8874f7d1bTimo Sirainenvoid passdb_register_module(struct passdb_module_interface *iface)
5c0034beb9933bca2a8b7d83d11dface1ea3b7faTimo Sirainen if (passdb_interface_find(iface->name) != NULL) {
5c0034beb9933bca2a8b7d83d11dface1ea3b7faTimo Sirainen i_panic("passdb_register_module(%s): Already registered",
9bf2dc275ec21bff3d468ab1bc4fddc8874f7d1bTimo Sirainenvoid passdb_unregister_module(struct passdb_module_interface *iface)
5c0034beb9933bca2a8b7d83d11dface1ea3b7faTimo Sirainen struct passdb_module_interface *const *ifaces;
5c0034beb9933bca2a8b7d83d11dface1ea3b7faTimo Sirainen unsigned int i, count;
5c0034beb9933bca2a8b7d83d11dface1ea3b7faTimo Sirainen ifaces = array_get(&passdb_interfaces, &count);
5c0034beb9933bca2a8b7d83d11dface1ea3b7faTimo Sirainen for (i = 0; i < count; i++) {
5c0034beb9933bca2a8b7d83d11dface1ea3b7faTimo Sirainen i_panic("passdb_unregister_module(%s): Not registered", iface->name);
9bf2dc275ec21bff3d468ab1bc4fddc8874f7d1bTimo Sirainenbool passdb_get_credentials(struct auth_request *auth_request,
9bf2dc275ec21bff3d468ab1bc4fddc8874f7d1bTimo Sirainen const unsigned char **credentials_r, size_t *size_r)
9bf2dc275ec21bff3d468ab1bc4fddc8874f7d1bTimo Sirainen const char *wanted_scheme = auth_request->credentials_scheme;
9bf2dc275ec21bff3d468ab1bc4fddc8874f7d1bTimo Sirainen ret = password_decode(input, input_scheme, credentials_r, size_r);
9bf2dc275ec21bff3d468ab1bc4fddc8874f7d1bTimo Sirainen auth_request_log_error(auth_request, "password",
9bf2dc275ec21bff3d468ab1bc4fddc8874f7d1bTimo Sirainen "Invalid password format for scheme %s",
9bf2dc275ec21bff3d468ab1bc4fddc8874f7d1bTimo Sirainen auth_request_log_error(auth_request, "password",
008a83e9f680f04f69789fb702232416eab2a86cTimo Sirainen /* anything goes. change the credentials_scheme to what we
008a83e9f680f04f69789fb702232416eab2a86cTimo Sirainen actually got, so blocking passdbs work. */
008a83e9f680f04f69789fb702232416eab2a86cTimo Sirainen if (!password_scheme_is_alias(input_scheme, wanted_scheme)) {
008a83e9f680f04f69789fb702232416eab2a86cTimo Sirainen if (!password_scheme_is_alias(input_scheme, "PLAIN")) {
008a83e9f680f04f69789fb702232416eab2a86cTimo Sirainen auth_request_log_info(auth_request, "password",
008a83e9f680f04f69789fb702232416eab2a86cTimo Sirainen "Requested %s scheme, but we have only %s",
008a83e9f680f04f69789fb702232416eab2a86cTimo Sirainen /* we can generate anything out of plaintext passwords */
008a83e9f680f04f69789fb702232416eab2a86cTimo Sirainen plaintext = t_strndup(*credentials_r, *size_r);
008a83e9f680f04f69789fb702232416eab2a86cTimo Sirainen if (!password_generate(plaintext, auth_request->user,
008a83e9f680f04f69789fb702232416eab2a86cTimo Sirainen auth_request_log_error(auth_request, "password",
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen "Requested unknown scheme %s", wanted_scheme);
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainenvoid passdb_handle_credentials(enum passdb_result result,
a75d470c9223a75801418fcdda258885c36317e0Timo Sirainen const unsigned char *credentials;
be889d9b142fbb5604a922c6955bd7f6ea32f163Timo Sirainen !passdb_get_credentials(auth_request, password, scheme,
be889d9b142fbb5604a922c6955bd7f6ea32f163Timo Sirainen callback(result, credentials, size, auth_request);
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainenstruct auth_passdb *passdb_preinit(struct auth *auth, const char *driver,
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen auth_passdb = p_new(auth->pool, struct auth_passdb, 1);
0cea9b1f4fa0495a48f5f097e40492517d67e1baTimo Sirainen auth_passdb->args = p_strdup(auth->pool, args);
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen auth_passdb->module = auth_module_open(driver);
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen "(typo, or Dovecot was built without support for it? "
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen "Check with dovecot --build-options)",
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen iface->preinit(auth_passdb, auth_passdb->args);
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen passdb->passdb->iface.init(passdb->passdb, passdb->args);
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen i_assert(passdb->passdb->default_pass_scheme != NULL ||
e2e105f6182f550efa82f77d2a46b3e8a2d4da10Timo Sirainen /* blocking passdb - we need an auth server */
bc793bfcee945ce8871edfa298fe7235744425b6Timo Sirainenextern struct passdb_module_interface passdb_passwd;
32c24eab7111799d880139634144ba8aea5a666eTimo Sirainenextern struct passdb_module_interface passdb_bsdauth;
32c24eab7111799d880139634144ba8aea5a666eTimo Sirainenextern struct passdb_module_interface passdb_shadow;
ea4ca37ec14913354f3a0deebc0df96097eb9468Timo Sirainenextern struct passdb_module_interface passdb_passwd_file;
16598a1fb870ae40d6177755a4306216e4d6a4cdTimo Sirainenextern struct passdb_module_interface passdb_pam;
ea4ca37ec14913354f3a0deebc0df96097eb9468Timo Sirainenextern struct passdb_module_interface passdb_checkpassword;
ea4ca37ec14913354f3a0deebc0df96097eb9468Timo Sirainenextern struct passdb_module_interface passdb_vpopmail;
16598a1fb870ae40d6177755a4306216e4d6a4cdTimo Sirainenextern struct passdb_module_interface passdb_ldap;
16598a1fb870ae40d6177755a4306216e4d6a4cdTimo Sirainenextern struct passdb_module_interface passdb_sql;
16598a1fb870ae40d6177755a4306216e4d6a4cdTimo Sirainenextern struct passdb_module_interface passdb_sia;