annotate src/imap/cmd-list.c @ 6856:a249d916f6e6 HEAD

If client tries to use unknown list-extended options, fail with BAD.
author Timo Sirainen <tss@iki.fi>
date Sun, 25 Nov 2007 15:05:31 +0200
parents e1fde9940f7e
children 414c9d631a81
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6429
65c69a53a7be Replaced my Copyright notices. The year range always ends with 2007 now.
Timo Sirainen <tss@iki.fi>
parents: 6418
diff changeset
1 /* Copyright (c) 2002-2007 Dovecot authors, see the included COPYING file */
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
406c9a863f26 Compiler warning fixes
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
fd21588ef7aa LSUB \Noselect fix
Timo Sirainen <tss@iki.fi>
parents: 5832
diff changeset
53 if ((flags & MAILBOX_CHILD_SUBSCRIBED) != 0 &&
fd21588ef7aa LSUB \Noselect fix
Timo Sirainen <tss@iki.fi>
parents: 5832
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
78 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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)
1d73153584d2 Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents: 5818
diff changeset
88 str_append(str, " (\"CHILDINFO\" (\"SUBSCRIBED\"))");
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
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
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
406c9a863f26 Compiler warning fixes
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
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
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
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
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
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
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
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
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
122 if ((list_flags & MAILBOX_LIST_ITER_SELECT_RECURSIVEMATCH) != 0 &&
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
123 (list_flags & MAILBOX_LIST_ITER_SELECT_SUBSCRIBED) == 0) {
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
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
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
128
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
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
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
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
406c9a863f26 Compiler warning fixes
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
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
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
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
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
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
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
151 list_flags |= MAILBOX_LIST_ITER_RETURN_CHILDREN;
6018
b148e4c41aa7 Added X-STATUS (..) return option to send STATUS replies to client for
Timo Sirainen <tss@iki.fi>
parents: 6017
diff changeset
152 else if (strcasecmp(atom, "X-STATUS") == 0 &&
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
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
168
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
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 */
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
188 ns = mail_namespace_find_inbox(ctx->cmd->client->namespaces);
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
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
217 static void
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
218 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
219 {
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
220 struct mail_namespace *const *listed;
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
221 unsigned int i, count, len;
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
222 enum mailbox_info_flags flags;
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
223 const char *name;
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
224 string_t *str;
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
225
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
226 ctx->cur_ns_send_prefix = FALSE;
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
227
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
228 /* 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
229 namespace */
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
230 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
231 for (i = 0; i < count; i++) {
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
232 if (listed[i] == ctx->ns)
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
233 return;
3856
b97de2e354bd Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 3305
diff changeset
234 }
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
235
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
236 len = strlen(ctx->ns->prefix);
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
237 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
238 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
239 /* 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
240 if (ctx->inbox_found) {
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
241 /* 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
242 return;
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
243 }
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 ctx->inbox_found = TRUE;
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
246 flags = list_get_inbox_flags(ctx);
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
247 } else {
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
248 flags = MAILBOX_NONEXISTENT;
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
249 }
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
250
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
251 if ((flags & MAILBOX_CHILDREN) == 0) {
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
252 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
253 flags |= MAILBOX_CHILDREN;
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
254 flags &= ~MAILBOX_NOCHILDREN;
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
255 } else {
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
256 flags |= MAILBOX_NOCHILDREN;
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
257 }
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
258 }
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
259
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
260 name = ctx->cur_ns_skip_trailing_sep ?
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
261 t_strndup(ctx->ns->prefix, len-1) : ctx->ns->prefix;
5829
1d73153584d2 Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents: 5818
diff changeset
262
1d73153584d2 Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents: 5818
diff changeset
263 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
264 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
265 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
266 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
267 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
268 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
269
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
270 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
271 }
b97de2e354bd Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 3305
diff changeset
272
6018
b148e4c41aa7 Added X-STATUS (..) return option to send STATUS replies to client for
Timo Sirainen <tss@iki.fi>
parents: 6017
diff changeset
273 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
274 {
b148e4c41aa7 Added X-STATUS (..) return option to send STATUS replies to client for
Timo Sirainen <tss@iki.fi>
parents: 6017
diff changeset
275 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
276 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
277 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
278
b148e4c41aa7 Added X-STATUS (..) return option to send STATUS replies to client for
Timo Sirainen <tss@iki.fi>
parents: 6017
diff changeset
279 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
280 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
281
b148e4c41aa7 Added X-STATUS (..) return option to send STATUS replies to client for
Timo Sirainen <tss@iki.fi>
parents: 6017
diff changeset
282 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
283 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
284 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
285 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
286 return;
b148e4c41aa7 Added X-STATUS (..) return option to send STATUS replies to client for
Timo Sirainen <tss@iki.fi>
parents: 6017
diff changeset
287 }
b148e4c41aa7 Added X-STATUS (..) return option to send STATUS replies to client for
Timo Sirainen <tss@iki.fi>
parents: 6017
diff changeset
288
b148e4c41aa7 Added X-STATUS (..) return option to send STATUS replies to client for
Timo Sirainen <tss@iki.fi>
parents: 6017
diff changeset
289 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
290 }
b148e4c41aa7 Added X-STATUS (..) return option to send STATUS replies to client for
Timo Sirainen <tss@iki.fi>
parents: 6017
diff changeset
291
2350
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
292 static int
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
293 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
294 {
5807
ec09ad1d017f mailbox_list_iter_next() returns now const pointer.
Timo Sirainen <tss@iki.fi>
parents: 5806
diff changeset
295 const struct mailbox_info *info;
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
296 struct mail_namespace *ns;
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
297 enum mailbox_info_flags flags;
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
298 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
299 const char *name;
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents: 4729
diff changeset
300 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
301
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
302 t_push();
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
303 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
304 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
305 while ((info = mailbox_list_iter_next(ctx->list_iter)) != NULL) {
6014
92fabfda82f9 Let lib-storage handle matching namespace prefixes as well.
Timo Sirainen <tss@iki.fi>
parents: 6009
diff changeset
306 if (ctx->ns->sep == ctx->ns->real_sep)
92fabfda82f9 Let lib-storage handle matching namespace prefixes as well.
Timo Sirainen <tss@iki.fi>
parents: 6009
diff changeset
307 name = info->name;
92fabfda82f9 Let lib-storage handle matching namespace prefixes as well.
Timo Sirainen <tss@iki.fi>
parents: 6009
diff changeset
308 else {
92fabfda82f9 Let lib-storage handle matching namespace prefixes as well.
Timo Sirainen <tss@iki.fi>
parents: 6009
diff changeset
309 char *p;
5806
3704fe78f2f9 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5803
diff changeset
310
6014
92fabfda82f9 Let lib-storage handle matching namespace prefixes as well.
Timo Sirainen <tss@iki.fi>
parents: 6009
diff changeset
311 str_truncate(name_str, 0);
92fabfda82f9 Let lib-storage handle matching namespace prefixes as well.
Timo Sirainen <tss@iki.fi>
parents: 6009
diff changeset
312 str_append(name_str, info->name);
92fabfda82f9 Let lib-storage handle matching namespace prefixes as well.
Timo Sirainen <tss@iki.fi>
parents: 6009
diff changeset
313 for (p = str_c_modifiable(name_str); *p != '\0'; p++) {
2425
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
314 if (*p == ctx->ns->real_sep)
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
315 *p = ctx->ns->sep;
2350
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
316 }
6014
92fabfda82f9 Let lib-storage handle matching namespace prefixes as well.
Timo Sirainen <tss@iki.fi>
parents: 6009
diff changeset
317 name = str_c(name_str);
2350
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
318 }
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
319 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
320
4639
47531abcf691 Handle INBOX-prefixed namespaces better. Avoid duplicate INBOX replies if
Timo Sirainen <tss@iki.fi>
parents: 4546
diff changeset
321 if (strcasecmp(name, "INBOX") == 0) {
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
322 if (ctx->inbox_found) {
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
323 /* 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
324 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
325 continue;
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
326 }
6318
5313cbcfccc6 Don't crash if mailbox named INBOX is listed in prefixless namespace, but
Timo Sirainen <tss@iki.fi>
parents: 6018
diff changeset
327 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
328 /* 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
329 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
330 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
331 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
332 continue;
5313cbcfccc6 Don't crash if mailbox named INBOX is listed in prefixless namespace, but
Timo Sirainen <tss@iki.fi>
parents: 6018
diff changeset
333 }
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
334 ctx->inbox_found = TRUE;
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
335 }
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
336 if (ctx->cur_ns_send_prefix)
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
337 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
338
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
339 /* 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
340 having children */
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
341 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
342 if (ns != NULL) {
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
343 flags |= MAILBOX_CHILDREN;
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
344 flags &= ~MAILBOX_NOCHILDREN;
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
345 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
346 }
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
347
6009
62f92a68fc72 LSUB: If pattern doesn't end with %, don't show extra unsubscribed mailboxes
Timo Sirainen <tss@iki.fi>
parents: 6007
diff changeset
348 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
349 (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
350 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
351 /* 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
352 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
353 continue;
62f92a68fc72 LSUB: If pattern doesn't end with %, don't show extra unsubscribed mailboxes
Timo Sirainen <tss@iki.fi>
parents: 6007
diff changeset
354 }
62f92a68fc72 LSUB: If pattern doesn't end with %, don't show extra unsubscribed mailboxes
Timo Sirainen <tss@iki.fi>
parents: 6007
diff changeset
355
2350
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
356 str_truncate(str, 0);
5314
ce59b45431fb Use less memory when listing lots of mailboxes
Timo Sirainen <tss@iki.fi>
parents: 5307
diff changeset
357 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
358 mailbox_flags2str(ctx, str, flags);
5314
ce59b45431fb Use less memory when listing lots of mailboxes
Timo Sirainen <tss@iki.fi>
parents: 5307
diff changeset
359 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
360 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
361 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
362
6018
b148e4c41aa7 Added X-STATUS (..) return option to send STATUS replies to client for
Timo Sirainen <tss@iki.fi>
parents: 6017
diff changeset
363 if (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
364 (flags & (MAILBOX_NONEXISTENT | MAILBOX_NOSELECT)) == 0)
b148e4c41aa7 Added X-STATUS (..) return option to send STATUS replies to client for
Timo Sirainen <tss@iki.fi>
parents: 6017
diff changeset
365 list_send_status(ctx, name);
b148e4c41aa7 Added X-STATUS (..) return option to send STATUS replies to client for
Timo Sirainen <tss@iki.fi>
parents: 6017
diff changeset
366
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
367 if (client_send_line(ctx->cmd->client, str_c(str)) == 0) {
2425
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
368 /* 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
369 t_pop();
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
370 return 0;
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
371 }
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
5611
44db6ddd5a17 Removed mail_storage_set_list_error(). Handle the errors directly.
Timo Sirainen <tss@iki.fi>
parents: 5571
diff changeset
374 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
375 ret = -1;
2350
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
376
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents: 4729
diff changeset
377 t_pop();
2425
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
378 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
379 }
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
380
5839
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
381 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
382 {
5839
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
383 for (; *pattern != '\0'; pattern++) {
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
384 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
385 return TRUE;
e5abc07d843f Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
386 }
e5abc07d843f Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
387 return FALSE;
e5abc07d843f Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
388 }
e5abc07d843f Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
389
e5abc07d843f Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
390 static void
5839
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
391 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
392 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
393 {
5839
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
394 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
395 bool match;
2350
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
396
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
397 prefix_len = strlen(*prefix);
5839
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
398 pattern_len = strlen(*pattern);
3856
b97de2e354bd Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 3305
diff changeset
399
5839
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
400 if (pattern_len < prefix_len) {
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
401 /* eg. namespace prefix = "INBOX.", pattern = "INBOX" */
3856
b97de2e354bd Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 3305
diff changeset
402 return;
b97de2e354bd Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 3305
diff changeset
403 }
2350
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
404
5839
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
405 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
406 if (!match && inbox_check) {
3856
b97de2e354bd Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 3305
diff changeset
407 /* try INBOX check. */
b97de2e354bd Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 3305
diff changeset
408 match = prefix_len >= 5 &&
5839
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
409 strncasecmp(*prefix, *pattern, 5) == 0 &&
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
410 strncmp(*prefix + 5, *pattern + 5,
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
411 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
412 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
413 ((*prefix)[5] == sep || (*prefix)[5] == '\0');
3856
b97de2e354bd Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 3305
diff changeset
414 }
b97de2e354bd Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 3305
diff changeset
415
b97de2e354bd Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 3305
diff changeset
416 if (match) {
b97de2e354bd Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 3305
diff changeset
417 *prefix += prefix_len;
5839
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
418 *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
419 }
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
420 }
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
421
5803
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
422 static bool
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
423 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
424 const char **cur_ns_prefix_p,
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
425 const char **cur_ref_p)
5803
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
426 {
5809
ab88a5e8ac95 Fixes for last changes.
Timo Sirainen <tss@iki.fi>
parents: 5808
diff changeset
427 const char *cur_ns_prefix = *cur_ns_prefix_p;
ab88a5e8ac95 Fixes for last changes.
Timo Sirainen <tss@iki.fi>
parents: 5808
diff changeset
428 const char *cur_ref = *cur_ref_p;
5803
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
429
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
430 if (*cur_ref != '\0') {
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
431 /* reference argument given. skip namespace prefix using it.
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
432
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
433 cur_ns_prefix = foo/bar/
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
434 cur_ref = foo/
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
435 -> cur_ns_prefix=bar/, cur_ref=""
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
436 cur_ref = foo/bar/baz
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
437 -> cur_ns_prefix="", cur_ref="baz"
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
438 */
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
439 skip_namespace_prefix(&cur_ns_prefix, &cur_ref, TRUE,
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
440 ctx->ns->sep);
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
441
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
442 if (*cur_ref != '\0' && *cur_ns_prefix != '\0') {
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
443 /* reference parameter didn't match with
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
444 namespace prefix. skip this. */
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
445 return FALSE;
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
446 }
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
447 }
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
448
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
449 *cur_ns_prefix_p = cur_ns_prefix;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
450 *cur_ref_p = cur_ref;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
451 return TRUE;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
452 }
5803
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
453
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
454 static void
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
455 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
456 const char **cur_ns_prefix_p,
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
457 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
458 {
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
459 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
460 const char *cur_pattern = *cur_pattern_p;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
461 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
462 const char *old_pattern = cur_pattern;
5803
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
463
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
464 if (*cur_ns_prefix == '\0')
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
465 return;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
466
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
467 /* skip namespace prefix using pattern */
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
468 i_assert(*cur_ref == '\0');
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
469
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
470 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
471 cur_ref == ctx->ref, ctx->ns->sep);
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
472
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
473 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
474 /* trying to list the namespace prefix itself. */
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
475 cur_ns_prefix = old_ns_prefix;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
476 cur_pattern = old_pattern;
5803
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
477 }
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
478
5809
ab88a5e8ac95 Fixes for last changes.
Timo Sirainen <tss@iki.fi>
parents: 5808
diff changeset
479 *cur_ns_prefix_p = cur_ns_prefix;
5839
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
480 *cur_pattern_p = cur_pattern;
5803
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
481 }
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
482
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
483 static enum imap_match_result
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
484 list_use_inboxcase(struct cmd_list_context *ctx)
5803
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
485 {
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
486 struct imap_match_glob *inbox_glob;
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
487 const char *const *pat;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
488 enum imap_match_result match, ret;
5803
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
489
5808
45735dd11f17 Moved several namespace booleans to a flags field. Removed unused
Timo Sirainen <tss@iki.fi>
parents: 5807
diff changeset
490 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
491 (ctx->ns->flags & NAMESPACE_FLAG_INBOX) == 0)
5803
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
492 return IMAP_MATCH_NO;
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
493
5839
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
494 /* if the original reference and pattern combined produces something
5803
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
495 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
496 ret = IMAP_MATCH_NO;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
497 for (pat = ctx->patterns; *pat != NULL; pat++) {
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
498 t_push();
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
499 inbox_glob =
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
500 imap_match_init(pool_datastack_create(),
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
501 t_strconcat(ctx->ref, *pat, NULL),
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
502 TRUE, ctx->ns->sep);
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
503 match = imap_match(inbox_glob, "INBOX");
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
504 t_pop();
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
505
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
506 if (match == IMAP_MATCH_YES)
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
507 return IMAP_MATCH_YES;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
508 if ((match & IMAP_MATCH_PARENT) != 0)
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
509 ret = IMAP_MATCH_PARENT;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
510 }
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
511 return ret;
5803
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
512 }
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
513
6014
92fabfda82f9 Let lib-storage handle matching namespace prefixes as well.
Timo Sirainen <tss@iki.fi>
parents: 6009
diff changeset
514 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
515 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
516 {
5b2ff32877d4 Send namespace prefix LIST reply for list=no namespaces also if doing LIST
Timo Sirainen <tss@iki.fi>
parents: 6573
diff changeset
517 /* 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
518 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
519 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
520
5b2ff32877d4 Send namespace prefix LIST reply for list=no namespaces also if doing LIST
Timo Sirainen <tss@iki.fi>
parents: 6573
diff changeset
521 /* send the prefix if namespace is listable.. */
5b2ff32877d4 Send namespace prefix LIST reply for list=no namespaces also if doing LIST
Timo Sirainen <tss@iki.fi>
parents: 6573
diff changeset
522 if ((ctx->ns->flags & NAMESPACE_FLAG_LIST) != 0)
5b2ff32877d4 Send namespace prefix LIST reply for list=no namespaces also if doing LIST
Timo Sirainen <tss@iki.fi>
parents: 6573
diff changeset
523 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
524
5b2ff32877d4 Send namespace prefix LIST reply for list=no namespaces also if doing LIST
Timo Sirainen <tss@iki.fi>
parents: 6573
diff changeset
525 /* ..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
526 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
527 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
528 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
529 break;
5b2ff32877d4 Send namespace prefix LIST reply for list=no namespaces also if doing LIST
Timo Sirainen <tss@iki.fi>
parents: 6573
diff changeset
530 }
5b2ff32877d4 Send namespace prefix LIST reply for list=no namespaces also if doing LIST
Timo Sirainen <tss@iki.fi>
parents: 6573
diff changeset
531 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
532 }
5b2ff32877d4 Send namespace prefix LIST reply for list=no namespaces also if doing LIST
Timo Sirainen <tss@iki.fi>
parents: 6573
diff changeset
533
5b2ff32877d4 Send namespace prefix LIST reply for list=no namespaces also if doing LIST
Timo Sirainen <tss@iki.fi>
parents: 6573
diff changeset
534 static bool
6014
92fabfda82f9 Let lib-storage handle matching namespace prefixes as well.
Timo Sirainen <tss@iki.fi>
parents: 6009
diff changeset
535 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
536 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
537 const char *cur_pattern)
5803
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
538 {
6014
92fabfda82f9 Let lib-storage handle matching namespace prefixes as well.
Timo Sirainen <tss@iki.fi>
parents: 6009
diff changeset
539 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
540 struct mail_namespace *ns = ctx->ns;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
541 struct imap_match_glob *pat_glob;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
542 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
543 const char *p;
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
544 size_t len;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
545
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
546 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
547 cur_ref, &cur_pattern);
6014
92fabfda82f9 Let lib-storage handle matching namespace prefixes as well.
Timo Sirainen <tss@iki.fi>
parents: 6009
diff changeset
548 if (*cur_ns_prefix == '\0')
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
549 return TRUE;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
550
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
551 /* 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
552 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
553 Check that pattern matches namespace prefix. */
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
554 i_assert(*cur_ref == '\0');
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
555
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
556 /* drop the trailing separator in namespace prefix.
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
557 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
558 (LIST "" foo/ needs to return "foo/" entry) */
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
559 len = strlen(cur_ns_prefix);
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
560 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
561 strcmp(cur_pattern, cur_ns_prefix) != 0) {
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
562 ctx->cur_ns_skip_trailing_sep = TRUE;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
563 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
564 }
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
565
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
566 /* hidden and non-listable namespaces are invisible to wildcards */
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
567 if ((ns->flags & NAMESPACE_FLAG_LIST) == 0 &&
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
568 list_pattern_has_wildcards(cur_pattern))
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
569 return FALSE;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
570
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
571 /* 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
572 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
573 inboxcase, ns->sep);
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
574 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
575 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
576 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
577 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
578
6573
c901bdf0db75 Fixes for listing namespaces with prefixes and real != virtual separator.
Timo Sirainen <tss@iki.fi>
parents: 6496
diff changeset
579 /* 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
580 check our children too */
c901bdf0db75 Fixes for listing namespaces with prefixes and real != virtual separator.
Timo Sirainen <tss@iki.fi>
parents: 6496
diff changeset
581 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
582 if (*p == '*')
c901bdf0db75 Fixes for listing namespaces with prefixes and real != virtual separator.
Timo Sirainen <tss@iki.fi>
parents: 6496
diff changeset
583 return TRUE;
c901bdf0db75 Fixes for listing namespaces with prefixes and real != virtual separator.
Timo Sirainen <tss@iki.fi>
parents: 6496
diff changeset
584 }
c901bdf0db75 Fixes for listing namespaces with prefixes and real != virtual separator.
Timo Sirainen <tss@iki.fi>
parents: 6496
diff changeset
585 }
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
586
6573
c901bdf0db75 Fixes for listing namespaces with prefixes and real != virtual separator.
Timo Sirainen <tss@iki.fi>
parents: 6496
diff changeset
587 return (match & IMAP_MATCH_CHILDREN) != 0;
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
588 }
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
589
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
590 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
591 {
5500
4862cb37106c Moved namespace handling to lib-storage. Beginnings of namespace support for
Timo Sirainen <tss@iki.fi>
parents: 5438
diff changeset
592 struct mail_namespace *ns = ctx->ns;
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
593 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
594 enum imap_match_result inbox_match;
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
595 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
596 bool inboxcase;
2350
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
597
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
598 cur_ns_prefix = ns->prefix;
5809
ab88a5e8ac95 Fixes for last changes.
Timo Sirainen <tss@iki.fi>
parents: 5808
diff changeset
599 cur_ref = ctx->ref;
ab88a5e8ac95 Fixes for last changes.
Timo Sirainen <tss@iki.fi>
parents: 5808
diff changeset
600
6603
afc28dd2d4c5 Added subscriptions setting to namespaces to specify if it should handle
Timo Sirainen <tss@iki.fi>
parents: 6577
diff changeset
601 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
602 (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
603 /* 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
604 return;
86282604e2f5 Don't use subscriptions with hidden namespaces.
Timo Sirainen <tss@iki.fi>
parents: 5811
diff changeset
605 }
86282604e2f5 Don't use subscriptions with hidden namespaces.
Timo Sirainen <tss@iki.fi>
parents: 5811
diff changeset
606
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
607 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
608
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
609 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
610 ctx->seen_inbox_namespace = TRUE;
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
611
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
612 if (*cur_ns_prefix != '\0') {
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
613 /* 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
614 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
615 return;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
616 }
2350
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
617
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
618 inbox_match = list_use_inboxcase(ctx);
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
619 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
620 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
621
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
622 t_array_init(&used_patterns, 16);
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
623 for (pat = ctx->patterns; *pat != NULL; pat++) {
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
624 pattern = *pat;
6014
92fabfda82f9 Let lib-storage handle matching namespace prefixes as well.
Timo Sirainen <tss@iki.fi>
parents: 6009
diff changeset
625 /* 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
626 namespace prefix */
92fabfda82f9 Let lib-storage handle matching namespace prefixes as well.
Timo Sirainen <tss@iki.fi>
parents: 6009
diff changeset
627 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
628 cur_ns_prefix, pattern)) {
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
629 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
630 ctx->ref, pattern);
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
631 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
632 }
2425
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
633 }
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
634
6573
c901bdf0db75 Fixes for listing namespaces with prefixes and real != virtual separator.
Timo Sirainen <tss@iki.fi>
parents: 6496
diff changeset
635 if (array_count(&used_patterns) == 0) {
c901bdf0db75 Fixes for listing namespaces with prefixes and real != virtual separator.
Timo Sirainen <tss@iki.fi>
parents: 6496
diff changeset
636 /* it's possible that the namespace prefix matched,
c901bdf0db75 Fixes for listing namespaces with prefixes and real != virtual separator.
Timo Sirainen <tss@iki.fi>
parents: 6496
diff changeset
637 even though its children didn't */
c901bdf0db75 Fixes for listing namespaces with prefixes and real != virtual separator.
Timo Sirainen <tss@iki.fi>
parents: 6496
diff changeset
638 if (ctx->cur_ns_send_prefix)
c901bdf0db75 Fixes for listing namespaces with prefixes and real != virtual separator.
Timo Sirainen <tss@iki.fi>
parents: 6496
diff changeset
639 list_namespace_send_prefix(ctx, TRUE);
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
640 return;
6573
c901bdf0db75 Fixes for listing namespaces with prefixes and real != virtual separator.
Timo Sirainen <tss@iki.fi>
parents: 6496
diff changeset
641 }
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
642 (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
643 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
644
5500
4862cb37106c Moved namespace handling to lib-storage. Beginnings of namespace support for
Timo Sirainen <tss@iki.fi>
parents: 5438
diff changeset
645 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
646 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
647 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
648 }
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
649
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
650 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
651 {
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
652 const char *str;
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
653
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
654 /* INBOX always exists */
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
655 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
656 (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
657 (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
658 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
659 ctx->ns->sep_str);
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
660 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
661 }
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
662 }
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
663
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
664 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
665 {
3141
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 2590
diff changeset
666 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
667 int ret;
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
668
4939
ff2272c228cc Dovecot is now able to execute multiple commands at the same time.
Timo Sirainen <tss@iki.fi>
parents: 4848
diff changeset
669 if (cmd->cancel) {
5611
44db6ddd5a17 Removed mail_storage_set_list_error(). Handle the errors directly.
Timo Sirainen <tss@iki.fi>
parents: 5571
diff changeset
670 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
671 (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
672 return TRUE;
ff2272c228cc Dovecot is now able to execute multiple commands at the same time.
Timo Sirainen <tss@iki.fi>
parents: 4848
diff changeset
673 }
2425
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
674 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
675 if (ctx->list_iter == NULL) {
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
676 t_push();
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
677 list_namespace_init(ctx);
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
678 t_pop();
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
679 if (ctx->list_iter == NULL)
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
680 continue;
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
681 }
2425
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
682
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
683 if ((ret = list_namespace_mailboxes(ctx)) < 0) {
5611
44db6ddd5a17 Removed mail_storage_set_list_error(). Handle the errors directly.
Timo Sirainen <tss@iki.fi>
parents: 5571
diff changeset
684 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
685 return TRUE;
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 if (ret == 0)
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
688 return FALSE;
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
689
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
690 if (ctx->cur_ns_send_prefix) {
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
691 /* no mailboxes in this namespace */
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
692 list_namespace_send_prefix(ctx, FALSE);
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
693 }
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
694 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
695 }
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
696
3141
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 2590
diff changeset
697 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
698 "OK List completed." :
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
699 "OK Lsub completed.");
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
700 return TRUE;
2350
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
701 }
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
702
5797
de3a087ea8d2 Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents: 5611
diff changeset
703 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
704 {
de3a087ea8d2 Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents: 5611
diff changeset
705 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
706 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
707 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
708 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
709
de3a087ea8d2 Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents: 5611
diff changeset
710 /* 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
711 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
712 Otherwise we'll emulate UW-IMAP behavior. */
de3a087ea8d2 Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents: 5611
diff changeset
713 ns = mail_namespace_find_visible(client->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
714 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
715 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
716 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
717 } 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
718 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
719 ns_sep = mail_namespace_get_root_sep(client->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
720 }
de3a087ea8d2 Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents: 5611
diff changeset
721
de3a087ea8d2 Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents: 5611
diff changeset
722 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
723 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
724 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
725 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
726 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
727 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
728 /* 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
729 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
730 } else {
5799
75e3aedc0568 Put UW-IMAP emulation back after all
Timo Sirainen <tss@iki.fi>
parents: 5797
diff changeset
731 /* 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
732 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
733 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
734 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
735 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
736
de3a087ea8d2 Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents: 5611
diff changeset
737 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
738 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
739 else {
de3a087ea8d2 Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents: 5611
diff changeset
740 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
741 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
742 FALSE);
de3a087ea8d2 Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents: 5611
diff changeset
743 }
de3a087ea8d2 Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents: 5611
diff changeset
744 }
de3a087ea8d2 Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents: 5611
diff changeset
745 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
746 }
de3a087ea8d2 Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents: 5611
diff changeset
747
6418
46d9ee79f292 Removed _ prefix from all public APIs.
Timo Sirainen <tss@iki.fi>
parents: 6318
diff changeset
748 bool cmd_list_full(struct client_command_context *cmd, bool lsub)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
749 {
3141
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 2590
diff changeset
750 struct client *client = cmd->client;
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
751 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
752 struct cmd_list_context *ctx;
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
753 ARRAY_DEFINE(patterns, const char *) = ARRAY_INIT;
6017
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
754 const char *pattern, *const *patterns_strarr;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
755
5829
1d73153584d2 Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents: 5818
diff changeset
756 /* [(<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
757 [RETURN (<return options>)] */
3141
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 2590
diff changeset
758 if (!client_read_args(cmd, 0, 0, &args))
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
759 return FALSE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
760
6017
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
761 ctx = p_new(cmd->pool, struct cmd_list_context, 1);
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
762 ctx->cmd = cmd;
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
763 ctx->ns = client->namespaces;
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
764 ctx->lsub = lsub;
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
765
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
766 cmd->context = ctx;
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
767
5832
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
768 if (args[0].type == IMAP_ARG_LIST && !lsub) {
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
769 /* LIST-EXTENDED selection options */
6017
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
770 ctx->used_listext = TRUE;
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
771 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
772 return TRUE;
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
773 args++;
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
774 }
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
775
6017
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
776 ctx->ref = imap_arg_string(&args[0]);
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
777 if (ctx->ref == NULL) {
5832
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
778 /* broken */
6017
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
779 client_send_command_error(cmd, "Invalid reference.");
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
780 return TRUE;
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
781 }
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
782 if (args[1].type == IMAP_ARG_LIST) {
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
783 ctx->used_listext = TRUE;
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
784 /* convert pattern list to string array */
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
785 p_array_init(&patterns, cmd->pool,
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
786 IMAP_ARG_LIST_COUNT(&args[1]));
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
787 arg = IMAP_ARG_LIST_ARGS(&args[1]);
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
788 for (; arg->type != IMAP_ARG_EOL; arg++) {
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
789 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
790 /* broken */
6017
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
791 client_send_command_error(cmd,
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
792 "Invalid pattern list.");
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
793 return TRUE;
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
794 }
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
795 pattern = imap_arg_string(arg);
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
796 array_append(&patterns, &pattern, 1);
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
797 }
5832
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
798 args += 2;
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
799 } else {
5839
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
800 pattern = imap_arg_string(&args[1]);
6017
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
801 if (pattern == NULL) {
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
802 client_send_command_error(cmd, "Invalid pattern.");
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
803 return TRUE;
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
804 }
6017
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
805
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
806 p_array_init(&patterns, cmd->pool, 1);
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
807 array_append(&patterns, &pattern, 1);
5832
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
808 args += 2;
6017
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
809
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
810 if (lsub) {
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
811 size_t len = strlen(pattern);
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
812 ctx->lsub_no_unsubscribed = len == 0 ||
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
813 pattern[len-1] != '%';
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
814 }
5832
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
815 }
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
816
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
817 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
818 strcasecmp(imap_arg_string(&args[0]), "RETURN") == 0) {
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
819 /* LIST-EXTENDED return options */
6017
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
820 ctx->used_listext = TRUE;
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
821 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
822 return TRUE;
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
823 args += 2;
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
824 }
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
825
6639
e1fde9940f7e Fixes to handling namespace prefixes and real!=virtual separator. Added a
Timo Sirainen <tss@iki.fi>
parents: 6603
diff changeset
826 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
827 if (lsub) {
bbdce1697239 LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents: 1890
diff changeset
828 /* 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
829 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
830 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
831 MAILBOX_LIST_ITER_RETURN_NO_FLAGS;
6017
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
832 } else if (!ctx->used_listext) {
5832
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
833 /* 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
834 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
835 }
40bae47bdba1 Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents: 1218
diff changeset
836
6017
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
837 if (args[0].type != IMAP_ARG_EOL) {
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
838 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
839 return TRUE;
40bae47bdba1 Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents: 1218
diff changeset
840 }
40bae47bdba1 Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents: 1218
diff changeset
841
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
842 (void)array_append_space(&patterns); /* NULL-terminate */
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
843 patterns_strarr = array_idx(&patterns, 0);
6017
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
844 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
845 /* Only LIST ref "" gets us here */
6017
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
846 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
847 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
848 } else {
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
849 ctx->patterns = patterns_strarr;
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
850 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
851
3141
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 2590
diff changeset
852 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
853 /* unfinished */
4939
ff2272c228cc Dovecot is now able to execute multiple commands at the same time.
Timo Sirainen <tss@iki.fi>
parents: 4848
diff changeset
854 cmd->output_pending = TRUE;
3141
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 2590
diff changeset
855 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
856 return FALSE;
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
857 }
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
858
3141
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 2590
diff changeset
859 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
860 return TRUE;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
861 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
862 return TRUE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
863 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
864
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
865 bool cmd_list(struct client_command_context *cmd)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
866 {
6418
46d9ee79f292 Removed _ prefix from all public APIs.
Timo Sirainen <tss@iki.fi>
parents: 6318
diff changeset
867 return cmd_list_full(cmd, FALSE);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
868 }