Mercurial > dovecot > core-2.2
annotate src/plugins/mail-crypt/doveadm-mail-crypt.c @ 21512:be3236bce027
doveadm mailbox cryptokey generate: Fix error handling
Don't crash if mail_user creation failed.
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Fri, 10 Feb 2017 12:40:41 +0200 |
parents | 59fca1e76009 |
children | b4dd0868ecc0 |
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 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
22 struct generated_key { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
23 const char *name; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
24 const char *id; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
25 const char *error; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
26 struct mailbox *box; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
27 bool success:1; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
28 bool active:1; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
29 }; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
30 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
31 ARRAY_DEFINE_TYPE(generated_keys, struct generated_key); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
32 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
33 struct mcp_cmd_context { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
34 struct doveadm_mail_cmd_context ctx; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
35 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
36 const char *old_password; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
37 const char *new_password; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
38 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
39 bool userkey_only:1; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
40 bool recrypt_box_keys:1; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
41 bool force:1; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
42 bool ask_old_password:1; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
43 bool ask_new_password:1; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
44 bool clear_password:1; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
45 }; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
46 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
47 struct mcp_key_iter_ctx { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
48 pool_t pool; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
49 ARRAY_TYPE(generated_keys) keys; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
50 }; |
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 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
|
53 void doveadm_mail_crypt_plugin_deinit(void); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
54 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
55 static int |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
56 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
|
57 struct mail_user **dest_user_r, |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
58 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
|
59 const char **error_r) |
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 const struct mail_storage_service_input *old_input; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
62 struct mail_storage_service_input input; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
63 struct mail_storage_service_ctx *service_ctx; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
64 struct ioloop_context *cur_ioloop_ctx; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
65 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
66 int ret; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
67 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
68 i_assert(user->_service_user != NULL); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
69 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
|
70 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
|
71 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
72 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
|
73 io_loop_context_deactivate(cur_ioloop_ctx); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
74 |
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
|
75 i_zero(&input); |
21233
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
76 input.module = old_input->module; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
77 input.service = old_input->service; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
78 input.username = dest_username; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
79 input.session_id_prefix = user->session_id; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
80 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
|
81 MAIL_STORAGE_SERVICE_FLAG_NO_LOG_INIT; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
82 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
83 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
|
84 dest_service_user_r, |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
85 dest_user_r, error_r); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
86 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
87 if (ret == 0) |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
88 *error_r = "User not found"; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
89 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
90 return ret; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
91 } |
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 static int |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
94 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
|
95 struct mail_user *user, const char *target_uid, |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
96 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
|
97 { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
98 const char *error; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
99 struct mail_user *dest_user; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
100 struct mail_storage_service_user *dest_service_user; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
101 struct ioloop_context *cur_ioloop_ctx; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
102 struct dcrypt_public_key *pkey; |
21511
59fca1e76009
doveadm mailbox cryptokey generate: Fix memory leak
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
103 const char *dest_username; |
21233
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
104 int ret = 0; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
105 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
106 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
|
107 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
108 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
|
109 &dest_service_user, &error); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
110 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
111 /* 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
|
112 if (ret > 0) |
be3236bce027
doveadm mailbox cryptokey generate: Fix error handling
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21511
diff
changeset
|
113 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
|
114 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
|
115 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
116 if (ret <= 0) { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
117 i_error("Cannot initialize destination user %s: %s", |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
118 target_uid, error); |
21512
be3236bce027
doveadm mailbox cryptokey generate: Fix error handling
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21511
diff
changeset
|
119 return ret; |
21233
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
120 } else { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
121 i_assert(dest_user != NULL); |
21511
59fca1e76009
doveadm mailbox cryptokey generate: Fix memory leak
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
122 dest_username = dest_user->username; |
59fca1e76009
doveadm mailbox cryptokey generate: Fix memory leak
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
123 |
21233
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
124 /* get public key from target user */ |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
125 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
|
126 &pkey, error_r)) <= 0) { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
127 if (ret == 0 && disallow_insecure) { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
128 *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
|
129 dest_user->username); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
130 ret = -1; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
131 } else if (ret == 0) { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
132 /* perform insecure sharing */ |
21511
59fca1e76009
doveadm mailbox cryptokey generate: Fix memory leak
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
133 dest_username = NULL; |
21233
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
134 pkey = NULL; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
135 ret = 1; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
136 } |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
137 } |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
138 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
139 if (ret == 1) { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
140 ARRAY_TYPE(dcrypt_private_key) keys; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
141 t_array_init(&keys, 1); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
142 array_append(&keys, &key, 1); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
143 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
|
144 dest_username, |
21233
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
145 &keys, error_r); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
146 } |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
147 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
148 } |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
149 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
150 /* logging context swap again */ |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
151 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
|
152 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
|
153 |
21511
59fca1e76009
doveadm mailbox cryptokey generate: Fix memory leak
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
154 mail_user_unref(&dest_user); |
21512
be3236bce027
doveadm mailbox cryptokey generate: Fix error handling
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21511
diff
changeset
|
155 mail_storage_service_user_free(&dest_service_user); |
21233
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
156 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
157 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
|
158 io_loop_context_deactivate(cur_ioloop_ctx); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
159 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
160 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
|
161 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
162 return ret; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
163 } |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
164 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
165 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
|
166 const char *pubid, struct dcrypt_private_key *key) |
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 const char *error; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
169 int ret; |
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 ARRAY_TYPE(const_string) ids; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
172 t_array_init(&ids, 8); |
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 /* figure out who needs the key */ |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
175 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
|
176 MAIL_ATTRIBUTE_TYPE_SHARED, |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
177 &ids, &error)) < 0) { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
178 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
|
179 mailbox_get_vname(box), |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
180 error); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
181 return -1; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
182 } |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
183 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
184 const char *const *id; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
185 bool found = FALSE; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
186 string_t *uid = t_str_new(64); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
187 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
188 struct mailbox_transaction_context *t = |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
189 mailbox_transaction_begin(box, 0); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
190 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
191 ret = 0; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
192 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
193 /* then perform sharing */ |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
194 array_foreach(&ids, id) { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
195 if (strchr(*id, '/') != NULL) { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
196 str_truncate(uid, 0); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
197 const char *hexuid = t_strcut(*id, '/'); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
198 hex_to_binary(hexuid, uid); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
199 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
|
200 &error) < 0) { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
201 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
|
202 mailbox_get_vname(box), |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
203 str_c(uid), |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
204 error); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
205 ret = -1; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
206 break; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
207 } |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
208 } else if (!found) { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
209 found = TRUE; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
210 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
|
211 NULL, NULL, |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
212 &error) < 0) { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
213 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
|
214 mailbox_get_vname(box), |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
215 error); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
216 ret = -1; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
217 break; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
218 } |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
219 } |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
220 } |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
221 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
222 if (ret < 0) { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
223 mailbox_transaction_rollback(&t); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
224 } else if (mailbox_transaction_commit(&t) < 0) { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
225 i_error("mailbox_transaction_commit(%s) failed: %s", |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
226 mailbox_get_vname(box), |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
227 error); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
228 ret = -1; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
229 } |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
230 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
231 return ret; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
232 } |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
233 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
234 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
|
235 struct dcrypt_public_key *user_key, |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
236 struct mailbox *box, struct dcrypt_keypair *pair_r, |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
237 const char **pubid_r, const char **error_r) |
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 struct dcrypt_keypair pair = {NULL, NULL}; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
240 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
241 int ret; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
242 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
243 struct mailbox_transaction_context *t = |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
244 mailbox_transaction_begin(box, 0); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
245 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
246 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
|
247 ret = -1; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
248 } 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
|
249 /* 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
|
250 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
|
251 user keypair. |
d732ab1b584c
doveadm-mail-crypt: Skip existing keys properly
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21233
diff
changeset
|
252 |
d732ab1b584c
doveadm-mail-crypt: Skip existing keys properly
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21233
diff
changeset
|
253 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
|
254 ret = 0; |
21233
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
255 } else { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
256 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
|
257 user_key, pubid_r, error_r)) < 0) { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
258 ret = -1; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
259 } else { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
260 *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
|
261 *pair_r = pair; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
262 ret = 1; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
263 } |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
264 } |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
265 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
266 if (ret < 1) { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
267 if (pair.pub != NULL) |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
268 dcrypt_key_unref_public(&pair.pub); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
269 if (pair.priv != NULL) |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
270 dcrypt_key_unref_private(&pair.priv); |
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 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
273 (void)mailbox_transaction_commit(&t); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
274 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
275 return ret; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
276 } |
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 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
|
279 struct mail_user *user, |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
280 ARRAY_TYPE(generated_keys) *result) |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
281 { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
282 const char *error; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
283 int ret; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
284 struct dcrypt_public_key *user_key; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
285 struct mcp_cmd_context *ctx = |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
286 (struct mcp_cmd_context *)_ctx; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
287 const char *pubid; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
288 bool user_key_generated = FALSE; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
289 struct generated_key *res; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
290 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
291 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
|
292 &error)) <= 0) { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
293 struct dcrypt_keypair pair; |
21270
e0d156644fbe
plugins: mail-crypt - fix static analysis pedantry
Phil Carmody <phil@dovecot.fi>
parents:
21244
diff
changeset
|
294 if (ret < 0) { |
21233
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
295 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
|
296 user->username, |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
297 error); |
21270
e0d156644fbe
plugins: mail-crypt - fix static analysis pedantry
Phil Carmody <phil@dovecot.fi>
parents:
21244
diff
changeset
|
298 } 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
|
299 &pubid, &error) < 0) { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
300 ret = -1; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
301 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
|
302 user->username, |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
303 error); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
304 res = array_append_space(result); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
305 res->name = ""; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
306 res->error = p_strdup(_ctx->pool, error); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
307 res->success = FALSE; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
308 } else { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
309 res = array_append_space(result); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
310 res->name = ""; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
311 res->id = p_strdup(_ctx->pool, pubid); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
312 res->success = TRUE; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
313 /* don't do it again later on */ |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
314 user_key_generated = TRUE; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
315 ret = 1; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
316 user_key = pair.pub; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
317 dcrypt_key_unref_private(&pair.priv); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
318 } |
21270
e0d156644fbe
plugins: mail-crypt - fix static analysis pedantry
Phil Carmody <phil@dovecot.fi>
parents:
21244
diff
changeset
|
319 if (ret < 0) return ret; |
21233
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
320 } |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
321 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
322 if (ret == 1 && ctx->force && |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
323 ctx->userkey_only && !user_key_generated) { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
324 struct dcrypt_keypair pair; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
325 dcrypt_key_unref_public(&user_key); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
326 /* regen user key */ |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
327 res = array_append_space(result); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
328 res->name = ""; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
329 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
|
330 &error) < 0) { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
331 res->success = FALSE; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
332 res->id = p_strdup(_ctx->pool, error); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
333 return -1; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
334 } |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
335 user_key = pair.pub; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
336 dcrypt_key_unref_private(&pair.priv); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
337 } |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
338 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
339 if (ctx->userkey_only) |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
340 return 0; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
341 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
342 const char *const *patterns = (const char *const[]){ "*", NULL }; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
343 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
344 /* only re-encrypt all folder keys if wanted */ |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
345 if (!ctx->recrypt_box_keys) { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
346 patterns = ctx->ctx.args; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
347 } |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
348 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
349 const struct mailbox_info *info; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
350 struct mailbox_list_iterate_context *iter = |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
351 mailbox_list_iter_init_namespaces(user->namespaces, |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
352 patterns, |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
353 MAIL_NAMESPACE_TYPE_PRIVATE, |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
354 MAILBOX_LIST_ITER_SKIP_ALIASES | |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
355 MAILBOX_LIST_ITER_NO_AUTO_BOXES | |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
356 MAILBOX_LIST_ITER_RETURN_NO_FLAGS); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
357 while((info = mailbox_list_iter_next(iter)) != NULL) { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
358 if ((info->flags & MAILBOX_NOSELECT) != 0 || |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
359 (info->flags & MAILBOX_NONEXISTENT) != 0) continue; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
360 struct dcrypt_keypair pair; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
361 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
362 struct mailbox *box = |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
363 mailbox_alloc(info->ns->list, |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
364 info->vname, 0); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
365 if (mailbox_open(box) < 0) { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
366 res = array_append_space(result); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
367 res->name = p_strdup(_ctx->pool, info->vname); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
368 res->success = FALSE; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
369 res->error = p_strdup(_ctx->pool, |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
370 mailbox_get_last_error(box, NULL)); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
371 } 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
|
372 &pair, &pubid, |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
373 &error)) < 0) { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
374 res = array_append_space(result); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
375 res->name = p_strdup(_ctx->pool, info->vname); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
376 res->success = FALSE; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
377 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
|
378 } else if (ret == 0) { |
d732ab1b584c
doveadm-mail-crypt: Skip existing keys properly
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21233
diff
changeset
|
379 /* 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
|
380 force wasn't used, skip */ |
d732ab1b584c
doveadm-mail-crypt: Skip existing keys properly
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21233
diff
changeset
|
381 } else if (ret > 0) { |
21233
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
382 res = array_append_space(result); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
383 res->name = p_strdup(_ctx->pool, info->vname); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
384 res->success = TRUE; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
385 res->id = pubid; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
386 T_BEGIN { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
387 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
|
388 } T_END; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
389 dcrypt_keypair_unref(&pair); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
390 } |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
391 mailbox_free(&box); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
392 } |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
393 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
394 (void)mailbox_list_iter_deinit(&iter); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
395 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
396 dcrypt_key_unref_public(&user_key); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
397 return 0; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
398 } |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
399 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
400 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
|
401 struct mail_user *user) |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
402 { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
403 int ret = 0; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
404 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
405 ARRAY_TYPE(generated_keys) result; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
406 p_array_init(&result, _ctx->pool, 8); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
407 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
408 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
|
409 _ctx->exit_code = EX_DATAERR; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
410 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
411 doveadm_print_init(DOVEADM_PRINT_TYPE_TABLE); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
412 doveadm_print_header("success", " ", 0); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
413 doveadm_print_header("box", "Folder", 0); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
414 doveadm_print_header("pubid", "Public ID", 0); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
415 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
416 const struct generated_key *res; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
417 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
418 array_foreach(&result, res) { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
419 if (res->success) |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
420 doveadm_print("\xE2\x9C\x93"); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
421 else { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
422 ret = -1; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
423 doveadm_print("x"); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
424 } |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
425 doveadm_print(res->name); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
426 if (!res->success) |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
427 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
|
428 else |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
429 doveadm_print(res->id); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
430 } |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
431 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
432 return ret; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
433 } |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
434 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
435 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
|
436 struct mail_user *user, |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
437 void(*callback)(const struct generated_key *, void *), |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
438 void *context) |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
439 { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
440 const char *error; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
441 int ret; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
442 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
443 /* 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
|
444 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
|
445 */ |
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 ARRAY_TYPE(const_string) ids; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
448 t_array_init(&ids, 8); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
449 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
450 if (ctx->userkey_only) { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
451 struct mailbox_attribute_iter *iter; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
452 struct mail_namespace *ns = |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
453 mail_namespace_find_inbox(user->namespaces); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
454 struct mailbox *box = |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
455 mailbox_alloc(ns->list, "INBOX", MAILBOX_FLAG_READONLY); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
456 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
|
457 i_zero(&value); |
21233
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
458 if (mailbox_open(box) < 0) { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
459 i_error("mailbox_open(%s) failed: %s", |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
460 mailbox_get_vname(box), |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
461 mailbox_get_last_error(box, NULL)); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
462 mailbox_free(&box); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
463 return; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
464 } |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
465 struct mailbox_transaction_context *t = |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
466 mailbox_transaction_begin(box, 0); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
467 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
468 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
|
469 USER_CRYPT_PREFIX |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
470 ACTIVE_KEY_NAME, |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
471 &value)) < 0) { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
472 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
|
473 mailbox_get_vname(box), |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
474 USER_CRYPT_PREFIX ACTIVE_KEY_NAME, |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
475 mailbox_get_last_error(box, NULL)); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
476 } |
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 iter = mailbox_attribute_iter_init(box, |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
479 MAIL_ATTRIBUTE_TYPE_PRIVATE, |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
480 USER_CRYPT_PREFIX |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
481 PRIVKEYS_PREFIX); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
482 const char *key_id; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
483 if (value.value == NULL) |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
484 value.value = "<NO ACTIVE KEY>"; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
485 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
|
486 struct generated_key key; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
487 key.id = key_id; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
488 key.active = strcmp(value.value, key_id) == 0; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
489 key.name = ""; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
490 key.box = box; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
491 callback(&key, context); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
492 } |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
493 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
494 if (mailbox_attribute_iter_deinit(&iter) < 0) |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
495 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
|
496 mailbox_get_vname(box), |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
497 mailbox_get_last_error(box, NULL)); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
498 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
499 (void)mailbox_transaction_commit(&t); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
500 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
501 mailbox_free(&box); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
502 return; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
503 } |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
504 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
505 const struct mailbox_info *info; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
506 struct mailbox_list_iterate_context *iter = |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
507 mailbox_list_iter_init_namespaces(user->namespaces, |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
508 ctx->ctx.args, |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
509 MAIL_NAMESPACE_TYPE_PRIVATE, |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
510 MAILBOX_LIST_ITER_SKIP_ALIASES | |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
511 MAILBOX_LIST_ITER_NO_AUTO_BOXES | |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
512 MAILBOX_LIST_ITER_RETURN_NO_FLAGS); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
513 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
514 while((info = mailbox_list_iter_next(iter)) != NULL) { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
515 if ((info->flags & MAILBOX_NOSELECT) != 0 || |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
516 (info->flags & MAILBOX_NONEXISTENT) != 0) continue; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
517 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
518 struct mailbox *box = |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
519 mailbox_alloc(info->ns->list, |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
520 info->vname, MAILBOX_FLAG_READONLY); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
521 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
522 if (mailbox_open(box) < 0) { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
523 i_error("mailbox_open(%s) failed: %s", |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
524 mailbox_get_vname(box), |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
525 mailbox_get_last_error(box, NULL)); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
526 mailbox_free(&box); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
527 continue; |
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 struct mailbox_transaction_context *t = |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
530 mailbox_transaction_begin(box, 0); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
531 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
532 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
|
533 i_zero(&value); |
21233
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
534 array_clear(&ids); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
535 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
536 /* get active ID */ |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
537 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
|
538 BOX_CRYPT_PREFIX |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
539 ACTIVE_KEY_NAME, |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
540 &value)) < 0) { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
541 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
|
542 mailbox_get_vname(box), |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
543 BOX_CRYPT_PREFIX ACTIVE_KEY_NAME, |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
544 mailbox_get_last_error(box, NULL)); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
545 } 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
|
546 MAIL_ATTRIBUTE_TYPE_PRIVATE, |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
547 &ids, &error)) < 0) { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
548 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
|
549 mailbox_get_vname(box), |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
550 error); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
551 } else { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
552 const char *const *id; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
553 const char *boxname = mailbox_get_vname(box); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
554 if (value.value == NULL) |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
555 value.value = "<NO ACTIVE KEY>"; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
556 array_foreach(&ids, id) { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
557 struct generated_key key; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
558 key.name = boxname; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
559 key.id = *id; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
560 if (value.value != NULL) |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
561 key.active = strcmp(*id, value.value) == 0; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
562 else |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
563 key.active = FALSE; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
564 key.box = box; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
565 callback(&key, context); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
566 } |
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 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
569 (void)mailbox_transaction_commit(&t); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
570 mailbox_free(&box); |
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 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
573 (void)mailbox_list_iter_deinit(&iter); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
574 } |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
575 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
576 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
|
577 { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
578 struct mcp_key_iter_ctx *ctx = context; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
579 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
|
580 key->name = p_strdup(ctx->pool, _key->name); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
581 key->id = p_strdup(ctx->pool, _key->id); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
582 key->active = _key->active; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
583 } |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
584 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
585 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
|
586 struct mail_user *user) |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
587 { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
588 struct mcp_cmd_context *ctx = |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
589 (struct mcp_cmd_context *)_ctx; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
590 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
|
591 i_zero(&iter_ctx); |
21233
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
592 iter_ctx.pool = _ctx->pool; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
593 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
|
594 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
595 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
|
596 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
597 doveadm_print_init(DOVEADM_PRINT_TYPE_TABLE); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
598 doveadm_print_header("box", "Folder", 0); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
599 doveadm_print_header("active", "Active", 0); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
600 doveadm_print_header("pubid", "Public ID", 0); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
601 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
602 const struct generated_key *key; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
603 array_foreach(&iter_ctx.keys, key) { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
604 doveadm_print(key->name); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
605 doveadm_print(key->active ? "yes" : "no"); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
606 doveadm_print(key->id); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
607 } |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
608 return 0; |
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 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
611 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
|
612 void *context ATTR_UNUSED) |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
613 { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
614 struct dcrypt_private_key *pkey; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
615 bool user_key = FALSE; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
616 const char *error = NULL; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
617 int ret; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
618 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
619 if (*key->name == '\0') |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
620 user_key = TRUE; |
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 doveadm_print(key->name); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
623 doveadm_print(key->id); |
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 mailbox_transaction_context *t = |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
626 mailbox_transaction_begin(key->box, 0); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
627 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
628 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
|
629 &pkey, &error)) <= 0) { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
630 if (ret == 0) |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
631 error = "key not found"; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
632 doveadm_print(t_strdup_printf("ERROR: %s", error)); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
633 doveadm_print(""); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
634 } else { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
635 string_t *out = t_str_new(64); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
636 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
|
637 NULL, NULL, &error)) { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
638 doveadm_print(t_strdup_printf("ERROR: %s", error)); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
639 doveadm_print(""); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
640 } else { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
641 /* 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
|
642 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
|
643 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
|
644 } |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
645 dcrypt_key_unref_private(&pkey); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
646 } |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
647 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
648 (void)mailbox_transaction_commit(&t); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
649 } |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
650 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
651 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
|
652 struct mail_user *user) |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
653 { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
654 struct mcp_cmd_context *ctx = |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
655 (struct mcp_cmd_context *)_ctx; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
656 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
657 doveadm_print_init(DOVEADM_PRINT_TYPE_PAGER); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
658 doveadm_print_header("box", "Folder", 0); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
659 doveadm_print_header("name", "Public ID", 0); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
660 doveadm_print_header("error", "Error", 0); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
661 doveadm_print_header("key", "Key", 0); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
662 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
663 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
|
664 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
665 return 0; |
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 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
668 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
|
669 struct mail_user *user) |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
670 { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
671 struct mcp_cmd_context *ctx = |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
672 (struct mcp_cmd_context *)_ctx; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
673 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
674 struct raw_key { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
675 const char *attr; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
676 const char *id; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
677 const char *data; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
678 }; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
679 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
680 ARRAY(struct raw_key) raw_keys; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
681 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
682 doveadm_print_init(DOVEADM_PRINT_TYPE_PAGER); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
683 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
684 doveadm_print_header_simple("result"); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
685 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
686 if (ctx->ask_old_password) { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
687 if (ctx->old_password != NULL) { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
688 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
|
689 _ctx->exit_code = EX_USAGE; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
690 return -1; |
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 if (!_ctx->cli) { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
693 doveadm_print("No cli - cannot ask for password"); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
694 _ctx->exit_code = EX_USAGE; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
695 return -1; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
696 } |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
697 ctx->old_password = |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
698 p_strdup(_ctx->pool, t_askpass("Old password: ")); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
699 } |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
700 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
701 if (ctx->ask_new_password) { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
702 if (ctx->new_password != NULL) { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
703 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
|
704 _ctx->exit_code = EX_USAGE; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
705 return -1; |
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 if (!_ctx->cli) { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
708 doveadm_print("No cli - cannot ask for password"); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
709 _ctx->exit_code = EX_USAGE; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
710 return -1; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
711 } |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
712 ctx->new_password = |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
713 p_strdup(_ctx->pool, t_askpass("New password: ")); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
714 } |
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 if (ctx->clear_password && |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
717 (ctx->new_password != NULL || |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
718 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
|
719 doveadm_print("clear password and new password specified"); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
720 _ctx->exit_code = EX_USAGE; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
721 return -1; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
722 } |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
723 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
724 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
|
725 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
|
726 if (mailbox_open(box) < 0) { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
727 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
|
728 mailbox_get_vname(box), |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
729 mailbox_get_last_error(box, NULL))); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
730 _ctx->exit_code = EX_TEMPFAIL; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
731 return -1; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
732 } |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
733 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
734 struct mailbox_transaction_context *t = |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
735 mailbox_transaction_begin(box, 0); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
736 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
737 t_array_init(&raw_keys, 8); |
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 /* 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
|
740 struct mailbox_attribute_iter *iter = |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
741 mailbox_attribute_iter_init(box, |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
742 MAIL_ATTRIBUTE_TYPE_PRIVATE, |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
743 USER_CRYPT_PREFIX |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
744 PRIVKEYS_PREFIX); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
745 const char *error; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
746 const char *key_id; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
747 int ret = 1; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
748 unsigned int count = 0; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
749 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
750 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
|
751 const char *attr = |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
752 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
|
753 key_id); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
754 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
755 struct mail_attribute_value value; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
756 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
|
757 attr, &value)) < 0) { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
758 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
|
759 mailbox_get_vname(box), attr, |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
760 mailbox_get_last_error(box, NULL))); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
761 _ctx->exit_code = EX_TEMPFAIL; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
762 break; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
763 } else if (ret > 0) { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
764 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
|
765 raw_key->attr = p_strdup(_ctx->pool, attr); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
766 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
|
767 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
|
768 } |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
769 } |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
770 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
771 if (ret == 1) { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
772 struct dcrypt_private_key *key; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
773 const struct raw_key *raw_key; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
774 const char *algo = ctx->new_password != NULL ? |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
775 MAIL_CRYPT_PW_CIPHER : |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
776 NULL; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
777 string_t *newkey = t_str_new(256); |
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 array_foreach(&raw_keys, raw_key) { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
780 struct mail_attribute_value value; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
781 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
782 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
|
783 ctx->old_password, NULL, |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
784 &error)) { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
785 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
|
786 raw_key->id, |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
787 error)); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
788 _ctx->exit_code = EX_DATAERR; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
789 ret = -1; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
790 break; |
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 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
793 /* save it */ |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
794 str_truncate(newkey, 0); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
795 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
796 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
|
797 algo, newkey, |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
798 ctx->new_password, |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
799 NULL, &error)) { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
800 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
|
801 raw_key->id, |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
802 error)); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
803 _ctx->exit_code = EX_DATAERR; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
804 ret = -1; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
805 } |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
806 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
807 dcrypt_key_unref_private(&key); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
808 if (ret == -1) break; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
809 |
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
|
810 i_zero(&value); |
21233
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
811 value.value = str_c(newkey); |
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 /* and store it */ |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
814 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
|
815 raw_key->attr, &value) < 0) { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
816 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
|
817 mailbox_get_vname(box), |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
818 raw_key->attr, |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
819 mailbox_get_last_error(box, NULL))); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
820 _ctx->exit_code = EX_TEMPFAIL; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
821 ret = -1; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
822 break; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
823 } |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
824 count++; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
825 } |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
826 } |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
827 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
828 if (ret < 1) { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
829 mailbox_transaction_rollback(&t); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
830 } else { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
831 if (mailbox_transaction_commit(&t) < 0) { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
832 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
|
833 mailbox_get_vname(box), |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
834 mailbox_get_last_error(box, NULL))); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
835 } else { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
836 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
|
837 count)); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
838 } |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
839 } |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
840 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
841 (void)mailbox_attribute_iter_deinit(&iter); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
842 mailbox_free(&box); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
843 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
844 return ret; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
845 } |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
846 |
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 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
|
849 { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
850 struct mcp_cmd_context *ctx = |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
851 (struct mcp_cmd_context *)_ctx; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
852 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
853 switch (c) { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
854 case 'U': |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
855 ctx->userkey_only = TRUE; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
856 break; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
857 case 'R': |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
858 ctx->recrypt_box_keys = TRUE; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
859 break; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
860 case 'f': |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
861 ctx->force = TRUE; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
862 default: |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
863 return FALSE; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
864 } |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
865 return TRUE; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
866 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
867 } |
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 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
|
870 { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
871 struct mcp_cmd_context *ctx = |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
872 (struct mcp_cmd_context *)_ctx; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
873 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
874 switch (c) { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
875 case 'N': |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
876 ctx->ask_new_password = TRUE; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
877 break; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
878 case 'O': |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
879 ctx->ask_old_password = TRUE; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
880 break; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
881 case 'C': |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
882 ctx->clear_password = TRUE; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
883 break; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
884 case 'o': |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
885 ctx->old_password = p_strdup(_ctx->pool, optarg); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
886 break; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
887 case 'n': |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
888 ctx->new_password = p_strdup(_ctx->pool, optarg); |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
889 break; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
890 default: |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
891 return FALSE; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
892 } |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
893 return TRUE; |
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 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
896 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
|
897 { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
898 struct mcp_cmd_context *ctx = |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
899 (struct mcp_cmd_context *)_ctx; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
900 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
901 switch (c) { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
902 case 'U': |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
903 ctx->userkey_only = TRUE; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
904 break; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
905 default: |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
906 return FALSE; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
907 } |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
908 return TRUE; |
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 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
912 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
|
913 { |
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 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
|
917 ctx->ctx.getopt_args = "URf"; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
918 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
|
919 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
|
920 return &ctx->ctx; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
921 } |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
922 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
923 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
|
924 { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
925 struct mcp_cmd_context *ctx; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
926 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
927 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
|
928 ctx->ctx.getopt_args = "U"; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
929 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
|
930 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
|
931 return &ctx->ctx; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
932 } |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
933 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
934 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
|
935 { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
936 struct mcp_cmd_context *ctx; |
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 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
|
939 ctx->ctx.getopt_args = "U"; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
940 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
|
941 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
|
942 return &ctx->ctx; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
943 } |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
944 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
945 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
|
946 { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
947 struct mcp_cmd_context *ctx; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
948 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
949 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
|
950 ctx->ctx.getopt_args = "NOCo:n:"; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
951 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
|
952 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
|
953 return &ctx->ctx; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
954 } |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
955 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
956 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
|
957 .name = "mailbox cryptokey generate", |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
958 .mail_cmd = cmd_mcp_keypair_generate_alloc, |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
959 .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
|
960 DOVEADM_CMD_PARAMS_START |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
961 DOVEADM_CMD_MAIL_COMMON |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
962 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
|
963 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
|
964 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
|
965 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
|
966 DOVEADM_CMD_PARAMS_END |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
967 }; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
968 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
969 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
|
970 .name = "mailbox cryptokey list", |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
971 .mail_cmd = cmd_mcp_key_list_alloc, |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
972 .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
|
973 DOVEADM_CMD_PARAMS_START |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
974 DOVEADM_CMD_MAIL_COMMON |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
975 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
|
976 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
|
977 DOVEADM_CMD_PARAMS_END |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
978 }; |
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 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
|
981 .name = "mailbox cryptokey export", |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
982 .mail_cmd = cmd_mcp_key_export_alloc, |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
983 .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
|
984 DOVEADM_CMD_PARAMS_START |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
985 DOVEADM_CMD_MAIL_COMMON |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
986 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
|
987 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
|
988 DOVEADM_CMD_PARAMS_END |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
989 }; |
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 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
|
992 .name = "mailbox cryptokey password", |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
993 .mail_cmd = cmd_mcp_key_password_alloc, |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
994 .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
|
995 DOVEADM_CMD_PARAMS_START |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
996 DOVEADM_CMD_MAIL_COMMON |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
997 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
|
998 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
|
999 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
|
1000 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
|
1001 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
|
1002 DOVEADM_CMD_PARAMS_END |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
1003 }; |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
1004 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
1005 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
|
1006 { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
1007 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
|
1008 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
|
1009 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
|
1010 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
|
1011 } |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
1012 |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
1013 void doveadm_mail_crypt_plugin_deinit(void) |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
1014 { |
fa9a9c236232
mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
1015 } |