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