userdb-passwd.c revision 02d32b05a69c125b9c30d7002f023de4bd55ab4b
02c335c23bf5fa225a467c19f2c063fb0dc7b8c3Timo Sirainen/* Copyright (C) 2002-2003 Timo Sirainen */
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen#include "config.h"
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen#undef HAVE_CONFIG_H
735259c24eda6f272c8e21eab0f4d0c6bb022fd6Timo Sirainen
735259c24eda6f272c8e21eab0f4d0c6bb022fd6Timo Sirainen#ifdef USERDB_PASSWD
735259c24eda6f272c8e21eab0f4d0c6bb022fd6Timo Sirainen
735259c24eda6f272c8e21eab0f4d0c6bb022fd6Timo Sirainen#include "common.h"
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen#include "userdb.h"
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen#include <pwd.h>
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainenstatic void passwd_lookup(const char *user, userdb_callback_t *callback,
1537d20b852cbbf0d6971790b84e0cce5ca61307Timo Sirainen void *context)
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen{
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen struct user_data data;
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen struct passwd *pw;
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen size_t len;
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen pw = getpwnam(user);
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen if (pw == NULL) {
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen if (errno != 0)
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen i_error("getpwnam(%s) failed: %m", user);
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen else if (verbose)
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen i_info("passwd(%s): unknown user", user);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen callback(NULL, context);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen return;
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen }
735259c24eda6f272c8e21eab0f4d0c6bb022fd6Timo Sirainen
735259c24eda6f272c8e21eab0f4d0c6bb022fd6Timo Sirainen memset(&data, 0, sizeof(data));
735259c24eda6f272c8e21eab0f4d0c6bb022fd6Timo Sirainen data.uid = pw->pw_uid;
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen data.gid = pw->pw_gid;
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen data.virtual_user = data.system_user = pw->pw_name;
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen len = strlen(pw->pw_dir);
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen if (len < 3 || strcmp(pw->pw_dir + len - 3, "/./") != 0)
a0c453a8edaec90fb0d945c874de0b1845bc7d7eTimo Sirainen data.home = pw->pw_dir;
a0c453a8edaec90fb0d945c874de0b1845bc7d7eTimo Sirainen else {
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen /* wu-ftpd uses <chroot>/./<dir>. We don't support
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen the dir after chroot, but this should work well enough. */
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen data.home = t_strndup(pw->pw_dir, len-3);
88dc563319efecd6e68bad16b0d92672da05584aTimo Sirainen data.chroot = TRUE;
88dc563319efecd6e68bad16b0d92672da05584aTimo Sirainen }
85a4ae7e8df7ea45a7665828e5edf48a5fc85730Timo Sirainen
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen callback(&data, context);
1b0cfbf3cc77a670b92fff5c30f7b1eb17a63ab1Timo Sirainen}
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainenstruct userdb_module userdb_passwd = {
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen NULL, NULL,
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen passwd_lookup
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen};
735259c24eda6f272c8e21eab0f4d0c6bb022fd6Timo Sirainen
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen#endif
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen