1
1
/* Copyright (C) 2002-2003 Timo Sirainen */
6
5
#ifdef PASSDB_PASSWD_FILE
10
8
#include "password-scheme.h"
11
9
#include "db-passwd-file.h"
13
struct passwd_file *passdb_pwf = NULL;
11
#define PASSWD_FILE_CACHE_KEY "%u"
12
#define PASSWD_FILE_DEFAULT_SCHEME "CRYPT"
14
struct passwd_file_passdb_module {
15
struct passdb_module module;
17
struct db_passwd_file *pwf;
16
21
passwd_file_verify_plain(struct auth_request *request, const char *password,
17
22
verify_plain_callback_t *callback)
24
struct passdb_module *_module = request->passdb->passdb;
25
struct passwd_file_passdb_module *module =
26
(struct passwd_file_passdb_module *)_module;
19
27
struct passwd_user *pu;
20
28
const char *scheme, *crypted_pass;
23
pu = db_passwd_file_lookup(passdb_pwf, request->user);
31
pu = db_passwd_file_lookup(module->pwf, request);
25
33
callback(PASSDB_RESULT_USER_UNKNOWN, request);
29
37
crypted_pass = pu->password;
30
38
scheme = password_get_scheme(&crypted_pass);
31
if (scheme == NULL) scheme = "CRYPT";
39
if (scheme == NULL) scheme = _module->default_pass_scheme;
41
/* save the password so cache can use it */
42
auth_request_set_field(request, "password", crypted_pass, scheme);
33
44
ret = password_verify(password, crypted_pass, scheme,
36
47
callback(PASSDB_RESULT_OK, request);
39
i_error("passwd-file(%s): Unknown password scheme %s",
40
pu->user_realm, scheme);
42
i_info("passwd-file(%s): %s password mismatch",
43
pu->user_realm, scheme);
50
auth_request_log_error(request, "passwd-file",
51
"unknown password scheme %s", scheme);
53
auth_request_log_info(request, "passwd-file",
45
56
callback(PASSDB_RESULT_PASSWORD_MISMATCH, request);
50
61
passwd_file_lookup_credentials(struct auth_request *request,
51
enum passdb_credentials credentials,
52
62
lookup_credentials_callback_t *callback)
64
struct passdb_module *_module = request->passdb->passdb;
65
struct passwd_file_passdb_module *module =
66
(struct passwd_file_passdb_module *)_module;
54
67
struct passwd_user *pu;
55
68
const char *crypted_pass, *scheme;
57
pu = db_passwd_file_lookup(passdb_pwf, request->user);
70
pu = db_passwd_file_lookup(module->pwf, request);
59
callback(NULL, request);
72
callback(PASSDB_RESULT_USER_UNKNOWN, NULL, request);
63
76
crypted_pass = pu->password;
64
77
scheme = password_get_scheme(&crypted_pass);
66
passdb_handle_credentials(credentials, request->user, crypted_pass,
67
scheme, callback, request);
70
static void passwd_file_init(const char *args)
72
if (userdb_pwf != NULL && strcmp(userdb_pwf->path, args) == 0) {
73
passdb_pwf = userdb_pwf;
74
passdb_pwf->refcount++;
76
passdb_pwf = db_passwd_file_parse(args, FALSE);
80
static void passwd_file_deinit(void)
82
db_passwd_file_unref(passdb_pwf);
85
struct passdb_module passdb_passwd_file = {
79
passdb_handle_credentials(PASSDB_RESULT_OK, crypted_pass, scheme,
83
static struct passdb_module *
84
passwd_file_preinit(struct auth_passdb *auth_passdb,
85
const char *args __attr_unused__)
87
struct passwd_file_passdb_module *module;
89
module = p_new(auth_passdb->auth->pool,
90
struct passwd_file_passdb_module, 1);
91
module->module.cache_key = PASSWD_FILE_CACHE_KEY;
92
module->module.default_pass_scheme = PASSWD_FILE_DEFAULT_SCHEME;
93
return &module->module;
96
static void passwd_file_init(struct passdb_module *_module, const char *args)
98
struct passwd_file_passdb_module *module =
99
(struct passwd_file_passdb_module *)_module;
101
module->pwf = db_passwd_file_parse(args, FALSE);
104
static void passwd_file_deinit(struct passdb_module *_module)
106
struct passwd_file_passdb_module *module =
107
(struct passwd_file_passdb_module *)_module;
109
db_passwd_file_unref(module->pwf);
112
struct passdb_module_interface passdb_passwd_file = {
87
117
passwd_file_deinit,