"Fossies" - the Fresh Open Source Software Archive  

Source code changes of the file "src/doveadm/doveadm-proxy.c" between
dovecot-2.3.16.tar.gz and dovecot-2.3.17.tar.gz

About: Dovecot is an IMAP and POP3 server, written with security primarily in mind.

doveadm-proxy.c  (dovecot-2.3.16):doveadm-proxy.c  (dovecot-2.3.17)
skipping to change at line 22 skipping to change at line 22
#include <unistd.h> #include <unistd.h>
struct proxy_context { struct proxy_context {
struct ipc_client *ipc; struct ipc_client *ipc;
const char *username_field; const char *username_field;
const char *kick_hosts; const char *kick_hosts;
}; };
extern struct doveadm_cmd_ver2 doveadm_cmd_proxy[]; extern struct doveadm_cmd_ver2 doveadm_cmd_proxy[];
static void proxy_cmd_help(doveadm_command_t *cmd) ATTR_NORETURN; static void proxy_cmd_help(struct doveadm_cmd_context *cctx) ATTR_NORETURN;
static struct proxy_context * static struct proxy_context *
cmd_proxy_init(int argc, char *argv[], const char *getopt_args, cmd_proxy_init(struct doveadm_cmd_context *cctx)
doveadm_command_t *cmd)
{ {
struct proxy_context *ctx; struct proxy_context *ctx;
const char *socket_path; const char *socket_path;
int c;
ctx = t_new(struct proxy_context, 1); ctx = t_new(struct proxy_context, 1);
socket_path = t_strconcat(doveadm_settings->base_dir, "/ipc", NULL); if (!doveadm_cmd_param_str(cctx, "socket-path", &socket_path)) {
socket_path = t_strconcat(doveadm_settings->base_dir,
while ((c = getopt(argc, argv, getopt_args)) > 0) { "/ipc", NULL);
switch (c) {
case 'a':
socket_path = optarg;
break;
case 'f':
ctx->username_field = optarg;
break;
case 'h':
ctx->kick_hosts = optarg;
break;
default:
proxy_cmd_help(cmd);
}
} }
(void)doveadm_cmd_param_str(cctx, "passdb-field", &ctx->username_field);
(void)doveadm_cmd_param_str(cctx, "host", &ctx->kick_hosts);
ctx->ipc = ipc_client_init(socket_path); ctx->ipc = ipc_client_init(socket_path);
return ctx; return ctx;
} }
static void cmd_proxy_list_header(const char *const *args) static void cmd_proxy_list_header(const char *const *args)
{ {
struct { struct {
const char *key; const char *key;
const char *title; const char *title;
} header_map[] = { } header_map[] = {
skipping to change at line 112 skipping to change at line 99
} }
case IPC_CLIENT_CMD_STATE_OK: case IPC_CLIENT_CMD_STATE_OK:
break; break;
case IPC_CLIENT_CMD_STATE_ERROR: case IPC_CLIENT_CMD_STATE_ERROR:
i_error("LIST-FULL failed: %s", data); i_error("LIST-FULL failed: %s", data);
break; break;
} }
io_loop_stop(current_ioloop); io_loop_stop(current_ioloop);
} }
static void cmd_proxy_list(int argc, char *argv[]) static void cmd_proxy_list(struct doveadm_cmd_context *cctx)
{ {
struct proxy_context *ctx; struct proxy_context *ctx;
bool seen_header = FALSE; bool seen_header = FALSE;
ctx = cmd_proxy_init(argc, argv, "a:", cmd_proxy_list); ctx = cmd_proxy_init(cctx);
doveadm_print_init(DOVEADM_PRINT_TYPE_TABLE); doveadm_print_init(DOVEADM_PRINT_TYPE_TABLE);
io_loop_set_running(current_ioloop); io_loop_set_running(current_ioloop);
ipc_client_cmd(ctx->ipc, "proxy\t*\tLIST-FULL", ipc_client_cmd(ctx->ipc, "proxy\t*\tLIST-FULL",
cmd_proxy_list_callback, &seen_header); cmd_proxy_list_callback, &seen_header);
if (io_loop_is_running(current_ioloop)) if (io_loop_is_running(current_ioloop))
io_loop_run(current_ioloop); io_loop_run(current_ioloop);
ipc_client_deinit(&ctx->ipc); ipc_client_deinit(&ctx->ipc);
} }
skipping to change at line 148 skipping to change at line 135
doveadm_print(data); doveadm_print(data);
break; break;
case IPC_CLIENT_CMD_STATE_ERROR: case IPC_CLIENT_CMD_STATE_ERROR:
i_error("KICK failed: %s", data); i_error("KICK failed: %s", data);
doveadm_exit_code = EX_TEMPFAIL; doveadm_exit_code = EX_TEMPFAIL;
break; break;
} }
io_loop_stop(current_ioloop); io_loop_stop(current_ioloop);
} }
static void cmd_proxy_kick(int argc, char *argv[]) static void cmd_proxy_kick(struct doveadm_cmd_context *cctx)
{ {
struct proxy_context *ctx; struct proxy_context *ctx;
const char *const *users = NULL;
string_t *cmd; string_t *cmd;
ctx = cmd_proxy_init(argc, argv, "a:f:h:", cmd_proxy_kick); ctx = cmd_proxy_init(cctx);
(void)doveadm_cmd_param_array(cctx, "user", &users);
if (argv[optind] == NULL && ctx->kick_hosts == NULL) { if (users == NULL && ctx->kick_hosts == NULL) {
proxy_cmd_help(cmd_proxy_kick); proxy_cmd_help(cctx);
return; return;
} }
doveadm_print_init(DOVEADM_PRINT_TYPE_FORMATTED); doveadm_print_init(DOVEADM_PRINT_TYPE_FORMATTED);
doveadm_print_formatted_set_format("%{count} connections kicked\n"); doveadm_print_formatted_set_format("%{count} connections kicked\n");
doveadm_print_header_simple("count"); doveadm_print_header_simple("count");
cmd = t_str_new(128); cmd = t_str_new(128);
str_append(cmd, "proxy\t*\t"); str_append(cmd, "proxy\t*\t");
if (ctx->kick_hosts != NULL) { if (ctx->kick_hosts != NULL) {
str_append(cmd, "KICK-HOST\t"); str_append(cmd, "KICK-HOST\t");
str_append(cmd, ctx->kick_hosts); str_append(cmd, ctx->kick_hosts);
} }
else if (ctx->username_field == NULL) else if (ctx->username_field == NULL)
str_append(cmd, "KICK"); str_append(cmd, "KICK");
else { else {
str_append(cmd, "KICK-ALT\t"); str_append(cmd, "KICK-ALT\t");
str_append_tabescaped(cmd, ctx->username_field); str_append_tabescaped(cmd, ctx->username_field);
} }
for (; argv[optind] != NULL; optind++) { if (users != NULL) {
str_append_c(cmd, '\t'); for (unsigned int i = 0; users[i] != NULL; i++) {
str_append_tabescaped(cmd, argv[optind]); str_append_c(cmd, '\t');
str_append_tabescaped(cmd, users[i]);
}
} }
ipc_client_cmd(ctx->ipc, str_c(cmd), cmd_proxy_kick_callback, NULL); ipc_client_cmd(ctx->ipc, str_c(cmd), cmd_proxy_kick_callback, NULL);
io_loop_run(current_ioloop); io_loop_run(current_ioloop);
ipc_client_deinit(&ctx->ipc); ipc_client_deinit(&ctx->ipc);
} }
struct doveadm_cmd_ver2 doveadm_cmd_proxy[] = { struct doveadm_cmd_ver2 doveadm_cmd_proxy[] = {
{ {
.name = "proxy list", .name = "proxy list",
.usage = "[-a <ipc socket path>]", .usage = "[-a <ipc socket path>]",
.old_cmd = cmd_proxy_list, .cmd = cmd_proxy_list,
DOVEADM_CMD_PARAMS_START DOVEADM_CMD_PARAMS_START
DOVEADM_CMD_PARAM('a', "socket-path", CMD_PARAM_STR, 0) DOVEADM_CMD_PARAM('a', "socket-path", CMD_PARAM_STR, 0)
DOVEADM_CMD_PARAMS_END DOVEADM_CMD_PARAMS_END
}, },
{ {
.name = "proxy kick", .name = "proxy kick",
.usage = "[-a <ipc socket path>] [-f <passdb field>] [-h <host> [...] | < user> [...]]", .usage = "[-a <ipc socket path>] [-f <passdb field>] [-h <host> [...] | < user> [...]]",
.old_cmd = cmd_proxy_kick, .cmd = cmd_proxy_kick,
DOVEADM_CMD_PARAMS_START DOVEADM_CMD_PARAMS_START
DOVEADM_CMD_PARAM('a', "socket-path", CMD_PARAM_STR, 0) DOVEADM_CMD_PARAM('a', "socket-path", CMD_PARAM_STR, 0)
DOVEADM_CMD_PARAM('f', "passdb-field", CMD_PARAM_STR, 0) DOVEADM_CMD_PARAM('f', "passdb-field", CMD_PARAM_STR, 0)
DOVEADM_CMD_PARAM('h', "host", CMD_PARAM_STR, 0) DOVEADM_CMD_PARAM('h', "host", CMD_PARAM_STR, 0)
DOVEADM_CMD_PARAM('\0', "user", CMD_PARAM_ARRAY, CMD_PARAM_FLAG_POSITIONAL) DOVEADM_CMD_PARAM('\0', "user", CMD_PARAM_ARRAY, CMD_PARAM_FLAG_POSITIONAL)
DOVEADM_CMD_PARAMS_END DOVEADM_CMD_PARAMS_END
} }
}; };
static void proxy_cmd_help(doveadm_command_t *cmd) static void proxy_cmd_help(struct doveadm_cmd_context *cctx)
{ {
unsigned int i; unsigned int i;
for (i = 0; i < N_ELEMENTS(doveadm_cmd_proxy); i++) { for (i = 0; i < N_ELEMENTS(doveadm_cmd_proxy); i++) {
if (doveadm_cmd_proxy[i].old_cmd == cmd) if (doveadm_cmd_proxy[i].cmd == cctx->cmd->cmd)
help_ver2(&doveadm_cmd_proxy[i]); help_ver2(&doveadm_cmd_proxy[i]);
} }
i_unreached(); i_unreached();
} }
void doveadm_register_proxy_commands(void) void doveadm_register_proxy_commands(void)
{ {
unsigned int i; unsigned int i;
for (i = 0; i < N_ELEMENTS(doveadm_cmd_proxy); i++) for (i = 0; i < N_ELEMENTS(doveadm_cmd_proxy); i++)
 End of changes. 15 change blocks. 
34 lines changed or deleted 24 lines changed or added

Home  |  About  |  Features  |  All  |  Newest  |  Dox  |  Diffs  |  RSS Feeds  |  Screenshots  |  Comments  |  Imprint  |  Privacy  |  HTTP(S)