diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-28 09:51:24 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-28 09:51:24 +0000 |
commit | f7548d6d28c313cf80e6f3ef89aed16a19815df1 (patch) | |
tree | a3f6f2a3f247293bee59ecd28e8cd8ceb6ca064a /src/plugins/mail-crypt/mail-crypt-userenv.c | |
parent | Initial commit. (diff) | |
download | dovecot-f7548d6d28c313cf80e6f3ef89aed16a19815df1.tar.xz dovecot-f7548d6d28c313cf80e6f3ef89aed16a19815df1.zip |
Adding upstream version 1:2.3.19.1+dfsg1.upstream/1%2.3.19.1+dfsg1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to '')
-rw-r--r-- | src/plugins/mail-crypt/mail-crypt-userenv.c | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/src/plugins/mail-crypt/mail-crypt-userenv.c b/src/plugins/mail-crypt/mail-crypt-userenv.c new file mode 100644 index 0000000..b152a7f --- /dev/null +++ b/src/plugins/mail-crypt/mail-crypt-userenv.c @@ -0,0 +1,66 @@ +/* Copyright (c) 2015-2018 Dovecot authors, see the included COPYING file */ +#include "lib.h" +#include "str.h" +#include "mail-user.h" +#include "mail-crypt-common.h" +#include "mail-crypt-key.h" + +static int +mail_crypt_load_global_private_keys(struct mail_user *user, + const char *set_prefix, + struct mail_crypt_global_keys *global_keys, + bool ignore_errors, + const char **error_r) +{ + string_t *set_key = t_str_new(64); + str_append(set_key, set_prefix); + str_append(set_key, "_private_key"); + size_t prefix_len = str_len(set_key); + + unsigned int i = 1; + const char *key_data; + while ((key_data = mail_user_plugin_getenv(user, str_c(set_key))) != NULL) { + const char *set_pw = t_strconcat(str_c(set_key), "_password", NULL); + const char *password = mail_user_plugin_getenv(user, set_pw); + if (mail_crypt_load_global_private_key(str_c(set_key), key_data, + set_pw, password, + global_keys, + error_r) < 0) { + /* skip this key */ + if (ignore_errors) { + e_debug(user->event, "mail-crypt-plugin: " + "mail_crypt_load_global_private_key failed: %s", + *error_r); + *error_r = NULL; + continue; + } + return -1; + } + str_truncate(set_key, prefix_len); + str_printfa(set_key, "%u", ++i); + } + return 0; +} + +int mail_crypt_global_keys_load(struct mail_user *user, const char *set_prefix, + struct mail_crypt_global_keys *global_keys_r, + bool ignore_privkey_errors, + const char **error_r) +{ + const char *set_key = t_strconcat(set_prefix, "_public_key", NULL); + const char *key_data = mail_user_plugin_getenv(user, set_key); + + mail_crypt_global_keys_init(global_keys_r); + if (key_data != NULL) { + if (mail_crypt_load_global_public_key(set_key, + key_data, + global_keys_r, + error_r) < 0) + return -1; + } + if (mail_crypt_load_global_private_keys(user, set_prefix, global_keys_r, + ignore_privkey_errors, + error_r) < 0) + return -1; + return 0; +} |