annotate src/plugins/mail-crypt/doveadm-mail-crypt.c @ 22591:dafc46a5c6e5

doveadm-mail-crypt: Print existing userkey hash when aborting generate
author Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
date Fri, 06 Oct 2017 11:07:23 +0300
parents b0da9b8fdae8
children 8dc7e629897a
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;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
254 } else if (ret == 1 && (!ctx->force || ctx->recrypt_box_keys)) {
21244
d732ab1b584c doveadm-mail-crypt: Skip existing keys properly
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21233
diff changeset
255 /* 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
256 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
257 user keypair.
d732ab1b584c doveadm-mail-crypt: Skip existing keys properly
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21233
diff changeset
258
d732ab1b584c doveadm-mail-crypt: Skip existing keys properly
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21233
diff changeset
259 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
260 ret = 0;
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
261 } else {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
262 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
263 user_key, pubid_r, error_r)) < 0) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
264 ret = -1;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
265 } else {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
266 *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
267 *pair_r = pair;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
268 ret = 1;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
269 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
270 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
271
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
272 if (ret < 1) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
273 if (pair.pub != NULL)
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
274 dcrypt_key_unref_public(&pair.pub);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
275 if (pair.priv != NULL)
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
276 dcrypt_key_unref_private(&pair.priv);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
277 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
278
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
279 (void)mailbox_transaction_commit(&t);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
280
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
281 return ret;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
282 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
283
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
284 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
285 struct mail_user *user,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
286 ARRAY_TYPE(generated_keys) *result)
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
287 {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
288 const char *error;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
289 int ret;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
290 struct dcrypt_public_key *user_key;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
291 struct mcp_cmd_context *ctx =
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
292 (struct mcp_cmd_context *)_ctx;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
293 const char *pubid;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
294 bool user_key_generated = FALSE;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
295 struct generated_key *res;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
296
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
297 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
298 &error)) <= 0) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
299 struct dcrypt_keypair pair;
21270
e0d156644fbe plugins: mail-crypt - fix static analysis pedantry
Phil Carmody <phil@dovecot.fi>
parents: 21244
diff changeset
300 if (ret < 0) {
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
301 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
302 user->username,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
303 error);
21270
e0d156644fbe plugins: mail-crypt - fix static analysis pedantry
Phil Carmody <phil@dovecot.fi>
parents: 21244
diff changeset
304 } 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
305 &pubid, &error) < 0) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
306 ret = -1;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
307 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
308 user->username,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
309 error);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
310 res = array_append_space(result);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
311 res->name = "";
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
312 res->error = p_strdup(_ctx->pool, error);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
313 res->success = FALSE;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
314 } else {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
315 res = array_append_space(result);
22590
b0da9b8fdae8 mail-crypt: Improve doveadm output
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22589
diff changeset
316 res->name = DOVEADM_MCP_USERKEY;
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
317 res->id = p_strdup(_ctx->pool, pubid);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
318 res->success = TRUE;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
319 /* don't do it again later on */
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
320 user_key_generated = TRUE;
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 user_key = pair.pub;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
323 dcrypt_key_unref_private(&pair.priv);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
324 }
21270
e0d156644fbe plugins: mail-crypt - fix static analysis pedantry
Phil Carmody <phil@dovecot.fi>
parents: 21244
diff changeset
325 if (ret < 0) return ret;
22590
b0da9b8fdae8 mail-crypt: Improve doveadm output
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22589
diff changeset
326 ctx->matched_keys++;
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
327 }
22591
dafc46a5c6e5 doveadm-mail-crypt: Print existing userkey hash when aborting generate
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 22590
diff changeset
328 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
329 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
330 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
331 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
332 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
333 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
334 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
335 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
336 error);
dafc46a5c6e5 doveadm-mail-crypt: Print existing userkey hash when aborting generate
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 22590
diff changeset
337 return -1;
dafc46a5c6e5 doveadm-mail-crypt: Print existing userkey hash when aborting generate
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 22590
diff changeset
338 }
dafc46a5c6e5 doveadm-mail-crypt: Print existing userkey hash when aborting generate
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 22590
diff changeset
339 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
340 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
341 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
342 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
343 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
344 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
345 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
346 return 1;
dafc46a5c6e5 doveadm-mail-crypt: Print existing userkey hash when aborting generate
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 22590
diff changeset
347 }
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
348 struct dcrypt_keypair pair;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
349 dcrypt_key_unref_public(&user_key);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
350 /* regen user key */
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
351 res = array_append_space(result);
22590
b0da9b8fdae8 mail-crypt: Improve doveadm output
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22589
diff changeset
352 res->name = DOVEADM_MCP_USERKEY;
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
353 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
354 &error) < 0) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
355 res->success = FALSE;
22589
103a6d51eefe mail-crypt: Fix key generation handling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21814
diff changeset
356 res->error = p_strdup(_ctx->pool, error);
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
357 return -1;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
358 }
22589
103a6d51eefe mail-crypt: Fix key generation handling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21814
diff changeset
359 res->success = TRUE;
103a6d51eefe mail-crypt: Fix key generation handling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21814
diff changeset
360 res->id = p_strdup(_ctx->pool, pubid);
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
361 user_key = pair.pub;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
362 dcrypt_key_unref_private(&pair.priv);
22590
b0da9b8fdae8 mail-crypt: Improve doveadm output
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22589
diff changeset
363 ctx->matched_keys++;
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
364 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
365
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
366 if (ctx->userkey_only)
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
367 return 0;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
368
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
369 const char *const *patterns = (const char *const[]){ "*", NULL };
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
370
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
371 /* only re-encrypt all folder keys if wanted */
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
372 if (!ctx->recrypt_box_keys) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
373 patterns = ctx->ctx.args;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
374 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
375
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
376 const struct mailbox_info *info;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
377 struct mailbox_list_iterate_context *iter =
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
378 mailbox_list_iter_init_namespaces(user->namespaces,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
379 patterns,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
380 MAIL_NAMESPACE_TYPE_PRIVATE,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
381 MAILBOX_LIST_ITER_SKIP_ALIASES |
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
382 MAILBOX_LIST_ITER_NO_AUTO_BOXES |
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
383 MAILBOX_LIST_ITER_RETURN_NO_FLAGS);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
384 while((info = mailbox_list_iter_next(iter)) != NULL) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
385 if ((info->flags & MAILBOX_NOSELECT) != 0 ||
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
386 (info->flags & MAILBOX_NONEXISTENT) != 0) continue;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
387 struct dcrypt_keypair pair;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
388
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
389 struct mailbox *box =
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
390 mailbox_alloc(info->ns->list,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
391 info->vname, 0);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
392 if (mailbox_open(box) < 0) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
393 res = array_append_space(result);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
394 res->name = p_strdup(_ctx->pool, info->vname);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
395 res->success = FALSE;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
396 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
397 mailbox_get_last_internal_error(box, NULL));
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
398 } 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
399 &pair, &pubid,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
400 &error)) < 0) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
401 res = array_append_space(result);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
402 res->name = p_strdup(_ctx->pool, info->vname);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
403 res->success = FALSE;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
404 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
405 } else if (ret == 0) {
d732ab1b584c doveadm-mail-crypt: Skip existing keys properly
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21233
diff changeset
406 /* 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
407 force wasn't used, skip */
d732ab1b584c doveadm-mail-crypt: Skip existing keys properly
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21233
diff changeset
408 } else if (ret > 0) {
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
409 res = array_append_space(result);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
410 res->name = p_strdup(_ctx->pool, info->vname);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
411 res->success = TRUE;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
412 res->id = pubid;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
413 T_BEGIN {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
414 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
415 } T_END;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
416 dcrypt_keypair_unref(&pair);
22590
b0da9b8fdae8 mail-crypt: Improve doveadm output
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22589
diff changeset
417 ctx->matched_keys++;
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
418 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
419 mailbox_free(&box);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
420 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
421
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
422 (void)mailbox_list_iter_deinit(&iter);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
423
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
424 dcrypt_key_unref_public(&user_key);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
425 return 0;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
426 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
427
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
428 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
429 struct mail_user *user)
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
430 {
22590
b0da9b8fdae8 mail-crypt: Improve doveadm output
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22589
diff changeset
431 struct mcp_cmd_context *ctx =
b0da9b8fdae8 mail-crypt: Improve doveadm output
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22589
diff changeset
432 (struct mcp_cmd_context *)_ctx;
b0da9b8fdae8 mail-crypt: Improve doveadm output
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22589
diff changeset
433
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
434 int ret = 0;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
435
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
436 ARRAY_TYPE(generated_keys) result;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
437 p_array_init(&result, _ctx->pool, 8);
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 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
440 _ctx->exit_code = EX_DATAERR;
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 doveadm_print_init(DOVEADM_PRINT_TYPE_TABLE);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
443 doveadm_print_header("success", " ", 0);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
444 doveadm_print_header("box", "Folder", 0);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
445 doveadm_print_header("pubid", "Public ID", 0);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
446
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
447 const struct generated_key *res;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
448
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
449 array_foreach(&result, res) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
450 if (res->success)
22590
b0da9b8fdae8 mail-crypt: Improve doveadm output
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22589
diff changeset
451 doveadm_print(DOVEADM_MCP_SUCCESS);
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
452 else {
22589
103a6d51eefe mail-crypt: Fix key generation handling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21814
diff changeset
453 _ctx->exit_code = EX_DATAERR;
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
454 ret = -1;
22590
b0da9b8fdae8 mail-crypt: Improve doveadm output
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22589
diff changeset
455 doveadm_print(DOVEADM_MCP_FAIL);
21233
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 doveadm_print(res->name);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
458 if (!res->success)
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
459 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
460 else
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
461 doveadm_print(res->id);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
462 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
463
22590
b0da9b8fdae8 mail-crypt: Improve doveadm output
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22589
diff changeset
464 if (ctx->matched_keys == 0)
b0da9b8fdae8 mail-crypt: Improve doveadm output
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22589
diff changeset
465 i_warning("mailbox cryptokey generate: Nothing was matched. "
b0da9b8fdae8 mail-crypt: Improve doveadm output
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22589
diff changeset
466 "Use -U or specify mask?");
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
467 return ret;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
468 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
469
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
470 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
471 struct mail_user *user,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
472 void(*callback)(const struct generated_key *, void *),
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
473 void *context)
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 const char *error;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
476 int ret;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
477
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
478 /* 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
479 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
480 */
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
481
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
482 ARRAY_TYPE(const_string) ids;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
483 t_array_init(&ids, 8);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
484
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
485 if (ctx->userkey_only) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
486 struct mailbox_attribute_iter *iter;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
487 struct mail_namespace *ns =
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
488 mail_namespace_find_inbox(user->namespaces);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
489 struct mailbox *box =
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
490 mailbox_alloc(ns->list, "INBOX", MAILBOX_FLAG_READONLY);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
491 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
492 i_zero(&value);
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
493 if (mailbox_open(box) < 0) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
494 i_error("mailbox_open(%s) failed: %s",
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
495 mailbox_get_vname(box),
21814
759962e70148 global: Log internal storage error on failure
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 21671
diff changeset
496 mailbox_get_last_internal_error(box, NULL));
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
497 mailbox_free(&box);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
498 return;
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 struct mailbox_transaction_context *t =
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
501 mailbox_transaction_begin(box, 0);
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 ((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
504 USER_CRYPT_PREFIX
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
505 ACTIVE_KEY_NAME,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
506 &value)) < 0) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
507 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
508 mailbox_get_vname(box),
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
509 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
510 mailbox_get_last_internal_error(box, NULL));
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
511 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
512
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
513 iter = mailbox_attribute_iter_init(box,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
514 MAIL_ATTRIBUTE_TYPE_PRIVATE,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
515 USER_CRYPT_PREFIX
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
516 PRIVKEYS_PREFIX);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
517 const char *key_id;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
518 if (value.value == NULL)
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
519 value.value = "<NO ACTIVE KEY>";
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
520 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
521 struct generated_key key;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
522 key.id = key_id;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
523 key.active = strcmp(value.value, key_id) == 0;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
524 key.name = "";
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
525 key.box = box;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
526 callback(&key, context);
22590
b0da9b8fdae8 mail-crypt: Improve doveadm output
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22589
diff changeset
527 ctx->matched_keys++;
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
528 }
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 if (mailbox_attribute_iter_deinit(&iter) < 0)
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
531 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
532 mailbox_get_vname(box),
21814
759962e70148 global: Log internal storage error on failure
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 21671
diff changeset
533 mailbox_get_last_internal_error(box, NULL));
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
534
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
535 (void)mailbox_transaction_commit(&t);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
536
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
537 mailbox_free(&box);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
538 return;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
539 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
540
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
541 const struct mailbox_info *info;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
542 struct mailbox_list_iterate_context *iter =
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
543 mailbox_list_iter_init_namespaces(user->namespaces,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
544 ctx->ctx.args,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
545 MAIL_NAMESPACE_TYPE_PRIVATE,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
546 MAILBOX_LIST_ITER_SKIP_ALIASES |
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
547 MAILBOX_LIST_ITER_NO_AUTO_BOXES |
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
548 MAILBOX_LIST_ITER_RETURN_NO_FLAGS);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
549
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
550 while((info = mailbox_list_iter_next(iter)) != NULL) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
551 if ((info->flags & MAILBOX_NOSELECT) != 0 ||
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
552 (info->flags & MAILBOX_NONEXISTENT) != 0) continue;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
553
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
554 struct mailbox *box =
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
555 mailbox_alloc(info->ns->list,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
556 info->vname, MAILBOX_FLAG_READONLY);
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 if (mailbox_open(box) < 0) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
559 i_error("mailbox_open(%s) failed: %s",
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
560 mailbox_get_vname(box),
21814
759962e70148 global: Log internal storage error on failure
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 21671
diff changeset
561 mailbox_get_last_internal_error(box, NULL));
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
562 mailbox_free(&box);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
563 continue;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
564 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
565 struct mailbox_transaction_context *t =
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
566 mailbox_transaction_begin(box, 0);
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 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
569 i_zero(&value);
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
570 array_clear(&ids);
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 /* get active ID */
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
573 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
574 BOX_CRYPT_PREFIX
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
575 ACTIVE_KEY_NAME,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
576 &value)) < 0) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
577 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
578 mailbox_get_vname(box),
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
579 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
580 mailbox_get_last_internal_error(box, NULL));
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
581 } 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
582 MAIL_ATTRIBUTE_TYPE_PRIVATE,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
583 &ids, &error)) < 0) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
584 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
585 mailbox_get_vname(box),
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
586 error);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
587 } else {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
588 const char *const *id;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
589 const char *boxname = mailbox_get_vname(box);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
590 if (value.value == NULL)
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
591 value.value = "<NO ACTIVE KEY>";
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
592 array_foreach(&ids, id) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
593 struct generated_key key;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
594 key.name = boxname;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
595 key.id = *id;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
596 if (value.value != NULL)
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
597 key.active = strcmp(*id, value.value) == 0;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
598 else
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
599 key.active = FALSE;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
600 key.box = box;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
601 callback(&key, context);
22590
b0da9b8fdae8 mail-crypt: Improve doveadm output
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22589
diff changeset
602 ctx->matched_keys++;
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
603 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
604 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
605
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
606 (void)mailbox_transaction_commit(&t);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
607 mailbox_free(&box);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
608 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
609
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
610 (void)mailbox_list_iter_deinit(&iter);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
611 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
612
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
613 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
614 {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
615 struct mcp_key_iter_ctx *ctx = context;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
616 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
617 key->name = p_strdup(ctx->pool, _key->name);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
618 key->id = p_strdup(ctx->pool, _key->id);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
619 key->active = _key->active;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
620 }
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 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
623 struct mail_user *user)
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
624 {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
625 struct mcp_cmd_context *ctx =
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
626 (struct mcp_cmd_context *)_ctx;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
627 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
628 i_zero(&iter_ctx);
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
629 iter_ctx.pool = _ctx->pool;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
630 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
631
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
632 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
633
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
634 doveadm_print_init(DOVEADM_PRINT_TYPE_TABLE);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
635 doveadm_print_header("box", "Folder", 0);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
636 doveadm_print_header("active", "Active", 0);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
637 doveadm_print_header("pubid", "Public ID", 0);
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 const struct generated_key *key;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
640 array_foreach(&iter_ctx.keys, key) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
641 doveadm_print(key->name);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
642 doveadm_print(key->active ? "yes" : "no");
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
643 doveadm_print(key->id);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
644 }
22590
b0da9b8fdae8 mail-crypt: Improve doveadm output
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22589
diff changeset
645
b0da9b8fdae8 mail-crypt: Improve doveadm output
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22589
diff changeset
646 if (ctx->matched_keys == 0)
b0da9b8fdae8 mail-crypt: Improve doveadm output
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22589
diff changeset
647 i_warning("mailbox cryptokey list: Nothing was matched. "
b0da9b8fdae8 mail-crypt: Improve doveadm output
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22589
diff changeset
648 "Use -U or specify mask?");
b0da9b8fdae8 mail-crypt: Improve doveadm output
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 22589
diff changeset
649
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
650 return 0;
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
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
653 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
654 void *context ATTR_UNUSED)
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
655 {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
656 struct dcrypt_private_key *pkey;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
657 bool user_key = FALSE;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
658 const char *error = NULL;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
659 int ret;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
660
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
661 if (*key->name == '\0')
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
662 user_key = TRUE;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
663
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
664 doveadm_print(key->name);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
665 doveadm_print(key->id);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
666
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
667 struct mailbox_transaction_context *t =
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
668 mailbox_transaction_begin(key->box, 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 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
671 &pkey, &error)) <= 0) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
672 if (ret == 0)
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
673 error = "key not found";
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
674 doveadm_print(t_strdup_printf("ERROR: %s", error));
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
675 doveadm_print("");
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
676 } else {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
677 string_t *out = t_str_new(64);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
678 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
679 NULL, NULL, &error)) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
680 doveadm_print(t_strdup_printf("ERROR: %s", error));
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
681 doveadm_print("");
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
682 } else {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
683 /* 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
684 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
685 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
686 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
687 dcrypt_key_unref_private(&pkey);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
688 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
689
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
690 (void)mailbox_transaction_commit(&t);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
691 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
692
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
693 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
694 struct mail_user *user)
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
695 {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
696 struct mcp_cmd_context *ctx =
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
697 (struct mcp_cmd_context *)_ctx;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
698
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
699 doveadm_print_init(DOVEADM_PRINT_TYPE_PAGER);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
700 doveadm_print_header("box", "Folder", 0);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
701 doveadm_print_header("name", "Public ID", 0);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
702 doveadm_print_header("error", "Error", 0);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
703 doveadm_print_header("key", "Key", 0);
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 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
706
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
707 return 0;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
708 }
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 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
711 struct mail_user *user)
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
712 {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
713 struct mcp_cmd_context *ctx =
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
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
716 struct raw_key {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
717 const char *attr;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
718 const char *id;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
719 const char *data;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
720 };
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
721
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
722 ARRAY(struct raw_key) raw_keys;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
723
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
724 doveadm_print_init(DOVEADM_PRINT_TYPE_PAGER);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
725
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
726 doveadm_print_header_simple("result");
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 if (ctx->ask_old_password) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
729 if (ctx->old_password != NULL) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
730 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
731 _ctx->exit_code = EX_USAGE;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
732 return -1;
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 if (!_ctx->cli) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
735 doveadm_print("No cli - cannot ask for password");
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
736 _ctx->exit_code = EX_USAGE;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
737 return -1;
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 ctx->old_password =
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
740 p_strdup(_ctx->pool, t_askpass("Old password: "));
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
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
743 if (ctx->ask_new_password) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
744 if (ctx->new_password != NULL) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
745 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
746 _ctx->exit_code = EX_USAGE;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
747 return -1;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
748 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
749 if (!_ctx->cli) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
750 doveadm_print("No cli - cannot ask for password");
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
751 _ctx->exit_code = EX_USAGE;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
752 return -1;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
753 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
754 ctx->new_password =
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
755 p_strdup(_ctx->pool, t_askpass("New password: "));
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
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
758 if (ctx->clear_password &&
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
759 (ctx->new_password != NULL ||
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
760 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
761 doveadm_print("clear password and new password specified");
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
762 _ctx->exit_code = EX_USAGE;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
763 return -1;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
764 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
765
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
766 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
767 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
768 if (mailbox_open(box) < 0) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
769 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
770 mailbox_get_vname(box),
21814
759962e70148 global: Log internal storage error on failure
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 21671
diff changeset
771 mailbox_get_last_internal_error(box, NULL)));
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
772 _ctx->exit_code = EX_TEMPFAIL;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
773 return -1;
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 struct mailbox_transaction_context *t =
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
777 mailbox_transaction_begin(box, 0);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
778
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
779 t_array_init(&raw_keys, 8);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
780
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
781 /* 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
782 struct mailbox_attribute_iter *iter =
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
783 mailbox_attribute_iter_init(box,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
784 MAIL_ATTRIBUTE_TYPE_PRIVATE,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
785 USER_CRYPT_PREFIX
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
786 PRIVKEYS_PREFIX);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
787 const char *error;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
788 const char *key_id;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
789 int ret = 1;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
790 unsigned int count = 0;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
791
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
792 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
793 const char *attr =
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
794 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
795 key_id);
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 struct mail_attribute_value value;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
798 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
799 attr, &value)) < 0) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
800 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
801 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
802 mailbox_get_last_internal_error(box, NULL)));
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
803 _ctx->exit_code = EX_TEMPFAIL;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
804 break;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
805 } else if (ret > 0) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
806 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
807 raw_key->attr = p_strdup(_ctx->pool, attr);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
808 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
809 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
810 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
811 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
812
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
813 if (ret == 1) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
814 struct dcrypt_private_key *key;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
815 const struct raw_key *raw_key;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
816 const char *algo = ctx->new_password != NULL ?
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
817 MAIL_CRYPT_PW_CIPHER :
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
818 NULL;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
819 string_t *newkey = t_str_new(256);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
820
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
821 array_foreach(&raw_keys, raw_key) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
822 struct mail_attribute_value value;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
823
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
824 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
825 ctx->old_password, NULL,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
826 &error)) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
827 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
828 raw_key->id,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
829 error));
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
830 _ctx->exit_code = EX_DATAERR;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
831 ret = -1;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
832 break;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
833 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
834
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
835 /* save it */
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
836 str_truncate(newkey, 0);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
837
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
838 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
839 algo, newkey,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
840 ctx->new_password,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
841 NULL, &error)) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
842 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
843 raw_key->id,
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 _ctx->exit_code = EX_DATAERR;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
846 ret = -1;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
847 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
848
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
849 dcrypt_key_unref_private(&key);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
850 if (ret == -1) break;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
851
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
852 i_zero(&value);
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
853 value.value = str_c(newkey);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
854
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
855 /* and store it */
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
856 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
857 raw_key->attr, &value) < 0) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
858 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
859 mailbox_get_vname(box),
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
860 raw_key->attr,
21814
759962e70148 global: Log internal storage error on failure
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 21671
diff changeset
861 mailbox_get_last_internal_error(box, NULL)));
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
862 _ctx->exit_code = EX_TEMPFAIL;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
863 ret = -1;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
864 break;
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 count++;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
867 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
868 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
869
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
870 if (ret < 1) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
871 mailbox_transaction_rollback(&t);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
872 } else {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
873 if (mailbox_transaction_commit(&t) < 0) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
874 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
875 mailbox_get_vname(box),
21814
759962e70148 global: Log internal storage error on failure
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 21671
diff changeset
876 mailbox_get_last_internal_error(box, NULL)));
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
877 } else {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
878 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
879 count));
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
880 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
881 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
882
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
883 (void)mailbox_attribute_iter_deinit(&iter);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
884 mailbox_free(&box);
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 return ret;
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
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
889
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
890 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
891 {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
892 struct mcp_cmd_context *ctx =
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
893 (struct mcp_cmd_context *)_ctx;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
894
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
895 switch (c) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
896 case 'U':
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
897 ctx->userkey_only = TRUE;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
898 break;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
899 case 'R':
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
900 ctx->recrypt_box_keys = TRUE;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
901 break;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
902 case 'f':
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
903 ctx->force = TRUE;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
904 default:
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
905 return FALSE;
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 return TRUE;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
908
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
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
911 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
912 {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
913 struct mcp_cmd_context *ctx =
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
914 (struct mcp_cmd_context *)_ctx;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
915
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
916 switch (c) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
917 case 'N':
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
918 ctx->ask_new_password = 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 'O':
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
921 ctx->ask_old_password = TRUE;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
922 break;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
923 case 'C':
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
924 ctx->clear_password = TRUE;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
925 break;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
926 case 'o':
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
927 ctx->old_password = p_strdup(_ctx->pool, optarg);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
928 break;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
929 case 'n':
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
930 ctx->new_password = p_strdup(_ctx->pool, optarg);
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
931 break;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
932 default:
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
933 return FALSE;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
934 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
935 return TRUE;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
936 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
937
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
938 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
939 {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
940 struct mcp_cmd_context *ctx =
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
941 (struct mcp_cmd_context *)_ctx;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
942
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
943 switch (c) {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
944 case 'U':
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
945 ctx->userkey_only = TRUE;
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 default:
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
948 return FALSE;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
949 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
950 return TRUE;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
951
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
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
954 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
955 {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
956 struct mcp_cmd_context *ctx;
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 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
959 ctx->ctx.getopt_args = "URf";
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
960 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
961 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
962 return &ctx->ctx;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
963 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
964
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
965 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
966 {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
967 struct mcp_cmd_context *ctx;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
968
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
969 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
970 ctx->ctx.getopt_args = "U";
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
971 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
972 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
973 return &ctx->ctx;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
974 }
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 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
977 {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
978 struct mcp_cmd_context *ctx;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
979
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
980 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
981 ctx->ctx.getopt_args = "U";
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
982 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
983 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
984 return &ctx->ctx;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
985 }
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 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
988 {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
989 struct mcp_cmd_context *ctx;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
990
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
991 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
992 ctx->ctx.getopt_args = "NOCo:n:";
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
993 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
994 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
995 return &ctx->ctx;
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
996 }
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 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
999 .name = "mailbox cryptokey generate",
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1000 .mail_cmd = cmd_mcp_keypair_generate_alloc,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1001 .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
1002 DOVEADM_CMD_PARAMS_START
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1003 DOVEADM_CMD_MAIL_COMMON
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1004 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
1005 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
1006 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
1007 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
1008 DOVEADM_CMD_PARAMS_END
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1009 };
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1010
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1011 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
1012 .name = "mailbox cryptokey list",
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1013 .mail_cmd = cmd_mcp_key_list_alloc,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1014 .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
1015 DOVEADM_CMD_PARAMS_START
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1016 DOVEADM_CMD_MAIL_COMMON
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1017 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
1018 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
1019 DOVEADM_CMD_PARAMS_END
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1020 };
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1021
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1022 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
1023 .name = "mailbox cryptokey export",
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1024 .mail_cmd = cmd_mcp_key_export_alloc,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1025 .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
1026 DOVEADM_CMD_PARAMS_START
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1027 DOVEADM_CMD_MAIL_COMMON
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1028 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
1029 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
1030 DOVEADM_CMD_PARAMS_END
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1031 };
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1032
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1033 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
1034 .name = "mailbox cryptokey password",
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1035 .mail_cmd = cmd_mcp_key_password_alloc,
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1036 .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
1037 DOVEADM_CMD_PARAMS_START
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1038 DOVEADM_CMD_MAIL_COMMON
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1039 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
1040 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
1041 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
1042 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
1043 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
1044 DOVEADM_CMD_PARAMS_END
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1045 };
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1046
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1047 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
1048 {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1049 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
1050 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
1051 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
1052 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
1053 }
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1054
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1055 void doveadm_mail_crypt_plugin_deinit(void)
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1056 {
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
1057 }