]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: Added mail_user.session_create_time and .session_restored
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Mon, 10 Oct 2016 14:19:06 +0000 (17:19 +0300)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Thu, 13 Oct 2016 08:25:56 +0000 (10:25 +0200)
src/lib-storage/mail-storage-service.c
src/lib-storage/mail-storage-service.h
src/lib-storage/mail-user.c
src/lib-storage/mail-user.h

index 742c533dd778296ec6ac6e25be4ef67e5a15a28f..f0befcf4095e76d5138f5cec82b3d46bf9e8acd1 100644 (file)
@@ -660,6 +660,11 @@ mail_storage_service_init_post(struct mail_storage_service_ctx *ctx,
        mail_user->admin = user->admin;
        mail_user->auth_token = p_strdup(mail_user->pool, user->auth_token);
        mail_user->auth_user = p_strdup(mail_user->pool, user->auth_user);
+       if (user->input.session_create_time != 0) {
+               mail_user->session_create_time =
+                       user->input.session_create_time;
+               mail_user->session_restored = TRUE;
+       }
        if (user->session_id_counter++ == 0) {
                mail_user->session_id =
                        p_strdup(mail_user->pool, user->input.session_id);
@@ -1237,6 +1242,7 @@ mail_storage_service_lookup_real(struct mail_storage_service_ctx *ctx,
                        mail_storage_service_generate_session_id(user_pool,
                                input->session_id_prefix);
        }
+       user->input.session_create_time = input->session_create_time;
        user->user_info = user_info;
        user->flags = flags;
 
index 603aeaccb7fd77d3b4bec915295a5387d768d89c..a668619d1fb5279a308fb0296ded0917c75cc283 100644 (file)
@@ -47,6 +47,10 @@ struct mail_storage_service_input {
        /* If set, use this string as the session ID prefix, but also append
           a unique session ID suffix to it. */
        const char *session_id_prefix;
+       /* If non-zero, override timestamp when session was created and set
+          mail_user.session_restored=TRUE */
+       time_t session_create_time;
+
        struct ip_addr local_ip, remote_ip;
        in_port_t local_port, remote_port;
 
index 17d3d3b94a352a67a22d8a83115d801ee000f1a0..4b668fe080faf7402d6dcedf2df7d8f1aadbc762 100644 (file)
@@ -3,6 +3,7 @@
 #include "lib.h"
 #include "array.h"
 #include "hostpid.h"
+#include "ioloop.h"
 #include "net.h"
 #include "module-dir.h"
 #include "home-expand.h"
@@ -63,6 +64,7 @@ struct mail_user *mail_user_alloc(const char *username,
        user->set = settings_dup(set_info, set, pool);
        user->service = master_service_get_name(master_service);
        user->default_normalizer = uni_utf8_to_decomposed_titlecase;
+       user->session_create_time = ioloop_time;
 
        /* check settings so that the duplicated structure will again
           contain the parsed fields */
@@ -546,6 +548,7 @@ struct mail_user *mail_user_dup(struct mail_user *user)
        user2->auth_token = p_strdup(user2->pool, user->auth_token);
        user2->auth_user = p_strdup(user2->pool, user->auth_user);
        user2->session_id = p_strdup(user2->pool, user->session_id);
+       user2->session_create_time = user->session_create_time;
        user2->userdb_fields = user->userdb_fields == NULL ? NULL :
                p_strarray_dup(user2->pool, user->userdb_fields);
        return user2;
index 68b92f9cc229cbcf8bd2bf9aafb892acddae9110..7a3ec8fcfaba5a1c79572ae0ba039c3719bb0829 100644 (file)
@@ -37,6 +37,9 @@ struct mail_user {
        struct ip_addr *local_ip, *remote_ip;
        const char *auth_token, *auth_user;
        const char *const *userdb_fields;
+       /* Timestamp when this session was initially created. Most importantly
+          this stays the same after IMAP client is hibernated and restored. */
+       time_t session_create_time;
 
        const struct var_expand_table *var_expand_table;
        /* If non-NULL, fail the user initialization with this error.
@@ -91,6 +94,8 @@ struct mail_user {
        unsigned int stats_enabled:1;
        /* Enable autoexpunging at deinit. */
        unsigned int autoexpunge_enabled:1;
+       /* This session was restored (e.g. IMAP unhibernation) */
+       unsigned int session_restored:1;
 };
 
 struct mail_user_module_register {