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