passdb.c revision 70cb37c37e4dce8f57cd3f882f7444e76b918bef
30d2f45dd260208f0fb882dde134a249318524b9Lubos Kosco/* Copyright (C) 2002-2003 Timo Sirainen */
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner#include "common.h"
30d2f45dd260208f0fb882dde134a249318524b9Lubos Kosco#include "mech.h"
30d2f45dd260208f0fb882dde134a249318524b9Lubos Kosco#include "auth-module.h"
30d2f45dd260208f0fb882dde134a249318524b9Lubos Kosco#include "passdb.h"
30d2f45dd260208f0fb882dde134a249318524b9Lubos Kosco
30d2f45dd260208f0fb882dde134a249318524b9Lubos Kosco#include <stdlib.h>
30d2f45dd260208f0fb882dde134a249318524b9Lubos Kosco
30d2f45dd260208f0fb882dde134a249318524b9Lubos Kosco#ifdef AUTH_MODULES
30d2f45dd260208f0fb882dde134a249318524b9Lubos Koscostatic struct auth_module *passdb_module = NULL;
30d2f45dd260208f0fb882dde134a249318524b9Lubos Kosco#endif
30d2f45dd260208f0fb882dde134a249318524b9Lubos Kosco
30d2f45dd260208f0fb882dde134a249318524b9Lubos Koscostruct passdb_module *passdb;
30d2f45dd260208f0fb882dde134a249318524b9Lubos Kosco
30d2f45dd260208f0fb882dde134a249318524b9Lubos Koscoconst char *passdb_credentials_to_str(enum passdb_credentials credentials)
30d2f45dd260208f0fb882dde134a249318524b9Lubos Kosco{
30d2f45dd260208f0fb882dde134a249318524b9Lubos Kosco switch (credentials) {
30d2f45dd260208f0fb882dde134a249318524b9Lubos Kosco case _PASSDB_CREDENTIALS_INTERNAL:
30d2f45dd260208f0fb882dde134a249318524b9Lubos Kosco break;
30d2f45dd260208f0fb882dde134a249318524b9Lubos Kosco case PASSDB_CREDENTIALS_PLAINTEXT:
30d2f45dd260208f0fb882dde134a249318524b9Lubos Kosco return "plaintext";
30d2f45dd260208f0fb882dde134a249318524b9Lubos Kosco case PASSDB_CREDENTIALS_CRYPT:
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner return "crypt";
30d2f45dd260208f0fb882dde134a249318524b9Lubos Kosco case PASSDB_CREDENTIALS_DIGEST_MD5:
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner return "digest-md5";
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner }
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner return "??";
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner}
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner
14a41f02433890d19b2f871156271e3388cd0845Jens Elknervoid passdb_init(void)
d2b27f3d647af6fca607f14cb9296cc61c64b5b7Knut Anders Hatlen{
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner const char *name, *args;
d2b27f3d647af6fca607f14cb9296cc61c64b5b7Knut Anders Hatlen
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner passdb = NULL;
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner name = getenv("PASSDB");
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner if (name == NULL)
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner i_fatal("PASSDB environment is unset");
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner args = strchr(name, ' ');
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner name = t_strcut(name, ' ');
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner#ifdef PASSDB_PASSWD
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner if (strcasecmp(name, "passwd") == 0)
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner passdb = &passdb_passwd;
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner#endif
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner#ifdef PASSDB_PASSWD_FILE
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner if (strcasecmp(name, "passwd-file") == 0)
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner passdb = &passdb_passwd_file;
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner#endif
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner#ifdef PASSDB_PAM
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner if (strcasecmp(name, "pam") == 0)
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner passdb = &passdb_pam;
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner#endif
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner#ifdef PASSDB_SHADOW
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner if (strcasecmp(name, "shadow") == 0)
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner passdb = &passdb_shadow;
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner#endif
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner#ifdef PASSDB_VPOPMAIL
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner if (strcasecmp(name, "vpopmail") == 0)
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner passdb = &passdb_vpopmail;
30d2f45dd260208f0fb882dde134a249318524b9Lubos Kosco#endif
30d2f45dd260208f0fb882dde134a249318524b9Lubos Kosco#ifdef USERDB_LDAP
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner if (strcasecmp(name, "ldap") == 0)
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner passdb = &passdb_ldap;
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner#endif
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner#ifdef AUTH_MODULES
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner passdb_module = auth_module_open(name);
9e84bb8ea80d12f1495640752b10ecbdabfe8a3aKnut Anders Hatlen if (passdb_module != NULL) {
30d2f45dd260208f0fb882dde134a249318524b9Lubos Kosco passdb = auth_module_sym(passdb_module,
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner t_strconcat("passdb_", name, NULL));
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner }
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner#endif
14a41f02433890d19b2f871156271e3388cd0845Jens Elkner
if (passdb == NULL)
i_fatal("Unknown passdb type '%s'", name);
/* initialize */
if (passdb->init != NULL)
passdb->init(args != NULL ? args+1 : "");
if ((auth_mechanisms & AUTH_MECH_PLAIN) &&
passdb->verify_plain == NULL)
i_fatal("Passdb %s doesn't support PLAIN method", name);
if ((auth_mechanisms & AUTH_MECH_DIGEST_MD5) &&
passdb->lookup_credentials == NULL)
i_fatal("Passdb %s doesn't support DIGEST-MD5 method", name);
}
void passdb_deinit(void)
{
if (passdb != NULL && passdb->deinit != NULL)
passdb->deinit();
#ifdef AUTH_MODULES
if (passdb_module != NULL)
auth_module_close(passdb_module);
#endif
}