passdb.c revision d5abbb932a0a598f002da39a8b3326643b1b5efc
76b43e4417bab52e913da39b5f5bc2a130d3f149Timo Sirainen/* Copyright (c) 2002-2008 Dovecot authors, see the included COPYING file */
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainenstatic ARRAY_DEFINE(passdb_interfaces, struct passdb_module_interface *);
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainenstatic struct passdb_module_interface *passdb_interface_find(const char *name)
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen struct passdb_module_interface *const *ifaces;
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen unsigned int i, count;
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen ifaces = array_get(&passdb_interfaces, &count);
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen for (i = 0; i < count; i++) {
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainenvoid passdb_register_module(struct passdb_module_interface *iface)
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen if (passdb_interface_find(iface->name) != NULL) {
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen i_panic("passdb_register_module(%s): Already registered",
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainenvoid passdb_unregister_module(struct passdb_module_interface *iface)
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen struct passdb_module_interface *const *ifaces;
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen unsigned int i, count;
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen ifaces = array_get(&passdb_interfaces, &count);
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen for (i = 0; i < count; i++) {
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen i_panic("passdb_unregister_module(%s): Not registered", iface->name);
b44650b0f48a4b5f0dc240ed836833a00b643b9fTimo Sirainenbool passdb_get_credentials(struct auth_request *auth_request,
b44650b0f48a4b5f0dc240ed836833a00b643b9fTimo Sirainen const unsigned char **credentials_r, size_t *size_r)
a8e132559a7ebe54c8269d79ce29fa3338c76199Timo Sirainen const char *wanted_scheme = auth_request->credentials_scheme;
b44650b0f48a4b5f0dc240ed836833a00b643b9fTimo Sirainen ret = password_decode(input, input_scheme, credentials_r, size_r);
b44650b0f48a4b5f0dc240ed836833a00b643b9fTimo Sirainen auth_request_log_error(auth_request, "password",
b44650b0f48a4b5f0dc240ed836833a00b643b9fTimo Sirainen "Invalid password format for scheme %s",
b44650b0f48a4b5f0dc240ed836833a00b643b9fTimo Sirainen auth_request_log_error(auth_request, "password",
b4f2560c29dacd066ba89e782d95ceed7ac473a3Timo Sirainen /* anything goes. change the credentials_scheme to what we
b4f2560c29dacd066ba89e782d95ceed7ac473a3Timo Sirainen actually got, so blocking passdbs work. */
b44650b0f48a4b5f0dc240ed836833a00b643b9fTimo Sirainen if (!password_scheme_is_alias(input_scheme, wanted_scheme)) {
b44650b0f48a4b5f0dc240ed836833a00b643b9fTimo Sirainen if (!password_scheme_is_alias(input_scheme, "PLAIN")) {
49e513d090753ccbf95560b2f3a21f081a5b6c51Timo Sirainen "Requested %s scheme, but we have only %s",
ac713658d206e8d001fef7c0e36945793f2eb942Timo Sirainen if (auth_request->auth->verbose_debug_passwords) {
ac713658d206e8d001fef7c0e36945793f2eb942Timo Sirainen auth_request_log_info(auth_request, "password",
517d1e7142d57299c733b30423e35e7e1f8d01d6Timo Sirainen /* we can generate anything out of plaintext passwords */
b44650b0f48a4b5f0dc240ed836833a00b643b9fTimo Sirainen plaintext = t_strndup(*credentials_r, *size_r);
b44650b0f48a4b5f0dc240ed836833a00b643b9fTimo Sirainen auth_request_log_error(auth_request, "password",
b44650b0f48a4b5f0dc240ed836833a00b643b9fTimo Sirainen "Requested unknown scheme %s", wanted_scheme);
f968e62caa52a8924bd05ebf76ff515b5c18e17bTimo Sirainenvoid passdb_handle_credentials(enum passdb_result result,
b44650b0f48a4b5f0dc240ed836833a00b643b9fTimo Sirainen const unsigned char *credentials;
b44650b0f48a4b5f0dc240ed836833a00b643b9fTimo Sirainen !passdb_get_credentials(auth_request, password, scheme,
b44650b0f48a4b5f0dc240ed836833a00b643b9fTimo Sirainen callback(result, credentials, size, auth_request);
157bce86d0a01477bb8ebd0d380e6b2297f326f7Timo Sirainenstruct auth_passdb *passdb_preinit(struct auth *auth, const char *driver,
e9503210d3521a6833ed62dc332fc42ffb0e7a13Timo Sirainen auth_passdb = p_new(auth->pool, struct auth_passdb, 1);
8eb94c5190ba09bb6f6f068eec7bf96750f08d1dTimo Sirainen auth_passdb->args = p_strdup(auth->pool, args);
d5abbb932a0a598f002da39a8b3326643b1b5efcTimo Sirainen i_fatal("Unknown passdb driver '%s'", driver);
d5abbb932a0a598f002da39a8b3326643b1b5efcTimo Sirainen i_fatal("Support not compiled in for passdb driver '%s'",
b321df9603081896b70ec44635af96d674a9839aTimo Sirainen iface->preinit(auth_passdb, auth_passdb->args);
25ee72451d16374ed27fdbf829f4ec756c778352Timo Sirainen passdb->passdb->iface.init(passdb->passdb, passdb->args);
e9503210d3521a6833ed62dc332fc42ffb0e7a13Timo Sirainen i_assert(passdb->passdb->default_pass_scheme != NULL ||
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen /* blocking passdb - we need an auth server */
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainenextern struct passdb_module_interface passdb_passwd;
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainenextern struct passdb_module_interface passdb_bsdauth;
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainenextern struct passdb_module_interface passdb_shadow;
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainenextern struct passdb_module_interface passdb_passwd_file;
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainenextern struct passdb_module_interface passdb_pam;
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainenextern struct passdb_module_interface passdb_checkpassword;
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainenextern struct passdb_module_interface passdb_vpopmail;
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainenextern struct passdb_module_interface passdb_ldap;
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainenextern struct passdb_module_interface passdb_sql;
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainenextern struct passdb_module_interface passdb_sia;