userdb-passwd-file.c revision f003421d8229323343169f66aba18752f5e1f11e
45312f52ff3a3d4c137447be4c7556500c2f8bf2Timo Sirainen/* Copyright (c) 2002-2013 Dovecot authors, see the included COPYING file */
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen#include "auth-common.h"
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen#include "userdb.h"
7e209b78ca757294dbbc15604c88673b3a6b0c39Timo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen#ifdef USERDB_PASSWD_FILE
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen#include "istream.h"
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen#include "str.h"
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen#include "auth-cache.h"
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen#include "var-expand.h"
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen#include "db-passwd-file.h"
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen#include <unistd.h>
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen#include <fcntl.h>
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen#define PASSWD_FILE_CACHE_KEY "%u"
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenstruct passwd_file_userdb_iterate_context {
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct userdb_iterate_context ctx;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct istream *input;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen char *path;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen bool skip_passdb_entries;
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen};
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainenstruct passwd_file_userdb_module {
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct userdb_module module;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
db0735f9b388c5bcfb781b1b25015e898d63d953Timo Sirainen struct db_passwd_file *pwf;
db0735f9b388c5bcfb781b1b25015e898d63d953Timo Sirainen const char *username_format;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen};
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenstatic void passwd_file_lookup(struct auth_request *auth_request,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen userdb_callback_t *callback)
db0735f9b388c5bcfb781b1b25015e898d63d953Timo Sirainen{
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct userdb_module *_module = auth_request->userdb->userdb;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct passwd_file_userdb_module *module =
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen (struct passwd_file_userdb_module *)_module;
6b265a8a9d1ce3b3a8033445e99c9035d62ffbc7Timo Sirainen struct passwd_user *pu;
6b265a8a9d1ce3b3a8033445e99c9035d62ffbc7Timo Sirainen const struct var_expand_table *table;
6b265a8a9d1ce3b3a8033445e99c9035d62ffbc7Timo Sirainen string_t *str;
6b265a8a9d1ce3b3a8033445e99c9035d62ffbc7Timo Sirainen const char *key, *value;
6b265a8a9d1ce3b3a8033445e99c9035d62ffbc7Timo Sirainen char **p;
6b265a8a9d1ce3b3a8033445e99c9035d62ffbc7Timo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen pu = db_passwd_file_lookup(module->pwf, auth_request,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen module->username_format);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen if (pu == NULL || pu->uid == 0) {
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen callback(USERDB_RESULT_USER_UNKNOWN, auth_request);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen return;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen }
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen auth_request_init_userdb_reply(auth_request);
db0735f9b388c5bcfb781b1b25015e898d63d953Timo Sirainen if (pu->uid != (uid_t)-1) {
db0735f9b388c5bcfb781b1b25015e898d63d953Timo Sirainen auth_request_set_userdb_field(auth_request, "uid",
db0735f9b388c5bcfb781b1b25015e898d63d953Timo Sirainen dec2str(pu->uid));
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen }
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen if (pu->gid != (gid_t)-1) {
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen auth_request_set_userdb_field(auth_request, "gid",
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen dec2str(pu->gid));
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen }
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen if (pu->home != NULL)
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen auth_request_set_userdb_field(auth_request, "home", pu->home);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen if (pu->extra_fields != NULL) {
db0735f9b388c5bcfb781b1b25015e898d63d953Timo Sirainen str = t_str_new(512);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen table = auth_request_get_var_expand_table(auth_request, NULL);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
66c0f96d704f09c88dd03b0ee13a3e9711ffe593Timo Sirainen for (p = pu->extra_fields; *p != NULL; p++) {
66c0f96d704f09c88dd03b0ee13a3e9711ffe593Timo Sirainen if (strncmp(*p, "userdb_", 7) != 0)
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen continue;
66c0f96d704f09c88dd03b0ee13a3e9711ffe593Timo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen key = *p + 7;
7e209b78ca757294dbbc15604c88673b3a6b0c39Timo Sirainen value = strchr(key, '=');
7e209b78ca757294dbbc15604c88673b3a6b0c39Timo Sirainen if (value != NULL) {
db0735f9b388c5bcfb781b1b25015e898d63d953Timo Sirainen key = t_strdup_until(key, value);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen str_truncate(str, 0);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen var_expand(str, value + 1, table);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen value = str_c(str);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen }
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen auth_request_set_userdb_field(auth_request, key, value);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen }
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen }
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen callback(USERDB_RESULT_OK, auth_request);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen}
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
db0735f9b388c5bcfb781b1b25015e898d63d953Timo Sirainenstatic struct userdb_iterate_context *
db0735f9b388c5bcfb781b1b25015e898d63d953Timo Sirainenpasswd_file_iterate_init(struct auth_request *auth_request,
db0735f9b388c5bcfb781b1b25015e898d63d953Timo Sirainen userdb_iter_callback_t *callback, void *context)
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen{
db0735f9b388c5bcfb781b1b25015e898d63d953Timo Sirainen struct userdb_module *_module = auth_request->userdb->userdb;
db0735f9b388c5bcfb781b1b25015e898d63d953Timo Sirainen struct passwd_file_userdb_module *module =
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen (struct passwd_file_userdb_module *)_module;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct passwd_file_userdb_iterate_context *ctx;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen int fd;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen ctx = i_new(struct passwd_file_userdb_iterate_context, 1);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen ctx->ctx.auth_request = auth_request;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen ctx->ctx.callback = callback;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen ctx->ctx.context = context;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen ctx->skip_passdb_entries = module->pwf->userdb_warn_missing;
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen if (module->pwf->default_file == NULL) {
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen i_error("passwd-file: User iteration isn't currently supported "
834f2b9f60d93e4c7dfc6992e692f5b7213a1b11Timo Sirainen "with %%variable paths");
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen ctx->ctx.failed = TRUE;
67770c0874918e3b73bbd1ff75b5ec91790d51dcTimo Sirainen return &ctx->ctx;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen }
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen ctx->path = i_strdup(module->pwf->default_file->path);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen /* for now we support only a single passwd-file */
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen fd = open(ctx->path, O_RDONLY);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen if (fd == -1) {
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen i_error("open(%s) failed: %m", ctx->path);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen ctx->ctx.failed = TRUE;
bcdb6c0bd2e7dbb34b306d3d8c2383a7d7654612Timo Sirainen } else {
bcdb6c0bd2e7dbb34b306d3d8c2383a7d7654612Timo Sirainen ctx->input = i_stream_create_fd(fd, (size_t)-1, TRUE);
bcdb6c0bd2e7dbb34b306d3d8c2383a7d7654612Timo Sirainen }
bcdb6c0bd2e7dbb34b306d3d8c2383a7d7654612Timo Sirainen return &ctx->ctx;
bcdb6c0bd2e7dbb34b306d3d8c2383a7d7654612Timo Sirainen}
bcdb6c0bd2e7dbb34b306d3d8c2383a7d7654612Timo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenstatic void passwd_file_iterate_next(struct userdb_iterate_context *_ctx)
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen{
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct passwd_file_userdb_iterate_context *ctx =
3852872e6954b7132e637294132005e86b8ebd4aTimo Sirainen (struct passwd_file_userdb_iterate_context *)_ctx;
3852872e6954b7132e637294132005e86b8ebd4aTimo Sirainen const char *line, *p;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
fb5b342aab25d6dc96df14774eb5215dc5481546Timo Sirainen if (ctx->input == NULL)
1330f999b8076b2f8eed2572c667f7482a555c1bTimo Sirainen line = NULL;
1330f999b8076b2f8eed2572c667f7482a555c1bTimo Sirainen else {
1330f999b8076b2f8eed2572c667f7482a555c1bTimo Sirainen while ((line = i_stream_read_next_line(ctx->input)) != NULL) {
899ebb8ba3fbebaafd3e431943283719ce2b106dTimo Sirainen if (*line == '\0' || *line == ':' || *line == '#')
899ebb8ba3fbebaafd3e431943283719ce2b106dTimo Sirainen continue; /* no username or comment */
899ebb8ba3fbebaafd3e431943283719ce2b106dTimo Sirainen if (ctx->skip_passdb_entries &&
899ebb8ba3fbebaafd3e431943283719ce2b106dTimo Sirainen ((p = strchr(line, ':')) == NULL ||
899ebb8ba3fbebaafd3e431943283719ce2b106dTimo Sirainen strchr(p+1, ':') == NULL)) {
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen /* only passdb info */
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen continue;
3852872e6954b7132e637294132005e86b8ebd4aTimo Sirainen }
834f2b9f60d93e4c7dfc6992e692f5b7213a1b11Timo Sirainen break;
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen }
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainen if (line == NULL && ctx->input->stream_errno != 0) {
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainen i_error("read(%s) failed: %m", ctx->path);
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainen _ctx->failed = TRUE;
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainen }
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainen }
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainen if (line == NULL)
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainen _ctx->callback(NULL, _ctx->context);
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainen else T_BEGIN {
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen _ctx->callback(t_strcut(line, ':'), _ctx->context);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen } T_END;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen}
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenstatic int passwd_file_iterate_deinit(struct userdb_iterate_context *_ctx)
3852872e6954b7132e637294132005e86b8ebd4aTimo Sirainen{
3852872e6954b7132e637294132005e86b8ebd4aTimo Sirainen struct passwd_file_userdb_iterate_context *ctx =
3852872e6954b7132e637294132005e86b8ebd4aTimo Sirainen (struct passwd_file_userdb_iterate_context *)_ctx;
3852872e6954b7132e637294132005e86b8ebd4aTimo Sirainen int ret = _ctx->failed ? -1 : 0;
b8835b8a21c617ceb82ddc5a176243faf36aa8f7Timo Sirainen
b8835b8a21c617ceb82ddc5a176243faf36aa8f7Timo Sirainen if (ctx->input != NULL)
3852872e6954b7132e637294132005e86b8ebd4aTimo Sirainen i_stream_destroy(&ctx->input);
3852872e6954b7132e637294132005e86b8ebd4aTimo Sirainen i_free(ctx->path);
3852872e6954b7132e637294132005e86b8ebd4aTimo Sirainen i_free(ctx);
b8835b8a21c617ceb82ddc5a176243faf36aa8f7Timo Sirainen return ret;
3852872e6954b7132e637294132005e86b8ebd4aTimo Sirainen}
3852872e6954b7132e637294132005e86b8ebd4aTimo Sirainen
3852872e6954b7132e637294132005e86b8ebd4aTimo Sirainenstatic struct userdb_module *
3852872e6954b7132e637294132005e86b8ebd4aTimo Sirainenpasswd_file_preinit(pool_t pool, const char *args)
b8835b8a21c617ceb82ddc5a176243faf36aa8f7Timo Sirainen{
b8835b8a21c617ceb82ddc5a176243faf36aa8f7Timo Sirainen struct passwd_file_userdb_module *module;
b8835b8a21c617ceb82ddc5a176243faf36aa8f7Timo Sirainen const char *format = PASSWD_FILE_DEFAULT_USERNAME_FORMAT;
3852872e6954b7132e637294132005e86b8ebd4aTimo Sirainen const char *p;
b8835b8a21c617ceb82ddc5a176243faf36aa8f7Timo Sirainen
b8835b8a21c617ceb82ddc5a176243faf36aa8f7Timo Sirainen if (strncmp(args, "username_format=", 16) == 0) {
b8835b8a21c617ceb82ddc5a176243faf36aa8f7Timo Sirainen args += 16;
b8835b8a21c617ceb82ddc5a176243faf36aa8f7Timo Sirainen p = strchr(args, ' ');
b8835b8a21c617ceb82ddc5a176243faf36aa8f7Timo Sirainen if (p == NULL) {
3852872e6954b7132e637294132005e86b8ebd4aTimo Sirainen format = p_strdup(pool, args);
3852872e6954b7132e637294132005e86b8ebd4aTimo Sirainen args = "";
3852872e6954b7132e637294132005e86b8ebd4aTimo Sirainen } else {
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen format = p_strdup_until(pool, args, p);
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen args = p + 1;
834f2b9f60d93e4c7dfc6992e692f5b7213a1b11Timo Sirainen }
834f2b9f60d93e4c7dfc6992e692f5b7213a1b11Timo Sirainen }
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen if (*args == '\0')
834f2b9f60d93e4c7dfc6992e692f5b7213a1b11Timo Sirainen i_fatal("userdb passwd-file: Missing args");
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen module = p_new(pool, struct passwd_file_userdb_module, 1);
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen module->pwf = db_passwd_file_init(args, TRUE,
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen global_auth_settings->debug);
834f2b9f60d93e4c7dfc6992e692f5b7213a1b11Timo Sirainen module->username_format = format;
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen
834f2b9f60d93e4c7dfc6992e692f5b7213a1b11Timo Sirainen if (!module->pwf->vars)
834f2b9f60d93e4c7dfc6992e692f5b7213a1b11Timo Sirainen module->module.cache_key = PASSWD_FILE_CACHE_KEY;
834f2b9f60d93e4c7dfc6992e692f5b7213a1b11Timo Sirainen else {
834f2b9f60d93e4c7dfc6992e692f5b7213a1b11Timo Sirainen module->module.cache_key =
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen auth_cache_parse_key(pool,
834f2b9f60d93e4c7dfc6992e692f5b7213a1b11Timo Sirainen t_strconcat(PASSWD_FILE_CACHE_KEY,
834f2b9f60d93e4c7dfc6992e692f5b7213a1b11Timo Sirainen module->pwf->path,
834f2b9f60d93e4c7dfc6992e692f5b7213a1b11Timo Sirainen NULL));
834f2b9f60d93e4c7dfc6992e692f5b7213a1b11Timo Sirainen }
834f2b9f60d93e4c7dfc6992e692f5b7213a1b11Timo Sirainen return &module->module;
834f2b9f60d93e4c7dfc6992e692f5b7213a1b11Timo Sirainen}
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainenstatic void passwd_file_init(struct userdb_module *_module)
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen{
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen struct passwd_file_userdb_module *module =
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen (struct passwd_file_userdb_module *)_module;
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen db_passwd_file_parse(module->pwf);
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen}
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainenstatic void passwd_file_deinit(struct userdb_module *_module)
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen{
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen struct passwd_file_userdb_module *module =
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen (struct passwd_file_userdb_module *)_module;
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen db_passwd_file_unref(&module->pwf);
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen}
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen
7f3b826a89bcb7a72759912e99f574b28309fe1bTimo Sirainenstruct userdb_module_interface userdb_passwd_file = {
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen "passwd-file",
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen passwd_file_preinit,
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen passwd_file_init,
834f2b9f60d93e4c7dfc6992e692f5b7213a1b11Timo Sirainen passwd_file_deinit,
834f2b9f60d93e4c7dfc6992e692f5b7213a1b11Timo Sirainen
834f2b9f60d93e4c7dfc6992e692f5b7213a1b11Timo Sirainen passwd_file_lookup,
834f2b9f60d93e4c7dfc6992e692f5b7213a1b11Timo Sirainen
834f2b9f60d93e4c7dfc6992e692f5b7213a1b11Timo Sirainen passwd_file_iterate_init,
834f2b9f60d93e4c7dfc6992e692f5b7213a1b11Timo Sirainen passwd_file_iterate_next,
834f2b9f60d93e4c7dfc6992e692f5b7213a1b11Timo Sirainen passwd_file_iterate_deinit
834f2b9f60d93e4c7dfc6992e692f5b7213a1b11Timo Sirainen};
834f2b9f60d93e4c7dfc6992e692f5b7213a1b11Timo Sirainen#else
834f2b9f60d93e4c7dfc6992e692f5b7213a1b11Timo Sirainenstruct userdb_module_interface userdb_passwd_file = {
834f2b9f60d93e4c7dfc6992e692f5b7213a1b11Timo Sirainen .name = "passwd-file"
834f2b9f60d93e4c7dfc6992e692f5b7213a1b11Timo Sirainen};
834f2b9f60d93e4c7dfc6992e692f5b7213a1b11Timo Sirainen#endif
834f2b9f60d93e4c7dfc6992e692f5b7213a1b11Timo Sirainen