]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: If session_id isn't given, generate a new one.
authorTimo Sirainen <tss@iki.fi>
Sun, 24 May 2015 21:40:53 +0000 (17:40 -0400)
committerTimo Sirainen <tss@iki.fi>
Sun, 24 May 2015 21:40:53 +0000 (17:40 -0400)
This is useful for tracking logs written by services that aren't directly
related to any specific user session.

src/lib-storage/mail-storage-service.c

index e7ea0d9686470546cd32da2f2be77d1296fd19bc..9c0e2ccdf0a18de0b935a46188fba73ac13f1c78 100644 (file)
@@ -3,6 +3,7 @@
 #include "lib.h"
 #include "ioloop.h"
 #include "array.h"
+#include "base64.h"
 #include "hostpid.h"
 #include "module-dir.h"
 #include "restrict-access.h"
@@ -1024,6 +1025,20 @@ mail_storage_service_set_log_prefix(struct mail_storage_service_ctx *ctx,
        i_set_failure_prefix("%s", str_c(str));
 }
 
+static const char *mail_storage_service_generate_session_id(pool_t pool)
+{
+       guid_128_t guid;
+       string_t *str = str_new(pool, MAX_BASE64_ENCODED_SIZE(sizeof(guid)));
+
+       guid_128_generate(guid);
+       base64_encode(guid, sizeof(guid), str);
+       /* remove the trailing "==" */
+       i_assert(str_data(str)[str_len(str)-2] == '=');
+       str_truncate(str, str_len(str)-2);
+       return str_c(str);
+
+}
+
 static int
 mail_storage_service_lookup_real(struct mail_storage_service_ctx *ctx,
                                 const struct mail_storage_service_input *input,
@@ -1123,6 +1138,10 @@ mail_storage_service_lookup_real(struct mail_storage_service_ctx *ctx,
        user->input.userdb_fields = NULL;
        user->input.username = p_strdup(user_pool, username);
        user->input.session_id = p_strdup(user_pool, input->session_id);
+       if (user->input.session_id == NULL) {
+               user->input.session_id =
+                       mail_storage_service_generate_session_id(user_pool);
+       }
        user->user_info = user_info;
        user->flags = flags;