Index: src/auth/userdb-passwd.c =================================================================== RCS file: /home/cvs/dovecot/src/auth/userdb-passwd.c,v retrieving revision 1.18 diff -c -r1.18 userdb-passwd.c *** src/auth/userdb-passwd.c 16 Oct 2005 14:34:39 -0000 1.18 --- src/auth/userdb-passwd.c 3 Feb 2006 12:34:22 -0000 *************** *** 4,18 **** --- 4,34 ---- #ifdef USERDB_PASSWD + #include "array.h" + #include "str.h" + #include "var-expand.h" #include "userdb.h" #include + struct passwd_userdb_module { + struct userdb_module module; + + array_t ARRAY_DEFINE(template, const char *); + }; + static void passwd_lookup(struct auth_request *auth_request, userdb_callback_t *callback) { + struct userdb_module *_module = auth_request->userdb->userdb; + struct passwd_userdb_module *module = + (struct passwd_userdb_module *)_module; struct passwd *pw; struct auth_stream_reply *reply; + const struct var_expand_table *table; + string_t *str; + const char *const *args, *value; + unsigned int i, count; pw = getpwnam(auth_request->user); if (pw == NULL) { *************** *** 29,48 **** pw->pw_name, auth_request->user); } reply = auth_stream_reply_init(auth_request); auth_stream_reply_add(reply, NULL, pw->pw_name); auth_stream_reply_add(reply, "system_user", pw->pw_name); auth_stream_reply_add(reply, "uid", dec2str(pw->pw_uid)); auth_stream_reply_add(reply, "gid", dec2str(pw->pw_gid)); auth_stream_reply_add(reply, "home", pw->pw_dir); callback(reply, auth_request); } struct userdb_module_interface userdb_passwd = { "passwd", ! NULL, NULL, NULL, passwd_lookup }; --- 45,118 ---- pw->pw_name, auth_request->user); } + t_push(); + str = t_str_new(256); + table = auth_request_get_var_expand_table(auth_request, NULL); + reply = auth_stream_reply_init(auth_request); auth_stream_reply_add(reply, NULL, pw->pw_name); auth_stream_reply_add(reply, "system_user", pw->pw_name); auth_stream_reply_add(reply, "uid", dec2str(pw->pw_uid)); auth_stream_reply_add(reply, "gid", dec2str(pw->pw_gid)); auth_stream_reply_add(reply, "home", pw->pw_dir); + /* auth_stream_reply_add(reply, "quota", "rquotad:/var/spool/mail/.3a/S,/var/spool/mail/.3b/S,/var/spool/mail/.4a/S,/var/spool/mail/.4b/S,/var/spool/mail/.3a/L,/var/spool/mail/.3b/L,/var/spool/mail/.4a/L,/var/spool/mail/.4b/L,/home/.1,/home/.2"); */ + + args = array_get(&module->template, &count); + i_assert((count % 2) == 0); + for (i = 0; i < count; i += 2) { + if (args[i+1] == NULL) + value = NULL; + else { + str_truncate(str, 0); + var_expand(str, args[i+1], table); + value = str_c(str); + } + auth_stream_reply_add(reply, args[i], value); + } callback(reply, auth_request); + t_pop(); + } + + static struct userdb_module * + passwd_preinit(struct auth_userdb *auth_userdb, const char *args) + { + struct passwd_userdb_module *module; + const char *const *tmp, *key, *value; + + module = p_new(auth_userdb->auth->pool, struct passwd_userdb_module, 1); + + tmp = t_strsplit_spaces(args, " "); + ARRAY_CREATE(&module->template, auth_userdb->auth->pool, + const char *, strarray_length(tmp)); + + t_push(); + for (; *tmp != NULL; tmp++) { + value = strchr(*tmp, '='); + if (value == NULL) + key = *tmp; + else { + key = t_strdup_until(*tmp, value); + value++; + } + + key = p_strdup(auth_userdb->auth->pool, key); + value = p_strdup(auth_userdb->auth->pool, value); + + array_append(&module->template, &key, 1); + array_append(&module->template, &value, 1); + } + t_pop(); + + return &module->module; } struct userdb_module_interface userdb_passwd = { "passwd", ! passwd_preinit, ! NULL, ! NULL, passwd_lookup };