doveadm-mail-server.c revision 1e09e09669964343557a0027188f486e9d4ccba8
5e0ce63bb65db34d7f48b34bbb5545fa791781c4Timo Sirainen/* Copyright (c) 2010-2013 Dovecot authors, see the included COPYING file */
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen (internal_failure || master_service_is_killed(master_service))
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainenstatic HASH_TABLE(char *, struct doveadm_server *) servers;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainenstatic struct doveadm_mail_cmd_context *cmd_ctx;
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainenstatic void doveadm_mail_server_handle(struct server_connection *conn,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainendoveadm_server_get(struct doveadm_mail_cmd_context *ctx, const char *name)
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen server_pool = pool_alloconly_create("doveadm servers", 1024*16);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen hash_table_create(&servers, server_pool, 0, str_hash, strcmp);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen server = p_new(server_pool, struct doveadm_server, 1);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen server->name = dup_name = p_strdup(server_pool, name);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen p_array_init(&server->connections, server_pool,
01af88dfbb7a022ddb3ab9fb4159f2a4a204ead3Timo Sirainendoveadm_server_find_unused_conn(struct doveadm_server *server)
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainenstatic bool doveadm_server_have_used_connections(struct doveadm_server *server)
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainenstatic void doveadm_cmd_callback(enum server_cmd_reply reply, void *context)
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen struct doveadm_mail_server_cmd *servercmd = context;
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen server_connection_get_server(servercmd->conn);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen const char *username = t_strdup(servercmd->username);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen i_error("%s: Internal failure for %s", server->name, username);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen i_error("%s: No such user: %s", server->name, username);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen doveadm_mail_failed_error(cmd_ctx, MAIL_ERROR_TEMP);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen char *const *usernamep = array_idx(&server->queue, 0);
c06f4017027263cf3a08becc551f5126409e2a83Timo Sirainen conn = doveadm_server_find_unused_conn(server);
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainenstatic void doveadm_mail_server_handle(struct server_connection *conn,
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen unsigned int i;
c06f4017027263cf3a08becc551f5126409e2a83Timo Sirainen /* <flags> <username> <command> [<args>] */
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen str_append_tabescaped(cmd, cmd_ctx->cmd->name);
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen for (i = 0; cmd_ctx->full_args[i] != NULL; i++) {
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen str_append_tabescaped(cmd, cmd_ctx->full_args[i]);
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen servercmd = i_new(struct doveadm_mail_server_cmd, 1);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainenstatic void doveadm_server_flush_one(struct doveadm_server *server)
1060afdc2fcdf647dbb3bc11647401f1b44a3a8aTimo Sirainen unsigned int count = array_count(&server->queue);
602a0434db30d8e3292d1c161a803d96a879a74fTimo Sirainen } while (array_count(&server->queue) == count &&
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainen doveadm_server_have_used_connections(server) &&
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainendoveadm_mail_server_user_get_host(struct doveadm_mail_cmd_context *ctx,
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen const struct mail_storage_service_input *input,
143cb2e0744e647f8fc637bbdea1106c1587a4bfTimo Sirainen const char *auth_socket_path, *proxy_host, *const *fields;
143cb2e0744e647f8fc637bbdea1106c1587a4bfTimo Sirainen unsigned int i;
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen /* make sure we have an auth connection */
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen mail_storage_service_init_settings(ctx->storage_service, input);
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen info.service = master_service_get_name(master_service);
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen pool = pool_alloconly_create("auth lookup", 1024);
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen auth_conn = mail_storage_service_get_auth_conn(ctx->storage_service);
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen auth_socket_path = auth_master_get_socket_path(auth_conn);
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen ret = auth_master_pass_lookup(auth_conn, input->username, &info,
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen *error_r = t_strdup_printf("%s: %s (to see if user is proxied, "
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen "because doveadm_proxy_port is set)",
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen } else if (ret == 0) {
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen /* user not found from passdb. it could be in userdb though,
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen so just continue with the default host */
7d207b1e77a7b5e3fda640e353acfc86d261fedfTimo Sirainen (fields[i][5] == '\0' || fields[i][5] == '='))
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen *error_r = t_strdup_printf("%s: Proxy is missing destination host",
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen if (strstr(auth_socket_path, "/auth-userdb") != NULL) {
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen "%s (maybe set auth_socket_path=director-userdb)",
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen *host_r = t_strdup_printf("%s:%u", proxy_host,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainenint doveadm_mail_server_user(struct doveadm_mail_cmd_context *ctx,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen const struct mail_storage_service_input *input,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen const char **error_r)
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen ret = doveadm_mail_server_user_get_host(ctx, input, &host, error_r);
if (ret == 0 &&
char *key;
return ret;
static void doveadm_servers_destroy_all_connections(void)
char *key;
void doveadm_mail_server_flush(void)
if (DOVEADM_MAIL_SERVER_FAILED())