passdb.c revision 25757faf029c369a8318349dafe952e2358df1d8
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen/* Copyright (C) 2002-2003 Timo Sirainen */
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen#include "common.h"
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen#include "mech.h"
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen#include "passdb.h"
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen#include <stdlib.h>
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainenstruct passdb_module *passdb;
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainenconst char *passdb_credentials_to_str(enum passdb_credentials credentials)
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen{
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen switch (credentials) {
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen case PASSDB_CREDENTIALS_PLAINTEXT:
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen return "plaintext";
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen case PASSDB_CREDENTIALS_DIGEST_MD5:
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen return "digest-md5";
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen }
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen return "??";
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen}
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainenvoid passdb_init(void)
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen{
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen const char *name, *args;
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen passdb = NULL;
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen name = getenv("PASSDB");
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen if (name == NULL)
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen i_fatal("PASSDB environment is unset");
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen#ifdef PASSDB_PASSWD
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen if (strcasecmp(name, "passwd") == 0)
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen passdb = &passdb_passwd;
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen#endif
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen#ifdef PASSDB_PASSWD_FILE
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen if (strcasecmp(name, "passwd-file") == 0)
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen passdb = &passdb_passwd_file;
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen#endif
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen#ifdef PASSDB_PAM
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen if (strcasecmp(name, "pam") == 0)
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen passdb = &passdb_pam;
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen#endif
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen#ifdef PASSDB_SHADOW
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen if (strcasecmp(name, "shadow") == 0)
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen passdb = &passdb_shadow;
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen#endif
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen#ifdef PASSDB_VPOPMAIL
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen if (strcasecmp(name, "vpopmail") == 0)
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen passdb = &passdb_vpopmail;
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen#endif
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen if (passdb == NULL)
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen i_fatal("Unknown passdb type '%s'", name);
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen /* initialize */
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen if (passdb->init != NULL) {
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen args = getenv("PASSDB_ARGS");
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen if (args == NULL) args = "";
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen passdb->init(args);
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen }
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen if ((auth_mechanisms & AUTH_MECH_PLAIN) &&
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen passdb->verify_plain == NULL)
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen i_fatal("Passdb %s doesn't support PLAIN method", name);
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen if ((auth_mechanisms & AUTH_MECH_DIGEST_MD5) &&
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen passdb->lookup_credentials == NULL)
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen i_fatal("Passdb %s doesn't support DIGEST-MD5 method", name);
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen}
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainenvoid passdb_deinit(void)
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen{
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen if (passdb != NULL && passdb->deinit != NULL)
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen passdb->deinit();
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen}