.ip = client->state.remote_ip,
};
if (master_service_anvil_connect(master_service, &anvil_session,
- FALSE, client->state.anvil_conn_guid))
+ TRUE, client->state.anvil_conn_guid))
client->state.anvil_sent = TRUE;
p_array_init(&client->notifys, pool, 2);
imap_client_destroy(&client, MASTER_SERVICE_SHUTTING_DOWN_MSG);
}
+unsigned int imap_clients_kick(const char *user, const guid_128_t conn_guid)
+{
+ struct imap_client *client, *next;
+ unsigned int count = 0;
+
+ for (client = imap_clients; client != NULL; client = next) {
+ next = client->next;
+ if (strcmp(client->state.username, user) == 0 &&
+ (guid_128_is_empty(conn_guid) ||
+ guid_128_cmp(client->state.anvil_conn_guid, conn_guid) == 0))
+ imap_client_kick(client);
+ }
+ return count;
+}
+
void imap_clients_init(void)
{
unhibernate_queue = priorityq_init(client_unhibernate_cmp, 64);
void imap_client_create_finish(struct imap_client *client);
void imap_client_destroy(struct imap_client **_client, const char *reason);
+unsigned int imap_clients_kick(const char *user, const guid_128_t conn_guid);
+
void imap_clients_init(void);
void imap_clients_deinit(void);
/* <settings checks> */
static struct file_listener_settings imap_hibernate_unix_listeners_array[] = {
- { "imap-hibernate", 0660, "", "$default_internal_group" }
+ { "imap-hibernate", 0660, "", "$default_internal_group" },
+ { "srv.imap-hibernate/%{pid}", 0600, "", "" },
};
static struct file_listener_settings *imap_hibernate_unix_listeners[] = {
- &imap_hibernate_unix_listeners_array[0]
+ &imap_hibernate_unix_listeners_array[0],
+ &imap_hibernate_unix_listeners_array[1],
};
static buffer_t imap_hibernate_unix_listeners_buf = {
{ { imap_hibernate_unix_listeners, sizeof(imap_hibernate_unix_listeners) } }
#include "lib.h"
#include "restrict-access.h"
#include "master-service.h"
+#include "master-admin-client.h"
#include "master-service-settings.h"
#include "imap-client.h"
#include "imap-hibernate-client.h"
static bool debug = FALSE;
+static const struct master_admin_client_callback admin_callbacks = {
+ .cmd_kick_user = imap_clients_kick,
+};
+
static void client_connected(struct master_service_connection *conn)
{
master_service_client_connection_accept(conn);
restrict_access_by_env(RESTRICT_ACCESS_FLAG_ALLOW_ROOT, NULL);
restrict_access_allow_coredumps(TRUE);
+ master_admin_clients_init(&admin_callbacks);
imap_clients_init();
imap_master_connections_init();
imap_hibernate_clients_init();