annotate src/plugins/mail-crypt/doveadm-mail-crypt.c @ 22592:8dc7e629897a

doveadm-mail-crypt: Print existing folder key hash when aborting generate
author Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
date Fri, 06 Oct 2017 12:47:06 +0300
parents dafc46a5c6e5
children ec7c7ceca87b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
21390
2e2563132d5f Updated copyright notices to include the year 2017.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21389
diff changeset
1 /* Copyright (c) 2015-2017 Dovecot authors, see the included COPYING file */
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
2
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
3 #include "lib.h"
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
4 #include "askpass.h"
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
5 #include "doveadm-mail.h"
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
6 #include "getopt.h"
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
7 #include "array.h"
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
8 #include "str.h"
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
9 #include "buffer.h"
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
10 #include "ioloop.h"
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
11 #include "ioloop-private.h"
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
12 #include "mail-namespace.h"
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
13 #include "mail-storage.h"
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
14 #include "mail-storage-settings.h"
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
15 #include "mailbox-attribute.h"
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
16 #include "mail-crypt-common.h"
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
17 #include "mail-crypt-key.h"
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
18 #include "mailbox-list-iter.h"
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
19 #include "doveadm-print.h"
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
20 #include "hex-binary.h"
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
21
22590
b0da9b8fdae8 mail-crypt: Improve doveadm output
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22589
diff changeset
22 #define DOVEADM_MCP_SUCCESS "\xE2\x9C\x93" /* emits a utf-8 CHECK MARK (U+2713) */
b0da9b8fdae8 mail-crypt: Improve doveadm output
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22589
diff changeset
23 #define DOVEADM_MCP_FAIL "x"
b0da9b8fdae8 mail-crypt: Improve doveadm output
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22589
diff changeset
24 #define DOVEADM_MCP_USERKEY "<userkey>"
b0da9b8fdae8 mail-crypt: Improve doveadm output
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22589
diff changeset
25
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
26 struct generated_key {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
27 const char *name;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
28 const char *id;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
29 const char *error;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
30 struct mailbox *box;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
31 bool success:1;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
32 bool active:1;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
33 };
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
34
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
35 ARRAY_DEFINE_TYPE(generated_keys, struct generated_key);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
36
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
37 struct mcp_cmd_context {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
38 struct doveadm_mail_cmd_context ctx;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
39
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
40 const char *old_password;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
41 const char *new_password;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
42
22590
b0da9b8fdae8 mail-crypt: Improve doveadm output
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22589
diff changeset
43 unsigned int matched_keys;
b0da9b8fdae8 mail-crypt: Improve doveadm output
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22589
diff changeset
44
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
45 bool userkey_only:1;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
46 bool recrypt_box_keys:1;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
47 bool force:1;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
48 bool ask_old_password:1;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
49 bool ask_new_password:1;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
50 bool clear_password:1;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
51 };
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
52
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
53 struct mcp_key_iter_ctx {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
54 pool_t pool;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
55 ARRAY_TYPE(generated_keys) keys;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
56 };
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
57
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
58 void doveadm_mail_crypt_plugin_init(struct module *mod ATTR_UNUSED);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
59 void doveadm_mail_crypt_plugin_deinit(void);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
60
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
61 static int
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
62 mcp_user_create(struct mail_user *user, const char *dest_username,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
63 struct mail_user **dest_user_r,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
64 struct mail_storage_service_user **dest_service_user_r,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
65 const char **error_r)
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
66 {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
67 const struct mail_storage_service_input *old_input;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
68 struct mail_storage_service_input input;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
69 struct mail_storage_service_ctx *service_ctx;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
70 struct ioloop_context *cur_ioloop_ctx;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
71
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
72 int ret;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
73
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
74 i_assert(user->_service_user != NULL);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
75 service_ctx = mail_storage_service_user_get_service_ctx(user->_service_user);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
76 old_input = mail_storage_service_user_get_input(user->_service_user);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
77
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
78 if ((cur_ioloop_ctx = io_loop_get_current_context(current_ioloop)) != NULL)
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
79 io_loop_context_deactivate(cur_ioloop_ctx);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
80
21389
59437f8764c6 global: Replaced all instances of memset(p, 0, sizeof(*p)) with the new i_zero() macro.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21270
diff changeset
81 i_zero(&input);
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
82 input.module = old_input->module;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
83 input.service = old_input->service;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
84 input.username = dest_username;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
85 input.session_id_prefix = user->session_id;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
86 input.flags_override_add = MAIL_STORAGE_SERVICE_FLAG_NO_PLUGINS |
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
87 MAIL_STORAGE_SERVICE_FLAG_NO_LOG_INIT;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
88
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
89 ret = mail_storage_service_lookup_next(service_ctx, &input,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
90 dest_service_user_r,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
91 dest_user_r, error_r);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
92
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
93 if (ret == 0)
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
94 *error_r = "User not found";
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
95
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
96 return ret;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
97 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
98
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
99 static int
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
100 mcp_update_shared_key(struct mailbox_transaction_context *t,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
101 struct mail_user *user, const char *target_uid,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
102 struct dcrypt_private_key *key, const char **error_r)
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
103 {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
104 const char *error;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
105 struct mail_user *dest_user;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
106 struct mail_storage_service_user *dest_service_user;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
107 struct ioloop_context *cur_ioloop_ctx;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
108 struct dcrypt_public_key *pkey;
21511
59fca1e76009 doveadm mailbox cryptokey generate: Fix memory leak
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
109 const char *dest_username;
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
110 int ret = 0;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
111
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
112 bool disallow_insecure = mail_crypt_acl_secure_sharing_enabled(user);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
113
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
114 ret = mcp_user_create(user, target_uid, &dest_user,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
115 &dest_service_user, &error);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
116
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
117 /* to make sure we get correct logging context */
21512
be3236bce027 doveadm mailbox cryptokey generate: Fix error handling
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21511
diff changeset
118 if (ret > 0)
be3236bce027 doveadm mailbox cryptokey generate: Fix error handling
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21511
diff changeset
119 mail_storage_service_io_deactivate_user(dest_service_user);
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
120 mail_storage_service_io_activate_user(user->_service_user);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
121
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
122 if (ret <= 0) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
123 i_error("Cannot initialize destination user %s: %s",
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
124 target_uid, error);
21512
be3236bce027 doveadm mailbox cryptokey generate: Fix error handling
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21511
diff changeset
125 return ret;
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
126 } else {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
127 i_assert(dest_user != NULL);
21511
59fca1e76009 doveadm mailbox cryptokey generate: Fix memory leak
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
128 dest_username = dest_user->username;
59fca1e76009 doveadm mailbox cryptokey generate: Fix memory leak
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
129
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
130 /* get public key from target user */
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
131 if ((ret = mail_crypt_user_get_public_key(dest_user,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
132 &pkey, error_r)) <= 0) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
133 if (ret == 0 && disallow_insecure) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
134 *error_r = t_strdup_printf("User %s has no active public key",
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
135 dest_user->username);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
136 ret = -1;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
137 } else if (ret == 0) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
138 /* perform insecure sharing */
21511
59fca1e76009 doveadm mailbox cryptokey generate: Fix memory leak
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
139 dest_username = NULL;
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
140 pkey = NULL;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
141 ret = 1;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
142 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
143 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
144
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
145 if (ret == 1) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
146 ARRAY_TYPE(dcrypt_private_key) keys;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
147 t_array_init(&keys, 1);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
148 array_append(&keys, &key, 1);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
149 ret = mail_crypt_box_share_private_keys(t, pkey,
21511
59fca1e76009 doveadm mailbox cryptokey generate: Fix memory leak
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
150 dest_username,
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
151 &keys, error_r);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
152 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
153
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
154 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
155
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
156 /* logging context swap again */
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
157 mail_storage_service_io_deactivate_user(user->_service_user);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
158 mail_storage_service_io_activate_user(dest_service_user);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
159
21511
59fca1e76009 doveadm mailbox cryptokey generate: Fix memory leak
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
160 mail_user_unref(&dest_user);
21671
b4dd0868ecc0 global: Replace mail_storage_service_user_free() with _unref()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21512
diff changeset
161 mail_storage_service_user_unref(&dest_service_user);
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
162
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
163 if ((cur_ioloop_ctx = io_loop_get_current_context(current_ioloop)) != NULL)
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
164 io_loop_context_deactivate(cur_ioloop_ctx);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
165
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
166 mail_storage_service_io_activate_user(user->_service_user);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
167
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
168 return ret;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
169 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
170
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
171 static int mcp_update_shared_keys(struct mailbox *box, struct mail_user *user,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
172 const char *pubid, struct dcrypt_private_key *key)
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
173 {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
174 const char *error;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
175 int ret;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
176
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
177 ARRAY_TYPE(const_string) ids;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
178 t_array_init(&ids, 8);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
179
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
180 /* figure out who needs the key */
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
181 if ((ret = mail_crypt_box_get_pvt_digests(box, pool_datastack_create(),
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
182 MAIL_ATTRIBUTE_TYPE_SHARED,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
183 &ids, &error)) < 0) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
184 i_error("mail_crypt_box_get_pvt_digests(%s, /shared) failed: %s",
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
185 mailbox_get_vname(box),
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
186 error);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
187 return -1;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
188 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
189
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
190 const char *const *id;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
191 bool found = FALSE;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
192 string_t *uid = t_str_new(64);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
193
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
194 struct mailbox_transaction_context *t =
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
195 mailbox_transaction_begin(box, 0);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
196
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
197 ret = 0;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
198
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
199 /* then perform sharing */
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
200 array_foreach(&ids, id) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
201 if (strchr(*id, '/') != NULL) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
202 str_truncate(uid, 0);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
203 const char *hexuid = t_strcut(*id, '/');
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
204 hex_to_binary(hexuid, uid);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
205 if (mcp_update_shared_key(t, user, str_c(uid), key,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
206 &error) < 0) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
207 i_error("mcp_update_shared_key(%s, %s) failed: %s",
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
208 mailbox_get_vname(box),
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
209 str_c(uid),
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
210 error);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
211 ret = -1;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
212 break;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
213 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
214 } else if (!found) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
215 found = TRUE;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
216 if (mail_crypt_box_set_shared_key(t, pubid, key,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
217 NULL, NULL,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
218 &error) < 0) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
219 i_error("mail_crypt_box_set_shared_key(%s) failed: %s",
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
220 mailbox_get_vname(box),
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
221 error);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
222 ret = -1;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
223 break;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
224 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
225 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
226 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
227
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
228 if (ret < 0) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
229 mailbox_transaction_rollback(&t);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
230 } else if (mailbox_transaction_commit(&t) < 0) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
231 i_error("mailbox_transaction_commit(%s) failed: %s",
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
232 mailbox_get_vname(box),
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
233 error);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
234 ret = -1;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
235 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
236
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
237 return ret;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
238 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
239
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
240 static int mcp_keypair_generate(struct mcp_cmd_context *ctx,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
241 struct dcrypt_public_key *user_key,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
242 struct mailbox *box, struct dcrypt_keypair *pair_r,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
243 const char **pubid_r, const char **error_r)
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
244 {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
245 struct dcrypt_keypair pair = {NULL, NULL};
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
246
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
247 int ret;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
248
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
249 struct mailbox_transaction_context *t =
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
250 mailbox_transaction_begin(box, 0);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
251
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
252 if ((ret = mail_crypt_box_get_public_key(t, &pair.pub, error_r)) < 0) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
253 ret = -1;
22592
8dc7e629897a doveadm-mail-crypt: Print existing folder key hash when aborting generate
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 22591
diff changeset
254 } else if (ret == 1 && !ctx->force) {
8dc7e629897a doveadm-mail-crypt: Print existing folder key hash when aborting generate
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 22591
diff changeset
255 i_info("Folder key exists. Use -f to generate a new one");
8dc7e629897a doveadm-mail-crypt: Print existing folder key hash when aborting generate
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 22591
diff changeset
256 buffer_t *key_id = t_str_new(MAIL_CRYPT_HASH_BUF_SIZE);
8dc7e629897a doveadm-mail-crypt: Print existing folder key hash when aborting generate
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 22591
diff changeset
257 const char *error;
8dc7e629897a doveadm-mail-crypt: Print existing folder key hash when aborting generate
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 22591
diff changeset
258 if (!dcrypt_key_id_public(pair.pub,
8dc7e629897a doveadm-mail-crypt: Print existing folder key hash when aborting generate
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 22591
diff changeset
259 MAIL_CRYPT_KEY_ID_ALGORITHM,
8dc7e629897a doveadm-mail-crypt: Print existing folder key hash when aborting generate
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 22591
diff changeset
260 key_id, &error)) {
8dc7e629897a doveadm-mail-crypt: Print existing folder key hash when aborting generate
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 22591
diff changeset
261 i_error("dcrypt_key_id_public() failed: %s",
8dc7e629897a doveadm-mail-crypt: Print existing folder key hash when aborting generate
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 22591
diff changeset
262 error);
8dc7e629897a doveadm-mail-crypt: Print existing folder key hash when aborting generate
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 22591
diff changeset
263 return -1;
8dc7e629897a doveadm-mail-crypt: Print existing folder key hash when aborting generate
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 22591
diff changeset
264 }
8dc7e629897a doveadm-mail-crypt: Print existing folder key hash when aborting generate
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 22591
diff changeset
265 *pubid_r = p_strdup(ctx->ctx.pool, binary_to_hex(key_id->data,
8dc7e629897a doveadm-mail-crypt: Print existing folder key hash when aborting generate
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 22591
diff changeset
266 key_id->used));
8dc7e629897a doveadm-mail-crypt: Print existing folder key hash when aborting generate
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 22591
diff changeset
267 *pair_r = pair;
8dc7e629897a doveadm-mail-crypt: Print existing folder key hash when aborting generate
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 22591
diff changeset
268 return 1;
8dc7e629897a doveadm-mail-crypt: Print existing folder key hash when aborting generate
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 22591
diff changeset
269 } else if (ret == 1 && ctx->recrypt_box_keys) {
21244
d732ab1b584c doveadm-mail-crypt: Skip existing keys properly
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21233
diff changeset
270 /* do nothing, because force isn't being used *OR*
d732ab1b584c doveadm-mail-crypt: Skip existing keys properly
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21233
diff changeset
271 we are recrypting box keys and force refers to
d732ab1b584c doveadm-mail-crypt: Skip existing keys properly
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21233
diff changeset
272 user keypair.
d732ab1b584c doveadm-mail-crypt: Skip existing keys properly
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21233
diff changeset
273
d732ab1b584c doveadm-mail-crypt: Skip existing keys properly
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21233
diff changeset
274 FIXME: this could be less confusing altogether */
d732ab1b584c doveadm-mail-crypt: Skip existing keys properly
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21233
diff changeset
275 ret = 0;
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
276 } else {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
277 if ((ret = mail_crypt_box_generate_keypair(box, &pair,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
278 user_key, pubid_r, error_r)) < 0) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
279 ret = -1;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
280 } else {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
281 *pubid_r = p_strdup(ctx->ctx.pool, *pubid_r);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
282 *pair_r = pair;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
283 ret = 1;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
284 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
285 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
286
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
287 if (ret < 1) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
288 if (pair.pub != NULL)
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
289 dcrypt_key_unref_public(&pair.pub);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
290 if (pair.priv != NULL)
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
291 dcrypt_key_unref_private(&pair.priv);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
292 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
293
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
294 (void)mailbox_transaction_commit(&t);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
295
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
296 return ret;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
297 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
298
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
299 static int mcp_keypair_generate_run(struct doveadm_mail_cmd_context *_ctx,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
300 struct mail_user *user,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
301 ARRAY_TYPE(generated_keys) *result)
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
302 {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
303 const char *error;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
304 int ret;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
305 struct dcrypt_public_key *user_key;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
306 struct mcp_cmd_context *ctx =
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
307 (struct mcp_cmd_context *)_ctx;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
308 const char *pubid;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
309 bool user_key_generated = FALSE;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
310 struct generated_key *res;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
311
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
312 if ((ret = mail_crypt_user_get_public_key(user, &user_key,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
313 &error)) <= 0) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
314 struct dcrypt_keypair pair;
21270
e0d156644fbe plugins: mail-crypt - fix static analysis pedantry
Phil Carmody <phil@dovecot.fi>
parents: 21244
diff changeset
315 if (ret < 0) {
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
316 i_error("mail_crypt_user_get_public_key(%s) failed: %s",
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
317 user->username,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
318 error);
21270
e0d156644fbe plugins: mail-crypt - fix static analysis pedantry
Phil Carmody <phil@dovecot.fi>
parents: 21244
diff changeset
319 } else if (mail_crypt_user_generate_keypair(user, &pair,
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
320 &pubid, &error) < 0) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
321 ret = -1;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
322 i_error("mail_crypt_user_generate_keypair(%s) failed: %s",
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
323 user->username,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
324 error);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
325 res = array_append_space(result);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
326 res->name = "";
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
327 res->error = p_strdup(_ctx->pool, error);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
328 res->success = FALSE;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
329 } else {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
330 res = array_append_space(result);
22590
b0da9b8fdae8 mail-crypt: Improve doveadm output
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22589
diff changeset
331 res->name = DOVEADM_MCP_USERKEY;
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
332 res->id = p_strdup(_ctx->pool, pubid);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
333 res->success = TRUE;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
334 /* don't do it again later on */
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
335 user_key_generated = TRUE;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
336 ret = 1;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
337 user_key = pair.pub;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
338 dcrypt_key_unref_private(&pair.priv);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
339 }
21270
e0d156644fbe plugins: mail-crypt - fix static analysis pedantry
Phil Carmody <phil@dovecot.fi>
parents: 21244
diff changeset
340 if (ret < 0) return ret;
22590
b0da9b8fdae8 mail-crypt: Improve doveadm output
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22589
diff changeset
341 ctx->matched_keys++;
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
342 }
22591
dafc46a5c6e5 doveadm-mail-crypt: Print existing userkey hash when aborting generate
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 22590
diff changeset
343 if (ret == 1 && ctx->userkey_only && !user_key_generated) {
dafc46a5c6e5 doveadm-mail-crypt: Print existing userkey hash when aborting generate
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 22590
diff changeset
344 if (!ctx->force) {
dafc46a5c6e5 doveadm-mail-crypt: Print existing userkey hash when aborting generate
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 22590
diff changeset
345 i_info("userkey exists. Use -f to generate a new one");
dafc46a5c6e5 doveadm-mail-crypt: Print existing userkey hash when aborting generate
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 22590
diff changeset
346 buffer_t *key_id = t_str_new(MAIL_CRYPT_HASH_BUF_SIZE);
dafc46a5c6e5 doveadm-mail-crypt: Print existing userkey hash when aborting generate
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 22590
diff changeset
347 if (!dcrypt_key_id_public(user_key,
dafc46a5c6e5 doveadm-mail-crypt: Print existing userkey hash when aborting generate
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 22590
diff changeset
348 MAIL_CRYPT_KEY_ID_ALGORITHM,
dafc46a5c6e5 doveadm-mail-crypt: Print existing userkey hash when aborting generate
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 22590
diff changeset
349 key_id, &error)) {
dafc46a5c6e5 doveadm-mail-crypt: Print existing userkey hash when aborting generate
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 22590
diff changeset
350 i_error("dcrypt_key_id_public() failed: %s",
dafc46a5c6e5 doveadm-mail-crypt: Print existing userkey hash when aborting generate
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 22590
diff changeset
351 error);
dafc46a5c6e5 doveadm-mail-crypt: Print existing userkey hash when aborting generate
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 22590
diff changeset
352 return -1;
dafc46a5c6e5 doveadm-mail-crypt: Print existing userkey hash when aborting generate
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 22590
diff changeset
353 }
dafc46a5c6e5 doveadm-mail-crypt: Print existing userkey hash when aborting generate
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 22590
diff changeset
354 const char *hash = binary_to_hex(key_id->data,
dafc46a5c6e5 doveadm-mail-crypt: Print existing userkey hash when aborting generate
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 22590
diff changeset
355 key_id->used);
dafc46a5c6e5 doveadm-mail-crypt: Print existing userkey hash when aborting generate
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 22590
diff changeset
356 res = array_append_space(result);
dafc46a5c6e5 doveadm-mail-crypt: Print existing userkey hash when aborting generate
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 22590
diff changeset
357 res->name = DOVEADM_MCP_USERKEY;
dafc46a5c6e5 doveadm-mail-crypt: Print existing userkey hash when aborting generate
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 22590
diff changeset
358 res->id = p_strdup(_ctx->pool, hash);
dafc46a5c6e5 doveadm-mail-crypt: Print existing userkey hash when aborting generate
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 22590
diff changeset
359 res->success = TRUE;
dafc46a5c6e5 doveadm-mail-crypt: Print existing userkey hash when aborting generate
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 22590
diff changeset
360 ctx->matched_keys++;
dafc46a5c6e5 doveadm-mail-crypt: Print existing userkey hash when aborting generate
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 22590
diff changeset
361 return 1;
dafc46a5c6e5 doveadm-mail-crypt: Print existing userkey hash when aborting generate
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 22590
diff changeset
362 }
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
363 struct dcrypt_keypair pair;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
364 dcrypt_key_unref_public(&user_key);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
365 /* regen user key */
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
366 res = array_append_space(result);
22590
b0da9b8fdae8 mail-crypt: Improve doveadm output
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22589
diff changeset
367 res->name = DOVEADM_MCP_USERKEY;
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
368 if (mail_crypt_user_generate_keypair(user, &pair, &pubid,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
369 &error) < 0) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
370 res->success = FALSE;
22589
103a6d51eefe mail-crypt: Fix key generation handling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21814
diff changeset
371 res->error = p_strdup(_ctx->pool, error);
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
372 return -1;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
373 }
22589
103a6d51eefe mail-crypt: Fix key generation handling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21814
diff changeset
374 res->success = TRUE;
103a6d51eefe mail-crypt: Fix key generation handling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21814
diff changeset
375 res->id = p_strdup(_ctx->pool, pubid);
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
376 user_key = pair.pub;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
377 dcrypt_key_unref_private(&pair.priv);
22590
b0da9b8fdae8 mail-crypt: Improve doveadm output
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22589
diff changeset
378 ctx->matched_keys++;
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
379 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
380
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
381 if (ctx->userkey_only)
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
382 return 0;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
383
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
384 const char *const *patterns = (const char *const[]){ "*", NULL };
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
385
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
386 /* only re-encrypt all folder keys if wanted */
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
387 if (!ctx->recrypt_box_keys) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
388 patterns = ctx->ctx.args;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
389 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
390
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
391 const struct mailbox_info *info;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
392 struct mailbox_list_iterate_context *iter =
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
393 mailbox_list_iter_init_namespaces(user->namespaces,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
394 patterns,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
395 MAIL_NAMESPACE_TYPE_PRIVATE,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
396 MAILBOX_LIST_ITER_SKIP_ALIASES |
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
397 MAILBOX_LIST_ITER_NO_AUTO_BOXES |
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
398 MAILBOX_LIST_ITER_RETURN_NO_FLAGS);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
399 while((info = mailbox_list_iter_next(iter)) != NULL) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
400 if ((info->flags & MAILBOX_NOSELECT) != 0 ||
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
401 (info->flags & MAILBOX_NONEXISTENT) != 0) continue;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
402 struct dcrypt_keypair pair;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
403
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
404 struct mailbox *box =
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
405 mailbox_alloc(info->ns->list,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
406 info->vname, 0);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
407 if (mailbox_open(box) < 0) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
408 res = array_append_space(result);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
409 res->name = p_strdup(_ctx->pool, info->vname);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
410 res->success = FALSE;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
411 res->error = p_strdup(_ctx->pool,
21814
759962e70148 global: Log internal storage error on failure
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 21671
diff changeset
412 mailbox_get_last_internal_error(box, NULL));
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
413 } else if ((ret = mcp_keypair_generate(ctx, user_key, box,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
414 &pair, &pubid,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
415 &error)) < 0) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
416 res = array_append_space(result);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
417 res->name = p_strdup(_ctx->pool, info->vname);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
418 res->success = FALSE;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
419 res->error = p_strdup(_ctx->pool, error);
21244
d732ab1b584c doveadm-mail-crypt: Skip existing keys properly
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21233
diff changeset
420 } else if (ret == 0) {
d732ab1b584c doveadm-mail-crypt: Skip existing keys properly
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21233
diff changeset
421 /* nothing happened because key already existed and
d732ab1b584c doveadm-mail-crypt: Skip existing keys properly
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21233
diff changeset
422 force wasn't used, skip */
d732ab1b584c doveadm-mail-crypt: Skip existing keys properly
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21233
diff changeset
423 } else if (ret > 0) {
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
424 res = array_append_space(result);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
425 res->name = p_strdup(_ctx->pool, info->vname);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
426 res->success = TRUE;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
427 res->id = pubid;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
428 T_BEGIN {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
429 mcp_update_shared_keys(box, user, pubid, pair.priv);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
430 } T_END;
22592
8dc7e629897a doveadm-mail-crypt: Print existing folder key hash when aborting generate
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 22591
diff changeset
431 if (pair.pub != NULL)
8dc7e629897a doveadm-mail-crypt: Print existing folder key hash when aborting generate
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 22591
diff changeset
432 dcrypt_key_unref_public(&pair.pub);
8dc7e629897a doveadm-mail-crypt: Print existing folder key hash when aborting generate
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 22591
diff changeset
433 if (pair.priv != NULL)
8dc7e629897a doveadm-mail-crypt: Print existing folder key hash when aborting generate
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 22591
diff changeset
434 dcrypt_key_unref_private(&pair.priv);
22590
b0da9b8fdae8 mail-crypt: Improve doveadm output
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22589
diff changeset
435 ctx->matched_keys++;
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
436 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
437 mailbox_free(&box);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
438 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
439
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
440 (void)mailbox_list_iter_deinit(&iter);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
441
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
442 dcrypt_key_unref_public(&user_key);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
443 return 0;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
444 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
445
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
446 static int cmd_mcp_keypair_generate_run(struct doveadm_mail_cmd_context *_ctx,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
447 struct mail_user *user)
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
448 {
22590
b0da9b8fdae8 mail-crypt: Improve doveadm output
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22589
diff changeset
449 struct mcp_cmd_context *ctx =
b0da9b8fdae8 mail-crypt: Improve doveadm output
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22589
diff changeset
450 (struct mcp_cmd_context *)_ctx;
b0da9b8fdae8 mail-crypt: Improve doveadm output
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22589
diff changeset
451
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
452 int ret = 0;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
453
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
454 ARRAY_TYPE(generated_keys) result;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
455 p_array_init(&result, _ctx->pool, 8);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
456
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
457 if (mcp_keypair_generate_run(_ctx, user, &result) < 0)
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
458 _ctx->exit_code = EX_DATAERR;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
459
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
460 doveadm_print_init(DOVEADM_PRINT_TYPE_TABLE);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
461 doveadm_print_header("success", " ", 0);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
462 doveadm_print_header("box", "Folder", 0);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
463 doveadm_print_header("pubid", "Public ID", 0);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
464
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
465 const struct generated_key *res;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
466
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
467 array_foreach(&result, res) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
468 if (res->success)
22590
b0da9b8fdae8 mail-crypt: Improve doveadm output
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22589
diff changeset
469 doveadm_print(DOVEADM_MCP_SUCCESS);
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
470 else {
22589
103a6d51eefe mail-crypt: Fix key generation handling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21814
diff changeset
471 _ctx->exit_code = EX_DATAERR;
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
472 ret = -1;
22590
b0da9b8fdae8 mail-crypt: Improve doveadm output
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22589
diff changeset
473 doveadm_print(DOVEADM_MCP_FAIL);
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
474 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
475 doveadm_print(res->name);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
476 if (!res->success)
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
477 doveadm_print(t_strdup_printf("ERROR: %s", res->error));
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
478 else
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
479 doveadm_print(res->id);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
480 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
481
22590
b0da9b8fdae8 mail-crypt: Improve doveadm output
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22589
diff changeset
482 if (ctx->matched_keys == 0)
b0da9b8fdae8 mail-crypt: Improve doveadm output
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22589
diff changeset
483 i_warning("mailbox cryptokey generate: Nothing was matched. "
b0da9b8fdae8 mail-crypt: Improve doveadm output
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22589
diff changeset
484 "Use -U or specify mask?");
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
485 return ret;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
486 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
487
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
488 static void mcp_key_list(struct mcp_cmd_context *ctx,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
489 struct mail_user *user,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
490 void(*callback)(const struct generated_key *, void *),
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
491 void *context)
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
492 {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
493 const char *error;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
494 int ret;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
495
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
496 /* we need to use the mailbox attribute API here, as we
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
497 are not necessarely able to decrypt any of these keys
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
498 */
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
499
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
500 ARRAY_TYPE(const_string) ids;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
501 t_array_init(&ids, 8);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
502
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
503 if (ctx->userkey_only) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
504 struct mailbox_attribute_iter *iter;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
505 struct mail_namespace *ns =
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
506 mail_namespace_find_inbox(user->namespaces);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
507 struct mailbox *box =
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
508 mailbox_alloc(ns->list, "INBOX", MAILBOX_FLAG_READONLY);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
509 struct mail_attribute_value value;
21389
59437f8764c6 global: Replaced all instances of memset(p, 0, sizeof(*p)) with the new i_zero() macro.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21270
diff changeset
510 i_zero(&value);
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
511 if (mailbox_open(box) < 0) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
512 i_error("mailbox_open(%s) failed: %s",
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
513 mailbox_get_vname(box),
21814
759962e70148 global: Log internal storage error on failure
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 21671
diff changeset
514 mailbox_get_last_internal_error(box, NULL));
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
515 mailbox_free(&box);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
516 return;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
517 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
518 struct mailbox_transaction_context *t =
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
519 mailbox_transaction_begin(box, 0);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
520
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
521 if ((ret = mailbox_attribute_get(t, MAIL_ATTRIBUTE_TYPE_SHARED,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
522 USER_CRYPT_PREFIX
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
523 ACTIVE_KEY_NAME,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
524 &value)) < 0) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
525 i_error("mailbox_get_attribute(%s, %s) failed: %s",
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
526 mailbox_get_vname(box),
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
527 USER_CRYPT_PREFIX ACTIVE_KEY_NAME,
21814
759962e70148 global: Log internal storage error on failure
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 21671
diff changeset
528 mailbox_get_last_internal_error(box, NULL));
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
529 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
530
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
531 iter = mailbox_attribute_iter_init(box,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
532 MAIL_ATTRIBUTE_TYPE_PRIVATE,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
533 USER_CRYPT_PREFIX
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
534 PRIVKEYS_PREFIX);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
535 const char *key_id;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
536 if (value.value == NULL)
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
537 value.value = "<NO ACTIVE KEY>";
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
538 while ((key_id = mailbox_attribute_iter_next(iter)) != NULL) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
539 struct generated_key key;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
540 key.id = key_id;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
541 key.active = strcmp(value.value, key_id) == 0;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
542 key.name = "";
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
543 key.box = box;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
544 callback(&key, context);
22590
b0da9b8fdae8 mail-crypt: Improve doveadm output
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22589
diff changeset
545 ctx->matched_keys++;
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
546 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
547
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
548 if (mailbox_attribute_iter_deinit(&iter) < 0)
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
549 i_error("mailbox_attribute_iter_deinit(%s) failed: %s",
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
550 mailbox_get_vname(box),
21814
759962e70148 global: Log internal storage error on failure
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 21671
diff changeset
551 mailbox_get_last_internal_error(box, NULL));
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
552
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
553 (void)mailbox_transaction_commit(&t);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
554
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
555 mailbox_free(&box);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
556 return;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
557 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
558
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
559 const struct mailbox_info *info;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
560 struct mailbox_list_iterate_context *iter =
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
561 mailbox_list_iter_init_namespaces(user->namespaces,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
562 ctx->ctx.args,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
563 MAIL_NAMESPACE_TYPE_PRIVATE,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
564 MAILBOX_LIST_ITER_SKIP_ALIASES |
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
565 MAILBOX_LIST_ITER_NO_AUTO_BOXES |
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
566 MAILBOX_LIST_ITER_RETURN_NO_FLAGS);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
567
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
568 while((info = mailbox_list_iter_next(iter)) != NULL) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
569 if ((info->flags & MAILBOX_NOSELECT) != 0 ||
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
570 (info->flags & MAILBOX_NONEXISTENT) != 0) continue;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
571
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
572 struct mailbox *box =
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
573 mailbox_alloc(info->ns->list,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
574 info->vname, MAILBOX_FLAG_READONLY);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
575
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
576 if (mailbox_open(box) < 0) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
577 i_error("mailbox_open(%s) failed: %s",
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
578 mailbox_get_vname(box),
21814
759962e70148 global: Log internal storage error on failure
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 21671
diff changeset
579 mailbox_get_last_internal_error(box, NULL));
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
580 mailbox_free(&box);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
581 continue;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
582 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
583 struct mailbox_transaction_context *t =
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
584 mailbox_transaction_begin(box, 0);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
585
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
586 struct mail_attribute_value value;
21389
59437f8764c6 global: Replaced all instances of memset(p, 0, sizeof(*p)) with the new i_zero() macro.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21270
diff changeset
587 i_zero(&value);
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
588 array_clear(&ids);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
589
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
590 /* get active ID */
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
591 if ((ret = mailbox_attribute_get(t, MAIL_ATTRIBUTE_TYPE_SHARED,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
592 BOX_CRYPT_PREFIX
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
593 ACTIVE_KEY_NAME,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
594 &value)) < 0) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
595 i_error("mailbox_get_attribute(%s, %s) failed: %s",
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
596 mailbox_get_vname(box),
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
597 BOX_CRYPT_PREFIX ACTIVE_KEY_NAME,
21814
759962e70148 global: Log internal storage error on failure
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 21671
diff changeset
598 mailbox_get_last_internal_error(box, NULL));
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
599 } else if ((ret = mail_crypt_box_get_pvt_digests(box, pool_datastack_create(),
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
600 MAIL_ATTRIBUTE_TYPE_PRIVATE,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
601 &ids, &error)) < 0) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
602 i_error("mail_crypt_box_get_pvt_digests(%s) failed: %s",
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
603 mailbox_get_vname(box),
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
604 error);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
605 } else {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
606 const char *const *id;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
607 const char *boxname = mailbox_get_vname(box);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
608 if (value.value == NULL)
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
609 value.value = "<NO ACTIVE KEY>";
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
610 array_foreach(&ids, id) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
611 struct generated_key key;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
612 key.name = boxname;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
613 key.id = *id;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
614 if (value.value != NULL)
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
615 key.active = strcmp(*id, value.value) == 0;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
616 else
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
617 key.active = FALSE;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
618 key.box = box;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
619 callback(&key, context);
22590
b0da9b8fdae8 mail-crypt: Improve doveadm output
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22589
diff changeset
620 ctx->matched_keys++;
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
621 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
622 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
623
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
624 (void)mailbox_transaction_commit(&t);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
625 mailbox_free(&box);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
626 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
627
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
628 (void)mailbox_list_iter_deinit(&iter);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
629 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
630
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
631 static void cmd_mcp_key_list_cb(const struct generated_key *_key, void *context)
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
632 {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
633 struct mcp_key_iter_ctx *ctx = context;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
634 struct generated_key *key = array_append_space(&ctx->keys);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
635 key->name = p_strdup(ctx->pool, _key->name);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
636 key->id = p_strdup(ctx->pool, _key->id);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
637 key->active = _key->active;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
638 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
639
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
640 static int cmd_mcp_key_list_run(struct doveadm_mail_cmd_context *_ctx,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
641 struct mail_user *user)
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
642 {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
643 struct mcp_cmd_context *ctx =
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
644 (struct mcp_cmd_context *)_ctx;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
645 struct mcp_key_iter_ctx iter_ctx;
21389
59437f8764c6 global: Replaced all instances of memset(p, 0, sizeof(*p)) with the new i_zero() macro.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21270
diff changeset
646 i_zero(&iter_ctx);
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
647 iter_ctx.pool = _ctx->pool;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
648 p_array_init(&iter_ctx.keys, _ctx->pool, 8);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
649
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
650 mcp_key_list(ctx, user, cmd_mcp_key_list_cb, &iter_ctx);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
651
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
652 doveadm_print_init(DOVEADM_PRINT_TYPE_TABLE);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
653 doveadm_print_header("box", "Folder", 0);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
654 doveadm_print_header("active", "Active", 0);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
655 doveadm_print_header("pubid", "Public ID", 0);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
656
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
657 const struct generated_key *key;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
658 array_foreach(&iter_ctx.keys, key) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
659 doveadm_print(key->name);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
660 doveadm_print(key->active ? "yes" : "no");
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
661 doveadm_print(key->id);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
662 }
22590
b0da9b8fdae8 mail-crypt: Improve doveadm output
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22589
diff changeset
663
b0da9b8fdae8 mail-crypt: Improve doveadm output
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22589
diff changeset
664 if (ctx->matched_keys == 0)
b0da9b8fdae8 mail-crypt: Improve doveadm output
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22589
diff changeset
665 i_warning("mailbox cryptokey list: Nothing was matched. "
b0da9b8fdae8 mail-crypt: Improve doveadm output
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22589
diff changeset
666 "Use -U or specify mask?");
b0da9b8fdae8 mail-crypt: Improve doveadm output
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22589
diff changeset
667
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
668 return 0;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
669 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
670
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
671 static void cmd_mcp_key_export_cb(const struct generated_key *key,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
672 void *context ATTR_UNUSED)
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
673 {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
674 struct dcrypt_private_key *pkey;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
675 bool user_key = FALSE;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
676 const char *error = NULL;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
677 int ret;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
678
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
679 if (*key->name == '\0')
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
680 user_key = TRUE;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
681
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
682 doveadm_print(key->name);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
683 doveadm_print(key->id);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
684
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
685 struct mailbox_transaction_context *t =
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
686 mailbox_transaction_begin(key->box, 0);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
687
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
688 if ((ret = mail_crypt_get_private_key(t, key->id, user_key, FALSE,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
689 &pkey, &error)) <= 0) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
690 if (ret == 0)
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
691 error = "key not found";
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
692 doveadm_print(t_strdup_printf("ERROR: %s", error));
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
693 doveadm_print("");
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
694 } else {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
695 string_t *out = t_str_new(64);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
696 if (!dcrypt_key_store_private(pkey, DCRYPT_FORMAT_PEM, NULL, out,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
697 NULL, NULL, &error)) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
698 doveadm_print(t_strdup_printf("ERROR: %s", error));
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
699 doveadm_print("");
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
700 } else {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
701 /* this is to make it more compatible with openssl cli
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
702 as it expects BEGIN on it's own line */
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
703 doveadm_print(t_strdup_printf("\n%s", str_c(out)));
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
704 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
705 dcrypt_key_unref_private(&pkey);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
706 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
707
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
708 (void)mailbox_transaction_commit(&t);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
709 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
710
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
711 static int cmd_mcp_key_export_run(struct doveadm_mail_cmd_context *_ctx,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
712 struct mail_user *user)
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
713 {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
714 struct mcp_cmd_context *ctx =
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
715 (struct mcp_cmd_context *)_ctx;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
716
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
717 doveadm_print_init(DOVEADM_PRINT_TYPE_PAGER);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
718 doveadm_print_header("box", "Folder", 0);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
719 doveadm_print_header("name", "Public ID", 0);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
720 doveadm_print_header("error", "Error", 0);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
721 doveadm_print_header("key", "Key", 0);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
722
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
723 mcp_key_list(ctx, user, cmd_mcp_key_export_cb, NULL);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
724
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
725 return 0;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
726 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
727
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
728 static int cmd_mcp_key_password_run(struct doveadm_mail_cmd_context *_ctx,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
729 struct mail_user *user)
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
730 {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
731 struct mcp_cmd_context *ctx =
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
732 (struct mcp_cmd_context *)_ctx;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
733
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
734 struct raw_key {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
735 const char *attr;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
736 const char *id;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
737 const char *data;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
738 };
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
739
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
740 ARRAY(struct raw_key) raw_keys;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
741
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
742 doveadm_print_init(DOVEADM_PRINT_TYPE_PAGER);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
743
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
744 doveadm_print_header_simple("result");
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
745
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
746 if (ctx->ask_old_password) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
747 if (ctx->old_password != NULL) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
748 doveadm_print("old password specified, cannot ask for it");
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
749 _ctx->exit_code = EX_USAGE;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
750 return -1;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
751 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
752 if (!_ctx->cli) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
753 doveadm_print("No cli - cannot ask for password");
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
754 _ctx->exit_code = EX_USAGE;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
755 return -1;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
756 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
757 ctx->old_password =
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
758 p_strdup(_ctx->pool, t_askpass("Old password: "));
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
759 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
760
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
761 if (ctx->ask_new_password) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
762 if (ctx->new_password != NULL) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
763 doveadm_print("new password specified, cannot ask for it");
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
764 _ctx->exit_code = EX_USAGE;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
765 return -1;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
766 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
767 if (!_ctx->cli) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
768 doveadm_print("No cli - cannot ask for password");
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
769 _ctx->exit_code = EX_USAGE;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
770 return -1;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
771 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
772 ctx->new_password =
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
773 p_strdup(_ctx->pool, t_askpass("New password: "));
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
774 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
775
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
776 if (ctx->clear_password &&
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
777 (ctx->new_password != NULL ||
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
778 mail_user_plugin_getenv(user, MAIL_CRYPT_USERENV_PASSWORD) != NULL)) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
779 doveadm_print("clear password and new password specified");
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
780 _ctx->exit_code = EX_USAGE;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
781 return -1;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
782 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
783
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
784 struct mail_namespace *ns = mail_namespace_find_inbox(user->namespaces);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
785 struct mailbox *box = mailbox_alloc(ns->list, "INBOX", 0);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
786 if (mailbox_open(box) < 0) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
787 doveadm_print(t_strdup_printf("mailbox_open(%s) failed: %s",
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
788 mailbox_get_vname(box),
21814
759962e70148 global: Log internal storage error on failure
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 21671
diff changeset
789 mailbox_get_last_internal_error(box, NULL)));
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
790 _ctx->exit_code = EX_TEMPFAIL;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
791 return -1;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
792 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
793
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
794 struct mailbox_transaction_context *t =
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
795 mailbox_transaction_begin(box, 0);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
796
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
797 t_array_init(&raw_keys, 8);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
798
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
799 /* then get the current user keys, all of them */
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
800 struct mailbox_attribute_iter *iter =
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
801 mailbox_attribute_iter_init(box,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
802 MAIL_ATTRIBUTE_TYPE_PRIVATE,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
803 USER_CRYPT_PREFIX
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
804 PRIVKEYS_PREFIX);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
805 const char *error;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
806 const char *key_id;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
807 int ret = 1;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
808 unsigned int count = 0;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
809
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
810 while ((key_id = mailbox_attribute_iter_next(iter)) != NULL) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
811 const char *attr =
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
812 t_strdup_printf(USER_CRYPT_PREFIX PRIVKEYS_PREFIX "%s",
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
813 key_id);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
814
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
815 struct mail_attribute_value value;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
816 if ((ret = mailbox_attribute_get(t, MAIL_ATTRIBUTE_TYPE_PRIVATE,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
817 attr, &value)) < 0) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
818 doveadm_print(t_strdup_printf("mailbox_attribute_get(%s, %s) failed: %s",
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
819 mailbox_get_vname(box), attr,
21814
759962e70148 global: Log internal storage error on failure
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 21671
diff changeset
820 mailbox_get_last_internal_error(box, NULL)));
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
821 _ctx->exit_code = EX_TEMPFAIL;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
822 break;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
823 } else if (ret > 0) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
824 struct raw_key *raw_key = array_append_space(&raw_keys);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
825 raw_key->attr = p_strdup(_ctx->pool, attr);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
826 raw_key->id = p_strdup(_ctx->pool, key_id);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
827 raw_key->data = p_strdup(_ctx->pool, value.value);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
828 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
829 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
830
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
831 if (ret == 1) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
832 struct dcrypt_private_key *key;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
833 const struct raw_key *raw_key;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
834 const char *algo = ctx->new_password != NULL ?
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
835 MAIL_CRYPT_PW_CIPHER :
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
836 NULL;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
837 string_t *newkey = t_str_new(256);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
838
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
839 array_foreach(&raw_keys, raw_key) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
840 struct mail_attribute_value value;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
841
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
842 if (!dcrypt_key_load_private(&key, raw_key->data,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
843 ctx->old_password, NULL,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
844 &error)) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
845 doveadm_print(t_strdup_printf("dcrypt_key_load_private(%s) failed: %s",
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
846 raw_key->id,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
847 error));
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
848 _ctx->exit_code = EX_DATAERR;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
849 ret = -1;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
850 break;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
851 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
852
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
853 /* save it */
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
854 str_truncate(newkey, 0);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
855
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
856 if (!dcrypt_key_store_private(key, DCRYPT_FORMAT_DOVECOT,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
857 algo, newkey,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
858 ctx->new_password,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
859 NULL, &error)) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
860 doveadm_print(t_strdup_printf("dcrypt_key_store_private(%s) failed: %s",
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
861 raw_key->id,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
862 error));
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
863 _ctx->exit_code = EX_DATAERR;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
864 ret = -1;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
865 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
866
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
867 dcrypt_key_unref_private(&key);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
868 if (ret == -1) break;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
869
21389
59437f8764c6 global: Replaced all instances of memset(p, 0, sizeof(*p)) with the new i_zero() macro.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21270
diff changeset
870 i_zero(&value);
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
871 value.value = str_c(newkey);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
872
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
873 /* and store it */
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
874 if (mailbox_attribute_set(t, MAIL_ATTRIBUTE_TYPE_PRIVATE,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
875 raw_key->attr, &value) < 0) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
876 doveadm_print(t_strdup_printf("mailbox_attribute_set(%s, %s) failed: %s",
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
877 mailbox_get_vname(box),
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
878 raw_key->attr,
21814
759962e70148 global: Log internal storage error on failure
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 21671
diff changeset
879 mailbox_get_last_internal_error(box, NULL)));
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
880 _ctx->exit_code = EX_TEMPFAIL;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
881 ret = -1;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
882 break;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
883 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
884 count++;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
885 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
886 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
887
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
888 if (ret < 1) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
889 mailbox_transaction_rollback(&t);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
890 } else {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
891 if (mailbox_transaction_commit(&t) < 0) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
892 doveadm_print(t_strdup_printf("mailbox_transaction_commit(%s) failed: %s",
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
893 mailbox_get_vname(box),
21814
759962e70148 global: Log internal storage error on failure
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 21671
diff changeset
894 mailbox_get_last_internal_error(box, NULL)));
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
895 } else {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
896 doveadm_print(t_strdup_printf("Changed password for %u key(s)",
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
897 count));
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
898 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
899 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
900
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
901 (void)mailbox_attribute_iter_deinit(&iter);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
902 mailbox_free(&box);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
903
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
904 return ret;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
905 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
906
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
907
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
908 static bool cmd_mcp_keypair_generate_parse_arg(struct doveadm_mail_cmd_context *_ctx, int c)
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
909 {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
910 struct mcp_cmd_context *ctx =
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
911 (struct mcp_cmd_context *)_ctx;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
912
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
913 switch (c) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
914 case 'U':
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
915 ctx->userkey_only = TRUE;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
916 break;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
917 case 'R':
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
918 ctx->recrypt_box_keys = TRUE;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
919 break;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
920 case 'f':
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
921 ctx->force = TRUE;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
922 default:
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
923 return FALSE;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
924 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
925 return TRUE;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
926
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
927 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
928
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
929 static bool cmd_mcp_key_password_parse_arg(struct doveadm_mail_cmd_context *_ctx, int c)
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
930 {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
931 struct mcp_cmd_context *ctx =
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
932 (struct mcp_cmd_context *)_ctx;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
933
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
934 switch (c) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
935 case 'N':
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
936 ctx->ask_new_password = TRUE;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
937 break;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
938 case 'O':
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
939 ctx->ask_old_password = TRUE;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
940 break;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
941 case 'C':
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
942 ctx->clear_password = TRUE;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
943 break;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
944 case 'o':
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
945 ctx->old_password = p_strdup(_ctx->pool, optarg);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
946 break;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
947 case 'n':
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
948 ctx->new_password = p_strdup(_ctx->pool, optarg);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
949 break;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
950 default:
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
951 return FALSE;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
952 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
953 return TRUE;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
954 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
955
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
956 static bool cmd_mcp_key_parse_arg(struct doveadm_mail_cmd_context *_ctx, int c)
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
957 {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
958 struct mcp_cmd_context *ctx =
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
959 (struct mcp_cmd_context *)_ctx;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
960
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
961 switch (c) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
962 case 'U':
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
963 ctx->userkey_only = TRUE;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
964 break;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
965 default:
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
966 return FALSE;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
967 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
968 return TRUE;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
969
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
970 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
971
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
972 static struct doveadm_mail_cmd_context *cmd_mcp_keypair_generate_alloc(void)
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
973 {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
974 struct mcp_cmd_context *ctx;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
975
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
976 ctx = doveadm_mail_cmd_alloc(struct mcp_cmd_context);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
977 ctx->ctx.getopt_args = "URf";
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
978 ctx->ctx.v.parse_arg = cmd_mcp_keypair_generate_parse_arg;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
979 ctx->ctx.v.run = cmd_mcp_keypair_generate_run;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
980 return &ctx->ctx;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
981 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
982
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
983 static struct doveadm_mail_cmd_context *cmd_mcp_key_list_alloc(void)
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
984 {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
985 struct mcp_cmd_context *ctx;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
986
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
987 ctx = doveadm_mail_cmd_alloc(struct mcp_cmd_context);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
988 ctx->ctx.getopt_args = "U";
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
989 ctx->ctx.v.parse_arg = cmd_mcp_key_parse_arg;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
990 ctx->ctx.v.run = cmd_mcp_key_list_run;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
991 return &ctx->ctx;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
992 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
993
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
994 static struct doveadm_mail_cmd_context *cmd_mcp_key_export_alloc(void)
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
995 {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
996 struct mcp_cmd_context *ctx;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
997
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
998 ctx = doveadm_mail_cmd_alloc(struct mcp_cmd_context);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
999 ctx->ctx.getopt_args = "U";
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1000 ctx->ctx.v.parse_arg = cmd_mcp_key_parse_arg;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1001 ctx->ctx.v.run = cmd_mcp_key_export_run;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1002 return &ctx->ctx;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1003 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1004
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1005 static struct doveadm_mail_cmd_context *cmd_mcp_key_password_alloc(void)
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1006 {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1007 struct mcp_cmd_context *ctx;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1008
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1009 ctx = doveadm_mail_cmd_alloc(struct mcp_cmd_context);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1010 ctx->ctx.getopt_args = "NOCo:n:";
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1011 ctx->ctx.v.parse_arg = cmd_mcp_key_password_parse_arg;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1012 ctx->ctx.v.run = cmd_mcp_key_password_run;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1013 return &ctx->ctx;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1014 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1015
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1016 struct doveadm_cmd_ver2 doveadm_cmd_mcp_keypair_generate = {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1017 .name = "mailbox cryptokey generate",
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1018 .mail_cmd = cmd_mcp_keypair_generate_alloc,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1019 .usage = DOVEADM_CMD_MAIL_USAGE_PREFIX "[-URf] mailbox [ mailbox .. ]",
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1020 DOVEADM_CMD_PARAMS_START
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1021 DOVEADM_CMD_MAIL_COMMON
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1022 DOVEADM_CMD_PARAM('U', "user-key-only", CMD_PARAM_BOOL, 0)
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1023 DOVEADM_CMD_PARAM('R', "re-encrypt-box-keys", CMD_PARAM_BOOL, 0)
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1024 DOVEADM_CMD_PARAM('f', "force", CMD_PARAM_BOOL, 0)
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1025 DOVEADM_CMD_PARAM('\0', "mailbox", CMD_PARAM_STR, CMD_PARAM_FLAG_POSITIONAL)
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1026 DOVEADM_CMD_PARAMS_END
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1027 };
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1028
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1029 struct doveadm_cmd_ver2 doveadm_cmd_mcp_key_list = {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1030 .name = "mailbox cryptokey list",
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1031 .mail_cmd = cmd_mcp_key_list_alloc,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1032 .usage = DOVEADM_CMD_MAIL_USAGE_PREFIX "-U | mailbox [ mailbox .. ]",
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1033 DOVEADM_CMD_PARAMS_START
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1034 DOVEADM_CMD_MAIL_COMMON
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1035 DOVEADM_CMD_PARAM('U', "user-key", CMD_PARAM_BOOL, 0)
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1036 DOVEADM_CMD_PARAM('\0', "mailbox", CMD_PARAM_STR, CMD_PARAM_FLAG_POSITIONAL)
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1037 DOVEADM_CMD_PARAMS_END
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1038 };
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1039
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1040 struct doveadm_cmd_ver2 doveadm_cmd_mcp_key_export = {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1041 .name = "mailbox cryptokey export",
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1042 .mail_cmd = cmd_mcp_key_export_alloc,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1043 .usage = DOVEADM_CMD_MAIL_USAGE_PREFIX "-U | mailbox [ mailbox .. ]",
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1044 DOVEADM_CMD_PARAMS_START
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1045 DOVEADM_CMD_MAIL_COMMON
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1046 DOVEADM_CMD_PARAM('U', "user-key", CMD_PARAM_BOOL, 0)
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1047 DOVEADM_CMD_PARAM('\0', "mailbox", CMD_PARAM_STR, CMD_PARAM_FLAG_POSITIONAL)
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1048 DOVEADM_CMD_PARAMS_END
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1049 };
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1050
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1051 struct doveadm_cmd_ver2 doveadm_cmd_mcp_key_password = {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1052 .name = "mailbox cryptokey password",
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1053 .mail_cmd = cmd_mcp_key_password_alloc,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1054 .usage = DOVEADM_CMD_MAIL_USAGE_PREFIX "[-NOC] [-opassword] [-npassword]",
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1055 DOVEADM_CMD_PARAMS_START
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1056 DOVEADM_CMD_MAIL_COMMON
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1057 DOVEADM_CMD_PARAM('C', "clear-password", CMD_PARAM_BOOL, 0)
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1058 DOVEADM_CMD_PARAM('N', "ask-new-password", CMD_PARAM_BOOL, 0)
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1059 DOVEADM_CMD_PARAM('n', "new-password", CMD_PARAM_STR, 0)
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1060 DOVEADM_CMD_PARAM('O', "ask-old-password", CMD_PARAM_STR, 0)
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1061 DOVEADM_CMD_PARAM('o', "old-password", CMD_PARAM_STR, 0)
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1062 DOVEADM_CMD_PARAMS_END
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1063 };
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1064
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1065 void doveadm_mail_crypt_plugin_init(struct module *mod ATTR_UNUSED)
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1066 {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1067 doveadm_cmd_register_ver2(&doveadm_cmd_mcp_keypair_generate);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1068 doveadm_cmd_register_ver2(&doveadm_cmd_mcp_key_list);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1069 doveadm_cmd_register_ver2(&doveadm_cmd_mcp_key_export);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1070 doveadm_cmd_register_ver2(&doveadm_cmd_mcp_key_password);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1071 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1072
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1073 void doveadm_mail_crypt_plugin_deinit(void)
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1074 {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1075 }