annotate src/imap/cmd-list.c @ 9191:b340ecb24469 HEAD

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