]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
imap-hibernate: Preserve mail_user.session_create_time through hibernation
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Mon, 10 Oct 2016 14:19:16 +0000 (17:19 +0300)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Thu, 13 Oct 2016 08:26:03 +0000 (10:26 +0200)
src/imap-hibernate/imap-client.c
src/imap-hibernate/imap-client.h
src/imap-hibernate/imap-hibernate-client.c
src/imap/imap-client-hibernate.c
src/imap/imap-master-client.c

index 8964f99abc1737ef4161f6afdb5e07daacff7c9b..75517697041a7c5426216f7056e1009abae45384 100644 (file)
@@ -133,6 +133,10 @@ imap_client_move_back_send_callback(void *context, struct ostream *output)
                str_append(str, "\tsession=");
                str_append_tabescaped(str, state->session_id);
        }
+       if (state->session_created != 0) {
+               str_printfa(str, "\tsession_created=%s",
+                           dec2str(state->session_created));
+       }
        if (state->tag != NULL)
                str_printfa(str, "\ttag=%s", client->state.tag);
        if (state->local_ip.family != 0)
index a68cf9666f924bfe5fa87db3b8054a409d82b6d2..ce7e479585993d3c67347264629d9394db2afef6 100644 (file)
@@ -9,6 +9,7 @@ struct imap_client_state {
        /* optional: */
        const char *session_id, *userdb_fields, *stats;
        struct ip_addr local_ip, remote_ip;
+       time_t session_created;
 
        uid_t uid;
        gid_t gid;
index 4b4ed7485e671bfba1e5b9aea9f1274eb03f2b95..df7d7616390080247c249ccc92f7c8fa28ee1651 100644 (file)
@@ -117,6 +117,12 @@ imap_hibernate_client_parse_input(const char *const *args, pool_t pool,
                        state_r->idle_cmd = TRUE;
                } else if (strcmp(key, "session") == 0) {
                        state_r->session_id = value;
+               } else if (strcmp(key, "session_created") == 0) {
+                       if (str_to_time(value, &state_r->session_created) < 0) {
+                               *error_r = t_strdup_printf(
+                                       "Invalid session_created value: %s", value);
+                               return -1;
+                       }
                } else if (strcmp(key, "userdb_fields") == 0) {
                        state_r->userdb_fields = value;
                } else if (strcmp(key, "notify_fd") == 0) {
index ae518ab044a9ec8253ae23f0876e02f1067984d3..bf219386bea63ba10602c7c1ba139c40e64dd0af 100644 (file)
@@ -64,6 +64,10 @@ static void imap_hibernate_write_cmd(struct client *client, string_t *cmd,
                str_append(cmd, "\tsession=");
                str_append_tabescaped(cmd, client->session_id);
        }
+       if (client->user->session_create_time != 0) {
+               str_printfa(cmd, "\tsession_created=%s",
+                           dec2str(client->user->session_create_time));
+       }
        if (client->user->local_ip != NULL)
                str_printfa(cmd, "\tlip=%s", net_ip2addr(client->user->local_ip));
        if (client->user->remote_ip != NULL)
index 35cf2bb3d338bebc36838c00a63e4b4e5a26a4b4..17bb53e14d3292b0df7dd01ba3d517364f5c661d 100644 (file)
@@ -114,6 +114,12 @@ imap_master_client_parse_input(const char *const *args, pool_t pool,
                        }
                } else if (strcmp(key, "session") == 0) {
                        input_r->session_id = value;
+               } else if (strcmp(key, "session_created") == 0) {
+                       if (str_to_time(value, &input_r->session_create_time) < 0) {
+                               *error_r = t_strdup_printf(
+                                       "Invalid session_created value: %s", value);
+                               return -1;
+                       }
                } else if (strcmp(key, "userdb_fields") == 0) {
                        input_r->userdb_fields =
                                t_strsplit_tabescaped(value);