annotate src/imap/cmd-list.c @ 6009:62f92a68fc72 HEAD

LSUB: If pattern doesn't end with %, don't show extra unsubscribed mailboxes
author Timo Sirainen <tss@iki.fi>
date Sun, 15 Jul 2007 06:45:36 +0300
parents cc1f4688a988
children 92fabfda82f9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
1 /* Copyright (C) 2002-2007 Timo Sirainen */
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"
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9 #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
10 #include "mail-namespace.h"
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11
2425
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
12 struct cmd_list_context {
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
13 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
14 const char *ref;
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
15 const char *const *patterns;
2425
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
16 enum mailbox_list_flags list_flags;
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
17
5500
4862cb37106c Moved namespace handling to lib-storage. Beginnings of namespace support for
Timo Sirainen <tss@iki.fi>
parents: 5438
diff changeset
18 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
19 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
20 struct imap_match_glob *glob;
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
21
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
22 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
23
2425
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
24 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
25 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
26 unsigned int inbox_found:1;
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
27 unsigned int seen_inbox_namespace:1;
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
28 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
29 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
30 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
31 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
32 };
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
33
5314
ce59b45431fb Use less memory when listing lots of mailboxes
Timo Sirainen <tss@iki.fi>
parents: 5307
diff changeset
34 static void
5829
1d73153584d2 Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents: 5818
diff changeset
35 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
36 enum mailbox_info_flags flags)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
37 {
5339
469799904802 Last change caused LIST replies to have extra spaces
Timo Sirainen <tss@iki.fi>
parents: 5314
diff changeset
38 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
39
5829
1d73153584d2 Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents: 5818
diff changeset
40 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
41 flags |= MAILBOX_NOSELECT;
1895
bbdce1697239 LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents: 1890
diff changeset
42 flags &= ~MAILBOX_NONEXISTENT;
bbdce1697239 LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents: 1890
diff changeset
43 }
1218
a70ebd3a59e2 Removed list-sort workarounds. It's pretty much needed for maildir listing.
Timo Sirainen <tss@iki.fi>
parents: 1198
diff changeset
44
5829
1d73153584d2 Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents: 5818
diff changeset
45 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
46 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
47
5829
1d73153584d2 Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents: 5818
diff changeset
48 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
49 (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
50 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
51
5834
fd21588ef7aa LSUB \Noselect fix
Timo Sirainen <tss@iki.fi>
parents: 5832
diff changeset
52 if ((flags & MAILBOX_CHILD_SUBSCRIBED) != 0 &&
fd21588ef7aa LSUB \Noselect fix
Timo Sirainen <tss@iki.fi>
parents: 5832
diff changeset
53 (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
54 /* 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
55 flags |= MAILBOX_NOSELECT;
1d73153584d2 Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents: 5818
diff changeset
56 }
1d73153584d2 Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents: 5818
diff changeset
57
5314
ce59b45431fb Use less memory when listing lots of mailboxes
Timo Sirainen <tss@iki.fi>
parents: 5307
diff changeset
58 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
59 str_append(str, "\\Noselect ");
5314
ce59b45431fb Use less memory when listing lots of mailboxes
Timo Sirainen <tss@iki.fi>
parents: 5307
diff changeset
60 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
61 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
62
5314
ce59b45431fb Use less memory when listing lots of mailboxes
Timo Sirainen <tss@iki.fi>
parents: 5307
diff changeset
63 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
64 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
65 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
66 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
67 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
68 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
69
5314
ce59b45431fb Use less memory when listing lots of mailboxes
Timo Sirainen <tss@iki.fi>
parents: 5307
diff changeset
70 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
71 str_append(str, "\\Marked ");
5314
ce59b45431fb Use less memory when listing lots of mailboxes
Timo Sirainen <tss@iki.fi>
parents: 5307
diff changeset
72 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
73 str_append(str, "\\UnMarked ");
469799904802 Last change caused LIST replies to have extra spaces
Timo Sirainen <tss@iki.fi>
parents: 5314
diff changeset
74
469799904802 Last change caused LIST replies to have extra spaces
Timo Sirainen <tss@iki.fi>
parents: 5314
diff changeset
75 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
76 str_truncate(str, str_len(str)-1);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
77 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
78
5829
1d73153584d2 Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents: 5818
diff changeset
79 static void
1d73153584d2 Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents: 5818
diff changeset
80 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
81 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
82 {
1d73153584d2 Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents: 5818
diff changeset
83 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
84 return;
1d73153584d2 Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents: 5818
diff changeset
85
1d73153584d2 Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents: 5818
diff changeset
86 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
87 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
88 }
1d73153584d2 Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents: 5818
diff changeset
89
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
90 static bool
5835
d59ed6a31b66 Added more consts to imap-parser API
Timo Sirainen <tss@iki.fi>
parents: 5834
diff changeset
91 parse_select_flags(struct client_command_context *cmd,
d59ed6a31b66 Added more consts to imap-parser API
Timo Sirainen <tss@iki.fi>
parents: 5834
diff changeset
92 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 enum mailbox_list_flags *list_flags)
1d73153584d2 Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents: 5818
diff changeset
94 {
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) {
1d73153584d2 Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents: 5818
diff changeset
99 client_send_command_error(cmd,
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) {
1d73153584d2 Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents: 5818
diff changeset
107 *list_flags |= MAILBOX_LIST_ITER_SELECT_SUBSCRIBED |
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)
1d73153584d2 Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents: 5818
diff changeset
110 *list_flags |= MAILBOX_LIST_ITER_SELECT_RECURSIVEMATCH;
5832
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
111 else {
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
112 /* skip also optional list value */
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
113 if (args[1].type == IMAP_ARG_LIST)
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
114 args++;
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
115 }
5829
1d73153584d2 Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents: 5818
diff changeset
116 args++;
1d73153584d2 Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents: 5818
diff changeset
117 }
1d73153584d2 Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents: 5818
diff changeset
118
1d73153584d2 Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents: 5818
diff changeset
119 if ((*list_flags & MAILBOX_LIST_ITER_SELECT_RECURSIVEMATCH) != 0 &&
1d73153584d2 Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents: 5818
diff changeset
120 (*list_flags & MAILBOX_LIST_ITER_SELECT_SUBSCRIBED) == 0) {
1d73153584d2 Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents: 5818
diff changeset
121 client_send_command_error(cmd,
1d73153584d2 Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents: 5818
diff changeset
122 "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
123 return FALSE;
1d73153584d2 Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents: 5818
diff changeset
124 }
1d73153584d2 Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents: 5818
diff changeset
125 return TRUE;
1d73153584d2 Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents: 5818
diff changeset
126 }
1d73153584d2 Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents: 5818
diff changeset
127
1d73153584d2 Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents: 5818
diff changeset
128 static bool
5835
d59ed6a31b66 Added more consts to imap-parser API
Timo Sirainen <tss@iki.fi>
parents: 5834
diff changeset
129 parse_return_flags(struct client_command_context *cmd,
d59ed6a31b66 Added more consts to imap-parser API
Timo Sirainen <tss@iki.fi>
parents: 5834
diff changeset
130 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
131 enum mailbox_list_flags *list_flags)
1198
d28571e8c810 Rewrote LIST, LSUB and subscription file handling. LIST replies aren't
Timo Sirainen <tss@iki.fi>
parents: 1183
diff changeset
132 {
1244
40bae47bdba1 Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents: 1218
diff changeset
133 const char *atom;
40bae47bdba1 Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents: 1218
diff changeset
134
40bae47bdba1 Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents: 1218
diff changeset
135 while (args->type != IMAP_ARG_EOL) {
40bae47bdba1 Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents: 1218
diff changeset
136 if (args->type != IMAP_ARG_ATOM) {
3141
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 2590
diff changeset
137 client_send_command_error(cmd,
1244
40bae47bdba1 Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents: 1218
diff changeset
138 "List options contains non-atoms.");
40bae47bdba1 Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents: 1218
diff changeset
139 return FALSE;
40bae47bdba1 Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents: 1218
diff changeset
140 }
1198
d28571e8c810 Rewrote LIST, LSUB and subscription file handling. LIST replies aren't
Timo Sirainen <tss@iki.fi>
parents: 1183
diff changeset
141
1244
40bae47bdba1 Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents: 1218
diff changeset
142 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
143
1244
40bae47bdba1 Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents: 1218
diff changeset
144 if (strcasecmp(atom, "SUBSCRIBED") == 0)
5829
1d73153584d2 Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents: 5818
diff changeset
145 *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
146 else if (strcasecmp(atom, "CHILDREN") == 0)
5829
1d73153584d2 Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents: 5818
diff changeset
147 *list_flags |= MAILBOX_LIST_ITER_RETURN_CHILDREN;
5832
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
148 else {
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
149 /* skip also optional list value */
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
150 if (args[1].type == IMAP_ARG_LIST)
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
151 args++;
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
152 }
1244
40bae47bdba1 Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents: 1218
diff changeset
153 args++;
40bae47bdba1 Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents: 1218
diff changeset
154 }
40bae47bdba1 Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents: 1218
diff changeset
155 return TRUE;
1198
d28571e8c810 Rewrote LIST, LSUB and subscription file handling. LIST replies aren't
Timo Sirainen <tss@iki.fi>
parents: 1183
diff changeset
156 }
d28571e8c810 Rewrote LIST, LSUB and subscription file handling. LIST replies aren't
Timo Sirainen <tss@iki.fi>
parents: 1183
diff changeset
157
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
158 static enum mailbox_info_flags
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
159 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
160 {
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
161 struct mail_namespace *ns;
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
162 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
163 const struct mailbox_info *info;
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
164 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
165
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
166 if (ctx->seen_inbox_namespace &&
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
167 (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
168 /* 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
169 return flags;
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
170 }
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
171
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
172 /* find the INBOX flags */
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
173 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
174 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
175 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
176 if (info != NULL) {
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
177 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
178 flags = info->flags;
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
179 }
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
180 (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
181 return flags;
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
182 }
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
183
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
184 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
185 {
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
186 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
187 const struct mailbox_info *info;
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
188 bool ret = FALSE;
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
189
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
190 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
191 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
192 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
193 if (info != NULL)
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
194 ret = TRUE;
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
195 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
196 /* 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
197 ret = TRUE;
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 return ret;
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
200 }
3856
b97de2e354bd Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 3305
diff changeset
201
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
202 static void
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
203 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
204 {
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
205 struct mail_namespace *const *listed;
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
206 unsigned int i, count, len;
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
207 enum mailbox_info_flags flags;
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
208 const char *name;
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
209 string_t *str;
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
210
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
211 ctx->cur_ns_send_prefix = FALSE;
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
212
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
213 /* 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
214 namespace */
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
215 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
216 for (i = 0; i < count; i++) {
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
217 if (listed[i] == ctx->ns)
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
218 return;
3856
b97de2e354bd Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 3305
diff changeset
219 }
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
220
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
221 len = strlen(ctx->ns->prefix);
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
222 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
223 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
224 /* 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
225 if (ctx->inbox_found) {
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
226 /* 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
227 return;
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
228 }
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
229
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
230 ctx->inbox_found = TRUE;
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
231 flags = list_get_inbox_flags(ctx);
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
232 } else {
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
233 flags = MAILBOX_NONEXISTENT;
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
234 }
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 if ((flags & MAILBOX_CHILDREN) == 0) {
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
237 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
238 flags |= MAILBOX_CHILDREN;
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
239 flags &= ~MAILBOX_NOCHILDREN;
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
240 } else {
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
241 flags |= MAILBOX_NOCHILDREN;
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
242 }
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 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
246 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
247
1d73153584d2 Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents: 5818
diff changeset
248 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
249 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
250 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
251 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
252 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
253 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
254
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
255 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
256 }
b97de2e354bd Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 3305
diff changeset
257
5806
3704fe78f2f9 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5803
diff changeset
258 static bool
3704fe78f2f9 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5803
diff changeset
259 list_insert_ns_prefix(string_t *name_str, struct cmd_list_context *ctx,
5807
ec09ad1d017f mailbox_list_iter_next() returns now const pointer.
Timo Sirainen <tss@iki.fi>
parents: 5806
diff changeset
260 const struct mailbox_info *info)
5806
3704fe78f2f9 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5803
diff changeset
261 {
3704fe78f2f9 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5803
diff changeset
262 if (strcasecmp(info->name, "INBOX") != 0) {
3704fe78f2f9 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5803
diff changeset
263 /* non-INBOX always has prefix */
5808
45735dd11f17 Moved several namespace booleans to a flags field. Removed unused
Timo Sirainen <tss@iki.fi>
parents: 5807
diff changeset
264 } else if ((ctx->ns->flags & NAMESPACE_FLAG_INBOX) == 0) {
5806
3704fe78f2f9 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5803
diff changeset
265 /* INBOX from non-INBOX namespace. */
3704fe78f2f9 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5803
diff changeset
266 if (*ctx->ns->prefix == '\0') {
3704fe78f2f9 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5803
diff changeset
267 /* no namespace prefix, we can't list this */
3704fe78f2f9 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5803
diff changeset
268 return FALSE;
3704fe78f2f9 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5803
diff changeset
269 }
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
270 } else if (!ctx->cur_ns_match_inbox) {
5839
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
271 /* The pattern doesn't match INBOX (eg. prefix.%).
5806
3704fe78f2f9 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5803
diff changeset
272 We still want to list prefix.INBOX if it has
3704fe78f2f9 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5803
diff changeset
273 children. Otherwise we don't want to list
3704fe78f2f9 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5803
diff changeset
274 this INBOX at all. */
3704fe78f2f9 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5803
diff changeset
275 if ((info->flags & MAILBOX_CHILDREN) == 0)
3704fe78f2f9 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5803
diff changeset
276 return FALSE;
3704fe78f2f9 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5803
diff changeset
277 } else {
3704fe78f2f9 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5803
diff changeset
278 /* Listing INBOX from inbox=yes namespace.
3704fe78f2f9 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5803
diff changeset
279 Don't insert the namespace prefix. */
3704fe78f2f9 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5803
diff changeset
280 return TRUE;
3704fe78f2f9 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5803
diff changeset
281 }
3704fe78f2f9 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5803
diff changeset
282 str_append(name_str, ctx->ns->prefix);
3704fe78f2f9 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5803
diff changeset
283 return TRUE;
3704fe78f2f9 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5803
diff changeset
284 }
3704fe78f2f9 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5803
diff changeset
285
2350
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
286 static int
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
287 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
288 {
5807
ec09ad1d017f mailbox_list_iter_next() returns now const pointer.
Timo Sirainen <tss@iki.fi>
parents: 5806
diff changeset
289 const struct mailbox_info *info;
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
290 struct mail_namespace *ns;
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
291 enum mailbox_info_flags flags;
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
292 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
293 const char *name;
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents: 4729
diff changeset
294 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
295
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
296 t_push();
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
297 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
298 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
299 while ((info = mailbox_list_iter_next(ctx->list_iter)) != NULL) {
2350
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
300 str_truncate(name_str, 0);
5806
3704fe78f2f9 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5803
diff changeset
301
3704fe78f2f9 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5803
diff changeset
302 if (!list_insert_ns_prefix(name_str, ctx, info))
3704fe78f2f9 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5803
diff changeset
303 continue;
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents: 4729
diff changeset
304 str_append(name_str, info->name);
2350
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
305
2425
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
306 if (ctx->ns->sep != ctx->ns->real_sep) {
4451
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
307 char *p = str_c_modifiable(name_str);
2350
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
308 for (; *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
309 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
310 *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
311 }
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
312 }
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
313 name = str_c(name_str);
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
314 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
315
2425
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
316 if (*ctx->ns->prefix != '\0') {
5839
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
317 /* With patterns containing '*' we do the checks here
2350
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
318 so prefix is included in matching */
2425
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
319 if (ctx->glob != NULL &&
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
320 imap_match(ctx->glob, name) != IMAP_MATCH_YES)
2350
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
321 continue;
4639
47531abcf691 Handle INBOX-prefixed namespaces better. Avoid duplicate INBOX replies if
Timo Sirainen <tss@iki.fi>
parents: 4546
diff changeset
322 }
47531abcf691 Handle INBOX-prefixed namespaces better. Avoid duplicate INBOX replies if
Timo Sirainen <tss@iki.fi>
parents: 4546
diff changeset
323 if (strcasecmp(name, "INBOX") == 0) {
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
324 i_assert((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
325 if (ctx->inbox_found) {
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
326 /* 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
327 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
328 continue;
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
329 }
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
330 ctx->inbox_found = TRUE;
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
331 }
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
332 if (ctx->cur_ns_send_prefix)
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
333 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
334
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
335 /* 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
336 having children */
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
337 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
338 if (ns != NULL) {
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
339 flags |= MAILBOX_CHILDREN;
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
340 flags &= ~MAILBOX_NOCHILDREN;
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
341 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
342 }
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
343
6009
62f92a68fc72 LSUB: If pattern doesn't end with %, don't show extra unsubscribed mailboxes
Timo Sirainen <tss@iki.fi>
parents: 6007
diff changeset
344 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
345 (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
346 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
347 /* 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
348 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
349 continue;
62f92a68fc72 LSUB: If pattern doesn't end with %, don't show extra unsubscribed mailboxes
Timo Sirainen <tss@iki.fi>
parents: 6007
diff changeset
350 }
62f92a68fc72 LSUB: If pattern doesn't end with %, don't show extra unsubscribed mailboxes
Timo Sirainen <tss@iki.fi>
parents: 6007
diff changeset
351
2350
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
352 str_truncate(str, 0);
5314
ce59b45431fb Use less memory when listing lots of mailboxes
Timo Sirainen <tss@iki.fi>
parents: 5307
diff changeset
353 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
354 mailbox_flags2str(ctx, str, flags);
5314
ce59b45431fb Use less memory when listing lots of mailboxes
Timo Sirainen <tss@iki.fi>
parents: 5307
diff changeset
355 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
356 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
357 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
358
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
359 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
360 /* 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
361 t_pop();
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
362 return 0;
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
363 }
2350
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
364 }
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
365
5611
44db6ddd5a17 Removed mail_storage_set_list_error(). Handle the errors directly.
Timo Sirainen <tss@iki.fi>
parents: 5571
diff changeset
366 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
367 ret = -1;
2350
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
368
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents: 4729
diff changeset
369 t_pop();
2425
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
370 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
371 }
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
372
5839
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
373 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
374 {
5839
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
375 for (; *pattern != '\0'; pattern++) {
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
376 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
377 return TRUE;
e5abc07d843f Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
378 }
e5abc07d843f Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
379 return FALSE;
e5abc07d843f Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
380 }
e5abc07d843f Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
381
e5abc07d843f Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
382 static void
5839
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
383 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
384 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
385 {
5839
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
386 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
387 bool match;
2350
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
388
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
389 prefix_len = strlen(*prefix);
5839
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
390 pattern_len = strlen(*pattern);
3856
b97de2e354bd Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 3305
diff changeset
391
5839
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
392 if (pattern_len < prefix_len) {
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
393 /* eg. namespace prefix = "INBOX.", pattern = "INBOX" */
3856
b97de2e354bd Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 3305
diff changeset
394 return;
b97de2e354bd Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 3305
diff changeset
395 }
2350
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
396
5839
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
397 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
398 if (!match && inbox_check) {
3856
b97de2e354bd Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 3305
diff changeset
399 /* try INBOX check. */
b97de2e354bd Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 3305
diff changeset
400 match = prefix_len >= 5 &&
5839
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
401 strncasecmp(*prefix, *pattern, 5) == 0 &&
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
402 strncmp(*prefix + 5, *pattern + 5,
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
403 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
404 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
405 ((*prefix)[5] == sep || (*prefix)[5] == '\0');
3856
b97de2e354bd Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 3305
diff changeset
406 }
b97de2e354bd Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 3305
diff changeset
407
b97de2e354bd Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 3305
diff changeset
408 if (match) {
b97de2e354bd Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 3305
diff changeset
409 *prefix += prefix_len;
5839
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
410 *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
411 }
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
412 }
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
413
5803
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
414 static bool
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
415 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
416 const char **cur_ns_prefix_p,
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
417 const char **cur_ref_p)
5803
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
418 {
5809
ab88a5e8ac95 Fixes for last changes.
Timo Sirainen <tss@iki.fi>
parents: 5808
diff changeset
419 const char *cur_ns_prefix = *cur_ns_prefix_p;
ab88a5e8ac95 Fixes for last changes.
Timo Sirainen <tss@iki.fi>
parents: 5808
diff changeset
420 const char *cur_ref = *cur_ref_p;
5803
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
421
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
422 if (*cur_ref != '\0') {
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
423 /* reference argument given. skip namespace prefix using it.
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
424
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
425 cur_ns_prefix = foo/bar/
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
426 cur_ref = foo/
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
427 -> cur_ns_prefix=bar/, cur_ref=""
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
428 cur_ref = foo/bar/baz
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
429 -> cur_ns_prefix="", cur_ref="baz"
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
430 */
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
431 skip_namespace_prefix(&cur_ns_prefix, &cur_ref, TRUE,
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
432 ctx->ns->sep);
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
433
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
434 if (*cur_ref != '\0' && *cur_ns_prefix != '\0') {
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
435 /* reference parameter didn't match with
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
436 namespace prefix. skip this. */
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
437 return FALSE;
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 }
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
440
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
441 *cur_ns_prefix_p = cur_ns_prefix;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
442 *cur_ref_p = cur_ref;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
443 return TRUE;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
444 }
5803
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
445
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
446 static void
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
447 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
448 const char **cur_ns_prefix_p,
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
449 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
450 {
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
451 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
452 const char *cur_pattern = *cur_pattern_p;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
453 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
454 const char *old_pattern = cur_pattern;
5803
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
455
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
456 if (*cur_ns_prefix == '\0')
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
457 return;
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 /* skip namespace prefix using pattern */
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
460 i_assert(*cur_ref == '\0');
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
461
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
462 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
463 cur_ref == ctx->ref, ctx->ns->sep);
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
464
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
465 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
466 /* trying to list the namespace prefix itself. */
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
467 cur_ns_prefix = old_ns_prefix;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
468 cur_pattern = old_pattern;
5803
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
469 }
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
470
5809
ab88a5e8ac95 Fixes for last changes.
Timo Sirainen <tss@iki.fi>
parents: 5808
diff changeset
471 *cur_ns_prefix_p = cur_ns_prefix;
5839
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
472 *cur_pattern_p = cur_pattern;
5803
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
473 }
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
474
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
475 static enum imap_match_result
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
476 list_use_inboxcase(struct cmd_list_context *ctx)
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 struct imap_match_glob *inbox_glob;
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
479 const char *const *pat;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
480 enum imap_match_result match, ret;
5803
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
481
5808
45735dd11f17 Moved several namespace booleans to a flags field. Removed unused
Timo Sirainen <tss@iki.fi>
parents: 5807
diff changeset
482 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
483 (ctx->ns->flags & NAMESPACE_FLAG_INBOX) == 0)
5803
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
484 return IMAP_MATCH_NO;
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
485
5839
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
486 /* if the original reference and pattern combined produces something
5803
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
487 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
488 ret = IMAP_MATCH_NO;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
489 for (pat = ctx->patterns; *pat != NULL; pat++) {
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
490 t_push();
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
491 inbox_glob =
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
492 imap_match_init(pool_datastack_create(),
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
493 t_strconcat(ctx->ref, *pat, NULL),
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
494 TRUE, ctx->ns->sep);
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
495 match = imap_match(inbox_glob, "INBOX");
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
496 t_pop();
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
497
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
498 if (match == IMAP_MATCH_YES)
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
499 return IMAP_MATCH_YES;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
500 if ((match & IMAP_MATCH_PARENT) != 0)
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
501 ret = IMAP_MATCH_PARENT;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
502 }
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
503 return ret;
5803
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
504 }
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
505
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
506 static void
5839
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
507 skip_pattern_wildcard_prefix(const char *cur_ns_prefix, char sep,
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
508 const char **cur_pattern_p)
5803
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
509 {
5839
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
510 const char *cur_pattern = *cur_pattern_p;
5803
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
511 unsigned int count;
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 for (count = 1; *cur_ns_prefix != '\0'; cur_ns_prefix++) {
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
514 if (*cur_ns_prefix == sep)
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
515 count++;
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
516 }
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
517
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
518 for (; count > 0; count--) {
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
519 /* skip over one hierarchy */
5839
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
520 while (*cur_pattern != '\0' && *cur_pattern != '*' &&
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
521 *cur_pattern != sep)
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
522 cur_pattern++;
5803
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
523
5839
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
524 if (*cur_pattern == '*') {
5803
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
525 /* we'll just request "*" and filter it
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
526 ourself. otherwise this gets too complex. */
5839
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
527 cur_pattern = "*";
5803
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
528 break;
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
529 }
5839
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
530 if (*cur_pattern == '\0') {
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
531 /* pattern ended too early. we won't be listing
5803
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
532 any mailboxes. */
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
533 break;
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
534 }
5839
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
535 cur_pattern++;
5803
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
536 }
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
537
5839
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
538 *cur_pattern_p = cur_pattern;
5803
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
539 }
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
540
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
541 static bool
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
542 list_namespace_init_pattern(struct cmd_list_context *ctx, bool inboxcase,
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
543 const char *cur_ref, const char *cur_ns_prefix,
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
544 const char **cur_pattern_p, bool *want_glob_r)
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 struct mail_namespace *ns = ctx->ns;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
547 struct imap_match_glob *pat_glob;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
548 const char *cur_pattern = *cur_pattern_p;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
549 enum imap_match_result match;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
550 size_t len;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
551
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
552 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
553 cur_ref, &cur_pattern);
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
554 if (*cur_ns_prefix == '\0') {
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
555 *want_glob_r = FALSE;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
556 *cur_pattern_p = cur_pattern;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
557 return TRUE;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
558 }
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
559
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
560 /* 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
561 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
562 Check that pattern matches namespace prefix. */
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
563 i_assert(*cur_ref == '\0');
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 /* drop the trailing separator in namespace prefix.
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
566 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
567 (LIST "" foo/ needs to return "foo/" entry) */
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
568 len = strlen(cur_ns_prefix);
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
569 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
570 strcmp(cur_pattern, cur_ns_prefix) != 0) {
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
571 ctx->cur_ns_skip_trailing_sep = TRUE;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
572 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
573 }
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
574
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
575 /* 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
576 if ((ns->flags & NAMESPACE_FLAG_LIST) == 0 &&
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
577 list_pattern_has_wildcards(cur_pattern))
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
578 return FALSE;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
579
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
580 /* check if this namespace prefix matches the current pattern */
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
581 pat_glob = imap_match_init(pool_datastack_create(), *cur_pattern_p,
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
582 inboxcase, ns->sep);
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
583 match = imap_match(pat_glob, cur_ns_prefix);
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
584 if ((match & (IMAP_MATCH_YES | IMAP_MATCH_CHILDREN)) == 0)
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
585 return FALSE;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
586
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
587 if (match == IMAP_MATCH_YES && (ns->flags & NAMESPACE_FLAG_LIST) != 0 &&
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
588 (ctx->list_flags & MAILBOX_LIST_ITER_SELECT_SUBSCRIBED) == 0) {
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
589 /* the namespace prefix itself matches too. send it. */
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
590 ctx->cur_ns_send_prefix = TRUE;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
591 }
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
592
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
593 /* We have now verified that the pattern matches the namespace prefix,
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
594 so we'll just have to skip over as many hierarchies from pattern as
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
595 there exists in namespace prefix. */
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
596 skip_pattern_wildcard_prefix(cur_ns_prefix, ns->sep, &cur_pattern);
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
597
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
598 if (*cur_pattern == '\0' && ctx->cur_ns_match_inbox) {
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
599 /* ns_prefix="INBOX/" and we wanted to list "%".
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
600 This is an optimization to avoid doing an empty
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
601 listing followed by another INBOX listing later. */
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
602 cur_pattern = "INBOX";
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
603 *want_glob_r = FALSE;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
604 } else if (*cur_pattern != '*' || strcmp(*cur_pattern_p, "*") == 0) {
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
605 /* a) we don't have '*' in pattern
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
606 b) we want to display everything
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
607
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
608 we don't need to do separate filtering ourself */
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
609 *want_glob_r = FALSE;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
610 } else {
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
611 *want_glob_r = TRUE;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
612 }
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
613
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
614 *cur_pattern_p = cur_pattern;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
615 return TRUE;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
616 }
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
617
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
618 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
619 {
5500
4862cb37106c Moved namespace handling to lib-storage. Beginnings of namespace support for
Timo Sirainen <tss@iki.fi>
parents: 5438
diff changeset
620 struct mail_namespace *ns = ctx->ns;
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
621 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
622 enum imap_match_result inbox_match;
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
623 ARRAY_DEFINE(used_patterns, const char *);
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
624 bool inboxcase, want_glob = FALSE, want_any_glob = FALSE;
2350
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
625
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
626 cur_ns_prefix = ns->prefix;
5809
ab88a5e8ac95 Fixes for last changes.
Timo Sirainen <tss@iki.fi>
parents: 5808
diff changeset
627 cur_ref = ctx->ref;
ab88a5e8ac95 Fixes for last changes.
Timo Sirainen <tss@iki.fi>
parents: 5808
diff changeset
628
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
629 if ((ns->flags & NAMESPACE_FLAG_HIDDEN) != 0 &&
5829
1d73153584d2 Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents: 5818
diff changeset
630 (ctx->list_flags & MAILBOX_LIST_ITER_SELECT_SUBSCRIBED) != 0) {
5818
86282604e2f5 Don't use subscriptions with hidden namespaces.
Timo Sirainen <tss@iki.fi>
parents: 5811
diff changeset
631 /* ignore hidden namespaces */
86282604e2f5 Don't use subscriptions with hidden namespaces.
Timo Sirainen <tss@iki.fi>
parents: 5811
diff changeset
632 return;
86282604e2f5 Don't use subscriptions with hidden namespaces.
Timo Sirainen <tss@iki.fi>
parents: 5811
diff changeset
633 }
86282604e2f5 Don't use subscriptions with hidden namespaces.
Timo Sirainen <tss@iki.fi>
parents: 5811
diff changeset
634
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
635 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
636
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
637 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
638 ctx->seen_inbox_namespace = TRUE;
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
639
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
640 if (*cur_ns_prefix != '\0') {
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
641 /* 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
642 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
643 return;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
644 }
2350
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
645
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
646 inbox_match = list_use_inboxcase(ctx);
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
647 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
648 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
649
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
650 t_array_init(&used_patterns, 16);
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
651 for (pat = ctx->patterns; *pat != NULL; pat++) {
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
652 pattern = *pat;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
653 if (list_namespace_init_pattern(ctx, inboxcase, cur_ref,
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
654 cur_ns_prefix, &pattern,
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
655 &want_glob)) {
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
656 if (want_glob)
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
657 want_any_glob = TRUE;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
658 pattern = mailbox_list_join_refpattern(ns->list,
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
659 cur_ref, mail_namespace_fix_sep(ns, pattern));
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
660 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
661 }
2425
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
662 }
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
663
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
664 if (array_count(&used_patterns) == 0)
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
665 return;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
666 (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
667 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
668
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
669 ctx->glob = !want_any_glob ? NULL :
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
670 imap_match_init_multiple(ctx->cmd->pool, pat,
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
671 inboxcase, ns->sep);
2425
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
672
5500
4862cb37106c Moved namespace handling to lib-storage. Beginnings of namespace support for
Timo Sirainen <tss@iki.fi>
parents: 5438
diff changeset
673 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
674 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
675 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
676 }
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
677
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
678 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
679 {
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
680 const char *str;
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
681
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
682 /* INBOX always exists */
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
683 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
684 (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
685 (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
686 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
687 ctx->ns->sep_str);
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
688 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
689 }
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
690 }
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
691
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
692 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
693 {
3141
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 2590
diff changeset
694 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
695 int ret;
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
696
4939
ff2272c228cc Dovecot is now able to execute multiple commands at the same time.
Timo Sirainen <tss@iki.fi>
parents: 4848
diff changeset
697 if (cmd->cancel) {
5611
44db6ddd5a17 Removed mail_storage_set_list_error(). Handle the errors directly.
Timo Sirainen <tss@iki.fi>
parents: 5571
diff changeset
698 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
699 (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
700 return TRUE;
ff2272c228cc Dovecot is now able to execute multiple commands at the same time.
Timo Sirainen <tss@iki.fi>
parents: 4848
diff changeset
701 }
2425
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
702 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
703 if (ctx->list_iter == NULL) {
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
704 t_push();
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
705 list_namespace_init(ctx);
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
706 t_pop();
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
707 if (ctx->list_iter == NULL)
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
708 continue;
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
709 }
2425
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
710
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
711 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
712 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
713 return TRUE;
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
714 }
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
715 if (ret == 0)
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
716 return FALSE;
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
717
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
718 if (ctx->cur_ns_send_prefix) {
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
719 /* no mailboxes in this namespace */
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
720 list_namespace_send_prefix(ctx, FALSE);
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
721 }
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
722 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
723 }
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
724
3141
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 2590
diff changeset
725 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
726 "OK List completed." :
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
727 "OK Lsub completed.");
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
728 return TRUE;
2350
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
729 }
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
730
5797
de3a087ea8d2 Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents: 5611
diff changeset
731 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
732 {
de3a087ea8d2 Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents: 5611
diff changeset
733 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
734 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
735 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
736 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
737
de3a087ea8d2 Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents: 5611
diff changeset
738 /* 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
739 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
740 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
741 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
742 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
743 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
744 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
745 } 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
746 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
747 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
748 }
de3a087ea8d2 Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents: 5611
diff changeset
749
de3a087ea8d2 Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents: 5611
diff changeset
750 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
751 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
752 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
753 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
754 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
755 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
756 /* 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
757 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
758 } else {
5799
75e3aedc0568 Put UW-IMAP emulation back after all
Timo Sirainen <tss@iki.fi>
parents: 5797
diff changeset
759 /* 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
760 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
761 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
762 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
763 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
764
de3a087ea8d2 Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents: 5611
diff changeset
765 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
766 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
767 else {
de3a087ea8d2 Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents: 5611
diff changeset
768 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
769 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
770 FALSE);
de3a087ea8d2 Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents: 5611
diff changeset
771 }
de3a087ea8d2 Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents: 5611
diff changeset
772 }
de3a087ea8d2 Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents: 5611
diff changeset
773 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
774 }
de3a087ea8d2 Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents: 5611
diff changeset
775
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
776 bool _cmd_list_full(struct client_command_context *cmd, bool lsub)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
777 {
3141
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 2590
diff changeset
778 struct client *client = cmd->client;
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
779 const struct imap_arg *args, *arg;
5832
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
780 enum mailbox_list_flags list_flags = 0;
2425
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
781 struct cmd_list_context *ctx;
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
782 ARRAY_DEFINE(patterns, const char *) = ARRAY_INIT;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
783 const char *ref, *pattern, *const *patterns_strarr;
5829
1d73153584d2 Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents: 5818
diff changeset
784 bool used_listext = FALSE;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
785
5829
1d73153584d2 Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents: 5818
diff changeset
786 /* [(<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
787 [RETURN (<return options>)] */
3141
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 2590
diff changeset
788 if (!client_read_args(cmd, 0, 0, &args))
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
789 return FALSE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
790
5832
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
791 if (args[0].type == IMAP_ARG_LIST && !lsub) {
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
792 /* LIST-EXTENDED selection options */
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
793 used_listext = TRUE;
5836
9f869a7a3d73 Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents: 5835
diff changeset
794 if (!parse_select_flags(cmd, IMAP_ARG_LIST_ARGS(&args[0]),
5832
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
795 &list_flags))
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
796 return TRUE;
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
797 args++;
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
798 }
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
799
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
800 ref = imap_arg_string(&args[0]);
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
801 if (ref == NULL) {
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
802 /* broken */
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
803 } else if (args[1].type == IMAP_ARG_LIST) {
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
804 used_listext = TRUE;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
805 /* convert pattern list to string array */
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
806 p_array_init(&patterns, cmd->pool,
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
807 IMAP_ARG_LIST_COUNT(&args[1]));
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
808 arg = IMAP_ARG_LIST_ARGS(&args[1]);
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
809 for (; arg->type != IMAP_ARG_EOL; arg++) {
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
810 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
811 /* broken */
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
812 ref = NULL;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
813 break;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
814 }
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
815 pattern = imap_arg_string(arg);
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
816 array_append(&patterns, &pattern, 1);
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
817 }
5832
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
818 args += 2;
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
819 } else {
5839
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
820 pattern = imap_arg_string(&args[1]);
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
821 if (pattern == NULL)
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
822 ref = NULL;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
823 else {
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
824 p_array_init(&patterns, cmd->pool, 1);
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
825 array_append(&patterns, &pattern, 1);
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
826 }
5832
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
827 args += 2;
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
828 }
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
829
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
830 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
831 strcasecmp(imap_arg_string(&args[0]), "RETURN") == 0) {
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
832 /* LIST-EXTENDED return options */
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
833 used_listext = TRUE;
5836
9f869a7a3d73 Changed imap-parser API to use standard arrays for lists instead of its own
Timo Sirainen <tss@iki.fi>
parents: 5835
diff changeset
834 if (!parse_return_flags(cmd, IMAP_ARG_LIST_ARGS(&args[1]),
5832
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
835 &list_flags))
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
836 return TRUE;
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
837 args += 2;
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
838 }
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
839
1895
bbdce1697239 LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents: 1890
diff changeset
840 if (lsub) {
bbdce1697239 LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents: 1890
diff changeset
841 /* LSUB - we don't care about flags */
5829
1d73153584d2 Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents: 5818
diff changeset
842 list_flags = MAILBOX_LIST_ITER_SELECT_SUBSCRIBED |
1d73153584d2 Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents: 5818
diff changeset
843 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
844 MAILBOX_LIST_ITER_RETURN_NO_FLAGS;
5832
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
845 } else if (!used_listext) {
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
846 /* non-extended LIST - return children flags always */
5829
1d73153584d2 Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents: 5818
diff changeset
847 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
848 }
40bae47bdba1 Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents: 1218
diff changeset
849
5832
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
850 if (ref == NULL || args[0].type != IMAP_ARG_EOL) {
3141
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 2590
diff changeset
851 client_send_command_error(cmd, "Invalid arguments.");
1244
40bae47bdba1 Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents: 1218
diff changeset
852 return TRUE;
40bae47bdba1 Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents: 1218
diff changeset
853 }
40bae47bdba1 Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents: 1218
diff changeset
854
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
855 (void)array_append_space(&patterns); /* NULL-terminate */
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
856 patterns_strarr = array_idx(&patterns, 0);
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
857 if (!used_listext && !lsub && *patterns_strarr[0] == '\0') {
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
858 /* Only LIST ref "" gets us here */
5797
de3a087ea8d2 Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents: 5611
diff changeset
859 cmd_list_ref_root(client, ref);
3141
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 2590
diff changeset
860 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
861 } else {
3141
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 2590
diff changeset
862 ctx = p_new(cmd->pool, struct cmd_list_context, 1);
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
863 ctx->cmd = cmd;
2425
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
864 ctx->ref = ref;
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
865 ctx->patterns = patterns_strarr;
2425
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
866 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
867 ctx->used_listext = used_listext;
2425
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
868 ctx->lsub = lsub;
6009
62f92a68fc72 LSUB: If pattern doesn't end with %, don't show extra unsubscribed mailboxes
Timo Sirainen <tss@iki.fi>
parents: 6007
diff changeset
869 if (lsub) {
62f92a68fc72 LSUB: If pattern doesn't end with %, don't show extra unsubscribed mailboxes
Timo Sirainen <tss@iki.fi>
parents: 6007
diff changeset
870 size_t len = strlen(patterns_strarr[0]);
62f92a68fc72 LSUB: If pattern doesn't end with %, don't show extra unsubscribed mailboxes
Timo Sirainen <tss@iki.fi>
parents: 6007
diff changeset
871 ctx->lsub_no_unsubscribed = len == 0 ||
62f92a68fc72 LSUB: If pattern doesn't end with %, don't show extra unsubscribed mailboxes
Timo Sirainen <tss@iki.fi>
parents: 6007
diff changeset
872 patterns_strarr[0][len-1] != '%';
62f92a68fc72 LSUB: If pattern doesn't end with %, don't show extra unsubscribed mailboxes
Timo Sirainen <tss@iki.fi>
parents: 6007
diff changeset
873 }
2425
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
874 ctx->ns = client->namespaces;
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
875 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
876
3141
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 2590
diff changeset
877 cmd->context = ctx;
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 2590
diff changeset
878 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
879 /* unfinished */
4939
ff2272c228cc Dovecot is now able to execute multiple commands at the same time.
Timo Sirainen <tss@iki.fi>
parents: 4848
diff changeset
880 cmd->output_pending = TRUE;
3141
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 2590
diff changeset
881 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
882 return FALSE;
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
883 }
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
884
3141
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 2590
diff changeset
885 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
886 return TRUE;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
887 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
888 return TRUE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
889 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
890
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
891 bool cmd_list(struct client_command_context *cmd)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
892 {
3141
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 2590
diff changeset
893 return _cmd_list_full(cmd, FALSE);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
894 }