userdb-passwd-file.c revision f003421d8229323343169f66aba18752f5e1f11e
45312f52ff3a3d4c137447be4c7556500c2f8bf2Timo Sirainen/* Copyright (c) 2002-2013 Dovecot authors, see the included COPYING file */
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenstatic void passwd_file_lookup(struct auth_request *auth_request,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct userdb_module *_module = auth_request->userdb->userdb;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen pu = db_passwd_file_lookup(module->pwf, auth_request,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen callback(USERDB_RESULT_USER_UNKNOWN, auth_request);
db0735f9b388c5bcfb781b1b25015e898d63d953Timo Sirainen auth_request_set_userdb_field(auth_request, "uid",
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen auth_request_set_userdb_field(auth_request, "gid",
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen auth_request_set_userdb_field(auth_request, "home", pu->home);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen table = auth_request_get_var_expand_table(auth_request, NULL);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen auth_request_set_userdb_field(auth_request, key, value);
db0735f9b388c5bcfb781b1b25015e898d63d953Timo Sirainenpasswd_file_iterate_init(struct auth_request *auth_request,
db0735f9b388c5bcfb781b1b25015e898d63d953Timo Sirainen userdb_iter_callback_t *callback, void *context)
db0735f9b388c5bcfb781b1b25015e898d63d953Timo Sirainen struct userdb_module *_module = auth_request->userdb->userdb;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct passwd_file_userdb_iterate_context *ctx;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen ctx = i_new(struct passwd_file_userdb_iterate_context, 1);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen ctx->skip_passdb_entries = module->pwf->userdb_warn_missing;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen i_error("passwd-file: User iteration isn't currently supported "
834f2b9f60d93e4c7dfc6992e692f5b7213a1b11Timo Sirainen "with %%variable paths");
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen ctx->path = i_strdup(module->pwf->default_file->path);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen /* for now we support only a single passwd-file */
bcdb6c0bd2e7dbb34b306d3d8c2383a7d7654612Timo Sirainen ctx->input = i_stream_create_fd(fd, (size_t)-1, TRUE);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenstatic void passwd_file_iterate_next(struct userdb_iterate_context *_ctx)
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct passwd_file_userdb_iterate_context *ctx =
3852872e6954b7132e637294132005e86b8ebd4aTimo Sirainen (struct passwd_file_userdb_iterate_context *)_ctx;
3852872e6954b7132e637294132005e86b8ebd4aTimo Sirainen const char *line, *p;
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 */
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen /* only passdb info */
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainen if (line == NULL && ctx->input->stream_errno != 0) {
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen _ctx->callback(t_strcut(line, ':'), _ctx->context);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenstatic int passwd_file_iterate_deinit(struct userdb_iterate_context *_ctx)
3852872e6954b7132e637294132005e86b8ebd4aTimo Sirainen struct passwd_file_userdb_iterate_context *ctx =
3852872e6954b7132e637294132005e86b8ebd4aTimo Sirainen (struct passwd_file_userdb_iterate_context *)_ctx;
3852872e6954b7132e637294132005e86b8ebd4aTimo Sirainenpasswd_file_preinit(pool_t pool, const char *args)
b8835b8a21c617ceb82ddc5a176243faf36aa8f7Timo Sirainen const char *format = PASSWD_FILE_DEFAULT_USERNAME_FORMAT;
3852872e6954b7132e637294132005e86b8ebd4aTimo Sirainen const char *p;
b8835b8a21c617ceb82ddc5a176243faf36aa8f7Timo Sirainen if (strncmp(args, "username_format=", 16) == 0) {
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen module = p_new(pool, struct passwd_file_userdb_module, 1);
834f2b9f60d93e4c7dfc6992e692f5b7213a1b11Timo Sirainen module->module.cache_key = PASSWD_FILE_CACHE_KEY;
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainenstatic void passwd_file_init(struct userdb_module *_module)
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainenstatic void passwd_file_deinit(struct userdb_module *_module)
7f3b826a89bcb7a72759912e99f574b28309fe1bTimo Sirainenstruct userdb_module_interface userdb_passwd_file = {
111a7dda02defa4d612468cfc3c40da5240645afTimo Sirainen "passwd-file",