From: Timo Sirainen Date: Tue, 20 Oct 2009 22:11:00 +0000 (-0400) Subject: imap-login: If imap_capability is set, use it. X-Git-Tag: 2.0.alpha2~52 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=f059a046515f4b2b15a6c2a10a6f12f6166e39a5;p=thirdparty%2Fdovecot%2Fcore.git imap-login: If imap_capability is set, use it. --HG-- branch : HEAD --- diff --git a/src/imap-login/Makefile.am b/src/imap-login/Makefile.am index 5b48406b64..435e346da2 100644 --- a/src/imap-login/Makefile.am +++ b/src/imap-login/Makefile.am @@ -4,6 +4,7 @@ pkglibexec_PROGRAMS = imap-login AM_CPPFLAGS = \ -I$(top_srcdir)/src/lib \ + -I$(top_srcdir)/src/lib-settings \ -I$(top_srcdir)/src/lib-auth \ -I$(top_srcdir)/src/lib-imap \ -I$(top_srcdir)/src/lib-master \ @@ -19,9 +20,11 @@ imap_login_DEPENDENCIES = \ imap_login_SOURCES = \ client.c \ client-authenticate.c \ + imap-login-settings.c \ imap-proxy.c noinst_HEADERS = \ client.h \ client-authenticate.h \ + imap-login-settings.h \ imap-proxy.h diff --git a/src/imap-login/client.c b/src/imap-login/client.c index dcb16291b0..3bcbc2d444 100644 --- a/src/imap-login/client.c +++ b/src/imap-login/client.c @@ -19,6 +19,7 @@ #include "auth-client.h" #include "ssl-proxy.h" #include "imap-proxy.h" +#include "imap-login-settings.h" #include @@ -57,10 +58,13 @@ bool client_skip_line(struct imap_client *client) static const char *get_capability(struct client *client) { - const char *auths; + struct imap_client *imap_client = (struct imap_client *)client; + const char *auths, *cap_str; + cap_str = *imap_client->set->imap_capability != '\0' ? + imap_client->set->imap_capability : CAPABILITY_BANNER_STRING; auths = client_authenticate_get_capabilities(client); - return t_strconcat(CAPABILITY_BANNER_STRING, + return t_strconcat(cap_str, (ssl_initialized && !client->tls) ? " STARTTLS" : "", client->set->disable_plaintext_auth && !client->secured ? " LOGINDISABLED" : "", @@ -306,10 +310,11 @@ static struct client *imap_client_alloc(pool_t pool) return &imap_client->common; } -static void imap_client_create(struct client *client) +static void imap_client_create(struct client *client, void **other_sets) { struct imap_client *imap_client = (struct imap_client *)client; + imap_client->set = other_sets[0]; imap_client->parser = imap_parser_create(imap_client->common.input, imap_client->common.output, MAX_IMAP_LINE); @@ -419,7 +424,7 @@ imap_client_send_line(struct client *client, enum client_cmd_reply reply, void clients_init(void) { - /* Nothing to initialize for IMAP */ + login_set_roots = imap_login_setting_roots; } void clients_deinit(void) diff --git a/src/imap-login/client.h b/src/imap-login/client.h index 1339ee39fc..100fc87d77 100644 --- a/src/imap-login/client.h +++ b/src/imap-login/client.h @@ -7,6 +7,7 @@ struct imap_client { struct client common; + const struct imap_login_settings *set; struct imap_parser *parser; char *proxy_backend_capability; diff --git a/src/imap-login/imap-login-settings.c b/src/imap-login/imap-login-settings.c new file mode 100644 index 0000000000..9ca1a5f989 --- /dev/null +++ b/src/imap-login/imap-login-settings.c @@ -0,0 +1,48 @@ +/* Copyright (c) 2005-2009 Dovecot authors, see the included COPYING file */ + +#include "lib.h" +#include "settings-parser.h" +#include "login-settings.h" +#include "imap-login-settings.h" + +#include + +#undef DEF +#define DEF(type, name) \ + { type, #name, offsetof(struct imap_login_settings, name), NULL } + +static struct setting_define imap_login_setting_defines[] = { + DEF(SET_STR, imap_capability), + + SETTING_DEFINE_LIST_END +}; + +static struct imap_login_settings imap_login_default_settings = { + MEMBER(imap_capability) "" +}; + +static struct setting_parser_info *imap_login_setting_dependencies[] = { + &login_setting_parser_info, + NULL +}; + +static struct setting_parser_info imap_login_setting_parser_info = { + MEMBER(module_name) "imap-login", + MEMBER(defines) imap_login_setting_defines, + MEMBER(defaults) &imap_login_default_settings, + + MEMBER(type_offset) (size_t)-1, + MEMBER(struct_size) sizeof(struct imap_login_settings), + + MEMBER(parent_offset) (size_t)-1, + MEMBER(parent) NULL, + + MEMBER(check_func) NULL, + MEMBER(dependencies) imap_login_setting_dependencies +}; + +const struct setting_parser_info *imap_login_setting_roots[] = { + &login_setting_parser_info, + &imap_login_setting_parser_info, + NULL +}; diff --git a/src/imap-login/imap-login-settings.h b/src/imap-login/imap-login-settings.h new file mode 100644 index 0000000000..3307c522b1 --- /dev/null +++ b/src/imap-login/imap-login-settings.h @@ -0,0 +1,10 @@ +#ifndef IMAP_LOGIN_SETTINGS_H +#define IMAP_LOGIN_SETTINGS_H + +struct imap_login_settings { + const char *imap_capability; +}; + +extern const struct setting_parser_info *imap_login_setting_roots[]; + +#endif diff --git a/src/login-common/client-common.c b/src/login-common/client-common.c index 6bc653c549..3be771aaf1 100644 --- a/src/login-common/client-common.c +++ b/src/login-common/client-common.c @@ -37,10 +37,10 @@ static void client_open_streams(struct client *client) o_stream_create_fd(client->fd, LOGIN_MAX_OUTBUF_SIZE, FALSE); } -struct client *client_create(int fd, bool ssl, pool_t pool, - const struct login_settings *set, - const struct ip_addr *local_ip, - const struct ip_addr *remote_ip) +struct client * +client_create(int fd, bool ssl, pool_t pool, + const struct login_settings *set, void **other_sets, + const struct ip_addr *local_ip, const struct ip_addr *remote_ip) { struct client *client; @@ -78,7 +78,7 @@ struct client *client_create(int fd, bool ssl, pool_t pool, client_idle_disconnect_timeout, client); client_open_streams(client); - client->v.create(client); + client->v.create(client, other_sets); if (auth_client_is_connected(auth_client)) client->v.send_greeting(client); diff --git a/src/login-common/client-common.h b/src/login-common/client-common.h index cd3f896e27..de75c3841d 100644 --- a/src/login-common/client-common.h +++ b/src/login-common/client-common.h @@ -53,7 +53,7 @@ struct client_auth_reply { struct client_vfuncs { struct client *(*alloc)(pool_t pool); - void (*create)(struct client *client); + void (*create)(struct client *client, void **other_sets); void (*destroy)(struct client *client); void (*send_greeting)(struct client *client); void (*starttls)(struct client *client); @@ -126,10 +126,10 @@ struct client { extern struct client *clients; extern struct client_vfuncs client_vfuncs; -struct client *client_create(int fd, bool ssl, pool_t pool, - const struct login_settings *set, - const struct ip_addr *local_ip, - const struct ip_addr *remote_ip); +struct client * +client_create(int fd, bool ssl, pool_t pool, + const struct login_settings *set, void **other_sets, + const struct ip_addr *local_ip, const struct ip_addr *remote_ip); void client_destroy(struct client *client, const char *reason); void client_destroy_success(struct client *client, const char *reason); void client_destroy_internal_failure(struct client *client); diff --git a/src/login-common/common.h b/src/login-common/common.h index d44cfc0401..613b4a9076 100644 --- a/src/login-common/common.h +++ b/src/login-common/common.h @@ -21,6 +21,7 @@ extern bool closing_down; extern int anvil_fd; extern const struct login_settings *global_login_settings; +extern void **global_other_settings; void login_process_preinit(void); diff --git a/src/login-common/login-settings.c b/src/login-common/login-settings.c index 5bd96fc978..072cd97e1b 100644 --- a/src/login-common/login-settings.c +++ b/src/login-common/login-settings.c @@ -84,11 +84,13 @@ struct setting_parser_info login_setting_parser_info = { MEMBER(check_func) login_settings_check }; -const struct setting_parser_info *login_set_roots[] = { +static const struct setting_parser_info *default_login_set_roots[] = { &login_setting_parser_info, NULL }; +const struct setting_parser_info **login_set_roots = default_login_set_roots; + /* */ static int ssl_settings_check(void *_set ATTR_UNUSED, const char **error_r) { @@ -156,16 +158,17 @@ static bool login_settings_check(void *_set, pool_t pool, const char **error_r) struct login_settings * login_settings_read(struct master_service *service, pool_t pool, const struct ip_addr *local_ip, - const struct ip_addr *remote_ip) + const struct ip_addr *remote_ip, + void ***other_settings_r) { struct master_service_settings_input input; const char *error; void **sets; - struct login_settings *set; + unsigned int i; memset(&input, 0, sizeof(input)); input.roots = login_set_roots; - input.module = "login"; + input.module = login_process_name; input.service = login_protocol; if (local_ip != NULL) @@ -180,8 +183,15 @@ login_settings_read(struct master_service *service, pool_t pool, i_fatal("Error reading configuration: %s", error); sets = master_service_settings_get_others(service); - set = settings_dup(&login_setting_parser_info, sets[0], pool); - if (!login_settings_check(set, pool, &error)) - i_fatal("login_settings_check() failed: %s", error); - return set; + for (i = 0; sets[i] != NULL; i++) { + sets[i] = settings_dup(input.roots[i], sets[i], pool); + if (!settings_check(input.roots[i], pool, sets[i], &error)) { + const char *name = input.roots[i]->module_name; + i_fatal("settings_check(%s) failed: %s", + name != NULL ? name : "unknown", error); + } + } + + *other_settings_r = sets + 1; + return sets[0]; } diff --git a/src/login-common/login-settings.h b/src/login-common/login-settings.h index f63f5cb960..7c4b2e92cc 100644 --- a/src/login-common/login-settings.h +++ b/src/login-common/login-settings.h @@ -32,11 +32,13 @@ struct login_settings { char *const *log_format_elements_split; }; -extern const struct setting_parser_info *login_set_roots[]; +extern const struct setting_parser_info **login_set_roots; +extern struct setting_parser_info login_setting_parser_info; struct login_settings * login_settings_read(struct master_service *service, pool_t pool, const struct ip_addr *local_ip, - const struct ip_addr *remote_ip); + const struct ip_addr *remote_ip, + void ***other_settings_r); #endif diff --git a/src/login-common/main.c b/src/login-common/main.c index 25eebddbda..a843117d4c 100644 --- a/src/login-common/main.c +++ b/src/login-common/main.c @@ -24,6 +24,7 @@ bool closing_down; int anvil_fd = -1; const struct login_settings *global_login_settings; +void **global_other_settings; static bool ssl_connections = FALSE; @@ -36,6 +37,7 @@ static void client_connected(const struct master_service_connection *conn) unsigned int local_port; pool_t pool; int fd_ssl; + void **other_sets; if (net_getsockname(conn->fd, &local_ip, &local_port) < 0) { memset(&local_ip, 0, sizeof(local_ip)); @@ -44,11 +46,11 @@ static void client_connected(const struct master_service_connection *conn) pool = pool_alloconly_create("login client", 3*1024); set = login_settings_read(master_service, pool, &local_ip, - &conn->remote_ip); + &conn->remote_ip, &other_sets); if (!ssl_connections && !conn->ssl) { - client = client_create(conn->fd, FALSE, pool, set, &local_ip, - &conn->remote_ip); + client = client_create(conn->fd, FALSE, pool, set, other_sets, + &local_ip, &conn->remote_ip); } else { fd_ssl = ssl_proxy_new(conn->fd, &conn->remote_ip, set, &proxy); if (fd_ssl == -1) { @@ -57,7 +59,7 @@ static void client_connected(const struct master_service_connection *conn) return; } - client = client_create(fd_ssl, TRUE, pool, set, + client = client_create(fd_ssl, TRUE, pool, set, other_sets, &local_ip, &conn->remote_ip); client->ssl_proxy = proxy; ssl_proxy_set_client(proxy, client); @@ -198,7 +200,8 @@ int main(int argc, char *argv[], char *envp[]) process_title_init(argv, envp); set_pool = pool_alloconly_create("global login settings", 4096); global_login_settings = - login_settings_read(master_service, set_pool, NULL, NULL); + login_settings_read(master_service, set_pool, NULL, NULL, + &global_other_settings); /* main_preinit() needs to know the client limit, which is set by this. so call it first. */ diff --git a/src/pop3-login/Makefile.am b/src/pop3-login/Makefile.am index 6cbf1101a3..7eff6858db 100644 --- a/src/pop3-login/Makefile.am +++ b/src/pop3-login/Makefile.am @@ -4,6 +4,7 @@ pkglibexec_PROGRAMS = pop3-login AM_CPPFLAGS = \ -I$(top_srcdir)/src/lib \ + -I$(top_srcdir)/src/lib-settings \ -I$(top_srcdir)/src/lib-auth \ -I$(top_srcdir)/src/lib-master \ -I$(top_srcdir)/src/login-common @@ -18,9 +19,11 @@ pop3_login_DEPENDENCIES = \ pop3_login_SOURCES = \ client.c \ client-authenticate.c \ + pop3-login-settings.c \ pop3-proxy.c noinst_HEADERS = \ client.h \ client-authenticate.h \ + pop3-login-settings.h \ pop3-proxy.h diff --git a/src/pop3-login/client.c b/src/pop3-login/client.c index 19d6007d46..ef5de37f7e 100644 --- a/src/pop3-login/client.c +++ b/src/pop3-login/client.c @@ -7,6 +7,7 @@ #include "istream.h" #include "ostream.h" #include "randgen.h" +#include "hostpid.h" #include "safe-memset.h" #include "str.h" #include "strescape.h" @@ -15,7 +16,7 @@ #include "auth-client.h" #include "ssl-proxy.h" #include "pop3-proxy.h" -#include "hostpid.h" +#include "pop3-login-settings.h" /* Disconnect client when it sends too many bad commands */ #define CLIENT_MAX_BAD_COMMANDS 10 @@ -109,7 +110,8 @@ static struct client *pop3_client_alloc(pool_t pool) return &pop3_client->common; } -static void pop3_client_create(struct client *client ATTR_UNUSED) +static void pop3_client_create(struct client *client ATTR_UNUSED, + void **other_sets ATTR_UNUSED) { } @@ -206,7 +208,7 @@ pop3_client_send_line(struct client *client, enum client_cmd_reply reply, void clients_init(void) { - /* Nothing to initialize for POP3 */ + login_set_roots = pop3_login_setting_roots; } void clients_deinit(void) diff --git a/src/pop3-login/pop3-login-settings.c b/src/pop3-login/pop3-login-settings.c new file mode 100644 index 0000000000..e33f88205b --- /dev/null +++ b/src/pop3-login/pop3-login-settings.c @@ -0,0 +1,38 @@ +/* Copyright (c) 2005-2009 Dovecot authors, see the included COPYING file */ + +#include "lib.h" +#include "settings-parser.h" +#include "login-settings.h" +#include "pop3-login-settings.h" + +#include + +static struct setting_define pop3_login_setting_defines[] = { + SETTING_DEFINE_LIST_END +}; + +static struct setting_parser_info *pop3_login_setting_dependencies[] = { + &login_setting_parser_info, + NULL +}; + +struct setting_parser_info pop3_login_setting_parser_info = { + MEMBER(module_name) "pop3-login", + MEMBER(defines) pop3_login_setting_defines, + MEMBER(defaults) NULL, + + MEMBER(type_offset) (size_t)-1, + MEMBER(struct_size) 0, + + MEMBER(parent_offset) (size_t)-1, + MEMBER(parent) NULL, + + MEMBER(check_func) NULL, + MEMBER(dependencies) pop3_login_setting_dependencies +}; + +const struct setting_parser_info *pop3_login_setting_roots[] = { + &login_setting_parser_info, + &pop3_login_setting_parser_info, + NULL +}; diff --git a/src/pop3-login/pop3-login-settings.h b/src/pop3-login/pop3-login-settings.h new file mode 100644 index 0000000000..1c497eb5e1 --- /dev/null +++ b/src/pop3-login/pop3-login-settings.h @@ -0,0 +1,6 @@ +#ifndef POP3_LOGIN_SETTINGS_H +#define POP3_LOGIN_SETTINGS_H + +extern const struct setting_parser_info *pop3_login_setting_roots[]; + +#endif