Mercurial > dovecot > original-hg > dovecot-1.2
changeset 3062:5e2e4cdbfe2e HEAD
Added "passdb" userdb. It works only if passdb gives all the information
needed for userdb. For example with SQL you can use ".. uid AS userdb_uid, gid
AS userdb_gid, home AS userdb_home .." in password_query.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Fri, 07 Jan 2005 20:15:14 +0200 |
parents | 42c1ca1f7a45 |
children | a0fbf92b41c3 |
files | configure.in src/auth/Makefile.am src/auth/auth-client-connection.c src/auth/userdb-passdb.c src/auth/userdb.c src/auth/userdb.h |
diffstat | 6 files changed, 129 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/configure.in Fri Jan 07 20:09:40 2005 +0200 +++ b/configure.in Fri Jan 07 20:15:14 2005 +0200 @@ -138,6 +138,15 @@ fi, want_static_userdb=yes) +AC_ARG_WITH(passdb-userdb, +[ --with-passdb-userdb Build with passdb userdb support (default)], + if test x$withval = xno; then + want_passdb_userdb=no + else + want_passdb_userdb=yes + fi, + want_passdb_userdb=yes) + AC_ARG_WITH(pgsql, [ --with-pgsql Build with PostgreSQL support], if test x$withval = xno; then @@ -999,6 +1008,11 @@ userdb="$userdb static" fi +if test $want_passdb_userdb = yes; then + AC_DEFINE(USERDB_PASSDB,, Build with passdb userdb support) + userdb="$userdb passdb" +fi + if test $want_passwd = yes; then need_crypt=yes AC_DEFINE(USERDB_PASSWD,, Build with passwd support)
--- a/src/auth/Makefile.am Fri Jan 07 20:09:40 2005 +0200 +++ b/src/auth/Makefile.am Fri Jan 07 20:15:14 2005 +0200 @@ -62,6 +62,7 @@ passdb-sql.c \ userdb.c \ userdb-ldap.c \ + userdb-passdb.c \ userdb-passwd.c \ userdb-passwd-file.c \ userdb-static.c \
--- a/src/auth/auth-client-connection.c Fri Jan 07 20:09:40 2005 +0200 +++ b/src/auth/auth-client-connection.c Fri Jan 07 20:15:14 2005 +0200 @@ -52,11 +52,33 @@ t_pop(); } +static const char *get_client_extra_fields(struct auth_request *request) +{ + const char **fields; + unsigned int src, dest; + + if (request->extra_fields == NULL) + return NULL; + + /* we only wish to remove all fields prefixed with "userdb_" */ + if (strstr(request->extra_fields, "userdb_") == NULL) + return request->extra_fields; + + fields = t_strsplit(request->extra_fields, "\t"); + for (src = dest = 0; fields[src] != NULL; src++) { + if (strncmp(fields[src], "userdb_", 7) == 0) + fields[dest++] = fields[src]; + } + fields[dest] = NULL; + return t_strarray_join(fields, "\t"); +} + static void auth_callback(struct auth_request *request, enum auth_client_result result, const void *reply, size_t reply_size) { string_t *str = NULL; + const char *fields; ssize_t ret; t_push(); @@ -75,22 +97,28 @@ str_append(str, "\tresp="); base64_encode(reply, reply_size, str); } - if (request->extra_fields) { + t_push(); + fields = get_client_extra_fields(request); + if (fields != NULL) { str_append_c(str, '\t'); - str_append(str, request->extra_fields); + str_append(str, fields); } + t_pop(); break; case AUTH_CLIENT_RESULT_FAILURE: str = t_str_new(128); str_printfa(str, "FAIL\t%u", request->id); if (request->user != NULL) str_printfa(str, "\tuser=%s", request->user); - if (request->extra_fields) { - str_append_c(str, '\t'); - str_append(str, request->extra_fields); - } if (request->internal_failure) str_append(str, "\ttemp"); + t_push(); + fields = get_client_extra_fields(request); + if (fields != NULL) { + str_append_c(str, '\t'); + str_append(str, fields); + } + t_pop(); break; }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/auth/userdb-passdb.c Fri Jan 07 20:15:14 2005 +0200 @@ -0,0 +1,76 @@ +/* Copyright (C) 2004 Timo Sirainen */ + +#include "config.h" +#undef HAVE_CONFIG_H + +#ifdef USERDB_PASSDB + +#include "common.h" +#include "str.h" +#include "var-expand.h" +#include "userdb.h" + +#include <stdlib.h> + +static void passdb_lookup(struct auth_request *auth_request, + userdb_callback_t *callback, void *context) +{ + struct user_data data; + const char *const *args; + int uid_seen, gid_seen; + + memset(&data, 0, sizeof(data)); + data.virtual_user = auth_request->user; + + uid_seen = gid_seen = FALSE; + data.uid = (uid_t)-1; + data.gid = (gid_t)-1; + + t_push(); + args = t_strsplit(auth_request->extra_fields, "\t"); + for (; *args != NULL; args++) { + const char *arg = *args; + + if (strncmp(arg, "userdb_", 7) != 0) + continue; + arg += 7; + + if (strncmp(arg, "uid=", 4) == 0) { + uid_seen = TRUE; + data.uid = userdb_parse_uid(auth_request, arg+4); + } else if (strncmp(arg, "gid=", 4) == 0) { + gid_seen = TRUE; + data.gid = userdb_parse_gid(auth_request, arg+4); + } else if (strncmp(arg, "home=", 5) == 0) + data.home = arg + 5; + else if (strncmp(arg, "mail=", 5) == 0) + data.mail = arg + 5; + } + + if (!uid_seen) { + i_error("passdb(%s): userdb_uid not returned", + get_log_prefix(auth_request)); + } + if (!gid_seen) { + i_error("passdb(%s): userdb_gid not returned", + get_log_prefix(auth_request)); + } + + if (data.uid == (uid_t)-1 || data.gid == (gid_t)-1) + callback(NULL, context); + else + callback(&data, context); + t_pop(); +} + +struct userdb_module userdb_passdb = { + "passdb", + + NULL, + NULL, + NULL, + + passdb_lookup +}; + +#endif
--- a/src/auth/userdb.c Fri Jan 07 20:09:40 2005 +0200 +++ b/src/auth/userdb.c Fri Jan 07 20:15:14 2005 +0200 @@ -19,6 +19,9 @@ #ifdef USERDB_PASSWD_FILE &userdb_passwd_file, #endif +#ifdef USERDB_PASSDB + &userdb_passdb, +#endif #ifdef USERDB_STATIC &userdb_static, #endif
--- a/src/auth/userdb.h Fri Jan 07 20:09:40 2005 +0200 +++ b/src/auth/userdb.h Fri Jan 07 20:15:14 2005 +0200 @@ -28,6 +28,7 @@ extern struct userdb_module *userdb; +extern struct userdb_module userdb_passdb; extern struct userdb_module userdb_static; extern struct userdb_module userdb_passwd; extern struct userdb_module userdb_passwd_file;