userdb-passwd.c revision 08d6658a4e2ec8104cd1307f6baa75fdb07a24f8
45312f52ff3a3d4c137447be4c7556500c2f8bf2Timo Sirainen/* Copyright (c) 2002-2009 Dovecot authors, see the included COPYING file */
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen
08d6658a4e2ec8104cd1307f6baa75fdb07a24f8Mark Washenberger#include "auth-common.h"
d5abbb932a0a598f002da39a8b3326643b1b5efcTimo Sirainen#include "userdb.h"
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen#ifdef USERDB_PASSWD
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen
40eb305d9b12cf48400fe3806a8a15ad6d372952Timo Sirainen#include "userdb-static.h"
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen#include <pwd.h>
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen
c5383a0ed56a188a7d5efaaa4c6f8243af432d65Timo Sirainen#define USER_CACHE_KEY "%u"
c5383a0ed56a188a7d5efaaa4c6f8243af432d65Timo Sirainen
40eb305d9b12cf48400fe3806a8a15ad6d372952Timo Sirainenstruct passwd_userdb_module {
40eb305d9b12cf48400fe3806a8a15ad6d372952Timo Sirainen struct userdb_module module;
40eb305d9b12cf48400fe3806a8a15ad6d372952Timo Sirainen struct userdb_static_template *tmpl;
40eb305d9b12cf48400fe3806a8a15ad6d372952Timo Sirainen};
40eb305d9b12cf48400fe3806a8a15ad6d372952Timo Sirainen
3b94ff5951db4d4eddb7a80ed4e3f61207202635Timo Sirainenstatic void passwd_lookup(struct auth_request *auth_request,
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen userdb_callback_t *callback)
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen{
40eb305d9b12cf48400fe3806a8a15ad6d372952Timo Sirainen struct userdb_module *_module = auth_request->userdb->userdb;
40eb305d9b12cf48400fe3806a8a15ad6d372952Timo Sirainen struct passwd_userdb_module *module =
40eb305d9b12cf48400fe3806a8a15ad6d372952Timo Sirainen (struct passwd_userdb_module *)_module;
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen struct passwd *pw;
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen
00bde9ae9eab9e720462bf6ec9a4dd85e88c3bbfTimo Sirainen auth_request_log_debug(auth_request, "passwd", "lookup");
00bde9ae9eab9e720462bf6ec9a4dd85e88c3bbfTimo Sirainen
3b94ff5951db4d4eddb7a80ed4e3f61207202635Timo Sirainen pw = getpwnam(auth_request->user);
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen if (pw == NULL) {
49e513d090753ccbf95560b2f3a21f081a5b6c51Timo Sirainen auth_request_log_info(auth_request, "passwd", "unknown user");
6fabfb7bbfd88d0c1de66981e52850f26067623bTimo Sirainen callback(USERDB_RESULT_USER_UNKNOWN, auth_request);
22535a9e685e29214082878e37a267157044618eTimo Sirainen return;
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen }
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen
6fabfb7bbfd88d0c1de66981e52850f26067623bTimo Sirainen auth_request_set_field(auth_request, "user", pw->pw_name, NULL);
137ea7ca34005345aa2304a940149b7f3774d727Timo Sirainen
6fabfb7bbfd88d0c1de66981e52850f26067623bTimo Sirainen auth_request_init_userdb_reply(auth_request);
40eb305d9b12cf48400fe3806a8a15ad6d372952Timo Sirainen userdb_static_template_export(module->tmpl, auth_request);
40eb305d9b12cf48400fe3806a8a15ad6d372952Timo Sirainen
312d3129573fc63ba0d39105b68daccfab9f0c8fTimo Sirainen /* FIXME: the system_user is for backwards compatibility */
312d3129573fc63ba0d39105b68daccfab9f0c8fTimo Sirainen if (!userdb_static_template_isset(module->tmpl, "system_groups_user") &&
312d3129573fc63ba0d39105b68daccfab9f0c8fTimo Sirainen !userdb_static_template_isset(module->tmpl, "system_user")) {
40eb305d9b12cf48400fe3806a8a15ad6d372952Timo Sirainen auth_request_set_userdb_field(auth_request,
312d3129573fc63ba0d39105b68daccfab9f0c8fTimo Sirainen "system_groups_user",
312d3129573fc63ba0d39105b68daccfab9f0c8fTimo Sirainen pw->pw_name);
40eb305d9b12cf48400fe3806a8a15ad6d372952Timo Sirainen }
40eb305d9b12cf48400fe3806a8a15ad6d372952Timo Sirainen if (!userdb_static_template_isset(module->tmpl, "uid")) {
40eb305d9b12cf48400fe3806a8a15ad6d372952Timo Sirainen auth_request_set_userdb_field(auth_request,
40eb305d9b12cf48400fe3806a8a15ad6d372952Timo Sirainen "uid", dec2str(pw->pw_uid));
40eb305d9b12cf48400fe3806a8a15ad6d372952Timo Sirainen }
40eb305d9b12cf48400fe3806a8a15ad6d372952Timo Sirainen if (!userdb_static_template_isset(module->tmpl, "gid")) {
40eb305d9b12cf48400fe3806a8a15ad6d372952Timo Sirainen auth_request_set_userdb_field(auth_request,
40eb305d9b12cf48400fe3806a8a15ad6d372952Timo Sirainen "gid", dec2str(pw->pw_gid));
40eb305d9b12cf48400fe3806a8a15ad6d372952Timo Sirainen }
40eb305d9b12cf48400fe3806a8a15ad6d372952Timo Sirainen if (!userdb_static_template_isset(module->tmpl, "home"))
40eb305d9b12cf48400fe3806a8a15ad6d372952Timo Sirainen auth_request_set_userdb_field(auth_request, "home", pw->pw_dir);
6fabfb7bbfd88d0c1de66981e52850f26067623bTimo Sirainen
6fabfb7bbfd88d0c1de66981e52850f26067623bTimo Sirainen callback(USERDB_RESULT_OK, auth_request);
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen}
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen
40eb305d9b12cf48400fe3806a8a15ad6d372952Timo Sirainenstatic struct userdb_module *
40eb305d9b12cf48400fe3806a8a15ad6d372952Timo Sirainenpasswd_passwd_preinit(struct auth_userdb *auth_userdb, const char *args)
c5383a0ed56a188a7d5efaaa4c6f8243af432d65Timo Sirainen{
40eb305d9b12cf48400fe3806a8a15ad6d372952Timo Sirainen struct passwd_userdb_module *module;
40eb305d9b12cf48400fe3806a8a15ad6d372952Timo Sirainen const char *value;
40eb305d9b12cf48400fe3806a8a15ad6d372952Timo Sirainen
40eb305d9b12cf48400fe3806a8a15ad6d372952Timo Sirainen module = p_new(auth_userdb->auth->pool, struct passwd_userdb_module, 1);
40eb305d9b12cf48400fe3806a8a15ad6d372952Timo Sirainen module->module.cache_key = USER_CACHE_KEY;
40eb305d9b12cf48400fe3806a8a15ad6d372952Timo Sirainen module->tmpl = userdb_static_template_build(auth_userdb->auth->pool,
40eb305d9b12cf48400fe3806a8a15ad6d372952Timo Sirainen "passwd", args);
40eb305d9b12cf48400fe3806a8a15ad6d372952Timo Sirainen
40eb305d9b12cf48400fe3806a8a15ad6d372952Timo Sirainen if (userdb_static_template_remove(module->tmpl, "blocking",
40eb305d9b12cf48400fe3806a8a15ad6d372952Timo Sirainen &value)) {
40eb305d9b12cf48400fe3806a8a15ad6d372952Timo Sirainen module->module.blocking = value == NULL ||
40eb305d9b12cf48400fe3806a8a15ad6d372952Timo Sirainen strcasecmp(value, "yes") == 0;
40eb305d9b12cf48400fe3806a8a15ad6d372952Timo Sirainen }
40eb305d9b12cf48400fe3806a8a15ad6d372952Timo Sirainen return &module->module;
c5383a0ed56a188a7d5efaaa4c6f8243af432d65Timo Sirainen}
c5383a0ed56a188a7d5efaaa4c6f8243af432d65Timo Sirainen
b42f37ae6f65ed986315b6885568d32115e589b1Timo Sirainenstruct userdb_module_interface userdb_passwd = {
1f1e81aab38d833d1c9cdc244c91fd762e0080d4Timo Sirainen "passwd",
1f1e81aab38d833d1c9cdc244c91fd762e0080d4Timo Sirainen
40eb305d9b12cf48400fe3806a8a15ad6d372952Timo Sirainen passwd_passwd_preinit,
c5383a0ed56a188a7d5efaaa4c6f8243af432d65Timo Sirainen NULL,
c5383a0ed56a188a7d5efaaa4c6f8243af432d65Timo Sirainen NULL,
c5383a0ed56a188a7d5efaaa4c6f8243af432d65Timo Sirainen
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen passwd_lookup
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen};
d5abbb932a0a598f002da39a8b3326643b1b5efcTimo Sirainen#else
d5abbb932a0a598f002da39a8b3326643b1b5efcTimo Sirainenstruct userdb_module_interface userdb_passwd = {
d5abbb932a0a598f002da39a8b3326643b1b5efcTimo Sirainen MEMBER(name) "passwd"
d5abbb932a0a598f002da39a8b3326643b1b5efcTimo Sirainen};
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen#endif