dovecot-2.0: doveadm: Added doveadm_proxy_port setting to make i...
dovecot at dovecot.org
dovecot at dovecot.org
Fri May 20 13:30:49 EEST 2011
details: http://hg.dovecot.org/dovecot-2.0/rev/9c9f81ad0111
changeset: 12813:9c9f81ad0111
user: Timo Sirainen <tss at iki.fi>
date: Fri May 20 13:05:16 2011 +0300
description:
doveadm: Added doveadm_proxy_port setting to make it work with proxying.
diffstat:
src/doveadm/Makefile.am | 8 +-
src/doveadm/doveadm-mail-server.c | 96 +++++++++++++++++++++++++++-----------
src/doveadm/doveadm-mail.c | 13 ++--
src/doveadm/doveadm-mail.h | 3 +-
src/doveadm/doveadm-settings.c | 2 +
src/doveadm/doveadm-settings.h | 1 +
src/doveadm/main.c | 11 ----
7 files changed, 82 insertions(+), 52 deletions(-)
diffs (275 lines):
diff -r d20588657ddc -r 9c9f81ad0111 src/doveadm/Makefile.am
--- a/src/doveadm/Makefile.am Fri May 20 13:03:34 2011 +0300
+++ b/src/doveadm/Makefile.am Fri May 20 13:05:16 2011 +0300
@@ -70,9 +70,11 @@
doveadm-mail-move.c \
doveadm-mail-list-iter.c \
doveadm-mail-search.c \
+ doveadm-mail-server.c \
doveadm-print.c \
doveadm-settings.c \
- doveadm-util.c
+ doveadm-util.c \
+ server-connection.c
doveadm_SOURCES = \
$(common) \
@@ -87,7 +89,6 @@
doveadm-kick.c \
doveadm-log.c \
doveadm-master.c \
- doveadm-mail-server.c \
doveadm-mutf7.c \
doveadm-penalty.c \
doveadm-print-flow.c \
@@ -96,8 +97,7 @@
doveadm-print-table.c \
doveadm-pw.c \
doveadm-sis.c \
- doveadm-who.c \
- server-connection.c
+ doveadm-who.c
doveadm_server_SOURCES = \
$(common) \
diff -r d20588657ddc -r 9c9f81ad0111 src/doveadm/doveadm-mail-server.c
--- a/src/doveadm/doveadm-mail-server.c Fri May 20 13:03:34 2011 +0300
+++ b/src/doveadm/doveadm-mail-server.c Fri May 20 13:05:16 2011 +0300
@@ -7,6 +7,7 @@
#include "strescape.h"
#include "ioloop.h"
#include "master-service.h"
+#include "auth-master.h"
#include "mail-storage.h"
#include "mail-storage-service.h"
#include "server-connection.h"
@@ -142,33 +143,74 @@
!DOVEADM_MAIL_SERVER_FAILED());
}
-static const char *userdb_field_find(const char *const *fields, const char *key)
+static int
+doveadm_mail_server_user_get_host(struct doveadm_mail_cmd_context *ctx,
+ const char *username, const char **host_r,
+ const char **error_r)
{
- unsigned int i, len = strlen(key);
+ struct mail_storage_service_input input;
+ struct auth_master_connection *auth_conn;
+ struct auth_user_info info;
+ pool_t pool;
+ const char *proxy_host, *const *fields;
+ unsigned int i;
+ bool proxying;
+ int ret;
- if (fields == NULL)
- return NULL;
+ *host_r = doveadm_settings->doveadm_socket_path;
- for (i = 0; fields[i] != NULL; i++) {
- if (strncmp(fields[i], key, len) == 0) {
- if (fields[i][len] == '\0')
- return "";
- if (fields[i][len] == '=')
- return fields[i]+len+1;
+ if (doveadm_settings->doveadm_proxy_port == 0)
+ return 0;
+
+ /* make sure we have an auth connection */
+ memset(&input, 0, sizeof(input));
+ input.service = "doveadm";
+ mail_storage_service_init_settings(ctx->storage_service, &input);
+
+ memset(&info, 0, sizeof(info));
+ info.service = master_service_get_name(master_service);
+
+ pool = pool_alloconly_create("auth lookup", 1024);
+ auth_conn = mail_storage_service_get_auth_conn(ctx->storage_service);
+ ret = auth_master_pass_lookup(auth_conn, username, &info,
+ pool, &fields);
+ if (ret < 0) {
+ *error_r = fields[0] != NULL ?
+ t_strdup(fields[0]) : "passdb lookup failed";
+ } else if (ret == 0) {
+ /* user not found from passdb. it could be in userdb though,
+ so just continue with the default host */
+ } else {
+ proxy_host = NULL;
+ for (i = 0; fields[i] != NULL; i++) {
+ if (strncmp(fields[i], "proxy", 5) == 0 &&
+ (fields[i][5] == '\0' || fields[i][5] == '='))
+ proxying = TRUE;
+ else if (strncmp(fields[i], "host=", 5) == 0)
+ proxy_host = fields[i]+5;
+ }
+ if (!proxying)
+ ret = 0;
+ else if (proxy_host == NULL) {
+ *error_r = "Proxy is missing destination host";
+ ret = -1;
+ } else {
+ *host_r = t_strdup_printf("%s:%u", proxy_host,
+ doveadm_settings->doveadm_proxy_port);
}
}
- return NULL;
+ pool_unref(&pool);
+ return ret;
}
int doveadm_mail_server_user(struct doveadm_mail_cmd_context *ctx,
- struct mail_storage_service_user *user,
- const char **error_r)
+ const char *username, const char **error_r)
{
- const struct mail_storage_service_input *input;
struct doveadm_server *server;
struct server_connection *conn;
const char *host;
char *username_dup;
+ int ret;
i_assert(cmd_ctx == ctx || cmd_ctx == NULL);
cmd_ctx = ctx;
@@ -177,34 +219,32 @@
so undo any sticks we might have added already */
doveadm_print_unstick_headers();
- input = mail_storage_service_user_get_input(user);
- if (userdb_field_find(input->userdb_fields, "proxy") != NULL) {
- host = userdb_field_find(input->userdb_fields, "host");
- if (host == NULL) {
- *error_r = "Proxy is missing destination host";
- return -1;
- }
- } else {
- host = doveadm_settings->doveadm_socket_path;
+ ret = doveadm_mail_server_user_get_host(ctx, username, &host, error_r);
+ if (ret < 0)
+ return -1;
+ if (ret == 0 &&
+ (doveadm_settings->doveadm_worker_count == 0 || doveadm_server)) {
+ /* run it ourself */
+ return 0;
}
server = doveadm_server_get(host);
conn = doveadm_server_find_unused_conn(server);
if (conn != NULL)
- doveadm_mail_server_handle(conn, input->username);
+ doveadm_mail_server_handle(conn, username);
else if (array_count(&server->connections) <
- doveadm_settings->doveadm_worker_count) {
+ I_MAX(doveadm_settings->doveadm_worker_count, 1)) {
conn = server_connection_create(server);
- doveadm_mail_server_handle(conn, input->username);
+ doveadm_mail_server_handle(conn, username);
} else {
if (array_count(&server->queue) >= DOVEADM_SERVER_QUEUE_MAX)
doveadm_server_flush_one(server);
- username_dup = i_strdup(input->username);
+ username_dup = i_strdup(username);
array_append(&server->queue, &username_dup, 1);
}
*error_r = "doveadm server failure";
- return DOVEADM_MAIL_SERVER_FAILED() ? -1 : 0;
+ return DOVEADM_MAIL_SERVER_FAILED() ? -1 : 1;
}
static struct doveadm_server *doveadm_server_find_used(void)
diff -r d20588657ddc -r 9c9f81ad0111 src/doveadm/doveadm-mail.c
--- a/src/doveadm/doveadm-mail.c Fri May 20 13:03:34 2011 +0300
+++ b/src/doveadm/doveadm-mail.c Fri May 20 13:05:16 2011 +0300
@@ -193,6 +193,12 @@
i_set_failure_prefix(t_strdup_printf("doveadm(%s): ", input->username));
+ /* see if we want to execute this command via (another)
+ doveadm server */
+ ret = doveadm_mail_server_user(ctx, input->username, error_r);
+ if (ret != 0)
+ return ret;
+
ret = mail_storage_service_lookup(ctx->storage_service, input,
&service_user, &error);
if (ret <= 0) {
@@ -203,13 +209,6 @@
return ret;
}
- if (doveadm_settings->doveadm_worker_count > 0 && !doveadm_server) {
- /* execute this command via doveadm server */
- ret = doveadm_mail_server_user(ctx, service_user, error_r);
- mail_storage_service_user_free(&service_user);
- return ret < 0 ? -1 : 1;
- }
-
ret = mail_storage_service_next(ctx->storage_service, service_user,
&ctx->cur_mail_user);
if (ret < 0) {
diff -r d20588657ddc -r 9c9f81ad0111 src/doveadm/doveadm-mail.h
--- a/src/doveadm/doveadm-mail.h Fri May 20 13:03:34 2011 +0300
+++ b/src/doveadm/doveadm-mail.h Fri May 20 13:05:16 2011 +0300
@@ -85,8 +85,7 @@
char *argv[], const char *username,
enum mail_storage_service_flags service_flags);
int doveadm_mail_server_user(struct doveadm_mail_cmd_context *ctx,
- struct mail_storage_service_user *user,
- const char **error_r);
+ const char *username, const char **error_r);
void doveadm_mail_server_flush(void);
int doveadm_mailbox_find_and_sync(struct mail_user *user, const char *mailbox,
diff -r d20588657ddc -r 9c9f81ad0111 src/doveadm/doveadm-settings.c
--- a/src/doveadm/doveadm-settings.c Fri May 20 13:03:34 2011 +0300
+++ b/src/doveadm/doveadm-settings.c Fri May 20 13:05:16 2011 +0300
@@ -57,6 +57,7 @@
DEF(SET_STR, mail_plugin_dir),
DEF(SET_STR, doveadm_socket_path),
DEF(SET_UINT, doveadm_worker_count),
+ DEF(SET_UINT, doveadm_proxy_port),
{ SET_STRLIST, "plugin", offsetof(struct doveadm_settings, plugin_envs), NULL },
@@ -69,6 +70,7 @@
.mail_plugin_dir = MODULEDIR,
.doveadm_socket_path = "doveadm-server",
.doveadm_worker_count = 0,
+ .doveadm_proxy_port = 0,
.plugin_envs = ARRAY_INIT
};
diff -r d20588657ddc -r 9c9f81ad0111 src/doveadm/doveadm-settings.h
--- a/src/doveadm/doveadm-settings.h Fri May 20 13:03:34 2011 +0300
+++ b/src/doveadm/doveadm-settings.h Fri May 20 13:05:16 2011 +0300
@@ -7,6 +7,7 @@
const char *mail_plugin_dir;
const char *doveadm_socket_path;
unsigned int doveadm_worker_count;
+ unsigned int doveadm_proxy_port;
ARRAY_DEFINE(plugin_envs, const char *);
};
diff -r d20588657ddc -r 9c9f81ad0111 src/doveadm/main.c
--- a/src/doveadm/main.c Fri May 20 13:03:34 2011 +0300
+++ b/src/doveadm/main.c Fri May 20 13:05:16 2011 +0300
@@ -18,17 +18,6 @@
struct client_connection *doveadm_client;
-int doveadm_mail_server_user(struct doveadm_mail_cmd_context *ctx ATTR_UNUSED,
- struct mail_storage_service_user *user ATTR_UNUSED,
- const char **error_r ATTR_UNUSED)
-{
- /* this function should be called only by doveadm client code */
- i_unreached();
-}
-void doveadm_mail_server_flush(void)
-{
-}
-
static void doveadm_die(void)
{
/* do nothing. doveadm connections should be over soon. */
More information about the dovecot-cvs
mailing list