passdb.c revision 43a66a0b16299bd4f7615acd85e98bd3832c54d5
5a580c3a38ced62d4bcc95b8ac7c4f2935b5d294Timo Sirainen/* Copyright (C) 2002-2003 Timo Sirainen */
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen#include "common.h"
6157a322f2ac1ea1332d9003ecb0b11466aa8fe7Timo Sirainen#include "array.h"
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen#include "auth-module.h"
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen#include "password-scheme.h"
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen#include "auth-worker-server.h"
8b681dae1e8fa564649e703ab17398dcfaf896e4Timo Sirainen#include "passdb.h"
4bbee99b3aef449a9a2a11a5b5cf1ca486915c49Timo Sirainen
c4cfee078c4a185b5ba8f0c55f51275b7e885b2cTimo Sirainen#include <stdlib.h>
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainenstatic ARRAY_DEFINE(passdb_interfaces, struct passdb_module_interface *);
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainenstatic struct passdb_module_interface *passdb_interface_find(const char *name)
8c02331f9f569d8b30e74b6bc8550734d65f9daeTimo Sirainen{
8c02331f9f569d8b30e74b6bc8550734d65f9daeTimo Sirainen struct passdb_module_interface *const *ifaces;
8c02331f9f569d8b30e74b6bc8550734d65f9daeTimo Sirainen unsigned int i, count;
8c02331f9f569d8b30e74b6bc8550734d65f9daeTimo Sirainen
9bf2dc275ec21bff3d468ab1bc4fddc8874f7d1bTimo Sirainen ifaces = array_get(&passdb_interfaces, &count);
9bf2dc275ec21bff3d468ab1bc4fddc8874f7d1bTimo Sirainen for (i = 0; i < count; i++) {
9bf2dc275ec21bff3d468ab1bc4fddc8874f7d1bTimo Sirainen if (strcmp(ifaces[i]->name, name) == 0)
9bf2dc275ec21bff3d468ab1bc4fddc8874f7d1bTimo Sirainen return ifaces[i];
9bf2dc275ec21bff3d468ab1bc4fddc8874f7d1bTimo Sirainen }
9bf2dc275ec21bff3d468ab1bc4fddc8874f7d1bTimo Sirainen return NULL;
9bf2dc275ec21bff3d468ab1bc4fddc8874f7d1bTimo Sirainen}
9bf2dc275ec21bff3d468ab1bc4fddc8874f7d1bTimo Sirainen
9bf2dc275ec21bff3d468ab1bc4fddc8874f7d1bTimo Sirainenvoid passdb_register_module(struct passdb_module_interface *iface)
9bf2dc275ec21bff3d468ab1bc4fddc8874f7d1bTimo Sirainen{
5c0034beb9933bca2a8b7d83d11dface1ea3b7faTimo Sirainen if (passdb_interface_find(iface->name) != NULL) {
5c0034beb9933bca2a8b7d83d11dface1ea3b7faTimo Sirainen i_panic("passdb_register_module(%s): Already registered",
5c0034beb9933bca2a8b7d83d11dface1ea3b7faTimo Sirainen iface->name);
9bf2dc275ec21bff3d468ab1bc4fddc8874f7d1bTimo Sirainen }
9bf2dc275ec21bff3d468ab1bc4fddc8874f7d1bTimo Sirainen array_append(&passdb_interfaces, &iface, 1);
9bf2dc275ec21bff3d468ab1bc4fddc8874f7d1bTimo Sirainen}
9bf2dc275ec21bff3d468ab1bc4fddc8874f7d1bTimo Sirainen
9bf2dc275ec21bff3d468ab1bc4fddc8874f7d1bTimo Sirainenvoid passdb_unregister_module(struct passdb_module_interface *iface)
9bf2dc275ec21bff3d468ab1bc4fddc8874f7d1bTimo Sirainen{
5c0034beb9933bca2a8b7d83d11dface1ea3b7faTimo Sirainen struct passdb_module_interface *const *ifaces;
5c0034beb9933bca2a8b7d83d11dface1ea3b7faTimo Sirainen unsigned int i, count;
5c0034beb9933bca2a8b7d83d11dface1ea3b7faTimo Sirainen
5c0034beb9933bca2a8b7d83d11dface1ea3b7faTimo Sirainen ifaces = array_get(&passdb_interfaces, &count);
5c0034beb9933bca2a8b7d83d11dface1ea3b7faTimo Sirainen for (i = 0; i < count; i++) {
5c0034beb9933bca2a8b7d83d11dface1ea3b7faTimo Sirainen if (ifaces[i] == iface) {
5c0034beb9933bca2a8b7d83d11dface1ea3b7faTimo Sirainen array_delete(&passdb_interfaces, i, 1);
5c0034beb9933bca2a8b7d83d11dface1ea3b7faTimo Sirainen return;
5c0034beb9933bca2a8b7d83d11dface1ea3b7faTimo Sirainen }
5c0034beb9933bca2a8b7d83d11dface1ea3b7faTimo Sirainen }
5c0034beb9933bca2a8b7d83d11dface1ea3b7faTimo Sirainen i_panic("passdb_unregister_module(%s): Not registered", iface->name);
5c0034beb9933bca2a8b7d83d11dface1ea3b7faTimo Sirainen}
9bf2dc275ec21bff3d468ab1bc4fddc8874f7d1bTimo Sirainen
9bf2dc275ec21bff3d468ab1bc4fddc8874f7d1bTimo Sirainenbool passdb_get_credentials(struct auth_request *auth_request,
9bf2dc275ec21bff3d468ab1bc4fddc8874f7d1bTimo Sirainen const char *input, const char *input_scheme,
9bf2dc275ec21bff3d468ab1bc4fddc8874f7d1bTimo Sirainen const unsigned char **credentials_r, size_t *size_r)
9bf2dc275ec21bff3d468ab1bc4fddc8874f7d1bTimo Sirainen{
9bf2dc275ec21bff3d468ab1bc4fddc8874f7d1bTimo Sirainen const char *wanted_scheme = auth_request->credentials_scheme;
9bf2dc275ec21bff3d468ab1bc4fddc8874f7d1bTimo Sirainen const char *plaintext;
9bf2dc275ec21bff3d468ab1bc4fddc8874f7d1bTimo Sirainen int ret;
9bf2dc275ec21bff3d468ab1bc4fddc8874f7d1bTimo Sirainen
9bf2dc275ec21bff3d468ab1bc4fddc8874f7d1bTimo Sirainen ret = password_decode(input, input_scheme, credentials_r, size_r);
9bf2dc275ec21bff3d468ab1bc4fddc8874f7d1bTimo Sirainen if (ret <= 0) {
9bf2dc275ec21bff3d468ab1bc4fddc8874f7d1bTimo Sirainen if (ret < 0) {
9bf2dc275ec21bff3d468ab1bc4fddc8874f7d1bTimo Sirainen auth_request_log_error(auth_request, "password",
9bf2dc275ec21bff3d468ab1bc4fddc8874f7d1bTimo Sirainen "Invalid password format for scheme %s",
9bf2dc275ec21bff3d468ab1bc4fddc8874f7d1bTimo Sirainen input_scheme);
9bf2dc275ec21bff3d468ab1bc4fddc8874f7d1bTimo Sirainen } else {
9bf2dc275ec21bff3d468ab1bc4fddc8874f7d1bTimo Sirainen auth_request_log_error(auth_request, "password",
9bf2dc275ec21bff3d468ab1bc4fddc8874f7d1bTimo Sirainen "Unknown scheme %s", input_scheme);
008a83e9f680f04f69789fb702232416eab2a86cTimo Sirainen }
008a83e9f680f04f69789fb702232416eab2a86cTimo Sirainen return FALSE;
008a83e9f680f04f69789fb702232416eab2a86cTimo Sirainen }
008a83e9f680f04f69789fb702232416eab2a86cTimo Sirainen
008a83e9f680f04f69789fb702232416eab2a86cTimo Sirainen if (*wanted_scheme == '\0') {
008a83e9f680f04f69789fb702232416eab2a86cTimo Sirainen /* anything goes. change the credentials_scheme to what we
008a83e9f680f04f69789fb702232416eab2a86cTimo Sirainen actually got, so blocking passdbs work. */
008a83e9f680f04f69789fb702232416eab2a86cTimo Sirainen auth_request->credentials_scheme =
008a83e9f680f04f69789fb702232416eab2a86cTimo Sirainen p_strdup(auth_request->pool, input_scheme);
a16d9a651aaa36a308f1aaae87e73e143fdff887Timo Sirainen return TRUE;
a16d9a651aaa36a308f1aaae87e73e143fdff887Timo Sirainen }
008a83e9f680f04f69789fb702232416eab2a86cTimo Sirainen
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 wanted_scheme, input_scheme);
008a83e9f680f04f69789fb702232416eab2a86cTimo Sirainen return FALSE;
008a83e9f680f04f69789fb702232416eab2a86cTimo Sirainen }
008a83e9f680f04f69789fb702232416eab2a86cTimo Sirainen
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 wanted_scheme, credentials_r, size_r)) {
008a83e9f680f04f69789fb702232416eab2a86cTimo Sirainen auth_request_log_error(auth_request, "password",
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen "Requested unknown scheme %s", wanted_scheme);
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen return FALSE;
9d3ccd79130199ffdb19a688027d49bf20a4aaaaTimo Sirainen }
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen }
8d6cb44a0161d88743756733f83c4fb278485987Timo Sirainen
a75d470c9223a75801418fcdda258885c36317e0Timo Sirainen return TRUE;
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen}
be889d9b142fbb5604a922c6955bd7f6ea32f163Timo Sirainen
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainenvoid passdb_handle_credentials(enum passdb_result result,
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen const char *password, const char *scheme,
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen lookup_credentials_callback_t *callback,
3ccab0bac68040f179a7de45c516cec258e28fdbTimo Sirainen struct auth_request *auth_request)
a75d470c9223a75801418fcdda258885c36317e0Timo Sirainen{
a75d470c9223a75801418fcdda258885c36317e0Timo Sirainen const unsigned char *credentials;
008a83e9f680f04f69789fb702232416eab2a86cTimo Sirainen size_t size = 0;
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen if (result != PASSDB_RESULT_OK) {
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen callback(result, NULL, 0, auth_request);
be889d9b142fbb5604a922c6955bd7f6ea32f163Timo Sirainen return;
be889d9b142fbb5604a922c6955bd7f6ea32f163Timo Sirainen }
be889d9b142fbb5604a922c6955bd7f6ea32f163Timo Sirainen
be889d9b142fbb5604a922c6955bd7f6ea32f163Timo Sirainen if (password == NULL ||
be889d9b142fbb5604a922c6955bd7f6ea32f163Timo Sirainen !passdb_get_credentials(auth_request, password, scheme,
be889d9b142fbb5604a922c6955bd7f6ea32f163Timo Sirainen &credentials, &size))
be889d9b142fbb5604a922c6955bd7f6ea32f163Timo Sirainen result = PASSDB_RESULT_SCHEME_NOT_AVAILABLE;
be889d9b142fbb5604a922c6955bd7f6ea32f163Timo Sirainen
be889d9b142fbb5604a922c6955bd7f6ea32f163Timo Sirainen callback(result, credentials, size, auth_request);
be889d9b142fbb5604a922c6955bd7f6ea32f163Timo Sirainen}
be889d9b142fbb5604a922c6955bd7f6ea32f163Timo Sirainen
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainenstruct auth_passdb *passdb_preinit(struct auth *auth, const char *driver,
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen const char *args, unsigned int id)
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen{
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen struct passdb_module_interface *iface;
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen struct auth_passdb *auth_passdb;
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen
0cea9b1f4fa0495a48f5f097e40492517d67e1baTimo Sirainen if (args == NULL) args = "";
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen auth_passdb = p_new(auth->pool, struct auth_passdb, 1);
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen auth_passdb->auth = auth;
0cea9b1f4fa0495a48f5f097e40492517d67e1baTimo Sirainen auth_passdb->args = p_strdup(auth->pool, args);
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen auth_passdb->id = id;
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen iface = passdb_interface_find(driver);
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen#ifdef HAVE_MODULES
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen if (iface == NULL)
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen auth_passdb->module = auth_module_open(driver);
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen if (auth_passdb->module != NULL) {
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen iface = auth_module_sym(auth_passdb->module,
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen t_strconcat("passdb_", driver, NULL));
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen }
8d6cb44a0161d88743756733f83c4fb278485987Timo Sirainen#endif
4bbee99b3aef449a9a2a11a5b5cf1ca486915c49Timo Sirainen
8d6cb44a0161d88743756733f83c4fb278485987Timo Sirainen if (iface == NULL) {
008a83e9f680f04f69789fb702232416eab2a86cTimo Sirainen i_fatal("Unknown passdb driver '%s' "
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen "(typo, or Dovecot was built without support for it? "
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen "Check with dovecot --build-options)",
9bf2dc275ec21bff3d468ab1bc4fddc8874f7d1bTimo Sirainen driver);
8ae72ad7d0c69e972cfa65d1e2ce4e3e9a8b765cTimo Sirainen }
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen
a75d470c9223a75801418fcdda258885c36317e0Timo Sirainen if (iface->preinit == NULL) {
a75d470c9223a75801418fcdda258885c36317e0Timo Sirainen auth_passdb->passdb =
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen p_new(auth->pool, struct passdb_module, 1);
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen } else {
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen auth_passdb->passdb =
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen iface->preinit(auth_passdb, auth_passdb->args);
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen }
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen auth_passdb->passdb->iface = *iface;
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen return auth_passdb;
a75d470c9223a75801418fcdda258885c36317e0Timo Sirainen}
a75d470c9223a75801418fcdda258885c36317e0Timo Sirainen
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainenvoid passdb_init(struct auth_passdb *passdb)
a75d470c9223a75801418fcdda258885c36317e0Timo Sirainen{
a75d470c9223a75801418fcdda258885c36317e0Timo Sirainen if (passdb->passdb->iface.init != NULL)
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen passdb->passdb->iface.init(passdb->passdb, passdb->args);
8ae72ad7d0c69e972cfa65d1e2ce4e3e9a8b765cTimo Sirainen
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen i_assert(passdb->passdb->default_pass_scheme != NULL ||
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen passdb->passdb->cache_key == NULL);
e2e105f6182f550efa82f77d2a46b3e8a2d4da10Timo Sirainen
e2e105f6182f550efa82f77d2a46b3e8a2d4da10Timo Sirainen if (passdb->passdb->blocking && !worker) {
e2e105f6182f550efa82f77d2a46b3e8a2d4da10Timo Sirainen /* blocking passdb - we need an auth server */
e2e105f6182f550efa82f77d2a46b3e8a2d4da10Timo Sirainen auth_worker_server_init();
e2e105f6182f550efa82f77d2a46b3e8a2d4da10Timo Sirainen }
e2e105f6182f550efa82f77d2a46b3e8a2d4da10Timo Sirainen}
e2e105f6182f550efa82f77d2a46b3e8a2d4da10Timo Sirainen
e2e105f6182f550efa82f77d2a46b3e8a2d4da10Timo Sirainenvoid passdb_deinit(struct auth_passdb *passdb)
16598a1fb870ae40d6177755a4306216e4d6a4cdTimo Sirainen{
16598a1fb870ae40d6177755a4306216e4d6a4cdTimo Sirainen if (passdb->passdb->iface.deinit != NULL)
16598a1fb870ae40d6177755a4306216e4d6a4cdTimo Sirainen passdb->passdb->iface.deinit(passdb->passdb);
16598a1fb870ae40d6177755a4306216e4d6a4cdTimo Sirainen#ifdef HAVE_MODULES
16598a1fb870ae40d6177755a4306216e4d6a4cdTimo Sirainen if (passdb->module != NULL)
16598a1fb870ae40d6177755a4306216e4d6a4cdTimo Sirainen auth_module_close(&passdb->module);
16598a1fb870ae40d6177755a4306216e4d6a4cdTimo Sirainen#endif
bc793bfcee945ce8871edfa298fe7235744425b6Timo Sirainen}
bc793bfcee945ce8871edfa298fe7235744425b6Timo Sirainen
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;
16598a1fb870ae40d6177755a4306216e4d6a4cdTimo Sirainen
16598a1fb870ae40d6177755a4306216e4d6a4cdTimo Sirainenvoid passdbs_init(void)
82ed69779f49bd71ef1b570ce8aca67d357dbee8Timo Sirainen{
82ed69779f49bd71ef1b570ce8aca67d357dbee8Timo Sirainen i_array_init(&passdb_interfaces, 16);
82ed69779f49bd71ef1b570ce8aca67d357dbee8Timo Sirainen#ifdef PASSDB_PASSWD
82ed69779f49bd71ef1b570ce8aca67d357dbee8Timo Sirainen passdb_register_module(&passdb_passwd);
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen#endif
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen#ifdef PASSDB_BSDAUTH
8b681dae1e8fa564649e703ab17398dcfaf896e4Timo Sirainen passdb_register_module(&passdb_bsdauth);
82ed69779f49bd71ef1b570ce8aca67d357dbee8Timo Sirainen#endif
05d1312c8456f9d548470bf5662481a4cf812d70Timo Sirainen#ifdef PASSDB_PASSWD_FILE
abb83d133dd082527d500916fca66a72fbbbaa8dTimo Sirainen passdb_register_module(&passdb_passwd_file);
8b681dae1e8fa564649e703ab17398dcfaf896e4Timo Sirainen#endif
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen#ifdef PASSDB_PAM
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen passdb_register_module(&passdb_pam);
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen#endif
82ed69779f49bd71ef1b570ce8aca67d357dbee8Timo Sirainen#ifdef PASSDB_CHECKPASSWORD
82ed69779f49bd71ef1b570ce8aca67d357dbee8Timo Sirainen passdb_register_module(&passdb_checkpassword);
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen#endif
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen#ifdef PASSDB_SHADOW
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen passdb_register_module(&passdb_shadow);
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen#endif
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen#ifdef PASSDB_VPOPMAIL
6e235046e1d8e9d89fc948f5c623676c20421a28Timo Sirainen passdb_register_module(&passdb_vpopmail);
6e235046e1d8e9d89fc948f5c623676c20421a28Timo Sirainen#endif
44ff75ca53188056ff5a3e50428e3f2078800b3cTimo Sirainen#ifdef PASSDB_LDAP
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen passdb_register_module(&passdb_ldap);
4bbee99b3aef449a9a2a11a5b5cf1ca486915c49Timo Sirainen#endif
4bbee99b3aef449a9a2a11a5b5cf1ca486915c49Timo Sirainen#ifdef PASSDB_SQL
4bbee99b3aef449a9a2a11a5b5cf1ca486915c49Timo Sirainen passdb_register_module(&passdb_sql);
4bbee99b3aef449a9a2a11a5b5cf1ca486915c49Timo Sirainen#endif
4bbee99b3aef449a9a2a11a5b5cf1ca486915c49Timo Sirainen#ifdef PASSDB_SIA
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen passdb_register_module(&passdb_sia);
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen#endif
ab1e5b156d1b5480d36ed6e8e06197339d803038Timo Sirainen}
82ed69779f49bd71ef1b570ce8aca67d357dbee8Timo Sirainen
82ed69779f49bd71ef1b570ce8aca67d357dbee8Timo Sirainenvoid passdbs_deinit(void)
82ed69779f49bd71ef1b570ce8aca67d357dbee8Timo Sirainen{
82ed69779f49bd71ef1b570ce8aca67d357dbee8Timo Sirainen array_free(&passdb_interfaces);
82ed69779f49bd71ef1b570ce8aca67d357dbee8Timo Sirainen}
73b251f13abfbd8e06c8c78784eb570d28fe7e40Timo Sirainen