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);
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;
/* 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;
#include "lib.h"
#include "array.h"
#include "hostpid.h"
+#include "ioloop.h"
#include "net.h"
#include "module-dir.h"
#include "home-expand.h"
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 */
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;
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.
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 {