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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
21390
2e2563132d5f Updated copyright notices to include the year 2017.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21389
diff changeset
1 /* Copyright (c) 2015-2017 Dovecot authors, see the included COPYING file */
21233
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
2
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
3 #include "lib.h"
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
4 #include "askpass.h"
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
5 #include "doveadm-mail.h"
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
6 #include "getopt.h"
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
7 #include "array.h"
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
8 #include "str.h"
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
9 #include "buffer.h"
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
10 #include "ioloop.h"
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
11 #include "ioloop-private.h"
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
12 #include "mail-namespace.h"
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
13 #include "mail-storage.h"
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
14 #include "mail-storage-settings.h"
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
15 #include "mailbox-attribute.h"
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
16 #include "mail-crypt-common.h"
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
17 #include "mail-crypt-key.h"
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
18 #include "mailbox-list-iter.h"
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
19 #include "doveadm-print.h"
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
20 #include "hex-binary.h"
fa9a9c236232 mail-crypt: Add mail-crypt plugin
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
21
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 }