userdb-passwd.c revision 06390800923922d4a5549e985b597af33b2753ac
5a580c3a38ced62d4bcc95b8ac7c4f2935b5d294Timo Sirainen/* Copyright (c) 2002-2009 Dovecot authors, see the included COPYING file */
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch#include "common.h"
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch#include "userdb.h"
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch#ifdef USERDB_PASSWD
bdd36cfdba3ff66d25570a9ff568d69e1eb543cfTimo Sirainen
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch#include "userdb-static.h"
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch#include <pwd.h>
e98e8ba55a01427844b2d24becd791dde8b0178bTimo Sirainen
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch#define USER_CACHE_KEY "%u"
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Boschstruct passwd_userdb_module {
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch struct userdb_module module;
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch struct userdb_static_template *tmpl;
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch};
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Boschstatic void passwd_lookup(struct auth_request *auth_request,
84a31ddebcf8c3aeaef7b9e54171a48ee1374c45Timo Sirainen userdb_callback_t *callback)
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch{
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch struct userdb_module *_module = auth_request->userdb->userdb;
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch struct passwd_userdb_module *module =
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch (struct passwd_userdb_module *)_module;
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch struct passwd *pw;
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch auth_request_log_debug(auth_request, "passwd", "lookup");
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch pw = getpwnam(auth_request->user);
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch if (pw == NULL) {
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch auth_request_log_info(auth_request, "passwd", "unknown user");
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch callback(USERDB_RESULT_USER_UNKNOWN, auth_request);
84a31ddebcf8c3aeaef7b9e54171a48ee1374c45Timo Sirainen return;
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch }
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch auth_request_set_field(auth_request, "user", pw->pw_name, NULL);
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch auth_request_init_userdb_reply(auth_request);
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch userdb_static_template_export(module->tmpl, auth_request);
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch if (!userdb_static_template_isset(module->tmpl, "system_user")) {
7b6cc2bca3b2fb58bbbea5293ed8f63d352dc305Timo Sirainen auth_request_set_userdb_field(auth_request,
7b6cc2bca3b2fb58bbbea5293ed8f63d352dc305Timo Sirainen "system_user", pw->pw_name);
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch }
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch if (!userdb_static_template_isset(module->tmpl, "uid")) {
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch auth_request_set_userdb_field(auth_request,
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch "uid", dec2str(pw->pw_uid));
d2dd9b7365c8efb4e205d521c9d66758dbf7300aTimo Sirainen }
d2dd9b7365c8efb4e205d521c9d66758dbf7300aTimo Sirainen if (!userdb_static_template_isset(module->tmpl, "gid")) {
d2dd9b7365c8efb4e205d521c9d66758dbf7300aTimo Sirainen auth_request_set_userdb_field(auth_request,
d2dd9b7365c8efb4e205d521c9d66758dbf7300aTimo Sirainen "gid", dec2str(pw->pw_gid));
d2dd9b7365c8efb4e205d521c9d66758dbf7300aTimo Sirainen }
d2dd9b7365c8efb4e205d521c9d66758dbf7300aTimo Sirainen if (!userdb_static_template_isset(module->tmpl, "home"))
d2dd9b7365c8efb4e205d521c9d66758dbf7300aTimo Sirainen auth_request_set_userdb_field(auth_request, "home", pw->pw_dir);
d2dd9b7365c8efb4e205d521c9d66758dbf7300aTimo Sirainen
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch callback(USERDB_RESULT_OK, auth_request);
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch}
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Boschstatic struct userdb_module *
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Boschpasswd_passwd_preinit(struct auth_userdb *auth_userdb, const char *args)
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch{
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch struct passwd_userdb_module *module;
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch const char *value;
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch module = p_new(auth_userdb->auth->pool, struct passwd_userdb_module, 1);
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch module->module.cache_key = USER_CACHE_KEY;
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch module->tmpl = userdb_static_template_build(auth_userdb->auth->pool,
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch "passwd", args);
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch if (userdb_static_template_remove(module->tmpl, "blocking",
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch &value)) {
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch module->module.blocking = value == NULL ||
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch strcasecmp(value, "yes") == 0;
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch }
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch return &module->module;
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch}
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Boschstruct userdb_module_interface userdb_passwd = {
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch "passwd",
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch passwd_passwd_preinit,
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch NULL,
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch NULL,
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch
c1b9c4531186c6a7cd92d2c353273a834f8ee66fTimo Sirainen passwd_lookup
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch};
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch#else
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Boschstruct userdb_module_interface userdb_passwd = {
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch MEMBER(name) "passwd"
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch};
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch#endif
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch