userdb-passwd-file.c revision 0dfadf47a8d705a7425575fb490da434edc6b978
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen/* Copyright (C) 2002-2003 Timo Sirainen */
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen#include "common.h"
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen#ifdef USERDB_PASSWD_FILE
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen#include "str.h"
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen#include "auth-cache.h"
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen#include "var-expand.h"
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen#include "userdb.h"
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen#include "db-passwd-file.h"
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen#define PASSWD_FILE_CACHE_KEY "%u"
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainenstruct passwd_file_userdb_module {
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen struct userdb_module module;
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen
39e6fcc3e8b1ccb13087c232cb6bdea04d1a20a4Timo Sirainen struct auth *auth;
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen struct db_passwd_file *pwf;
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen};
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainenstatic void passwd_file_lookup(struct auth_request *auth_request,
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen userdb_callback_t *callback)
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen{
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen struct userdb_module *_module = auth_request->userdb->userdb;
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen struct passwd_file_userdb_module *module =
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen (struct passwd_file_userdb_module *)_module;
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen struct passwd_user *pu;
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainen const struct var_expand_table *table;
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen string_t *str;
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen const char *key, *value;
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen char **p;
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen
39e6fcc3e8b1ccb13087c232cb6bdea04d1a20a4Timo Sirainen pu = db_passwd_file_lookup(module->pwf, auth_request);
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen if (pu == NULL) {
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen callback(USERDB_RESULT_USER_UNKNOWN, auth_request);
bc3698b8892df8003b410daea6f5bbcd20433808Timo Sirainen return;
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen }
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen auth_request_init_userdb_reply(auth_request);
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen if (pu->uid != (uid_t)-1) {
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen auth_request_set_userdb_field(auth_request, "uid",
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen dec2str(pu->uid));
39e6fcc3e8b1ccb13087c232cb6bdea04d1a20a4Timo Sirainen }
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen if (pu->gid != (gid_t)-1) {
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen auth_request_set_userdb_field(auth_request, "gid",
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen dec2str(pu->gid));
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen }
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen
bc3698b8892df8003b410daea6f5bbcd20433808Timo Sirainen if (pu->home != NULL)
bc3698b8892df8003b410daea6f5bbcd20433808Timo Sirainen auth_request_set_userdb_field(auth_request, "home", pu->home);
bc3698b8892df8003b410daea6f5bbcd20433808Timo Sirainen
bc3698b8892df8003b410daea6f5bbcd20433808Timo Sirainen if (pu->extra_fields != NULL) {
bc3698b8892df8003b410daea6f5bbcd20433808Timo Sirainen t_push();
bc3698b8892df8003b410daea6f5bbcd20433808Timo Sirainen str = t_str_new(512);
bc3698b8892df8003b410daea6f5bbcd20433808Timo Sirainen table = auth_request_get_var_expand_table(auth_request, NULL);
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen for (p = pu->extra_fields; *p != NULL; p++) {
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen if (strncmp(*p, "userdb_", 7) != 0)
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen continue;
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen key = *p + 7;
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen value = strchr(key, '=');
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen if (value != NULL) {
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen key = t_strdup_until(key, value);
5fb3bff645380804c9db2510940c41db6b8fdb01Timo Sirainen str_truncate(str, 0);
5fb3bff645380804c9db2510940c41db6b8fdb01Timo Sirainen var_expand(str, value + 1, table);
5fb3bff645380804c9db2510940c41db6b8fdb01Timo Sirainen value = str_c(str);
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen }
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen auth_request_set_userdb_field(auth_request, key, value);
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen }
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen t_pop();
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen }
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen callback(USERDB_RESULT_OK, auth_request);
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen}
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainenstatic struct userdb_module *
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainenpasswd_file_preinit(struct auth_userdb *auth_userdb, const char *args)
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen{
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen struct passwd_file_userdb_module *module;
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen module = p_new(auth_userdb->auth->pool,
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen struct passwd_file_userdb_module, 1);
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen module->auth = auth_userdb->auth;
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen module->pwf =
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen db_passwd_file_init(args, TRUE, module->auth->verbose_debug);
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen if (!module->pwf->vars)
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen module->module.cache_key = PASSWD_FILE_CACHE_KEY;
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen else {
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen module->module.cache_key =
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen auth_cache_parse_key(auth_userdb->auth->pool,
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen t_strconcat(PASSWD_FILE_CACHE_KEY,
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen module->pwf->path,
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen NULL));
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen }
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen return &module->module;
68efcccb384f2d6871164b072457e87473502c51Timo Sirainen}
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainenstatic void passwd_file_init(struct userdb_module *_module,
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen const char *args __attr_unused__)
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen{
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen struct passwd_file_userdb_module *module =
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen (struct passwd_file_userdb_module *)_module;
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen
68efcccb384f2d6871164b072457e87473502c51Timo Sirainen db_passwd_file_parse(module->pwf);
68efcccb384f2d6871164b072457e87473502c51Timo Sirainen}
68efcccb384f2d6871164b072457e87473502c51Timo Sirainen
68efcccb384f2d6871164b072457e87473502c51Timo Sirainenstatic void passwd_file_deinit(struct userdb_module *_module)
68efcccb384f2d6871164b072457e87473502c51Timo Sirainen{
68efcccb384f2d6871164b072457e87473502c51Timo Sirainen struct passwd_file_userdb_module *module =
68efcccb384f2d6871164b072457e87473502c51Timo Sirainen (struct passwd_file_userdb_module *)_module;
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen
68efcccb384f2d6871164b072457e87473502c51Timo Sirainen db_passwd_file_unref(&module->pwf);
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen}
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen
a54be2bd26d6f0860d194d3aeedfa6b7fc14d24cTimo Sirainenstruct userdb_module_interface userdb_passwd_file = {
a54be2bd26d6f0860d194d3aeedfa6b7fc14d24cTimo Sirainen "passwd-file",
a54be2bd26d6f0860d194d3aeedfa6b7fc14d24cTimo Sirainen
a54be2bd26d6f0860d194d3aeedfa6b7fc14d24cTimo Sirainen passwd_file_preinit,
a54be2bd26d6f0860d194d3aeedfa6b7fc14d24cTimo Sirainen passwd_file_init,
a54be2bd26d6f0860d194d3aeedfa6b7fc14d24cTimo Sirainen passwd_file_deinit,
a54be2bd26d6f0860d194d3aeedfa6b7fc14d24cTimo Sirainen
a54be2bd26d6f0860d194d3aeedfa6b7fc14d24cTimo Sirainen passwd_file_lookup
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen};
d756ebcfa96bd7cff02097c8f26df9df368b81b1Timo Sirainen
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen#endif
c4267cf4c40fb1f866b5958ff122ef836b8c5dfbTimo Sirainen