Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/imap/cmd-list.c @ 9276:13fa572535f0 HEAD
Allow namespace prefix to be opened as mailbox, if it already exists.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sun, 02 Aug 2009 23:01:04 -0400 |
parents | db2fdf3529ac |
children | a0fa514d92f0 |
rev | line source |
---|---|
8590
b9faf4db2a9f
Updated copyright notices to include year 2009.
Timo Sirainen <tss@iki.fi>
parents:
8461
diff
changeset
|
1 /* Copyright (c) 2002-2009 Dovecot authors, see the included COPYING file */ |
0 | 2 |
3 #include "common.h" | |
5811
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
4 #include "array.h" |
1329
ae229b7acb4c
Mailbox names are now sent through imap-quoter instead of just escaping it.
Timo Sirainen <tss@iki.fi>
parents:
1310
diff
changeset
|
5 #include "str.h" |
896
21ffcce83c70
Rewrote rfc822-tokenize.c to work one token at a time so it won't uselessly
Timo Sirainen <tss@iki.fi>
parents:
886
diff
changeset
|
6 #include "strescape.h" |
1329
ae229b7acb4c
Mailbox names are now sent through imap-quoter instead of just escaping it.
Timo Sirainen <tss@iki.fi>
parents:
1310
diff
changeset
|
7 #include "imap-quote.h" |
1218
a70ebd3a59e2
Removed list-sort workarounds. It's pretty much needed for maildir listing.
Timo Sirainen <tss@iki.fi>
parents:
1198
diff
changeset
|
8 #include "imap-match.h" |
6018
b148e4c41aa7
Added X-STATUS (..) return option to send STATUS replies to client for
Timo Sirainen <tss@iki.fi>
parents:
6017
diff
changeset
|
9 #include "imap-status.h" |
0 | 10 #include "commands.h" |
5500
4862cb37106c
Moved namespace handling to lib-storage. Beginnings of namespace support for
Timo Sirainen <tss@iki.fi>
parents:
5438
diff
changeset
|
11 #include "mail-namespace.h" |
0 | 12 |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
13 struct cmd_list_context { |
5811
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
14 struct client_command_context *cmd; |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
15 const char *ref; |
6007
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
16 const char *const *patterns; |
6496 | 17 enum mailbox_list_iter_flags list_flags; |
6018
b148e4c41aa7
Added X-STATUS (..) return option to send STATUS replies to client for
Timo Sirainen <tss@iki.fi>
parents:
6017
diff
changeset
|
18 enum mailbox_status_items status_items; |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
19 |
5500
4862cb37106c
Moved namespace handling to lib-storage. Beginnings of namespace support for
Timo Sirainen <tss@iki.fi>
parents:
5438
diff
changeset
|
20 struct mail_namespace *ns; |
4808
93bc9770f938
Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
4729
diff
changeset
|
21 struct mailbox_list_iterate_context *list_iter; |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
22 |
5811
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
23 ARRAY_DEFINE(ns_prefixes_listed, struct mail_namespace *); |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
24 |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
25 unsigned int lsub:1; |
6009
62f92a68fc72
LSUB: If pattern doesn't end with %, don't show extra unsubscribed mailboxes
Timo Sirainen <tss@iki.fi>
parents:
6007
diff
changeset
|
26 unsigned int lsub_no_unsubscribed:1; |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
27 unsigned int inbox_found:1; |
5811
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
28 unsigned int seen_inbox_namespace:1; |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
29 unsigned int cur_ns_match_inbox:1; |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
30 unsigned int cur_ns_send_prefix:1; |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
31 unsigned int cur_ns_skip_trailing_sep:1; |
5829
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
32 unsigned int used_listext:1; |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
33 }; |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
34 |
5314
ce59b45431fb
Use less memory when listing lots of mailboxes
Timo Sirainen <tss@iki.fi>
parents:
5307
diff
changeset
|
35 static void |
5829
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
36 mailbox_flags2str(struct cmd_list_context *ctx, string_t *str, |
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
37 enum mailbox_info_flags flags) |
0 | 38 { |
5339
469799904802
Last change caused LIST replies to have extra spaces
Timo Sirainen <tss@iki.fi>
parents:
5314
diff
changeset
|
39 unsigned int orig_len = str_len(str); |
469799904802
Last change caused LIST replies to have extra spaces
Timo Sirainen <tss@iki.fi>
parents:
5314
diff
changeset
|
40 |
5829
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
41 if ((flags & MAILBOX_NONEXISTENT) != 0 && !ctx->used_listext) { |
1244
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
42 flags |= MAILBOX_NOSELECT; |
1895
bbdce1697239
LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents:
1890
diff
changeset
|
43 flags &= ~MAILBOX_NONEXISTENT; |
bbdce1697239
LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents:
1890
diff
changeset
|
44 } |
1218
a70ebd3a59e2
Removed list-sort workarounds. It's pretty much needed for maildir listing.
Timo Sirainen <tss@iki.fi>
parents:
1198
diff
changeset
|
45 |
5829
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
46 if ((ctx->list_flags & MAILBOX_LIST_ITER_RETURN_CHILDREN) == 0) |
1748
588326f1cd84
If LISTEXT is used and CHILDREN info isn't wanted, don't send it.
Timo Sirainen <tss@iki.fi>
parents:
1657
diff
changeset
|
47 flags &= ~(MAILBOX_CHILDREN|MAILBOX_NOCHILDREN); |
588326f1cd84
If LISTEXT is used and CHILDREN info isn't wanted, don't send it.
Timo Sirainen <tss@iki.fi>
parents:
1657
diff
changeset
|
48 |
5829
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
49 if ((flags & MAILBOX_SUBSCRIBED) != 0 && |
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
50 (ctx->list_flags & MAILBOX_LIST_ITER_RETURN_SUBSCRIBED) != 0) |
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
51 str_append(str, "\\Subscribed "); |
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
52 |
5834 | 53 if ((flags & MAILBOX_CHILD_SUBSCRIBED) != 0 && |
54 (flags & MAILBOX_SUBSCRIBED) == 0 && !ctx->used_listext) { | |
5829
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
55 /* LSUB uses \Noselect for this */ |
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
56 flags |= MAILBOX_NOSELECT; |
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
57 } |
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
58 |
5314
ce59b45431fb
Use less memory when listing lots of mailboxes
Timo Sirainen <tss@iki.fi>
parents:
5307
diff
changeset
|
59 if ((flags & MAILBOX_NOSELECT) != 0) |
5339
469799904802
Last change caused LIST replies to have extra spaces
Timo Sirainen <tss@iki.fi>
parents:
5314
diff
changeset
|
60 str_append(str, "\\Noselect "); |
5314
ce59b45431fb
Use less memory when listing lots of mailboxes
Timo Sirainen <tss@iki.fi>
parents:
5307
diff
changeset
|
61 if ((flags & MAILBOX_NONEXISTENT) != 0) |
5339
469799904802
Last change caused LIST replies to have extra spaces
Timo Sirainen <tss@iki.fi>
parents:
5314
diff
changeset
|
62 str_append(str, "\\NonExistent "); |
5829
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
63 |
5314
ce59b45431fb
Use less memory when listing lots of mailboxes
Timo Sirainen <tss@iki.fi>
parents:
5307
diff
changeset
|
64 if ((flags & MAILBOX_CHILDREN) != 0) |
5339
469799904802
Last change caused LIST replies to have extra spaces
Timo Sirainen <tss@iki.fi>
parents:
5314
diff
changeset
|
65 str_append(str, "\\HasChildren "); |
5829
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
66 else if ((flags & MAILBOX_NOINFERIORS) != 0) |
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
67 str_append(str, "\\NoInferiors "); |
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
68 else if ((flags & MAILBOX_NOCHILDREN) != 0) |
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
69 str_append(str, "\\HasNoChildren "); |
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
70 |
5314
ce59b45431fb
Use less memory when listing lots of mailboxes
Timo Sirainen <tss@iki.fi>
parents:
5307
diff
changeset
|
71 if ((flags & MAILBOX_MARKED) != 0) |
5339
469799904802
Last change caused LIST replies to have extra spaces
Timo Sirainen <tss@iki.fi>
parents:
5314
diff
changeset
|
72 str_append(str, "\\Marked "); |
5314
ce59b45431fb
Use less memory when listing lots of mailboxes
Timo Sirainen <tss@iki.fi>
parents:
5307
diff
changeset
|
73 if ((flags & MAILBOX_UNMARKED) != 0) |
5339
469799904802
Last change caused LIST replies to have extra spaces
Timo Sirainen <tss@iki.fi>
parents:
5314
diff
changeset
|
74 str_append(str, "\\UnMarked "); |
469799904802
Last change caused LIST replies to have extra spaces
Timo Sirainen <tss@iki.fi>
parents:
5314
diff
changeset
|
75 |
469799904802
Last change caused LIST replies to have extra spaces
Timo Sirainen <tss@iki.fi>
parents:
5314
diff
changeset
|
76 if (str_len(str) != orig_len) |
469799904802
Last change caused LIST replies to have extra spaces
Timo Sirainen <tss@iki.fi>
parents:
5314
diff
changeset
|
77 str_truncate(str, str_len(str)-1); |
0 | 78 } |
79 | |
5829
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
80 static void |
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
81 mailbox_childinfo2str(struct cmd_list_context *ctx, string_t *str, |
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
82 enum mailbox_info_flags flags) |
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
83 { |
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
84 if (!ctx->used_listext) |
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
85 return; |
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
86 |
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
87 if ((flags & MAILBOX_CHILD_SUBSCRIBED) != 0) |
7531
0cd3db11a42f
LIST-EXTENDED: CHILDINFO shouldn't be quoted.
Timo Sirainen <tss@iki.fi>
parents:
7492
diff
changeset
|
88 str_append(str, " (CHILDINFO (\"SUBSCRIBED\"))"); |
5829
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
89 } |
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
90 |
3863
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3856
diff
changeset
|
91 static bool |
6017 | 92 parse_select_flags(struct cmd_list_context *ctx, const struct imap_arg *args) |
5829
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
93 { |
6496 | 94 enum mailbox_list_iter_flags list_flags = 0; |
5829
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
95 const char *atom; |
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
96 |
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
97 while (args->type != IMAP_ARG_EOL) { |
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
98 if (args->type != IMAP_ARG_ATOM) { |
6017 | 99 client_send_command_error(ctx->cmd, |
5829
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
100 "List options contains non-atoms."); |
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
101 return FALSE; |
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
102 } |
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
103 |
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
104 atom = IMAP_ARG_STR(args); |
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
105 |
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
106 if (strcasecmp(atom, "SUBSCRIBED") == 0) { |
6017 | 107 list_flags |= MAILBOX_LIST_ITER_SELECT_SUBSCRIBED | |
5829
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
108 MAILBOX_LIST_ITER_RETURN_SUBSCRIBED; |
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
109 } else if (strcasecmp(atom, "RECURSIVEMATCH") == 0) |
6017 | 110 list_flags |= MAILBOX_LIST_ITER_SELECT_RECURSIVEMATCH; |
6856
a249d916f6e6
If client tries to use unknown list-extended options, fail with BAD.
Timo Sirainen <tss@iki.fi>
parents:
6639
diff
changeset
|
111 else if (strcasecmp(atom, "REMOTE") == 0) { |
a249d916f6e6
If client tries to use unknown list-extended options, fail with BAD.
Timo Sirainen <tss@iki.fi>
parents:
6639
diff
changeset
|
112 /* not supported, ignore */ |
a249d916f6e6
If client tries to use unknown list-extended options, fail with BAD.
Timo Sirainen <tss@iki.fi>
parents:
6639
diff
changeset
|
113 } else { |
5832
1d91d36e14a4
Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents:
5829
diff
changeset
|
114 /* skip also optional list value */ |
6856
a249d916f6e6
If client tries to use unknown list-extended options, fail with BAD.
Timo Sirainen <tss@iki.fi>
parents:
6639
diff
changeset
|
115 client_send_command_error(ctx->cmd, |
a249d916f6e6
If client tries to use unknown list-extended options, fail with BAD.
Timo Sirainen <tss@iki.fi>
parents:
6639
diff
changeset
|
116 "Unknown select options"); |
a249d916f6e6
If client tries to use unknown list-extended options, fail with BAD.
Timo Sirainen <tss@iki.fi>
parents:
6639
diff
changeset
|
117 return FALSE; |
5832
1d91d36e14a4
Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents:
5829
diff
changeset
|
118 } |
5829
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
119 args++; |
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
120 } |
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
121 |
6017 | 122 if ((list_flags & MAILBOX_LIST_ITER_SELECT_RECURSIVEMATCH) != 0 && |
123 (list_flags & MAILBOX_LIST_ITER_SELECT_SUBSCRIBED) == 0) { | |
124 client_send_command_error(ctx->cmd, | |
5829
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
125 "RECURSIVEMATCH must not be the only selection."); |
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
126 return FALSE; |
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
127 } |
6017 | 128 |
129 ctx->list_flags = list_flags; | |
5829
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
130 return TRUE; |
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
131 } |
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
132 |
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
133 static bool |
6017 | 134 parse_return_flags(struct cmd_list_context *ctx, const struct imap_arg *args) |
1198
d28571e8c810
Rewrote LIST, LSUB and subscription file handling. LIST replies aren't
Timo Sirainen <tss@iki.fi>
parents:
1183
diff
changeset
|
135 { |
6496 | 136 enum mailbox_list_iter_flags list_flags = 0; |
1244
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
137 const char *atom; |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
138 |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
139 while (args->type != IMAP_ARG_EOL) { |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
140 if (args->type != IMAP_ARG_ATOM) { |
6017 | 141 client_send_command_error(ctx->cmd, |
1244
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
142 "List options contains non-atoms."); |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
143 return FALSE; |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
144 } |
1198
d28571e8c810
Rewrote LIST, LSUB and subscription file handling. LIST replies aren't
Timo Sirainen <tss@iki.fi>
parents:
1183
diff
changeset
|
145 |
1244
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
146 atom = IMAP_ARG_STR(args); |
1198
d28571e8c810
Rewrote LIST, LSUB and subscription file handling. LIST replies aren't
Timo Sirainen <tss@iki.fi>
parents:
1183
diff
changeset
|
147 |
1244
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
148 if (strcasecmp(atom, "SUBSCRIBED") == 0) |
6017 | 149 list_flags |= MAILBOX_LIST_ITER_RETURN_SUBSCRIBED; |
1244
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
150 else if (strcasecmp(atom, "CHILDREN") == 0) |
6017 | 151 list_flags |= MAILBOX_LIST_ITER_RETURN_CHILDREN; |
7808
9185f2adeefb
LIST: Renamed X-STATUS return option to STATUS, since the first draft of the
Timo Sirainen <tss@iki.fi>
parents:
7534
diff
changeset
|
152 else if (strcasecmp(atom, "STATUS") == 0 && |
6018
b148e4c41aa7
Added X-STATUS (..) return option to send STATUS replies to client for
Timo Sirainen <tss@iki.fi>
parents:
6017
diff
changeset
|
153 args[1].type == IMAP_ARG_LIST) { |
b148e4c41aa7
Added X-STATUS (..) return option to send STATUS replies to client for
Timo Sirainen <tss@iki.fi>
parents:
6017
diff
changeset
|
154 /* FIXME: this should probably be a plugin.. */ |
b148e4c41aa7
Added X-STATUS (..) return option to send STATUS replies to client for
Timo Sirainen <tss@iki.fi>
parents:
6017
diff
changeset
|
155 if (imap_status_parse_items(ctx->cmd, |
b148e4c41aa7
Added X-STATUS (..) return option to send STATUS replies to client for
Timo Sirainen <tss@iki.fi>
parents:
6017
diff
changeset
|
156 IMAP_ARG_LIST_ARGS(&args[1]), |
b148e4c41aa7
Added X-STATUS (..) return option to send STATUS replies to client for
Timo Sirainen <tss@iki.fi>
parents:
6017
diff
changeset
|
157 &ctx->status_items) < 0) |
b148e4c41aa7
Added X-STATUS (..) return option to send STATUS replies to client for
Timo Sirainen <tss@iki.fi>
parents:
6017
diff
changeset
|
158 return FALSE; |
b148e4c41aa7
Added X-STATUS (..) return option to send STATUS replies to client for
Timo Sirainen <tss@iki.fi>
parents:
6017
diff
changeset
|
159 args++; |
b148e4c41aa7
Added X-STATUS (..) return option to send STATUS replies to client for
Timo Sirainen <tss@iki.fi>
parents:
6017
diff
changeset
|
160 } else { |
5832
1d91d36e14a4
Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents:
5829
diff
changeset
|
161 /* skip also optional list value */ |
6856
a249d916f6e6
If client tries to use unknown list-extended options, fail with BAD.
Timo Sirainen <tss@iki.fi>
parents:
6639
diff
changeset
|
162 client_send_command_error(ctx->cmd, |
a249d916f6e6
If client tries to use unknown list-extended options, fail with BAD.
Timo Sirainen <tss@iki.fi>
parents:
6639
diff
changeset
|
163 "Unknown return options"); |
a249d916f6e6
If client tries to use unknown list-extended options, fail with BAD.
Timo Sirainen <tss@iki.fi>
parents:
6639
diff
changeset
|
164 return FALSE; |
5832
1d91d36e14a4
Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents:
5829
diff
changeset
|
165 } |
1244
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
166 args++; |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
167 } |
6017 | 168 |
169 ctx->list_flags |= list_flags; | |
1244
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
170 return TRUE; |
1198
d28571e8c810
Rewrote LIST, LSUB and subscription file handling. LIST replies aren't
Timo Sirainen <tss@iki.fi>
parents:
1183
diff
changeset
|
171 } |
d28571e8c810
Rewrote LIST, LSUB and subscription file handling. LIST replies aren't
Timo Sirainen <tss@iki.fi>
parents:
1183
diff
changeset
|
172 |
5811
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
173 static enum mailbox_info_flags |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
174 list_get_inbox_flags(struct cmd_list_context *ctx) |
3856
b97de2e354bd
Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
3305
diff
changeset
|
175 { |
5811
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
176 struct mail_namespace *ns; |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
177 struct mailbox_list_iterate_context *list_iter; |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
178 const struct mailbox_info *info; |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
179 enum mailbox_info_flags flags = MAILBOX_UNMARKED; |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
180 |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
181 if (ctx->seen_inbox_namespace && |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
182 (ctx->ns->flags & NAMESPACE_FLAG_INBOX) == 0) { |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
183 /* INBOX doesn't exist. use the default INBOX flags */ |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
184 return flags; |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
185 } |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
186 |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
187 /* find the INBOX flags */ |
8082
db66611fd195
Added struct mail_user and fixed the code to support multiple users per process.
Timo Sirainen <tss@iki.fi>
parents:
8016
diff
changeset
|
188 ns = mail_namespace_find_inbox(ctx->cmd->client->user->namespaces); |
5811
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
189 list_iter = mailbox_list_iter_init(ns->list, "INBOX", 0); |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
190 info = mailbox_list_iter_next(list_iter); |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
191 if (info != NULL) { |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
192 i_assert(strcasecmp(info->name, "INBOX") == 0); |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
193 flags = info->flags; |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
194 } |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
195 (void)mailbox_list_iter_deinit(&list_iter); |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
196 return flags; |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
197 } |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
198 |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
199 static bool list_namespace_has_children(struct cmd_list_context *ctx) |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
200 { |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
201 struct mailbox_list_iterate_context *list_iter; |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
202 const struct mailbox_info *info; |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
203 bool ret = FALSE; |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
204 |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
205 list_iter = mailbox_list_iter_init(ctx->ns->list, "%", |
5829
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
206 MAILBOX_LIST_ITER_RETURN_NO_FLAGS); |
5811
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
207 info = mailbox_list_iter_next(list_iter); |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
208 if (info != NULL) |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
209 ret = TRUE; |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
210 if (mailbox_list_iter_deinit(&list_iter) < 0) { |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
211 /* safer to answer TRUE in error conditions */ |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
212 ret = TRUE; |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
213 } |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
214 return ret; |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
215 } |
3856
b97de2e354bd
Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
3305
diff
changeset
|
216 |
8971
163c3f85a3aa
namespaces: list=children wasn't working correctly.
Timo Sirainen <tss@iki.fi>
parents:
8902
diff
changeset
|
217 static const char *ns_get_listed_prefix(struct cmd_list_context *ctx) |
8902
5ce33cfc568f
imap: Fixed LIST with namespace prefixes that have multiple hierarchies.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
218 { |
5ce33cfc568f
imap: Fixed LIST with namespace prefixes that have multiple hierarchies.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
219 struct imap_match_glob *glob; |
5ce33cfc568f
imap: Fixed LIST with namespace prefixes that have multiple hierarchies.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
220 enum imap_match_result match; |
5ce33cfc568f
imap: Fixed LIST with namespace prefixes that have multiple hierarchies.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
221 const char *ns_prefix, *p; |
5ce33cfc568f
imap: Fixed LIST with namespace prefixes that have multiple hierarchies.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
222 |
5ce33cfc568f
imap: Fixed LIST with namespace prefixes that have multiple hierarchies.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
223 glob = imap_match_init_multiple(pool_datastack_create(), |
5ce33cfc568f
imap: Fixed LIST with namespace prefixes that have multiple hierarchies.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
224 ctx->patterns, FALSE, ctx->ns->sep); |
5ce33cfc568f
imap: Fixed LIST with namespace prefixes that have multiple hierarchies.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
225 ns_prefix = ctx->ns->prefix; |
5ce33cfc568f
imap: Fixed LIST with namespace prefixes that have multiple hierarchies.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
226 match = imap_match(glob, ns_prefix); |
5ce33cfc568f
imap: Fixed LIST with namespace prefixes that have multiple hierarchies.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
227 if (match == IMAP_MATCH_YES) { |
5ce33cfc568f
imap: Fixed LIST with namespace prefixes that have multiple hierarchies.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
228 return !ctx->cur_ns_skip_trailing_sep ? ns_prefix : |
5ce33cfc568f
imap: Fixed LIST with namespace prefixes that have multiple hierarchies.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
229 t_strndup(ns_prefix, strlen(ns_prefix)-1); |
5ce33cfc568f
imap: Fixed LIST with namespace prefixes that have multiple hierarchies.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
230 } |
5ce33cfc568f
imap: Fixed LIST with namespace prefixes that have multiple hierarchies.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
231 |
5ce33cfc568f
imap: Fixed LIST with namespace prefixes that have multiple hierarchies.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
232 while ((match & IMAP_MATCH_PARENT) != 0) { |
5ce33cfc568f
imap: Fixed LIST with namespace prefixes that have multiple hierarchies.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
233 p = strrchr(ns_prefix, ctx->ns->sep); |
5ce33cfc568f
imap: Fixed LIST with namespace prefixes that have multiple hierarchies.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
234 i_assert(p != NULL); |
5ce33cfc568f
imap: Fixed LIST with namespace prefixes that have multiple hierarchies.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
235 ns_prefix = t_strdup_until(ns_prefix, p); |
5ce33cfc568f
imap: Fixed LIST with namespace prefixes that have multiple hierarchies.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
236 match = imap_match(glob, ns_prefix); |
5ce33cfc568f
imap: Fixed LIST with namespace prefixes that have multiple hierarchies.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
237 } |
5ce33cfc568f
imap: Fixed LIST with namespace prefixes that have multiple hierarchies.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
238 i_assert(match == IMAP_MATCH_YES); |
5ce33cfc568f
imap: Fixed LIST with namespace prefixes that have multiple hierarchies.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
239 return ns_prefix; |
5ce33cfc568f
imap: Fixed LIST with namespace prefixes that have multiple hierarchies.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
240 } |
5ce33cfc568f
imap: Fixed LIST with namespace prefixes that have multiple hierarchies.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
241 |
5811
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
242 static void |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
243 list_namespace_send_prefix(struct cmd_list_context *ctx, bool have_children) |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
244 { |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
245 struct mail_namespace *const *listed; |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
246 unsigned int i, count, len; |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
247 enum mailbox_info_flags flags; |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
248 const char *name; |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
249 string_t *str; |
8461
659667d89f69
Added list=children option for namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8082
diff
changeset
|
250 |
5811
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
251 ctx->cur_ns_send_prefix = FALSE; |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
252 |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
253 /* see if we already listed this as a valid mailbox in another |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
254 namespace */ |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
255 listed = array_get(&ctx->ns_prefixes_listed, &count); |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
256 for (i = 0; i < count; i++) { |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
257 if (listed[i] == ctx->ns) |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
258 return; |
3856
b97de2e354bd
Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
3305
diff
changeset
|
259 } |
5811
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
260 |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
261 len = strlen(ctx->ns->prefix); |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
262 if (len == 6 && strncasecmp(ctx->ns->prefix, "INBOX", len-1) == 0 && |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
263 ctx->ns->prefix[len-1] == ctx->ns->sep) { |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
264 /* INBOX namespace needs to be handled specially. */ |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
265 if (ctx->inbox_found) { |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
266 /* we're just now going to send it */ |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
267 return; |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
268 } |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
269 |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
270 ctx->inbox_found = TRUE; |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
271 flags = list_get_inbox_flags(ctx); |
9276
13fa572535f0
Allow namespace prefix to be opened as mailbox, if it already exists.
Timo Sirainen <tss@iki.fi>
parents:
9029
diff
changeset
|
272 } else if (mailbox_list_mailbox(ctx->ns->list, "", &flags) > 0) { |
13fa572535f0
Allow namespace prefix to be opened as mailbox, if it already exists.
Timo Sirainen <tss@iki.fi>
parents:
9029
diff
changeset
|
273 /* mailbox with namespace prefix exists */ |
5811
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
274 } else { |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
275 flags = MAILBOX_NONEXISTENT; |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
276 } |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
277 |
8971
163c3f85a3aa
namespaces: list=children wasn't working correctly.
Timo Sirainen <tss@iki.fi>
parents:
8902
diff
changeset
|
278 name = ns_get_listed_prefix(ctx); |
8902
5ce33cfc568f
imap: Fixed LIST with namespace prefixes that have multiple hierarchies.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
279 |
5811
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
280 if ((flags & MAILBOX_CHILDREN) == 0) { |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
281 if (have_children || list_namespace_has_children(ctx)) { |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
282 flags |= MAILBOX_CHILDREN; |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
283 flags &= ~MAILBOX_NOCHILDREN; |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
284 } else { |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
285 flags |= MAILBOX_NOCHILDREN; |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
286 } |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
287 } |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
288 |
8461
659667d89f69
Added list=children option for namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8082
diff
changeset
|
289 if ((ctx->ns->flags & NAMESPACE_FLAG_LIST_CHILDREN) != 0) { |
659667d89f69
Added list=children option for namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8082
diff
changeset
|
290 if (have_children) { |
659667d89f69
Added list=children option for namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8082
diff
changeset
|
291 /* children are going to be listed. */ |
659667d89f69
Added list=children option for namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8082
diff
changeset
|
292 return; |
659667d89f69
Added list=children option for namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8082
diff
changeset
|
293 } |
659667d89f69
Added list=children option for namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8082
diff
changeset
|
294 if ((flags & MAILBOX_CHILDREN) == 0) { |
659667d89f69
Added list=children option for namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8082
diff
changeset
|
295 /* namespace has no children. don't show it. */ |
659667d89f69
Added list=children option for namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8082
diff
changeset
|
296 return; |
659667d89f69
Added list=children option for namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8082
diff
changeset
|
297 } |
659667d89f69
Added list=children option for namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8082
diff
changeset
|
298 /* namespace has children but they don't match the list |
659667d89f69
Added list=children option for namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8082
diff
changeset
|
299 pattern. the prefix itself matches though, so show it. */ |
659667d89f69
Added list=children option for namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8082
diff
changeset
|
300 } |
659667d89f69
Added list=children option for namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8082
diff
changeset
|
301 |
5829
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
302 str = t_str_new(128); |
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
303 str_append(str, "* LIST ("); |
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
304 mailbox_flags2str(ctx, str, flags); |
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
305 str_printfa(str, ") \"%s\" ", ctx->ns->sep_str); |
5811
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
306 imap_quote_append_string(str, name, FALSE); |
5829
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
307 mailbox_childinfo2str(ctx, str, flags); |
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
308 |
5811
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
309 client_send_line(ctx->cmd->client, str_c(str)); |
3856
b97de2e354bd
Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
3305
diff
changeset
|
310 } |
b97de2e354bd
Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
3305
diff
changeset
|
311 |
6018
b148e4c41aa7
Added X-STATUS (..) return option to send STATUS replies to client for
Timo Sirainen <tss@iki.fi>
parents:
6017
diff
changeset
|
312 static void list_send_status(struct cmd_list_context *ctx, const char *name) |
b148e4c41aa7
Added X-STATUS (..) return option to send STATUS replies to client for
Timo Sirainen <tss@iki.fi>
parents:
6017
diff
changeset
|
313 { |
b148e4c41aa7
Added X-STATUS (..) return option to send STATUS replies to client for
Timo Sirainen <tss@iki.fi>
parents:
6017
diff
changeset
|
314 struct mailbox_status status; |
b148e4c41aa7
Added X-STATUS (..) return option to send STATUS replies to client for
Timo Sirainen <tss@iki.fi>
parents:
6017
diff
changeset
|
315 const char *storage_name; |
b148e4c41aa7
Added X-STATUS (..) return option to send STATUS replies to client for
Timo Sirainen <tss@iki.fi>
parents:
6017
diff
changeset
|
316 size_t prefix_len = strlen(ctx->ns->prefix); |
b148e4c41aa7
Added X-STATUS (..) return option to send STATUS replies to client for
Timo Sirainen <tss@iki.fi>
parents:
6017
diff
changeset
|
317 |
b148e4c41aa7
Added X-STATUS (..) return option to send STATUS replies to client for
Timo Sirainen <tss@iki.fi>
parents:
6017
diff
changeset
|
318 storage_name = strncmp(name, ctx->ns->prefix, prefix_len) == 0 ? |
b148e4c41aa7
Added X-STATUS (..) return option to send STATUS replies to client for
Timo Sirainen <tss@iki.fi>
parents:
6017
diff
changeset
|
319 name + prefix_len : name; |
b148e4c41aa7
Added X-STATUS (..) return option to send STATUS replies to client for
Timo Sirainen <tss@iki.fi>
parents:
6017
diff
changeset
|
320 |
b148e4c41aa7
Added X-STATUS (..) return option to send STATUS replies to client for
Timo Sirainen <tss@iki.fi>
parents:
6017
diff
changeset
|
321 if (!imap_status_get(ctx->cmd->client, ctx->ns->storage, storage_name, |
b148e4c41aa7
Added X-STATUS (..) return option to send STATUS replies to client for
Timo Sirainen <tss@iki.fi>
parents:
6017
diff
changeset
|
322 ctx->status_items, &status)) { |
b148e4c41aa7
Added X-STATUS (..) return option to send STATUS replies to client for
Timo Sirainen <tss@iki.fi>
parents:
6017
diff
changeset
|
323 client_send_untagged_storage_error(ctx->cmd->client, |
b148e4c41aa7
Added X-STATUS (..) return option to send STATUS replies to client for
Timo Sirainen <tss@iki.fi>
parents:
6017
diff
changeset
|
324 ctx->ns->storage); |
b148e4c41aa7
Added X-STATUS (..) return option to send STATUS replies to client for
Timo Sirainen <tss@iki.fi>
parents:
6017
diff
changeset
|
325 return; |
b148e4c41aa7
Added X-STATUS (..) return option to send STATUS replies to client for
Timo Sirainen <tss@iki.fi>
parents:
6017
diff
changeset
|
326 } |
b148e4c41aa7
Added X-STATUS (..) return option to send STATUS replies to client for
Timo Sirainen <tss@iki.fi>
parents:
6017
diff
changeset
|
327 |
b148e4c41aa7
Added X-STATUS (..) return option to send STATUS replies to client for
Timo Sirainen <tss@iki.fi>
parents:
6017
diff
changeset
|
328 imap_status_send(ctx->cmd->client, name, ctx->status_items, &status); |
b148e4c41aa7
Added X-STATUS (..) return option to send STATUS replies to client for
Timo Sirainen <tss@iki.fi>
parents:
6017
diff
changeset
|
329 } |
b148e4c41aa7
Added X-STATUS (..) return option to send STATUS replies to client for
Timo Sirainen <tss@iki.fi>
parents:
6017
diff
changeset
|
330 |
2350
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
331 static int |
5811
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
332 list_namespace_mailboxes(struct cmd_list_context *ctx) |
2350
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
333 { |
5807
ec09ad1d017f
mailbox_list_iter_next() returns now const pointer.
Timo Sirainen <tss@iki.fi>
parents:
5806
diff
changeset
|
334 const struct mailbox_info *info; |
5811
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
335 struct mail_namespace *ns; |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
336 enum mailbox_info_flags flags; |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
337 string_t *str, *name_str; |
2350
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
338 const char *name; |
4808
93bc9770f938
Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
4729
diff
changeset
|
339 int ret = 0; |
2350
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
340 |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
341 str = t_str_new(256); |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
342 name_str = t_str_new(256); |
4808
93bc9770f938
Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
4729
diff
changeset
|
343 while ((info = mailbox_list_iter_next(ctx->list_iter)) != NULL) { |
7255
cd7eeb8cc7fc
Don't convert real separators to virtual separators. The mailbox listing
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
344 name = info->name; |
5811
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
345 flags = info->flags; |
2350
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
346 |
4639
47531abcf691
Handle INBOX-prefixed namespaces better. Avoid duplicate INBOX replies if
Timo Sirainen <tss@iki.fi>
parents:
4546
diff
changeset
|
347 if (strcasecmp(name, "INBOX") == 0) { |
5811
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
348 if (ctx->inbox_found) { |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
349 /* we already listed this at the beginning |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
350 of handling INBOX/ namespace */ |
2350
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
351 continue; |
5811
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
352 } |
6318
5313cbcfccc6
Don't crash if mailbox named INBOX is listed in prefixless namespace, but
Timo Sirainen <tss@iki.fi>
parents:
6018
diff
changeset
|
353 if ((ctx->ns->flags & NAMESPACE_FLAG_INBOX) == 0) { |
5313cbcfccc6
Don't crash if mailbox named INBOX is listed in prefixless namespace, but
Timo Sirainen <tss@iki.fi>
parents:
6018
diff
changeset
|
354 /* INBOX is in non-empty prefix namespace, |
5313cbcfccc6
Don't crash if mailbox named INBOX is listed in prefixless namespace, but
Timo Sirainen <tss@iki.fi>
parents:
6018
diff
changeset
|
355 and we're now listing prefixless namespace |
5313cbcfccc6
Don't crash if mailbox named INBOX is listed in prefixless namespace, but
Timo Sirainen <tss@iki.fi>
parents:
6018
diff
changeset
|
356 that contains INBOX. There's no way we can |
5313cbcfccc6
Don't crash if mailbox named INBOX is listed in prefixless namespace, but
Timo Sirainen <tss@iki.fi>
parents:
6018
diff
changeset
|
357 show this mailbox. */ |
5313cbcfccc6
Don't crash if mailbox named INBOX is listed in prefixless namespace, but
Timo Sirainen <tss@iki.fi>
parents:
6018
diff
changeset
|
358 continue; |
5313cbcfccc6
Don't crash if mailbox named INBOX is listed in prefixless namespace, but
Timo Sirainen <tss@iki.fi>
parents:
6018
diff
changeset
|
359 } |
5811
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
360 ctx->inbox_found = TRUE; |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
361 } |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
362 if (ctx->cur_ns_send_prefix) |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
363 list_namespace_send_prefix(ctx, TRUE); |
2350
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
364 |
5811
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
365 /* if there's a namespace with this name, list it as |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
366 having children */ |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
367 ns = mail_namespace_find_prefix_nosep(ctx->ns, name); |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
368 if (ns != NULL) { |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
369 flags |= MAILBOX_CHILDREN; |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
370 flags &= ~MAILBOX_NOCHILDREN; |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
371 array_append(&ctx->ns_prefixes_listed, &ns, 1); |
2350
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
372 } |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
373 |
6009
62f92a68fc72
LSUB: If pattern doesn't end with %, don't show extra unsubscribed mailboxes
Timo Sirainen <tss@iki.fi>
parents:
6007
diff
changeset
|
374 if ((flags & MAILBOX_CHILD_SUBSCRIBED) != 0 && |
62f92a68fc72
LSUB: If pattern doesn't end with %, don't show extra unsubscribed mailboxes
Timo Sirainen <tss@iki.fi>
parents:
6007
diff
changeset
|
375 (flags & MAILBOX_SUBSCRIBED) == 0 && |
62f92a68fc72
LSUB: If pattern doesn't end with %, don't show extra unsubscribed mailboxes
Timo Sirainen <tss@iki.fi>
parents:
6007
diff
changeset
|
376 ctx->lsub_no_unsubscribed) { |
62f92a68fc72
LSUB: If pattern doesn't end with %, don't show extra unsubscribed mailboxes
Timo Sirainen <tss@iki.fi>
parents:
6007
diff
changeset
|
377 /* mask doesn't end with %. we don't want to show |
62f92a68fc72
LSUB: If pattern doesn't end with %, don't show extra unsubscribed mailboxes
Timo Sirainen <tss@iki.fi>
parents:
6007
diff
changeset
|
378 any extra mailboxes. */ |
62f92a68fc72
LSUB: If pattern doesn't end with %, don't show extra unsubscribed mailboxes
Timo Sirainen <tss@iki.fi>
parents:
6007
diff
changeset
|
379 continue; |
62f92a68fc72
LSUB: If pattern doesn't end with %, don't show extra unsubscribed mailboxes
Timo Sirainen <tss@iki.fi>
parents:
6007
diff
changeset
|
380 } |
62f92a68fc72
LSUB: If pattern doesn't end with %, don't show extra unsubscribed mailboxes
Timo Sirainen <tss@iki.fi>
parents:
6007
diff
changeset
|
381 |
2350
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
382 str_truncate(str, 0); |
5314
ce59b45431fb
Use less memory when listing lots of mailboxes
Timo Sirainen <tss@iki.fi>
parents:
5307
diff
changeset
|
383 str_printfa(str, "* %s (", ctx->lsub ? "LSUB" : "LIST"); |
5829
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
384 mailbox_flags2str(ctx, str, flags); |
5314
ce59b45431fb
Use less memory when listing lots of mailboxes
Timo Sirainen <tss@iki.fi>
parents:
5307
diff
changeset
|
385 str_printfa(str, ") \"%s\" ", ctx->ns->sep_str); |
2350
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
386 imap_quote_append_string(str, name, FALSE); |
5829
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
387 mailbox_childinfo2str(ctx, str, flags); |
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
388 |
7534
9c781d042afe
LIST X-STATUS: Send LIST reply before STATUS reply.
Timo Sirainen <tss@iki.fi>
parents:
7531
diff
changeset
|
389 ret = client_send_line(ctx->cmd->client, str_c(str)); |
6018
b148e4c41aa7
Added X-STATUS (..) return option to send STATUS replies to client for
Timo Sirainen <tss@iki.fi>
parents:
6017
diff
changeset
|
390 if (ctx->status_items != 0 && |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6856
diff
changeset
|
391 (flags & (MAILBOX_NONEXISTENT | MAILBOX_NOSELECT)) == 0) { |
7226
e6693a0ec8e1
Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents:
7148
diff
changeset
|
392 T_BEGIN { |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6856
diff
changeset
|
393 list_send_status(ctx, name); |
7226
e6693a0ec8e1
Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents:
7148
diff
changeset
|
394 } T_END; |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6856
diff
changeset
|
395 } |
7534
9c781d042afe
LIST X-STATUS: Send LIST reply before STATUS reply.
Timo Sirainen <tss@iki.fi>
parents:
7531
diff
changeset
|
396 if (ret == 0) { |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
397 /* buffer is full, continue later */ |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
398 return 0; |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
399 } |
2350
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
400 } |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
401 |
5611
44db6ddd5a17
Removed mail_storage_set_list_error(). Handle the errors directly.
Timo Sirainen <tss@iki.fi>
parents:
5571
diff
changeset
|
402 if (mailbox_list_iter_deinit(&ctx->list_iter) < 0) |
4808
93bc9770f938
Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
4729
diff
changeset
|
403 ret = -1; |
2350
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
404 |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
405 return ret < 0 ? -1 : 1; |
2350
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
406 } |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
407 |
5839
978722ad6184
s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
408 static bool list_pattern_has_wildcards(const char *pattern) |
3875
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
409 { |
5839
978722ad6184
s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
410 for (; *pattern != '\0'; pattern++) { |
978722ad6184
s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
411 if (*pattern == '%' || *pattern == '*') |
3875
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
412 return TRUE; |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
413 } |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
414 return FALSE; |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
415 } |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
416 |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
417 static void |
5839
978722ad6184
s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
418 skip_namespace_prefix(const char **prefix, const char **pattern, |
3875
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
419 bool inbox_check, char sep) |
2350
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
420 { |
5839
978722ad6184
s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
421 size_t pattern_len, prefix_len; |
3863
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3856
diff
changeset
|
422 bool match; |
2350
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
423 |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
424 prefix_len = strlen(*prefix); |
5839
978722ad6184
s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
425 pattern_len = strlen(*pattern); |
3856
b97de2e354bd
Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
3305
diff
changeset
|
426 |
5839
978722ad6184
s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
427 if (pattern_len < prefix_len) { |
978722ad6184
s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
428 /* eg. namespace prefix = "INBOX.", pattern = "INBOX" */ |
3856
b97de2e354bd
Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
3305
diff
changeset
|
429 return; |
b97de2e354bd
Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
3305
diff
changeset
|
430 } |
2350
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
431 |
5839
978722ad6184
s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
432 match = strncmp(*prefix, *pattern, prefix_len) == 0; |
3875
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
433 if (!match && inbox_check) { |
3856
b97de2e354bd
Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
3305
diff
changeset
|
434 /* try INBOX check. */ |
b97de2e354bd
Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
3305
diff
changeset
|
435 match = prefix_len >= 5 && |
5839
978722ad6184
s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
436 strncasecmp(*prefix, *pattern, 5) == 0 && |
978722ad6184
s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
437 strncmp(*prefix + 5, *pattern + 5, |
978722ad6184
s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
438 prefix_len - 5) == 0 && |
3875
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
439 strncasecmp(*prefix, "INBOX", 5) == 0 && |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
440 ((*prefix)[5] == sep || (*prefix)[5] == '\0'); |
3856
b97de2e354bd
Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
3305
diff
changeset
|
441 } |
b97de2e354bd
Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
3305
diff
changeset
|
442 |
b97de2e354bd
Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
3305
diff
changeset
|
443 if (match) { |
b97de2e354bd
Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
3305
diff
changeset
|
444 *prefix += prefix_len; |
5839
978722ad6184
s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
445 *pattern += prefix_len; |
2350
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
446 } |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
447 } |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
448 |
5803 | 449 static bool |
6007
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
450 skip_namespace_prefix_ref(struct cmd_list_context *ctx, |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
451 const char **cur_ns_prefix_p, |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
452 const char **cur_ref_p) |
5803 | 453 { |
5809 | 454 const char *cur_ns_prefix = *cur_ns_prefix_p; |
455 const char *cur_ref = *cur_ref_p; | |
5803 | 456 |
457 if (*cur_ref != '\0') { | |
458 /* reference argument given. skip namespace prefix using it. | |
459 | |
460 cur_ns_prefix = foo/bar/ | |
461 cur_ref = foo/ | |
462 -> cur_ns_prefix=bar/, cur_ref="" | |
463 cur_ref = foo/bar/baz | |
464 -> cur_ns_prefix="", cur_ref="baz" | |
465 */ | |
466 skip_namespace_prefix(&cur_ns_prefix, &cur_ref, TRUE, | |
467 ctx->ns->sep); | |
468 | |
469 if (*cur_ref != '\0' && *cur_ns_prefix != '\0') { | |
470 /* reference parameter didn't match with | |
471 namespace prefix. skip this. */ | |
472 return FALSE; | |
473 } | |
474 } | |
475 | |
6007
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
476 *cur_ns_prefix_p = cur_ns_prefix; |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
477 *cur_ref_p = cur_ref; |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
478 return TRUE; |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
479 } |
5803 | 480 |
6007
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
481 static void |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
482 skip_namespace_prefix_pattern(struct cmd_list_context *ctx, |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
483 const char **cur_ns_prefix_p, |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
484 const char *cur_ref, const char **cur_pattern_p) |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
485 { |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
486 const char *cur_ns_prefix = *cur_ns_prefix_p; |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
487 const char *cur_pattern = *cur_pattern_p; |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
488 const char *old_ns_prefix = cur_ns_prefix; |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
489 const char *old_pattern = cur_pattern; |
5803 | 490 |
6007
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
491 if (*cur_ns_prefix == '\0') |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
492 return; |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
493 |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
494 /* skip namespace prefix using pattern */ |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
495 i_assert(*cur_ref == '\0'); |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
496 |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
497 skip_namespace_prefix(&cur_ns_prefix, &cur_pattern, |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
498 cur_ref == ctx->ref, ctx->ns->sep); |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
499 |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
500 if (*cur_pattern == '\0' && *cur_ns_prefix == '\0') { |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
501 /* trying to list the namespace prefix itself. */ |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
502 cur_ns_prefix = old_ns_prefix; |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
503 cur_pattern = old_pattern; |
5803 | 504 } |
505 | |
5809 | 506 *cur_ns_prefix_p = cur_ns_prefix; |
5839
978722ad6184
s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
507 *cur_pattern_p = cur_pattern; |
5803 | 508 } |
509 | |
510 static enum imap_match_result | |
5811
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
511 list_use_inboxcase(struct cmd_list_context *ctx) |
5803 | 512 { |
513 struct imap_match_glob *inbox_glob; | |
6007
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
514 const char *const *pat; |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
515 enum imap_match_result match, ret; |
5803 | 516 |
5808
45735dd11f17
Moved several namespace booleans to a flags field. Removed unused
Timo Sirainen <tss@iki.fi>
parents:
5807
diff
changeset
|
517 if (*ctx->ns->prefix != '\0' && |
45735dd11f17
Moved several namespace booleans to a flags field. Removed unused
Timo Sirainen <tss@iki.fi>
parents:
5807
diff
changeset
|
518 (ctx->ns->flags & NAMESPACE_FLAG_INBOX) == 0) |
5803 | 519 return IMAP_MATCH_NO; |
520 | |
5839
978722ad6184
s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
521 /* if the original reference and pattern combined produces something |
5803 | 522 that matches INBOX, the INBOX casing is on. */ |
6007
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
523 ret = IMAP_MATCH_NO; |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
524 for (pat = ctx->patterns; *pat != NULL; pat++) { |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
525 inbox_glob = |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
526 imap_match_init(pool_datastack_create(), |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
527 t_strconcat(ctx->ref, *pat, NULL), |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
528 TRUE, ctx->ns->sep); |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
529 match = imap_match(inbox_glob, "INBOX"); |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
530 |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
531 if (match == IMAP_MATCH_YES) |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
532 return IMAP_MATCH_YES; |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
533 if ((match & IMAP_MATCH_PARENT) != 0) |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
534 ret = IMAP_MATCH_PARENT; |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
535 } |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
536 return ret; |
5803 | 537 } |
538 | |
6014
92fabfda82f9
Let lib-storage handle matching namespace prefixes as well.
Timo Sirainen <tss@iki.fi>
parents:
6009
diff
changeset
|
539 static bool |
6577
5b2ff32877d4
Send namespace prefix LIST reply for list=no namespaces also if doing LIST
Timo Sirainen <tss@iki.fi>
parents:
6573
diff
changeset
|
540 list_want_send_prefix(struct cmd_list_context *ctx, const char *pattern) |
5b2ff32877d4
Send namespace prefix LIST reply for list=no namespaces also if doing LIST
Timo Sirainen <tss@iki.fi>
parents:
6573
diff
changeset
|
541 { |
5b2ff32877d4
Send namespace prefix LIST reply for list=no namespaces also if doing LIST
Timo Sirainen <tss@iki.fi>
parents:
6573
diff
changeset
|
542 /* don't send the prefix if we're listing subscribed mailboxes */ |
5b2ff32877d4
Send namespace prefix LIST reply for list=no namespaces also if doing LIST
Timo Sirainen <tss@iki.fi>
parents:
6573
diff
changeset
|
543 if ((ctx->list_flags & MAILBOX_LIST_ITER_SELECT_SUBSCRIBED) != 0) |
5b2ff32877d4
Send namespace prefix LIST reply for list=no namespaces also if doing LIST
Timo Sirainen <tss@iki.fi>
parents:
6573
diff
changeset
|
544 return FALSE; |
5b2ff32877d4
Send namespace prefix LIST reply for list=no namespaces also if doing LIST
Timo Sirainen <tss@iki.fi>
parents:
6573
diff
changeset
|
545 |
8461
659667d89f69
Added list=children option for namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8082
diff
changeset
|
546 /* send the prefix if namespace is listable. if children are listable |
659667d89f69
Added list=children option for namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8082
diff
changeset
|
547 we may or may not need to send it. */ |
659667d89f69
Added list=children option for namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8082
diff
changeset
|
548 if ((ctx->ns->flags & (NAMESPACE_FLAG_LIST_PREFIX | |
659667d89f69
Added list=children option for namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8082
diff
changeset
|
549 NAMESPACE_FLAG_LIST_CHILDREN)) != 0) |
6577
5b2ff32877d4
Send namespace prefix LIST reply for list=no namespaces also if doing LIST
Timo Sirainen <tss@iki.fi>
parents:
6573
diff
changeset
|
550 return TRUE; |
5b2ff32877d4
Send namespace prefix LIST reply for list=no namespaces also if doing LIST
Timo Sirainen <tss@iki.fi>
parents:
6573
diff
changeset
|
551 |
5b2ff32877d4
Send namespace prefix LIST reply for list=no namespaces also if doing LIST
Timo Sirainen <tss@iki.fi>
parents:
6573
diff
changeset
|
552 /* ..or if pattern is exactly the same as namespace prefix. |
5b2ff32877d4
Send namespace prefix LIST reply for list=no namespaces also if doing LIST
Timo Sirainen <tss@iki.fi>
parents:
6573
diff
changeset
|
553 some clients (mutt) want to do LIST "" prefix. */ |
5b2ff32877d4
Send namespace prefix LIST reply for list=no namespaces also if doing LIST
Timo Sirainen <tss@iki.fi>
parents:
6573
diff
changeset
|
554 for (; *pattern != '\0'; pattern++) { |
5b2ff32877d4
Send namespace prefix LIST reply for list=no namespaces also if doing LIST
Timo Sirainen <tss@iki.fi>
parents:
6573
diff
changeset
|
555 if (*pattern == '*' || *pattern == '%') |
5b2ff32877d4
Send namespace prefix LIST reply for list=no namespaces also if doing LIST
Timo Sirainen <tss@iki.fi>
parents:
6573
diff
changeset
|
556 break; |
5b2ff32877d4
Send namespace prefix LIST reply for list=no namespaces also if doing LIST
Timo Sirainen <tss@iki.fi>
parents:
6573
diff
changeset
|
557 } |
5b2ff32877d4
Send namespace prefix LIST reply for list=no namespaces also if doing LIST
Timo Sirainen <tss@iki.fi>
parents:
6573
diff
changeset
|
558 return *pattern == '\0'; |
5b2ff32877d4
Send namespace prefix LIST reply for list=no namespaces also if doing LIST
Timo Sirainen <tss@iki.fi>
parents:
6573
diff
changeset
|
559 } |
5b2ff32877d4
Send namespace prefix LIST reply for list=no namespaces also if doing LIST
Timo Sirainen <tss@iki.fi>
parents:
6573
diff
changeset
|
560 |
5b2ff32877d4
Send namespace prefix LIST reply for list=no namespaces also if doing LIST
Timo Sirainen <tss@iki.fi>
parents:
6573
diff
changeset
|
561 static bool |
6014
92fabfda82f9
Let lib-storage handle matching namespace prefixes as well.
Timo Sirainen <tss@iki.fi>
parents:
6009
diff
changeset
|
562 list_namespace_match_pattern(struct cmd_list_context *ctx, bool inboxcase, |
92fabfda82f9
Let lib-storage handle matching namespace prefixes as well.
Timo Sirainen <tss@iki.fi>
parents:
6009
diff
changeset
|
563 const char *cur_ref, const char *cur_ns_prefix, |
92fabfda82f9
Let lib-storage handle matching namespace prefixes as well.
Timo Sirainen <tss@iki.fi>
parents:
6009
diff
changeset
|
564 const char *cur_pattern) |
5803 | 565 { |
6014
92fabfda82f9
Let lib-storage handle matching namespace prefixes as well.
Timo Sirainen <tss@iki.fi>
parents:
6009
diff
changeset
|
566 const char *orig_cur_pattern = cur_pattern; |
6007
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
567 struct mail_namespace *ns = ctx->ns; |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
568 struct imap_match_glob *pat_glob; |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
569 enum imap_match_result match; |
6573
c901bdf0db75
Fixes for listing namespaces with prefixes and real != virtual separator.
Timo Sirainen <tss@iki.fi>
parents:
6496
diff
changeset
|
570 const char *p; |
6007
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
571 size_t len; |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
572 |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
573 skip_namespace_prefix_pattern(ctx, &cur_ns_prefix, |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
574 cur_ref, &cur_pattern); |
9021
e36a9edb5fb0
Allow prefix="" namespace to have list=no and make it work in a somewhat useful way.
Timo Sirainen <tss@iki.fi>
parents:
8971
diff
changeset
|
575 if (*cur_ns_prefix == '\0') { |
9029
db2fdf3529ac
LIST: Previous prefix="", list=no change broke listing other list=no namespaces.
Timo Sirainen <tss@iki.fi>
parents:
9021
diff
changeset
|
576 if (*ns->prefix == '\0') { |
db2fdf3529ac
LIST: Previous prefix="", list=no change broke listing other list=no namespaces.
Timo Sirainen <tss@iki.fi>
parents:
9021
diff
changeset
|
577 /* no namespace prefix: if list=no we don't want to |
db2fdf3529ac
LIST: Previous prefix="", list=no change broke listing other list=no namespaces.
Timo Sirainen <tss@iki.fi>
parents:
9021
diff
changeset
|
578 show anything, except when the client does e.g. |
db2fdf3529ac
LIST: Previous prefix="", list=no change broke listing other list=no namespaces.
Timo Sirainen <tss@iki.fi>
parents:
9021
diff
changeset
|
579 LIST "" mailbox. prefix="", list=no namespace is |
db2fdf3529ac
LIST: Previous prefix="", list=no change broke listing other list=no namespaces.
Timo Sirainen <tss@iki.fi>
parents:
9021
diff
changeset
|
580 mainly useful for working around client bugs. */ |
db2fdf3529ac
LIST: Previous prefix="", list=no change broke listing other list=no namespaces.
Timo Sirainen <tss@iki.fi>
parents:
9021
diff
changeset
|
581 if ((ns->flags & NAMESPACE_FLAG_LIST_PREFIX) == 0 && |
db2fdf3529ac
LIST: Previous prefix="", list=no change broke listing other list=no namespaces.
Timo Sirainen <tss@iki.fi>
parents:
9021
diff
changeset
|
582 list_pattern_has_wildcards(cur_pattern)) |
db2fdf3529ac
LIST: Previous prefix="", list=no change broke listing other list=no namespaces.
Timo Sirainen <tss@iki.fi>
parents:
9021
diff
changeset
|
583 return FALSE; |
db2fdf3529ac
LIST: Previous prefix="", list=no change broke listing other list=no namespaces.
Timo Sirainen <tss@iki.fi>
parents:
9021
diff
changeset
|
584 } |
db2fdf3529ac
LIST: Previous prefix="", list=no change broke listing other list=no namespaces.
Timo Sirainen <tss@iki.fi>
parents:
9021
diff
changeset
|
585 return TRUE; |
9021
e36a9edb5fb0
Allow prefix="" namespace to have list=no and make it work in a somewhat useful way.
Timo Sirainen <tss@iki.fi>
parents:
8971
diff
changeset
|
586 } |
6007
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
587 |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
588 /* namespace prefix still wasn't completely skipped over. |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
589 for example cur_ns_prefix=INBOX/, pattern=%/% or pattern=IN%. |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
590 Check that pattern matches namespace prefix. */ |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
591 i_assert(*cur_ref == '\0'); |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
592 |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
593 /* drop the trailing separator in namespace prefix. |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
594 don't do it if we're listing only the prefix itself |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
595 (LIST "" foo/ needs to return "foo/" entry) */ |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
596 len = strlen(cur_ns_prefix); |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
597 if (cur_ns_prefix[len-1] == ns->sep && |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
598 strcmp(cur_pattern, cur_ns_prefix) != 0) { |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
599 ctx->cur_ns_skip_trailing_sep = TRUE; |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
600 cur_ns_prefix = t_strndup(cur_ns_prefix, len-1); |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
601 } |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
602 |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
603 /* hidden and non-listable namespaces are invisible to wildcards */ |
8461
659667d89f69
Added list=children option for namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8082
diff
changeset
|
604 if ((ns->flags & (NAMESPACE_FLAG_LIST_PREFIX | |
659667d89f69
Added list=children option for namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8082
diff
changeset
|
605 NAMESPACE_FLAG_LIST_CHILDREN)) == 0 && |
6007
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
606 list_pattern_has_wildcards(cur_pattern)) |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
607 return FALSE; |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
608 |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
609 /* check if this namespace prefix matches the current pattern */ |
6014
92fabfda82f9
Let lib-storage handle matching namespace prefixes as well.
Timo Sirainen <tss@iki.fi>
parents:
6009
diff
changeset
|
610 pat_glob = imap_match_init(pool_datastack_create(), orig_cur_pattern, |
6007
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
611 inboxcase, ns->sep); |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
612 match = imap_match(pat_glob, cur_ns_prefix); |
6573
c901bdf0db75
Fixes for listing namespaces with prefixes and real != virtual separator.
Timo Sirainen <tss@iki.fi>
parents:
6496
diff
changeset
|
613 if (match == IMAP_MATCH_YES) { |
6577
5b2ff32877d4
Send namespace prefix LIST reply for list=no namespaces also if doing LIST
Timo Sirainen <tss@iki.fi>
parents:
6573
diff
changeset
|
614 if (list_want_send_prefix(ctx, orig_cur_pattern)) |
6573
c901bdf0db75
Fixes for listing namespaces with prefixes and real != virtual separator.
Timo Sirainen <tss@iki.fi>
parents:
6496
diff
changeset
|
615 ctx->cur_ns_send_prefix = TRUE; |
6577
5b2ff32877d4
Send namespace prefix LIST reply for list=no namespaces also if doing LIST
Timo Sirainen <tss@iki.fi>
parents:
6573
diff
changeset
|
616 |
6573
c901bdf0db75
Fixes for listing namespaces with prefixes and real != virtual separator.
Timo Sirainen <tss@iki.fi>
parents:
6496
diff
changeset
|
617 /* if the pattern contains '*' characters, we'll need to |
c901bdf0db75
Fixes for listing namespaces with prefixes and real != virtual separator.
Timo Sirainen <tss@iki.fi>
parents:
6496
diff
changeset
|
618 check our children too */ |
c901bdf0db75
Fixes for listing namespaces with prefixes and real != virtual separator.
Timo Sirainen <tss@iki.fi>
parents:
6496
diff
changeset
|
619 for (p = orig_cur_pattern; *p != '\0'; p++) { |
c901bdf0db75
Fixes for listing namespaces with prefixes and real != virtual separator.
Timo Sirainen <tss@iki.fi>
parents:
6496
diff
changeset
|
620 if (*p == '*') |
c901bdf0db75
Fixes for listing namespaces with prefixes and real != virtual separator.
Timo Sirainen <tss@iki.fi>
parents:
6496
diff
changeset
|
621 return TRUE; |
c901bdf0db75
Fixes for listing namespaces with prefixes and real != virtual separator.
Timo Sirainen <tss@iki.fi>
parents:
6496
diff
changeset
|
622 } |
8902
5ce33cfc568f
imap: Fixed LIST with namespace prefixes that have multiple hierarchies.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
623 } else { |
5ce33cfc568f
imap: Fixed LIST with namespace prefixes that have multiple hierarchies.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
624 while ((match & IMAP_MATCH_PARENT) != 0) { |
5ce33cfc568f
imap: Fixed LIST with namespace prefixes that have multiple hierarchies.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
625 p = strrchr(cur_ns_prefix, ns->sep); |
5ce33cfc568f
imap: Fixed LIST with namespace prefixes that have multiple hierarchies.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
626 if (p == NULL) |
5ce33cfc568f
imap: Fixed LIST with namespace prefixes that have multiple hierarchies.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
627 break; |
5ce33cfc568f
imap: Fixed LIST with namespace prefixes that have multiple hierarchies.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
628 cur_ns_prefix = t_strdup_until(cur_ns_prefix, p); |
5ce33cfc568f
imap: Fixed LIST with namespace prefixes that have multiple hierarchies.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
629 match = imap_match(pat_glob, cur_ns_prefix); |
5ce33cfc568f
imap: Fixed LIST with namespace prefixes that have multiple hierarchies.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
630 } |
5ce33cfc568f
imap: Fixed LIST with namespace prefixes that have multiple hierarchies.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
631 if (match == IMAP_MATCH_YES && |
5ce33cfc568f
imap: Fixed LIST with namespace prefixes that have multiple hierarchies.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
632 mail_namespace_find_prefix_nosep(ns->user->namespaces, |
5ce33cfc568f
imap: Fixed LIST with namespace prefixes that have multiple hierarchies.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
633 cur_ns_prefix) == NULL) { |
5ce33cfc568f
imap: Fixed LIST with namespace prefixes that have multiple hierarchies.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
634 /* ns prefix="foo/bar/" and we're listing e.g. % */ |
5ce33cfc568f
imap: Fixed LIST with namespace prefixes that have multiple hierarchies.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
635 if (list_want_send_prefix(ctx, orig_cur_pattern)) |
5ce33cfc568f
imap: Fixed LIST with namespace prefixes that have multiple hierarchies.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
636 ctx->cur_ns_send_prefix = TRUE; |
5ce33cfc568f
imap: Fixed LIST with namespace prefixes that have multiple hierarchies.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
637 } |
6573
c901bdf0db75
Fixes for listing namespaces with prefixes and real != virtual separator.
Timo Sirainen <tss@iki.fi>
parents:
6496
diff
changeset
|
638 } |
6007
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
639 |
6573
c901bdf0db75
Fixes for listing namespaces with prefixes and real != virtual separator.
Timo Sirainen <tss@iki.fi>
parents:
6496
diff
changeset
|
640 return (match & IMAP_MATCH_CHILDREN) != 0; |
6007
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
641 } |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
642 |
5811
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
643 static void list_namespace_init(struct cmd_list_context *ctx) |
2350
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
644 { |
5500
4862cb37106c
Moved namespace handling to lib-storage. Beginnings of namespace support for
Timo Sirainen <tss@iki.fi>
parents:
5438
diff
changeset
|
645 struct mail_namespace *ns = ctx->ns; |
6007
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
646 const char *cur_ns_prefix, *cur_ref, *const *pat, *pattern; |
4545
5ab638aafc7b
Fixes to handling INBOX in LIST.
Timo Sirainen <tss@iki.fi>
parents:
4542
diff
changeset
|
647 enum imap_match_result inbox_match; |
6007
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
648 ARRAY_DEFINE(used_patterns, const char *); |
6014
92fabfda82f9
Let lib-storage handle matching namespace prefixes as well.
Timo Sirainen <tss@iki.fi>
parents:
6009
diff
changeset
|
649 bool inboxcase; |
2350
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
650 |
5811
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
651 cur_ns_prefix = ns->prefix; |
5809 | 652 cur_ref = ctx->ref; |
653 | |
6603
afc28dd2d4c5
Added subscriptions setting to namespaces to specify if it should handle
Timo Sirainen <tss@iki.fi>
parents:
6577
diff
changeset
|
654 if ((ns->flags & NAMESPACE_FLAG_SUBSCRIPTIONS) == 0 && |
5829
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
655 (ctx->list_flags & MAILBOX_LIST_ITER_SELECT_SUBSCRIBED) != 0) { |
6603
afc28dd2d4c5
Added subscriptions setting to namespaces to specify if it should handle
Timo Sirainen <tss@iki.fi>
parents:
6577
diff
changeset
|
656 /* ignore namespaces which don't have subscriptions */ |
5818
86282604e2f5
Don't use subscriptions with hidden namespaces.
Timo Sirainen <tss@iki.fi>
parents:
5811
diff
changeset
|
657 return; |
86282604e2f5
Don't use subscriptions with hidden namespaces.
Timo Sirainen <tss@iki.fi>
parents:
5811
diff
changeset
|
658 } |
86282604e2f5
Don't use subscriptions with hidden namespaces.
Timo Sirainen <tss@iki.fi>
parents:
5811
diff
changeset
|
659 |
5811
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
660 ctx->cur_ns_skip_trailing_sep = FALSE; |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
661 |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
662 if ((ns->flags & NAMESPACE_FLAG_INBOX) != 0) |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
663 ctx->seen_inbox_namespace = TRUE; |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
664 |
6007
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
665 if (*cur_ns_prefix != '\0') { |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
666 /* namespace has a prefix. see if we can skip over it. */ |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
667 if (!skip_namespace_prefix_ref(ctx, &cur_ns_prefix, &cur_ref)) |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
668 return; |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
669 } |
2350
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
670 |
5811
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
671 inbox_match = list_use_inboxcase(ctx); |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
672 ctx->cur_ns_match_inbox = inbox_match == IMAP_MATCH_YES; |
6007
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
673 inboxcase = (inbox_match & (IMAP_MATCH_YES | IMAP_MATCH_PARENT)) != 0; |
3875
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
674 |
6007
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
675 t_array_init(&used_patterns, 16); |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
676 for (pat = ctx->patterns; *pat != NULL; pat++) { |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
677 pattern = *pat; |
6014
92fabfda82f9
Let lib-storage handle matching namespace prefixes as well.
Timo Sirainen <tss@iki.fi>
parents:
6009
diff
changeset
|
678 /* see if pattern even has a chance of matching the |
92fabfda82f9
Let lib-storage handle matching namespace prefixes as well.
Timo Sirainen <tss@iki.fi>
parents:
6009
diff
changeset
|
679 namespace prefix */ |
92fabfda82f9
Let lib-storage handle matching namespace prefixes as well.
Timo Sirainen <tss@iki.fi>
parents:
6009
diff
changeset
|
680 if (list_namespace_match_pattern(ctx, inboxcase, cur_ref, |
92fabfda82f9
Let lib-storage handle matching namespace prefixes as well.
Timo Sirainen <tss@iki.fi>
parents:
6009
diff
changeset
|
681 cur_ns_prefix, pattern)) { |
6007
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
682 pattern = mailbox_list_join_refpattern(ns->list, |
6573
c901bdf0db75
Fixes for listing namespaces with prefixes and real != virtual separator.
Timo Sirainen <tss@iki.fi>
parents:
6496
diff
changeset
|
683 ctx->ref, pattern); |
6007
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
684 array_append(&used_patterns, &pattern, 1); |
4729
5ac887e3a53d
If we had only prefixed namespaces and we listed for "%", INBOX's flags
Timo Sirainen <tss@iki.fi>
parents:
4639
diff
changeset
|
685 } |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
686 } |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
687 |
6573
c901bdf0db75
Fixes for listing namespaces with prefixes and real != virtual separator.
Timo Sirainen <tss@iki.fi>
parents:
6496
diff
changeset
|
688 if (array_count(&used_patterns) == 0) { |
8016
8b240457c4a4
LIST didn't show INBOX if list patterns didn't match namespace prefix.
Timo Sirainen <tss@iki.fi>
parents:
7808
diff
changeset
|
689 if (!ctx->cur_ns_match_inbox) { |
8b240457c4a4
LIST didn't show INBOX if list patterns didn't match namespace prefix.
Timo Sirainen <tss@iki.fi>
parents:
7808
diff
changeset
|
690 /* it's possible that the namespace prefix matched, |
8b240457c4a4
LIST didn't show INBOX if list patterns didn't match namespace prefix.
Timo Sirainen <tss@iki.fi>
parents:
7808
diff
changeset
|
691 even though its children didn't */ |
8b240457c4a4
LIST didn't show INBOX if list patterns didn't match namespace prefix.
Timo Sirainen <tss@iki.fi>
parents:
7808
diff
changeset
|
692 if (ctx->cur_ns_send_prefix) |
8461
659667d89f69
Added list=children option for namespaces.
Timo Sirainen <tss@iki.fi>
parents:
8082
diff
changeset
|
693 list_namespace_send_prefix(ctx, FALSE); |
8016
8b240457c4a4
LIST didn't show INBOX if list patterns didn't match namespace prefix.
Timo Sirainen <tss@iki.fi>
parents:
7808
diff
changeset
|
694 return; |
8b240457c4a4
LIST didn't show INBOX if list patterns didn't match namespace prefix.
Timo Sirainen <tss@iki.fi>
parents:
7808
diff
changeset
|
695 } |
8b240457c4a4
LIST didn't show INBOX if list patterns didn't match namespace prefix.
Timo Sirainen <tss@iki.fi>
parents:
7808
diff
changeset
|
696 /* we should still list INBOX */ |
8b240457c4a4
LIST didn't show INBOX if list patterns didn't match namespace prefix.
Timo Sirainen <tss@iki.fi>
parents:
7808
diff
changeset
|
697 pattern = "INBOX"; |
8b240457c4a4
LIST didn't show INBOX if list patterns didn't match namespace prefix.
Timo Sirainen <tss@iki.fi>
parents:
7808
diff
changeset
|
698 array_append(&used_patterns, &pattern, 1); |
6573
c901bdf0db75
Fixes for listing namespaces with prefixes and real != virtual separator.
Timo Sirainen <tss@iki.fi>
parents:
6496
diff
changeset
|
699 } |
6007
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
700 (void)array_append_space(&used_patterns); /* NULL-terminate */ |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
701 pat = array_idx(&used_patterns, 0); |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
702 |
5500
4862cb37106c
Moved namespace handling to lib-storage. Beginnings of namespace support for
Timo Sirainen <tss@iki.fi>
parents:
5438
diff
changeset
|
703 cur_ref = mail_namespace_fix_sep(ns, cur_ref); |
6007
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
704 ctx->list_iter = mailbox_list_iter_init_multiple(ns->list, pat, |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
705 ctx->list_flags); |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
706 } |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
707 |
5811
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
708 static void list_inbox(struct cmd_list_context *ctx) |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
709 { |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
710 const char *str; |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
711 |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
712 /* INBOX always exists */ |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
713 if (!ctx->inbox_found && ctx->cur_ns_match_inbox && |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
714 (ctx->ns->flags & NAMESPACE_FLAG_INBOX) != 0 && |
5829
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
715 (ctx->list_flags & MAILBOX_LIST_ITER_SELECT_SUBSCRIBED) == 0) { |
5811
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
716 str = t_strdup_printf("* LIST (\\Unmarked) \"%s\" \"INBOX\"", |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
717 ctx->ns->sep_str); |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
718 client_send_line(ctx->cmd->client, str); |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
719 } |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
720 } |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
721 |
3863
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3856
diff
changeset
|
722 static bool cmd_list_continue(struct client_command_context *cmd) |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
723 { |
3141
61abed5f7864
Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents:
2590
diff
changeset
|
724 struct cmd_list_context *ctx = cmd->context; |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
725 int ret; |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
726 |
4939
ff2272c228cc
Dovecot is now able to execute multiple commands at the same time.
Timo Sirainen <tss@iki.fi>
parents:
4848
diff
changeset
|
727 if (cmd->cancel) { |
5611
44db6ddd5a17
Removed mail_storage_set_list_error(). Handle the errors directly.
Timo Sirainen <tss@iki.fi>
parents:
5571
diff
changeset
|
728 if (ctx->list_iter != NULL) |
44db6ddd5a17
Removed mail_storage_set_list_error(). Handle the errors directly.
Timo Sirainen <tss@iki.fi>
parents:
5571
diff
changeset
|
729 (void)mailbox_list_iter_deinit(&ctx->list_iter); |
4939
ff2272c228cc
Dovecot is now able to execute multiple commands at the same time.
Timo Sirainen <tss@iki.fi>
parents:
4848
diff
changeset
|
730 return TRUE; |
ff2272c228cc
Dovecot is now able to execute multiple commands at the same time.
Timo Sirainen <tss@iki.fi>
parents:
4848
diff
changeset
|
731 } |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
732 for (; ctx->ns != NULL; ctx->ns = ctx->ns->next) { |
5811
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
733 if (ctx->list_iter == NULL) { |
7226
e6693a0ec8e1
Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents:
7148
diff
changeset
|
734 T_BEGIN { |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6856
diff
changeset
|
735 list_namespace_init(ctx); |
7226
e6693a0ec8e1
Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents:
7148
diff
changeset
|
736 } T_END; |
5811
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
737 if (ctx->list_iter == NULL) |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
738 continue; |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
739 } |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
740 |
7226
e6693a0ec8e1
Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents:
7148
diff
changeset
|
741 T_BEGIN { |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6856
diff
changeset
|
742 ret = list_namespace_mailboxes(ctx); |
7226
e6693a0ec8e1
Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents:
7148
diff
changeset
|
743 } T_END; |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6856
diff
changeset
|
744 if (ret < 0) { |
5611
44db6ddd5a17
Removed mail_storage_set_list_error(). Handle the errors directly.
Timo Sirainen <tss@iki.fi>
parents:
5571
diff
changeset
|
745 client_send_list_error(cmd, ctx->ns->list); |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
746 return TRUE; |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
747 } |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
748 if (ret == 0) |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
749 return FALSE; |
5811
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
750 |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
751 if (ctx->cur_ns_send_prefix) { |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
752 /* no mailboxes in this namespace */ |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
753 list_namespace_send_prefix(ctx, FALSE); |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
754 } |
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
755 list_inbox(ctx); |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
756 } |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
757 |
3141
61abed5f7864
Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents:
2590
diff
changeset
|
758 client_send_tagline(cmd, !ctx->lsub ? |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
759 "OK List completed." : |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
760 "OK Lsub completed."); |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
761 return TRUE; |
2350
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
762 } |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
763 |
5797
de3a087ea8d2
Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents:
5611
diff
changeset
|
764 static void cmd_list_ref_root(struct client *client, const char *ref) |
de3a087ea8d2
Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents:
5611
diff
changeset
|
765 { |
de3a087ea8d2
Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents:
5611
diff
changeset
|
766 struct mail_namespace *ns; |
de3a087ea8d2
Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents:
5611
diff
changeset
|
767 const char *ns_prefix; |
5802
8416f66ac5ab
Make sure all listable namespaces use the same separator. If there's no ref
Timo Sirainen <tss@iki.fi>
parents:
5800
diff
changeset
|
768 char ns_sep; |
5797
de3a087ea8d2
Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents:
5611
diff
changeset
|
769 string_t *str; |
de3a087ea8d2
Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents:
5611
diff
changeset
|
770 |
de3a087ea8d2
Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents:
5611
diff
changeset
|
771 /* Special request to return the hierarchy delimiter and mailbox root |
de3a087ea8d2
Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents:
5611
diff
changeset
|
772 name. If namespace has a prefix, it's returned as the mailbox root. |
de3a087ea8d2
Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents:
5611
diff
changeset
|
773 Otherwise we'll emulate UW-IMAP behavior. */ |
8082
db66611fd195
Added struct mail_user and fixed the code to support multiple users per process.
Timo Sirainen <tss@iki.fi>
parents:
8016
diff
changeset
|
774 ns = mail_namespace_find_visible(client->user->namespaces, &ref); |
5802
8416f66ac5ab
Make sure all listable namespaces use the same separator. If there's no ref
Timo Sirainen <tss@iki.fi>
parents:
5800
diff
changeset
|
775 if (ns != NULL) { |
5797
de3a087ea8d2
Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents:
5611
diff
changeset
|
776 ns_prefix = ns->prefix; |
5802
8416f66ac5ab
Make sure all listable namespaces use the same separator. If there's no ref
Timo Sirainen <tss@iki.fi>
parents:
5800
diff
changeset
|
777 ns_sep = ns->sep; |
8416f66ac5ab
Make sure all listable namespaces use the same separator. If there's no ref
Timo Sirainen <tss@iki.fi>
parents:
5800
diff
changeset
|
778 } else { |
5797
de3a087ea8d2
Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents:
5611
diff
changeset
|
779 ns_prefix = ""; |
8082
db66611fd195
Added struct mail_user and fixed the code to support multiple users per process.
Timo Sirainen <tss@iki.fi>
parents:
8016
diff
changeset
|
780 ns_sep = mail_namespace_get_root_sep(client->user->namespaces); |
5797
de3a087ea8d2
Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents:
5611
diff
changeset
|
781 } |
de3a087ea8d2
Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents:
5611
diff
changeset
|
782 |
de3a087ea8d2
Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents:
5611
diff
changeset
|
783 str = t_str_new(64); |
5802
8416f66ac5ab
Make sure all listable namespaces use the same separator. If there's no ref
Timo Sirainen <tss@iki.fi>
parents:
5800
diff
changeset
|
784 str_append(str, "* LIST (\\Noselect) \""); |
8416f66ac5ab
Make sure all listable namespaces use the same separator. If there's no ref
Timo Sirainen <tss@iki.fi>
parents:
5800
diff
changeset
|
785 if (ns_sep == '\\' || ns_sep == '"') |
8416f66ac5ab
Make sure all listable namespaces use the same separator. If there's no ref
Timo Sirainen <tss@iki.fi>
parents:
5800
diff
changeset
|
786 str_append_c(str, '\\'); |
8416f66ac5ab
Make sure all listable namespaces use the same separator. If there's no ref
Timo Sirainen <tss@iki.fi>
parents:
5800
diff
changeset
|
787 str_printfa(str, "%c\" ", ns_sep); |
8416f66ac5ab
Make sure all listable namespaces use the same separator. If there's no ref
Timo Sirainen <tss@iki.fi>
parents:
5800
diff
changeset
|
788 if (*ns_prefix != '\0') { |
5797
de3a087ea8d2
Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents:
5611
diff
changeset
|
789 /* non-hidden namespace, use it as the root name */ |
de3a087ea8d2
Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents:
5611
diff
changeset
|
790 imap_quote_append_string(str, ns_prefix, FALSE); |
de3a087ea8d2
Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents:
5611
diff
changeset
|
791 } else { |
5799
75e3aedc0568
Put UW-IMAP emulation back after all
Timo Sirainen <tss@iki.fi>
parents:
5797
diff
changeset
|
792 /* Hidden namespace or empty namespace prefix. We could just |
75e3aedc0568
Put UW-IMAP emulation back after all
Timo Sirainen <tss@iki.fi>
parents:
5797
diff
changeset
|
793 return an empty root name, but it's safer to emulate what |
75e3aedc0568
Put UW-IMAP emulation back after all
Timo Sirainen <tss@iki.fi>
parents:
5797
diff
changeset
|
794 UW-IMAP does. With full filesystem access this might even |
75e3aedc0568
Put UW-IMAP emulation back after all
Timo Sirainen <tss@iki.fi>
parents:
5797
diff
changeset
|
795 matter (root of "~user/mail/" is "~user/", not "") */ |
5802
8416f66ac5ab
Make sure all listable namespaces use the same separator. If there's no ref
Timo Sirainen <tss@iki.fi>
parents:
5800
diff
changeset
|
796 const char *p = strchr(ref, ns_sep); |
5797
de3a087ea8d2
Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents:
5611
diff
changeset
|
797 |
de3a087ea8d2
Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents:
5611
diff
changeset
|
798 if (p == NULL) |
de3a087ea8d2
Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents:
5611
diff
changeset
|
799 str_append(str, "\"\""); |
de3a087ea8d2
Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents:
5611
diff
changeset
|
800 else { |
de3a087ea8d2
Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents:
5611
diff
changeset
|
801 imap_quote_append_string(str, |
de3a087ea8d2
Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents:
5611
diff
changeset
|
802 t_strdup_until(ref, p + 1), |
de3a087ea8d2
Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents:
5611
diff
changeset
|
803 FALSE); |
de3a087ea8d2
Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents:
5611
diff
changeset
|
804 } |
de3a087ea8d2
Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents:
5611
diff
changeset
|
805 } |
de3a087ea8d2
Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents:
5611
diff
changeset
|
806 client_send_line(client, str_c(str)); |
de3a087ea8d2
Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents:
5611
diff
changeset
|
807 } |
de3a087ea8d2
Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents:
5611
diff
changeset
|
808 |
6418
46d9ee79f292
Removed _ prefix from all public APIs.
Timo Sirainen <tss@iki.fi>
parents:
6318
diff
changeset
|
809 bool cmd_list_full(struct client_command_context *cmd, bool lsub) |
0 | 810 { |
3141
61abed5f7864
Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents:
2590
diff
changeset
|
811 struct client *client = cmd->client; |
6007
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
812 const struct imap_arg *args, *arg; |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
813 struct cmd_list_context *ctx; |
6007
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
814 ARRAY_DEFINE(patterns, const char *) = ARRAY_INIT; |
6017 | 815 const char *pattern, *const *patterns_strarr; |
0 | 816 |
5829
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
817 /* [(<selection options>)] <reference> <pattern>|(<pattern list>) |
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
818 [RETURN (<return options>)] */ |
3141
61abed5f7864
Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents:
2590
diff
changeset
|
819 if (!client_read_args(cmd, 0, 0, &args)) |
0 | 820 return FALSE; |
821 | |
6017 | 822 ctx = p_new(cmd->pool, struct cmd_list_context, 1); |
823 ctx->cmd = cmd; | |
8082
db66611fd195
Added struct mail_user and fixed the code to support multiple users per process.
Timo Sirainen <tss@iki.fi>
parents:
8016
diff
changeset
|
824 ctx->ns = client->user->namespaces; |
6017 | 825 ctx->lsub = lsub; |
826 | |
827 cmd->context = ctx; | |
828 | |
5832
1d91d36e14a4
Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents:
5829
diff
changeset
|
829 if (args[0].type == IMAP_ARG_LIST && !lsub) { |
1d91d36e14a4
Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents:
5829
diff
changeset
|
830 /* LIST-EXTENDED selection options */ |
6017 | 831 ctx->used_listext = TRUE; |
832 if (!parse_select_flags(ctx, IMAP_ARG_LIST_ARGS(&args[0]))) | |
5832
1d91d36e14a4
Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents:
5829
diff
changeset
|
833 return TRUE; |
1d91d36e14a4
Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents:
5829
diff
changeset
|
834 args++; |
1d91d36e14a4
Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents:
5829
diff
changeset
|
835 } |
1d91d36e14a4
Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents:
5829
diff
changeset
|
836 |
6017 | 837 ctx->ref = imap_arg_string(&args[0]); |
838 if (ctx->ref == NULL) { | |
5832
1d91d36e14a4
Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents:
5829
diff
changeset
|
839 /* broken */ |
6017 | 840 client_send_command_error(cmd, "Invalid reference."); |
841 return TRUE; | |
842 } | |
843 if (args[1].type == IMAP_ARG_LIST) { | |
844 ctx->used_listext = TRUE; | |
6007
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
845 /* convert pattern list to string array */ |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
846 p_array_init(&patterns, cmd->pool, |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
847 IMAP_ARG_LIST_COUNT(&args[1])); |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
848 arg = IMAP_ARG_LIST_ARGS(&args[1]); |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
849 for (; arg->type != IMAP_ARG_EOL; arg++) { |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
850 if (!IMAP_ARG_TYPE_IS_STRING(arg->type)) { |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
851 /* broken */ |
6017 | 852 client_send_command_error(cmd, |
853 "Invalid pattern list."); | |
854 return TRUE; | |
6007
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
855 } |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
856 pattern = imap_arg_string(arg); |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
857 array_append(&patterns, &pattern, 1); |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
858 } |
5832
1d91d36e14a4
Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents:
5829
diff
changeset
|
859 args += 2; |
1d91d36e14a4
Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents:
5829
diff
changeset
|
860 } else { |
5839
978722ad6184
s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents:
5836
diff
changeset
|
861 pattern = imap_arg_string(&args[1]); |
6017 | 862 if (pattern == NULL) { |
863 client_send_command_error(cmd, "Invalid pattern."); | |
864 return TRUE; | |
6007
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
865 } |
6017 | 866 |
867 p_array_init(&patterns, cmd->pool, 1); | |
868 array_append(&patterns, &pattern, 1); | |
5832
1d91d36e14a4
Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents:
5829
diff
changeset
|
869 args += 2; |
6017 | 870 |
871 if (lsub) { | |
872 size_t len = strlen(pattern); | |
873 ctx->lsub_no_unsubscribed = len == 0 || | |
874 pattern[len-1] != '%'; | |
875 } | |
5832
1d91d36e14a4
Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents:
5829
diff
changeset
|
876 } |
1d91d36e14a4
Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents:
5829
diff
changeset
|
877 |
1d91d36e14a4
Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents:
5829
diff
changeset
|
878 if (args[0].type == IMAP_ARG_ATOM && args[1].type == IMAP_ARG_LIST && |
1d91d36e14a4
Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents:
5829
diff
changeset
|
879 strcasecmp(imap_arg_string(&args[0]), "RETURN") == 0) { |
1d91d36e14a4
Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents:
5829
diff
changeset
|
880 /* LIST-EXTENDED return options */ |
6017 | 881 ctx->used_listext = TRUE; |
882 if (!parse_return_flags(ctx, IMAP_ARG_LIST_ARGS(&args[1]))) | |
5832
1d91d36e14a4
Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents:
5829
diff
changeset
|
883 return TRUE; |
1d91d36e14a4
Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents:
5829
diff
changeset
|
884 args += 2; |
1d91d36e14a4
Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents:
5829
diff
changeset
|
885 } |
1d91d36e14a4
Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents:
5829
diff
changeset
|
886 |
7492
ae8a3595d707
LIST-EXTENDED options were ignored.
Timo Sirainen <tss@iki.fi>
parents:
7255
diff
changeset
|
887 ctx->list_flags |= MAILBOX_LIST_ITER_VIRTUAL_NAMES; |
1895
bbdce1697239
LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents:
1890
diff
changeset
|
888 if (lsub) { |
bbdce1697239
LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents:
1890
diff
changeset
|
889 /* LSUB - we don't care about flags */ |
6639
e1fde9940f7e
Fixes to handling namespace prefixes and real!=virtual separator. Added a
Timo Sirainen <tss@iki.fi>
parents:
6603
diff
changeset
|
890 ctx->list_flags |= MAILBOX_LIST_ITER_SELECT_SUBSCRIBED | |
5829
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
891 MAILBOX_LIST_ITER_SELECT_RECURSIVEMATCH | |
1d73153584d2
Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents:
5818
diff
changeset
|
892 MAILBOX_LIST_ITER_RETURN_NO_FLAGS; |
6017 | 893 } else if (!ctx->used_listext) { |
5832
1d91d36e14a4
Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents:
5829
diff
changeset
|
894 /* non-extended LIST - return children flags always */ |
6639
e1fde9940f7e
Fixes to handling namespace prefixes and real!=virtual separator. Added a
Timo Sirainen <tss@iki.fi>
parents:
6603
diff
changeset
|
895 ctx->list_flags |= MAILBOX_LIST_ITER_RETURN_CHILDREN; |
1244
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
896 } |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
897 |
6017 | 898 if (args[0].type != IMAP_ARG_EOL) { |
899 client_send_command_error(cmd, "Extra arguments."); | |
1244
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
900 return TRUE; |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
901 } |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
902 |
6007
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
903 (void)array_append_space(&patterns); /* NULL-terminate */ |
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
904 patterns_strarr = array_idx(&patterns, 0); |
6017 | 905 if (!ctx->used_listext && !lsub && *patterns_strarr[0] == '\0') { |
6007
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
906 /* Only LIST ref "" gets us here */ |
6017 | 907 cmd_list_ref_root(client, ctx->ref); |
3141
61abed5f7864
Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents:
2590
diff
changeset
|
908 client_send_tagline(cmd, "OK List completed."); |
2350
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
909 } else { |
6007
cc1f4688a988
Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents:
5841
diff
changeset
|
910 ctx->patterns = patterns_strarr; |
5811
e0b451e0c190
Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
5809
diff
changeset
|
911 p_array_init(&ctx->ns_prefixes_listed, cmd->pool, 8); |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
912 |
3141
61abed5f7864
Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents:
2590
diff
changeset
|
913 if (!cmd_list_continue(cmd)) { |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
914 /* unfinished */ |
7148
5e3188213724
Added "command state" for running commands. Use it instead of some bitfields
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
915 cmd->state = CLIENT_COMMAND_STATE_WAIT_OUTPUT; |
3141
61abed5f7864
Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents:
2590
diff
changeset
|
916 cmd->func = cmd_list_continue; |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
917 return FALSE; |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
918 } |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
919 |
3141
61abed5f7864
Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents:
2590
diff
changeset
|
920 cmd->context = NULL; |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
921 return TRUE; |
0 | 922 } |
923 return TRUE; | |
924 } | |
925 | |
3863
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3856
diff
changeset
|
926 bool cmd_list(struct client_command_context *cmd) |
0 | 927 { |
6418
46d9ee79f292
Removed _ prefix from all public APIs.
Timo Sirainen <tss@iki.fi>
parents:
6318
diff
changeset
|
928 return cmd_list_full(cmd, FALSE); |
0 | 929 } |