7
7
#include "str-sanitize.h"
8
#include "mail-storage.h"
9
#include "commands-util.h"
8
#include "imap-resp-code.h"
10
9
#include "imap-parser.h"
11
10
#include "imap-sync.h"
12
11
#include "imap-util.h"
12
#include "mail-storage.h"
13
13
#include "mail-namespace.h"
14
#include "commands-util.h"
15
16
/* Maximum length for mailbox name, including it's path. This isn't fully
16
17
exact since the user can create folder hierarchy with small names, then
37
38
struct mail_namespace *ns;
40
if (!client_verify_mailbox_name(cmd, *mailbox,
41
CLIENT_VERIFY_MAILBOX_NAME))
39
44
ns = client_find_namespace(cmd, mailbox);
40
return ns == NULL ? NULL : ns->storage;
43
51
bool client_verify_mailbox_name(struct client_command_context *cmd,
44
52
const char *mailbox,
45
bool should_exist, bool should_not_exist)
53
enum client_verify_mailbox_mode mode)
47
55
struct mail_namespace *ns;
48
56
struct mailbox_list *list;
49
57
enum mailbox_name_status mailbox_status;
50
const char *orig_mailbox, *p;
58
const char *orig_mailbox, *p, *resp_code;
52
60
orig_mailbox = mailbox;
53
61
ns = client_find_namespace(cmd, &mailbox);
91
99
/* check what our storage thinks of it */
92
100
list = mail_storage_get_list(ns->storage);
93
if (mailbox_list_get_mailbox_name_status(list, mailbox,
94
&mailbox_status) < 0) {
95
client_send_storage_error(cmd, ns->storage);
101
if (mode == CLIENT_VERIFY_MAILBOX_NAME) {
103
mailbox_list_is_valid_existing_name(list, mailbox) ?
104
MAILBOX_NAME_VALID : MAILBOX_NAME_INVALID;
105
} else if (mailbox_list_get_mailbox_name_status(list, mailbox,
106
&mailbox_status) < 0) {
107
client_send_list_error(cmd, list);
99
111
switch (mailbox_status) {
100
112
case MAILBOX_NAME_EXISTS:
101
if (should_exist || !should_not_exist)
104
client_send_tagline(cmd, "NO Mailbox exists.");
114
case CLIENT_VERIFY_MAILBOX_NAME:
115
case CLIENT_VERIFY_MAILBOX_SHOULD_EXIST:
116
case CLIENT_VERIFY_MAILBOX_SHOULD_EXIST_TRYCREATE:
118
case CLIENT_VERIFY_MAILBOX_SHOULD_NOT_EXIST:
122
if (mode == CLIENT_VERIFY_MAILBOX_NAME ||
123
mode == CLIENT_VERIFY_MAILBOX_SHOULD_EXIST)
126
client_send_tagline(cmd, t_strconcat(
127
"NO [", IMAP_RESP_CODE_ALREADYEXISTS,
128
"] Mailbox exists.", NULL));
107
131
case MAILBOX_NAME_VALID:
133
case CLIENT_VERIFY_MAILBOX_NAME:
134
case CLIENT_VERIFY_MAILBOX_SHOULD_NOT_EXIST:
136
case CLIENT_VERIFY_MAILBOX_SHOULD_EXIST:
137
resp_code = IMAP_RESP_CODE_NONEXISTENT;
139
case CLIENT_VERIFY_MAILBOX_SHOULD_EXIST_TRYCREATE:
140
resp_code = "TRYCREATE";
111
147
client_send_tagline(cmd, t_strconcat(
112
"NO [TRYCREATE] Mailbox doesn't exist: ",
148
"NO [", resp_code, "] Mailbox doesn't exist: ",
113
149
str_sanitize(orig_mailbox, MAILBOX_MAX_NAME_LEN),
183
get_error_string(const char *error_string, enum mail_error error)
185
const char *resp_code = NULL;
188
case MAIL_ERROR_NONE:
190
case MAIL_ERROR_TEMP:
191
resp_code = IMAP_RESP_CODE_SERVERBUG;
193
case MAIL_ERROR_NOTPOSSIBLE:
194
case MAIL_ERROR_PARAMS:
195
resp_code = IMAP_RESP_CODE_CANNOT;
197
case MAIL_ERROR_PERM:
198
resp_code = IMAP_RESP_CODE_NOPERM;
200
case MAIL_ERROR_NOSPACE:
201
resp_code = IMAP_RESP_CODE_OVERQUOTA;
203
case MAIL_ERROR_NOTFOUND:
204
resp_code = IMAP_RESP_CODE_NONEXISTENT;
206
case MAIL_ERROR_EXISTS:
207
resp_code = IMAP_RESP_CODE_ALREADYEXISTS;
209
case MAIL_ERROR_EXPUNGED:
210
resp_code = IMAP_RESP_CODE_EXPUNGEISSUED;
212
case MAIL_ERROR_INUSE:
213
resp_code = IMAP_RESP_CODE_INUSE;
216
if (resp_code == NULL || *error_string == '[')
217
return t_strconcat("NO ", error_string, NULL);
219
return t_strdup_printf("NO [%s] %s", resp_code, error_string);
146
222
void client_send_list_error(struct client_command_context *cmd,
147
223
struct mailbox_list *list)
150
226
enum mail_error error;
152
228
error_string = mailbox_list_get_last_error(list, &error);
153
client_send_tagline(cmd, t_strconcat("NO ", error_string, NULL));
229
client_send_tagline(cmd, get_error_string(error_string, error));
156
232
void client_send_storage_error(struct client_command_context *cmd,
170
246
error_string = mail_storage_get_last_error(storage, &error);
171
client_send_tagline(cmd, t_strconcat("NO ", error_string, NULL));
247
client_send_tagline(cmd, get_error_string(error_string, error));
174
250
void client_send_untagged_storage_error(struct client *client,
321
397
return array_idx(dest, 0);
324
bool mailbox_equals(struct mailbox *box1, struct mail_storage *storage2,
400
bool mailbox_equals(const struct mailbox *box1,
401
const struct mail_storage *storage2, const char *name2)
327
403
struct mail_storage *storage1 = mailbox_get_storage(box1);
328
404
const char *name1;