annotate src/imap/cmd-list.c @ 6318:5313cbcfccc6 HEAD

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