#include "connection.h"
#include "imap-parser.h"
#include "imap-quote.h"
+#include "imap-resp-code.h"
#include "imap-login-settings.h"
#include "imap-login-client.h"
enum imap_id_param_flag {
IMAP_ID_PARAM_FLAG_KEY_IS_PREFIX = BIT(0),
+ IMAP_ID_PARAM_FLAG_RELOAD_SETTINGS = BIT(1),
};
struct imap_id_param_handler {
}
static const struct imap_id_param_handler imap_login_id_params[] = {
- { "x-originating-ip", 0, cmd_id_x_originating_ip },
- { "x-originating-port", 0, cmd_id_x_originating_port },
- { "x-connected-ip", 0, cmd_id_x_connected_ip },
- { "x-connected-port", 0, cmd_id_x_connected_port },
- { "x-connected-name", 0, cmd_id_x_connected_name },
+ { "x-originating-ip", IMAP_ID_PARAM_FLAG_RELOAD_SETTINGS,
+ cmd_id_x_originating_ip },
+ { "x-originating-port", IMAP_ID_PARAM_FLAG_RELOAD_SETTINGS,
+ cmd_id_x_originating_port },
+ { "x-connected-ip", IMAP_ID_PARAM_FLAG_RELOAD_SETTINGS,
+ cmd_id_x_connected_ip },
+ { "x-connected-port", IMAP_ID_PARAM_FLAG_RELOAD_SETTINGS,
+ cmd_id_x_connected_port },
+ { "x-connected-name", IMAP_ID_PARAM_FLAG_RELOAD_SETTINGS,
+ cmd_id_x_connected_name },
{ "x-proxy-ttl", 0, cmd_id_x_proxy_ttl },
{ "x-session-id", 0, cmd_id_x_session_id },
{ "x-session-ext-id", 0, cmd_id_x_session_id },
"Client sent invalid ID parameter '%s'", key);
return FALSE;
}
+ if ((handler->flags & IMAP_ID_PARAM_FLAG_RELOAD_SETTINGS) != 0)
+ client->cmd_id->reload_settings = TRUE;
}
if (client->set->imap_id_retain && !is_login_id_param &&
}
}
-static void cmd_id_finish(struct imap_client *client)
+static int cmd_id_finish(struct imap_client *client)
{
if (!client->id_logged) {
client->id_logged = TRUE;
cmd_id_copy_params(client, client->cmd_id->params);
msg = "Trusted ID completed.";
}
+
+ if (client->cmd_id->reload_settings) {
+ const char *error;
+ if (client_addresses_changed(&client->common, &error) < 0) {
+ client_send_reply_code(&client->common,
+ IMAP_CMD_REPLY_NO,
+ IMAP_RESP_CODE_SERVERBUG,
+ "Failed to reload configuration");
+ client_destroy(&client->common, error);
+ return -1;
+ }
+ }
client_send_reply(&client->common, IMAP_CMD_REPLY_OK, msg);
+ return 0;
}
void cmd_id_free(struct imap_client *client)
}
if (ret == 0) {
/* finished the line */
- cmd_id_finish(client);
+ if (cmd_id_finish(client) < 0)
+ return -1;
cmd_id_free(client);
return 1;
} else if (ret == -1) {
clients_destroy_all_reason(MASTER_SERVICE_SHUTTING_DOWN_MSG);
}
+int client_addresses_changed(struct client *client, const char **error_r)
+{
+ const char *error;
+
+ event_add_ip(client->event, "local_ip", &client->local_ip);
+ event_add_int(client->event, "local_port", client->local_port);
+ event_add_ip(client->event, "remote_ip", &client->ip);
+ event_add_int(client->event, "remote_port", client->remote_port);
+ event_add_str(client->event, "local_name", client->local_name);
+
+ if (client_settings_reload(client, &error) < 0) {
+ e_error(client->event, "%s", error);
+ *error_r = error;
+ return -1;
+ }
+ return 0;
+}
+
int client_settings_reload(struct client *client, const char **error_r)
{
const struct login_settings *old_set = client->set;