annotate src/imap/cmd-list.c @ 9276:13fa572535f0 HEAD

Allow namespace prefix to be opened as mailbox, if it already exists.
author Timo Sirainen <tss@iki.fi>
date Sun, 02 Aug 2009 23:01:04 -0400
parents db2fdf3529ac
children a0fa514d92f0
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);
9276
13fa572535f0 Allow namespace prefix to be opened as mailbox, if it already exists.
Timo Sirainen <tss@iki.fi>
parents: 9029
diff changeset
272 } else if (mailbox_list_mailbox(ctx->ns->list, "", &flags) > 0) {
13fa572535f0 Allow namespace prefix to be opened as mailbox, if it already exists.
Timo Sirainen <tss@iki.fi>
parents: 9029
diff changeset
273 /* mailbox with namespace prefix exists */
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
274 } else {
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
275 flags = MAILBOX_NONEXISTENT;
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
276 }
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
277
8971
163c3f85a3aa namespaces: list=children wasn't working correctly.
Timo Sirainen <tss@iki.fi>
parents: 8902
diff changeset
278 name = ns_get_listed_prefix(ctx);
8902
5ce33cfc568f imap: Fixed LIST with namespace prefixes that have multiple hierarchies.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
279
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
280 if ((flags & MAILBOX_CHILDREN) == 0) {
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
281 if (have_children || list_namespace_has_children(ctx)) {
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
282 flags |= MAILBOX_CHILDREN;
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
283 flags &= ~MAILBOX_NOCHILDREN;
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
284 } else {
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
285 flags |= MAILBOX_NOCHILDREN;
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
286 }
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
287 }
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
288
8461
659667d89f69 Added list=children option for namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8082
diff changeset
289 if ((ctx->ns->flags & NAMESPACE_FLAG_LIST_CHILDREN) != 0) {
659667d89f69 Added list=children option for namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8082
diff changeset
290 if (have_children) {
659667d89f69 Added list=children option for namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8082
diff changeset
291 /* children are going to be listed. */
659667d89f69 Added list=children option for namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8082
diff changeset
292 return;
659667d89f69 Added list=children option for namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8082
diff changeset
293 }
659667d89f69 Added list=children option for namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8082
diff changeset
294 if ((flags & MAILBOX_CHILDREN) == 0) {
659667d89f69 Added list=children option for namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8082
diff changeset
295 /* namespace has no children. don't show it. */
659667d89f69 Added list=children option for namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8082
diff changeset
296 return;
659667d89f69 Added list=children option for namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8082
diff changeset
297 }
659667d89f69 Added list=children option for namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8082
diff changeset
298 /* namespace has children but they don't match the list
659667d89f69 Added list=children option for namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8082
diff changeset
299 pattern. the prefix itself matches though, so show it. */
659667d89f69 Added list=children option for namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8082
diff changeset
300 }
659667d89f69 Added list=children option for namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8082
diff changeset
301
5829
1d73153584d2 Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents: 5818
diff changeset
302 str = t_str_new(128);
1d73153584d2 Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents: 5818
diff changeset
303 str_append(str, "* LIST (");
1d73153584d2 Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents: 5818
diff changeset
304 mailbox_flags2str(ctx, str, flags);
1d73153584d2 Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents: 5818
diff changeset
305 str_printfa(str, ") \"%s\" ", ctx->ns->sep_str);
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
306 imap_quote_append_string(str, name, FALSE);
5829
1d73153584d2 Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents: 5818
diff changeset
307 mailbox_childinfo2str(ctx, str, flags);
1d73153584d2 Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents: 5818
diff changeset
308
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
309 client_send_line(ctx->cmd->client, str_c(str));
3856
b97de2e354bd Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 3305
diff changeset
310 }
b97de2e354bd Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 3305
diff changeset
311
6018
b148e4c41aa7 Added X-STATUS (..) return option to send STATUS replies to client for
Timo Sirainen <tss@iki.fi>
parents: 6017
diff changeset
312 static void list_send_status(struct cmd_list_context *ctx, const char *name)
b148e4c41aa7 Added X-STATUS (..) return option to send STATUS replies to client for
Timo Sirainen <tss@iki.fi>
parents: 6017
diff changeset
313 {
b148e4c41aa7 Added X-STATUS (..) return option to send STATUS replies to client for
Timo Sirainen <tss@iki.fi>
parents: 6017
diff changeset
314 struct mailbox_status status;
b148e4c41aa7 Added X-STATUS (..) return option to send STATUS replies to client for
Timo Sirainen <tss@iki.fi>
parents: 6017
diff changeset
315 const char *storage_name;
b148e4c41aa7 Added X-STATUS (..) return option to send STATUS replies to client for
Timo Sirainen <tss@iki.fi>
parents: 6017
diff changeset
316 size_t prefix_len = strlen(ctx->ns->prefix);
b148e4c41aa7 Added X-STATUS (..) return option to send STATUS replies to client for
Timo Sirainen <tss@iki.fi>
parents: 6017
diff changeset
317
b148e4c41aa7 Added X-STATUS (..) return option to send STATUS replies to client for
Timo Sirainen <tss@iki.fi>
parents: 6017
diff changeset
318 storage_name = strncmp(name, ctx->ns->prefix, prefix_len) == 0 ?
b148e4c41aa7 Added X-STATUS (..) return option to send STATUS replies to client for
Timo Sirainen <tss@iki.fi>
parents: 6017
diff changeset
319 name + prefix_len : name;
b148e4c41aa7 Added X-STATUS (..) return option to send STATUS replies to client for
Timo Sirainen <tss@iki.fi>
parents: 6017
diff changeset
320
b148e4c41aa7 Added X-STATUS (..) return option to send STATUS replies to client for
Timo Sirainen <tss@iki.fi>
parents: 6017
diff changeset
321 if (!imap_status_get(ctx->cmd->client, ctx->ns->storage, storage_name,
b148e4c41aa7 Added X-STATUS (..) return option to send STATUS replies to client for
Timo Sirainen <tss@iki.fi>
parents: 6017
diff changeset
322 ctx->status_items, &status)) {
b148e4c41aa7 Added X-STATUS (..) return option to send STATUS replies to client for
Timo Sirainen <tss@iki.fi>
parents: 6017
diff changeset
323 client_send_untagged_storage_error(ctx->cmd->client,
b148e4c41aa7 Added X-STATUS (..) return option to send STATUS replies to client for
Timo Sirainen <tss@iki.fi>
parents: 6017
diff changeset
324 ctx->ns->storage);
b148e4c41aa7 Added X-STATUS (..) return option to send STATUS replies to client for
Timo Sirainen <tss@iki.fi>
parents: 6017
diff changeset
325 return;
b148e4c41aa7 Added X-STATUS (..) return option to send STATUS replies to client for
Timo Sirainen <tss@iki.fi>
parents: 6017
diff changeset
326 }
b148e4c41aa7 Added X-STATUS (..) return option to send STATUS replies to client for
Timo Sirainen <tss@iki.fi>
parents: 6017
diff changeset
327
b148e4c41aa7 Added X-STATUS (..) return option to send STATUS replies to client for
Timo Sirainen <tss@iki.fi>
parents: 6017
diff changeset
328 imap_status_send(ctx->cmd->client, name, ctx->status_items, &status);
b148e4c41aa7 Added X-STATUS (..) return option to send STATUS replies to client for
Timo Sirainen <tss@iki.fi>
parents: 6017
diff changeset
329 }
b148e4c41aa7 Added X-STATUS (..) return option to send STATUS replies to client for
Timo Sirainen <tss@iki.fi>
parents: 6017
diff changeset
330
2350
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
331 static int
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
332 list_namespace_mailboxes(struct cmd_list_context *ctx)
2350
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
333 {
5807
ec09ad1d017f mailbox_list_iter_next() returns now const pointer.
Timo Sirainen <tss@iki.fi>
parents: 5806
diff changeset
334 const struct mailbox_info *info;
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
335 struct mail_namespace *ns;
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
336 enum mailbox_info_flags flags;
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
337 string_t *str, *name_str;
2350
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
338 const char *name;
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents: 4729
diff changeset
339 int ret = 0;
2350
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
340
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
341 str = t_str_new(256);
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
342 name_str = t_str_new(256);
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents: 4729
diff changeset
343 while ((info = mailbox_list_iter_next(ctx->list_iter)) != NULL) {
7255
cd7eeb8cc7fc Don't convert real separators to virtual separators. The mailbox listing
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
344 name = info->name;
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
345 flags = info->flags;
2350
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
346
4639
47531abcf691 Handle INBOX-prefixed namespaces better. Avoid duplicate INBOX replies if
Timo Sirainen <tss@iki.fi>
parents: 4546
diff changeset
347 if (strcasecmp(name, "INBOX") == 0) {
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
348 if (ctx->inbox_found) {
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
349 /* we already listed this at the beginning
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
350 of handling INBOX/ namespace */
2350
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
351 continue;
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
352 }
6318
5313cbcfccc6 Don't crash if mailbox named INBOX is listed in prefixless namespace, but
Timo Sirainen <tss@iki.fi>
parents: 6018
diff changeset
353 if ((ctx->ns->flags & NAMESPACE_FLAG_INBOX) == 0) {
5313cbcfccc6 Don't crash if mailbox named INBOX is listed in prefixless namespace, but
Timo Sirainen <tss@iki.fi>
parents: 6018
diff changeset
354 /* INBOX is in non-empty prefix namespace,
5313cbcfccc6 Don't crash if mailbox named INBOX is listed in prefixless namespace, but
Timo Sirainen <tss@iki.fi>
parents: 6018
diff changeset
355 and we're now listing prefixless namespace
5313cbcfccc6 Don't crash if mailbox named INBOX is listed in prefixless namespace, but
Timo Sirainen <tss@iki.fi>
parents: 6018
diff changeset
356 that contains INBOX. There's no way we can
5313cbcfccc6 Don't crash if mailbox named INBOX is listed in prefixless namespace, but
Timo Sirainen <tss@iki.fi>
parents: 6018
diff changeset
357 show this mailbox. */
5313cbcfccc6 Don't crash if mailbox named INBOX is listed in prefixless namespace, but
Timo Sirainen <tss@iki.fi>
parents: 6018
diff changeset
358 continue;
5313cbcfccc6 Don't crash if mailbox named INBOX is listed in prefixless namespace, but
Timo Sirainen <tss@iki.fi>
parents: 6018
diff changeset
359 }
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
360 ctx->inbox_found = TRUE;
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
361 }
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
362 if (ctx->cur_ns_send_prefix)
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
363 list_namespace_send_prefix(ctx, TRUE);
2350
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
364
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
365 /* if there's a namespace with this name, list it as
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
366 having children */
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
367 ns = mail_namespace_find_prefix_nosep(ctx->ns, name);
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
368 if (ns != NULL) {
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
369 flags |= MAILBOX_CHILDREN;
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
370 flags &= ~MAILBOX_NOCHILDREN;
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
371 array_append(&ctx->ns_prefixes_listed, &ns, 1);
2350
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
372 }
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
373
6009
62f92a68fc72 LSUB: If pattern doesn't end with %, don't show extra unsubscribed mailboxes
Timo Sirainen <tss@iki.fi>
parents: 6007
diff changeset
374 if ((flags & MAILBOX_CHILD_SUBSCRIBED) != 0 &&
62f92a68fc72 LSUB: If pattern doesn't end with %, don't show extra unsubscribed mailboxes
Timo Sirainen <tss@iki.fi>
parents: 6007
diff changeset
375 (flags & MAILBOX_SUBSCRIBED) == 0 &&
62f92a68fc72 LSUB: If pattern doesn't end with %, don't show extra unsubscribed mailboxes
Timo Sirainen <tss@iki.fi>
parents: 6007
diff changeset
376 ctx->lsub_no_unsubscribed) {
62f92a68fc72 LSUB: If pattern doesn't end with %, don't show extra unsubscribed mailboxes
Timo Sirainen <tss@iki.fi>
parents: 6007
diff changeset
377 /* mask doesn't end with %. we don't want to show
62f92a68fc72 LSUB: If pattern doesn't end with %, don't show extra unsubscribed mailboxes
Timo Sirainen <tss@iki.fi>
parents: 6007
diff changeset
378 any extra mailboxes. */
62f92a68fc72 LSUB: If pattern doesn't end with %, don't show extra unsubscribed mailboxes
Timo Sirainen <tss@iki.fi>
parents: 6007
diff changeset
379 continue;
62f92a68fc72 LSUB: If pattern doesn't end with %, don't show extra unsubscribed mailboxes
Timo Sirainen <tss@iki.fi>
parents: 6007
diff changeset
380 }
62f92a68fc72 LSUB: If pattern doesn't end with %, don't show extra unsubscribed mailboxes
Timo Sirainen <tss@iki.fi>
parents: 6007
diff changeset
381
2350
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
382 str_truncate(str, 0);
5314
ce59b45431fb Use less memory when listing lots of mailboxes
Timo Sirainen <tss@iki.fi>
parents: 5307
diff changeset
383 str_printfa(str, "* %s (", ctx->lsub ? "LSUB" : "LIST");
5829
1d73153584d2 Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents: 5818
diff changeset
384 mailbox_flags2str(ctx, str, flags);
5314
ce59b45431fb Use less memory when listing lots of mailboxes
Timo Sirainen <tss@iki.fi>
parents: 5307
diff changeset
385 str_printfa(str, ") \"%s\" ", ctx->ns->sep_str);
2350
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
386 imap_quote_append_string(str, name, FALSE);
5829
1d73153584d2 Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents: 5818
diff changeset
387 mailbox_childinfo2str(ctx, str, flags);
1d73153584d2 Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents: 5818
diff changeset
388
7534
9c781d042afe LIST X-STATUS: Send LIST reply before STATUS reply.
Timo Sirainen <tss@iki.fi>
parents: 7531
diff changeset
389 ret = client_send_line(ctx->cmd->client, str_c(str));
6018
b148e4c41aa7 Added X-STATUS (..) return option to send STATUS replies to client for
Timo Sirainen <tss@iki.fi>
parents: 6017
diff changeset
390 if (ctx->status_items != 0 &&
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6856
diff changeset
391 (flags & (MAILBOX_NONEXISTENT | MAILBOX_NOSELECT)) == 0) {
7226
e6693a0ec8e1 Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents: 7148
diff changeset
392 T_BEGIN {
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6856
diff changeset
393 list_send_status(ctx, name);
7226
e6693a0ec8e1 Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents: 7148
diff changeset
394 } T_END;
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6856
diff changeset
395 }
7534
9c781d042afe LIST X-STATUS: Send LIST reply before STATUS reply.
Timo Sirainen <tss@iki.fi>
parents: 7531
diff changeset
396 if (ret == 0) {
2425
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
397 /* buffer is full, continue later */
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
398 return 0;
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
399 }
2350
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
400 }
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
401
5611
44db6ddd5a17 Removed mail_storage_set_list_error(). Handle the errors directly.
Timo Sirainen <tss@iki.fi>
parents: 5571
diff changeset
402 if (mailbox_list_iter_deinit(&ctx->list_iter) < 0)
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents: 4729
diff changeset
403 ret = -1;
2350
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
404
2425
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
405 return ret < 0 ? -1 : 1;
2350
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
406 }
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
407
5839
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
408 static bool list_pattern_has_wildcards(const char *pattern)
3875
e5abc07d843f Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
409 {
5839
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
410 for (; *pattern != '\0'; pattern++) {
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
411 if (*pattern == '%' || *pattern == '*')
3875
e5abc07d843f Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
412 return TRUE;
e5abc07d843f Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
413 }
e5abc07d843f Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
414 return FALSE;
e5abc07d843f Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
415 }
e5abc07d843f Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
416
e5abc07d843f Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
417 static void
5839
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
418 skip_namespace_prefix(const char **prefix, const char **pattern,
3875
e5abc07d843f Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
419 bool inbox_check, char sep)
2350
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
420 {
5839
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
421 size_t pattern_len, prefix_len;
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3856
diff changeset
422 bool match;
2350
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
423
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
424 prefix_len = strlen(*prefix);
5839
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
425 pattern_len = strlen(*pattern);
3856
b97de2e354bd Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 3305
diff changeset
426
5839
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
427 if (pattern_len < prefix_len) {
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
428 /* eg. namespace prefix = "INBOX.", pattern = "INBOX" */
3856
b97de2e354bd Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 3305
diff changeset
429 return;
b97de2e354bd Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 3305
diff changeset
430 }
2350
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
431
5839
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
432 match = strncmp(*prefix, *pattern, prefix_len) == 0;
3875
e5abc07d843f Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
433 if (!match && inbox_check) {
3856
b97de2e354bd Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 3305
diff changeset
434 /* try INBOX check. */
b97de2e354bd Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 3305
diff changeset
435 match = prefix_len >= 5 &&
5839
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
436 strncasecmp(*prefix, *pattern, 5) == 0 &&
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
437 strncmp(*prefix + 5, *pattern + 5,
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
438 prefix_len - 5) == 0 &&
3875
e5abc07d843f Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
439 strncasecmp(*prefix, "INBOX", 5) == 0 &&
e5abc07d843f Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
440 ((*prefix)[5] == sep || (*prefix)[5] == '\0');
3856
b97de2e354bd Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 3305
diff changeset
441 }
b97de2e354bd Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 3305
diff changeset
442
b97de2e354bd Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 3305
diff changeset
443 if (match) {
b97de2e354bd Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 3305
diff changeset
444 *prefix += prefix_len;
5839
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
445 *pattern += prefix_len;
2350
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
446 }
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
447 }
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
448
5803
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
449 static bool
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
450 skip_namespace_prefix_ref(struct cmd_list_context *ctx,
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
451 const char **cur_ns_prefix_p,
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
452 const char **cur_ref_p)
5803
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
453 {
5809
ab88a5e8ac95 Fixes for last changes.
Timo Sirainen <tss@iki.fi>
parents: 5808
diff changeset
454 const char *cur_ns_prefix = *cur_ns_prefix_p;
ab88a5e8ac95 Fixes for last changes.
Timo Sirainen <tss@iki.fi>
parents: 5808
diff changeset
455 const char *cur_ref = *cur_ref_p;
5803
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
456
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
457 if (*cur_ref != '\0') {
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
458 /* reference argument given. skip namespace prefix using it.
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
459
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
460 cur_ns_prefix = foo/bar/
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
461 cur_ref = foo/
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
462 -> cur_ns_prefix=bar/, cur_ref=""
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
463 cur_ref = foo/bar/baz
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
464 -> cur_ns_prefix="", cur_ref="baz"
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
465 */
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
466 skip_namespace_prefix(&cur_ns_prefix, &cur_ref, TRUE,
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
467 ctx->ns->sep);
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
468
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
469 if (*cur_ref != '\0' && *cur_ns_prefix != '\0') {
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
470 /* reference parameter didn't match with
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
471 namespace prefix. skip this. */
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
472 return FALSE;
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
473 }
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
474 }
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
475
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
476 *cur_ns_prefix_p = cur_ns_prefix;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
477 *cur_ref_p = cur_ref;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
478 return TRUE;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
479 }
5803
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
480
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
481 static void
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
482 skip_namespace_prefix_pattern(struct cmd_list_context *ctx,
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
483 const char **cur_ns_prefix_p,
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
484 const char *cur_ref, const char **cur_pattern_p)
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
485 {
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
486 const char *cur_ns_prefix = *cur_ns_prefix_p;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
487 const char *cur_pattern = *cur_pattern_p;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
488 const char *old_ns_prefix = cur_ns_prefix;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
489 const char *old_pattern = cur_pattern;
5803
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
490
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
491 if (*cur_ns_prefix == '\0')
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
492 return;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
493
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
494 /* skip namespace prefix using pattern */
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
495 i_assert(*cur_ref == '\0');
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
496
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
497 skip_namespace_prefix(&cur_ns_prefix, &cur_pattern,
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
498 cur_ref == ctx->ref, ctx->ns->sep);
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
499
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
500 if (*cur_pattern == '\0' && *cur_ns_prefix == '\0') {
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
501 /* trying to list the namespace prefix itself. */
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
502 cur_ns_prefix = old_ns_prefix;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
503 cur_pattern = old_pattern;
5803
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
504 }
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
505
5809
ab88a5e8ac95 Fixes for last changes.
Timo Sirainen <tss@iki.fi>
parents: 5808
diff changeset
506 *cur_ns_prefix_p = cur_ns_prefix;
5839
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
507 *cur_pattern_p = cur_pattern;
5803
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
508 }
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
509
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
510 static enum imap_match_result
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
511 list_use_inboxcase(struct cmd_list_context *ctx)
5803
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
512 {
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
513 struct imap_match_glob *inbox_glob;
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
514 const char *const *pat;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
515 enum imap_match_result match, ret;
5803
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
516
5808
45735dd11f17 Moved several namespace booleans to a flags field. Removed unused
Timo Sirainen <tss@iki.fi>
parents: 5807
diff changeset
517 if (*ctx->ns->prefix != '\0' &&
45735dd11f17 Moved several namespace booleans to a flags field. Removed unused
Timo Sirainen <tss@iki.fi>
parents: 5807
diff changeset
518 (ctx->ns->flags & NAMESPACE_FLAG_INBOX) == 0)
5803
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
519 return IMAP_MATCH_NO;
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
520
5839
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
521 /* if the original reference and pattern combined produces something
5803
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
522 that matches INBOX, the INBOX casing is on. */
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
523 ret = IMAP_MATCH_NO;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
524 for (pat = ctx->patterns; *pat != NULL; pat++) {
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
525 inbox_glob =
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
526 imap_match_init(pool_datastack_create(),
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
527 t_strconcat(ctx->ref, *pat, NULL),
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
528 TRUE, ctx->ns->sep);
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
529 match = imap_match(inbox_glob, "INBOX");
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
530
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
531 if (match == IMAP_MATCH_YES)
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
532 return IMAP_MATCH_YES;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
533 if ((match & IMAP_MATCH_PARENT) != 0)
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
534 ret = IMAP_MATCH_PARENT;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
535 }
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
536 return ret;
5803
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
537 }
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
538
6014
92fabfda82f9 Let lib-storage handle matching namespace prefixes as well.
Timo Sirainen <tss@iki.fi>
parents: 6009
diff changeset
539 static bool
6577
5b2ff32877d4 Send namespace prefix LIST reply for list=no namespaces also if doing LIST
Timo Sirainen <tss@iki.fi>
parents: 6573
diff changeset
540 list_want_send_prefix(struct cmd_list_context *ctx, const char *pattern)
5b2ff32877d4 Send namespace prefix LIST reply for list=no namespaces also if doing LIST
Timo Sirainen <tss@iki.fi>
parents: 6573
diff changeset
541 {
5b2ff32877d4 Send namespace prefix LIST reply for list=no namespaces also if doing LIST
Timo Sirainen <tss@iki.fi>
parents: 6573
diff changeset
542 /* don't send the prefix if we're listing subscribed mailboxes */
5b2ff32877d4 Send namespace prefix LIST reply for list=no namespaces also if doing LIST
Timo Sirainen <tss@iki.fi>
parents: 6573
diff changeset
543 if ((ctx->list_flags & MAILBOX_LIST_ITER_SELECT_SUBSCRIBED) != 0)
5b2ff32877d4 Send namespace prefix LIST reply for list=no namespaces also if doing LIST
Timo Sirainen <tss@iki.fi>
parents: 6573
diff changeset
544 return FALSE;
5b2ff32877d4 Send namespace prefix LIST reply for list=no namespaces also if doing LIST
Timo Sirainen <tss@iki.fi>
parents: 6573
diff changeset
545
8461
659667d89f69 Added list=children option for namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8082
diff changeset
546 /* send the prefix if namespace is listable. if children are listable
659667d89f69 Added list=children option for namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8082
diff changeset
547 we may or may not need to send it. */
659667d89f69 Added list=children option for namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8082
diff changeset
548 if ((ctx->ns->flags & (NAMESPACE_FLAG_LIST_PREFIX |
659667d89f69 Added list=children option for namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8082
diff changeset
549 NAMESPACE_FLAG_LIST_CHILDREN)) != 0)
6577
5b2ff32877d4 Send namespace prefix LIST reply for list=no namespaces also if doing LIST
Timo Sirainen <tss@iki.fi>
parents: 6573
diff changeset
550 return TRUE;
5b2ff32877d4 Send namespace prefix LIST reply for list=no namespaces also if doing LIST
Timo Sirainen <tss@iki.fi>
parents: 6573
diff changeset
551
5b2ff32877d4 Send namespace prefix LIST reply for list=no namespaces also if doing LIST
Timo Sirainen <tss@iki.fi>
parents: 6573
diff changeset
552 /* ..or if pattern is exactly the same as namespace prefix.
5b2ff32877d4 Send namespace prefix LIST reply for list=no namespaces also if doing LIST
Timo Sirainen <tss@iki.fi>
parents: 6573
diff changeset
553 some clients (mutt) want to do LIST "" prefix. */
5b2ff32877d4 Send namespace prefix LIST reply for list=no namespaces also if doing LIST
Timo Sirainen <tss@iki.fi>
parents: 6573
diff changeset
554 for (; *pattern != '\0'; pattern++) {
5b2ff32877d4 Send namespace prefix LIST reply for list=no namespaces also if doing LIST
Timo Sirainen <tss@iki.fi>
parents: 6573
diff changeset
555 if (*pattern == '*' || *pattern == '%')
5b2ff32877d4 Send namespace prefix LIST reply for list=no namespaces also if doing LIST
Timo Sirainen <tss@iki.fi>
parents: 6573
diff changeset
556 break;
5b2ff32877d4 Send namespace prefix LIST reply for list=no namespaces also if doing LIST
Timo Sirainen <tss@iki.fi>
parents: 6573
diff changeset
557 }
5b2ff32877d4 Send namespace prefix LIST reply for list=no namespaces also if doing LIST
Timo Sirainen <tss@iki.fi>
parents: 6573
diff changeset
558 return *pattern == '\0';
5b2ff32877d4 Send namespace prefix LIST reply for list=no namespaces also if doing LIST
Timo Sirainen <tss@iki.fi>
parents: 6573
diff changeset
559 }
5b2ff32877d4 Send namespace prefix LIST reply for list=no namespaces also if doing LIST
Timo Sirainen <tss@iki.fi>
parents: 6573
diff changeset
560
5b2ff32877d4 Send namespace prefix LIST reply for list=no namespaces also if doing LIST
Timo Sirainen <tss@iki.fi>
parents: 6573
diff changeset
561 static bool
6014
92fabfda82f9 Let lib-storage handle matching namespace prefixes as well.
Timo Sirainen <tss@iki.fi>
parents: 6009
diff changeset
562 list_namespace_match_pattern(struct cmd_list_context *ctx, bool inboxcase,
92fabfda82f9 Let lib-storage handle matching namespace prefixes as well.
Timo Sirainen <tss@iki.fi>
parents: 6009
diff changeset
563 const char *cur_ref, const char *cur_ns_prefix,
92fabfda82f9 Let lib-storage handle matching namespace prefixes as well.
Timo Sirainen <tss@iki.fi>
parents: 6009
diff changeset
564 const char *cur_pattern)
5803
6ae0dc6dc3b3 Code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5802
diff changeset
565 {
6014
92fabfda82f9 Let lib-storage handle matching namespace prefixes as well.
Timo Sirainen <tss@iki.fi>
parents: 6009
diff changeset
566 const char *orig_cur_pattern = cur_pattern;
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
567 struct mail_namespace *ns = ctx->ns;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
568 struct imap_match_glob *pat_glob;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
569 enum imap_match_result match;
6573
c901bdf0db75 Fixes for listing namespaces with prefixes and real != virtual separator.
Timo Sirainen <tss@iki.fi>
parents: 6496
diff changeset
570 const char *p;
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
571 size_t len;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
572
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
573 skip_namespace_prefix_pattern(ctx, &cur_ns_prefix,
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
574 cur_ref, &cur_pattern);
9021
e36a9edb5fb0 Allow prefix="" namespace to have list=no and make it work in a somewhat useful way.
Timo Sirainen <tss@iki.fi>
parents: 8971
diff changeset
575 if (*cur_ns_prefix == '\0') {
9029
db2fdf3529ac LIST: Previous prefix="", list=no change broke listing other list=no namespaces.
Timo Sirainen <tss@iki.fi>
parents: 9021
diff changeset
576 if (*ns->prefix == '\0') {
db2fdf3529ac LIST: Previous prefix="", list=no change broke listing other list=no namespaces.
Timo Sirainen <tss@iki.fi>
parents: 9021
diff changeset
577 /* no namespace prefix: if list=no we don't want to
db2fdf3529ac LIST: Previous prefix="", list=no change broke listing other list=no namespaces.
Timo Sirainen <tss@iki.fi>
parents: 9021
diff changeset
578 show anything, except when the client does e.g.
db2fdf3529ac LIST: Previous prefix="", list=no change broke listing other list=no namespaces.
Timo Sirainen <tss@iki.fi>
parents: 9021
diff changeset
579 LIST "" mailbox. prefix="", list=no namespace is
db2fdf3529ac LIST: Previous prefix="", list=no change broke listing other list=no namespaces.
Timo Sirainen <tss@iki.fi>
parents: 9021
diff changeset
580 mainly useful for working around client bugs. */
db2fdf3529ac LIST: Previous prefix="", list=no change broke listing other list=no namespaces.
Timo Sirainen <tss@iki.fi>
parents: 9021
diff changeset
581 if ((ns->flags & NAMESPACE_FLAG_LIST_PREFIX) == 0 &&
db2fdf3529ac LIST: Previous prefix="", list=no change broke listing other list=no namespaces.
Timo Sirainen <tss@iki.fi>
parents: 9021
diff changeset
582 list_pattern_has_wildcards(cur_pattern))
db2fdf3529ac LIST: Previous prefix="", list=no change broke listing other list=no namespaces.
Timo Sirainen <tss@iki.fi>
parents: 9021
diff changeset
583 return FALSE;
db2fdf3529ac LIST: Previous prefix="", list=no change broke listing other list=no namespaces.
Timo Sirainen <tss@iki.fi>
parents: 9021
diff changeset
584 }
db2fdf3529ac LIST: Previous prefix="", list=no change broke listing other list=no namespaces.
Timo Sirainen <tss@iki.fi>
parents: 9021
diff changeset
585 return TRUE;
9021
e36a9edb5fb0 Allow prefix="" namespace to have list=no and make it work in a somewhat useful way.
Timo Sirainen <tss@iki.fi>
parents: 8971
diff changeset
586 }
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
587
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
588 /* namespace prefix still wasn't completely skipped over.
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
589 for example cur_ns_prefix=INBOX/, pattern=%/% or pattern=IN%.
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
590 Check that pattern matches namespace prefix. */
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
591 i_assert(*cur_ref == '\0');
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
592
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
593 /* drop the trailing separator in namespace prefix.
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
594 don't do it if we're listing only the prefix itself
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
595 (LIST "" foo/ needs to return "foo/" entry) */
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
596 len = strlen(cur_ns_prefix);
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
597 if (cur_ns_prefix[len-1] == ns->sep &&
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
598 strcmp(cur_pattern, cur_ns_prefix) != 0) {
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
599 ctx->cur_ns_skip_trailing_sep = TRUE;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
600 cur_ns_prefix = t_strndup(cur_ns_prefix, len-1);
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
601 }
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
602
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
603 /* hidden and non-listable namespaces are invisible to wildcards */
8461
659667d89f69 Added list=children option for namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8082
diff changeset
604 if ((ns->flags & (NAMESPACE_FLAG_LIST_PREFIX |
659667d89f69 Added list=children option for namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8082
diff changeset
605 NAMESPACE_FLAG_LIST_CHILDREN)) == 0 &&
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
606 list_pattern_has_wildcards(cur_pattern))
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
607 return FALSE;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
608
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
609 /* check if this namespace prefix matches the current pattern */
6014
92fabfda82f9 Let lib-storage handle matching namespace prefixes as well.
Timo Sirainen <tss@iki.fi>
parents: 6009
diff changeset
610 pat_glob = imap_match_init(pool_datastack_create(), orig_cur_pattern,
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
611 inboxcase, ns->sep);
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
612 match = imap_match(pat_glob, cur_ns_prefix);
6573
c901bdf0db75 Fixes for listing namespaces with prefixes and real != virtual separator.
Timo Sirainen <tss@iki.fi>
parents: 6496
diff changeset
613 if (match == IMAP_MATCH_YES) {
6577
5b2ff32877d4 Send namespace prefix LIST reply for list=no namespaces also if doing LIST
Timo Sirainen <tss@iki.fi>
parents: 6573
diff changeset
614 if (list_want_send_prefix(ctx, orig_cur_pattern))
6573
c901bdf0db75 Fixes for listing namespaces with prefixes and real != virtual separator.
Timo Sirainen <tss@iki.fi>
parents: 6496
diff changeset
615 ctx->cur_ns_send_prefix = TRUE;
6577
5b2ff32877d4 Send namespace prefix LIST reply for list=no namespaces also if doing LIST
Timo Sirainen <tss@iki.fi>
parents: 6573
diff changeset
616
6573
c901bdf0db75 Fixes for listing namespaces with prefixes and real != virtual separator.
Timo Sirainen <tss@iki.fi>
parents: 6496
diff changeset
617 /* if the pattern contains '*' characters, we'll need to
c901bdf0db75 Fixes for listing namespaces with prefixes and real != virtual separator.
Timo Sirainen <tss@iki.fi>
parents: 6496
diff changeset
618 check our children too */
c901bdf0db75 Fixes for listing namespaces with prefixes and real != virtual separator.
Timo Sirainen <tss@iki.fi>
parents: 6496
diff changeset
619 for (p = orig_cur_pattern; *p != '\0'; p++) {
c901bdf0db75 Fixes for listing namespaces with prefixes and real != virtual separator.
Timo Sirainen <tss@iki.fi>
parents: 6496
diff changeset
620 if (*p == '*')
c901bdf0db75 Fixes for listing namespaces with prefixes and real != virtual separator.
Timo Sirainen <tss@iki.fi>
parents: 6496
diff changeset
621 return TRUE;
c901bdf0db75 Fixes for listing namespaces with prefixes and real != virtual separator.
Timo Sirainen <tss@iki.fi>
parents: 6496
diff changeset
622 }
8902
5ce33cfc568f imap: Fixed LIST with namespace prefixes that have multiple hierarchies.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
623 } else {
5ce33cfc568f imap: Fixed LIST with namespace prefixes that have multiple hierarchies.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
624 while ((match & IMAP_MATCH_PARENT) != 0) {
5ce33cfc568f imap: Fixed LIST with namespace prefixes that have multiple hierarchies.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
625 p = strrchr(cur_ns_prefix, ns->sep);
5ce33cfc568f imap: Fixed LIST with namespace prefixes that have multiple hierarchies.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
626 if (p == NULL)
5ce33cfc568f imap: Fixed LIST with namespace prefixes that have multiple hierarchies.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
627 break;
5ce33cfc568f imap: Fixed LIST with namespace prefixes that have multiple hierarchies.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
628 cur_ns_prefix = t_strdup_until(cur_ns_prefix, p);
5ce33cfc568f imap: Fixed LIST with namespace prefixes that have multiple hierarchies.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
629 match = imap_match(pat_glob, cur_ns_prefix);
5ce33cfc568f imap: Fixed LIST with namespace prefixes that have multiple hierarchies.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
630 }
5ce33cfc568f imap: Fixed LIST with namespace prefixes that have multiple hierarchies.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
631 if (match == IMAP_MATCH_YES &&
5ce33cfc568f imap: Fixed LIST with namespace prefixes that have multiple hierarchies.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
632 mail_namespace_find_prefix_nosep(ns->user->namespaces,
5ce33cfc568f imap: Fixed LIST with namespace prefixes that have multiple hierarchies.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
633 cur_ns_prefix) == NULL) {
5ce33cfc568f imap: Fixed LIST with namespace prefixes that have multiple hierarchies.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
634 /* ns prefix="foo/bar/" and we're listing e.g. % */
5ce33cfc568f imap: Fixed LIST with namespace prefixes that have multiple hierarchies.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
635 if (list_want_send_prefix(ctx, orig_cur_pattern))
5ce33cfc568f imap: Fixed LIST with namespace prefixes that have multiple hierarchies.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
636 ctx->cur_ns_send_prefix = TRUE;
5ce33cfc568f imap: Fixed LIST with namespace prefixes that have multiple hierarchies.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
637 }
6573
c901bdf0db75 Fixes for listing namespaces with prefixes and real != virtual separator.
Timo Sirainen <tss@iki.fi>
parents: 6496
diff changeset
638 }
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
639
6573
c901bdf0db75 Fixes for listing namespaces with prefixes and real != virtual separator.
Timo Sirainen <tss@iki.fi>
parents: 6496
diff changeset
640 return (match & IMAP_MATCH_CHILDREN) != 0;
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
641 }
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
642
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
643 static void list_namespace_init(struct cmd_list_context *ctx)
2350
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
644 {
5500
4862cb37106c Moved namespace handling to lib-storage. Beginnings of namespace support for
Timo Sirainen <tss@iki.fi>
parents: 5438
diff changeset
645 struct mail_namespace *ns = ctx->ns;
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
646 const char *cur_ns_prefix, *cur_ref, *const *pat, *pattern;
4545
5ab638aafc7b Fixes to handling INBOX in LIST.
Timo Sirainen <tss@iki.fi>
parents: 4542
diff changeset
647 enum imap_match_result inbox_match;
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
648 ARRAY_DEFINE(used_patterns, const char *);
6014
92fabfda82f9 Let lib-storage handle matching namespace prefixes as well.
Timo Sirainen <tss@iki.fi>
parents: 6009
diff changeset
649 bool inboxcase;
2350
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
650
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
651 cur_ns_prefix = ns->prefix;
5809
ab88a5e8ac95 Fixes for last changes.
Timo Sirainen <tss@iki.fi>
parents: 5808
diff changeset
652 cur_ref = ctx->ref;
ab88a5e8ac95 Fixes for last changes.
Timo Sirainen <tss@iki.fi>
parents: 5808
diff changeset
653
6603
afc28dd2d4c5 Added subscriptions setting to namespaces to specify if it should handle
Timo Sirainen <tss@iki.fi>
parents: 6577
diff changeset
654 if ((ns->flags & NAMESPACE_FLAG_SUBSCRIPTIONS) == 0 &&
5829
1d73153584d2 Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents: 5818
diff changeset
655 (ctx->list_flags & MAILBOX_LIST_ITER_SELECT_SUBSCRIBED) != 0) {
6603
afc28dd2d4c5 Added subscriptions setting to namespaces to specify if it should handle
Timo Sirainen <tss@iki.fi>
parents: 6577
diff changeset
656 /* ignore namespaces which don't have subscriptions */
5818
86282604e2f5 Don't use subscriptions with hidden namespaces.
Timo Sirainen <tss@iki.fi>
parents: 5811
diff changeset
657 return;
86282604e2f5 Don't use subscriptions with hidden namespaces.
Timo Sirainen <tss@iki.fi>
parents: 5811
diff changeset
658 }
86282604e2f5 Don't use subscriptions with hidden namespaces.
Timo Sirainen <tss@iki.fi>
parents: 5811
diff changeset
659
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
660 ctx->cur_ns_skip_trailing_sep = FALSE;
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
661
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
662 if ((ns->flags & NAMESPACE_FLAG_INBOX) != 0)
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
663 ctx->seen_inbox_namespace = TRUE;
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
664
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
665 if (*cur_ns_prefix != '\0') {
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
666 /* namespace has a prefix. see if we can skip over it. */
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
667 if (!skip_namespace_prefix_ref(ctx, &cur_ns_prefix, &cur_ref))
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
668 return;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
669 }
2350
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
670
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
671 inbox_match = list_use_inboxcase(ctx);
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
672 ctx->cur_ns_match_inbox = inbox_match == IMAP_MATCH_YES;
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
673 inboxcase = (inbox_match & (IMAP_MATCH_YES | IMAP_MATCH_PARENT)) != 0;
3875
e5abc07d843f Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
674
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
675 t_array_init(&used_patterns, 16);
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
676 for (pat = ctx->patterns; *pat != NULL; pat++) {
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
677 pattern = *pat;
6014
92fabfda82f9 Let lib-storage handle matching namespace prefixes as well.
Timo Sirainen <tss@iki.fi>
parents: 6009
diff changeset
678 /* see if pattern even has a chance of matching the
92fabfda82f9 Let lib-storage handle matching namespace prefixes as well.
Timo Sirainen <tss@iki.fi>
parents: 6009
diff changeset
679 namespace prefix */
92fabfda82f9 Let lib-storage handle matching namespace prefixes as well.
Timo Sirainen <tss@iki.fi>
parents: 6009
diff changeset
680 if (list_namespace_match_pattern(ctx, inboxcase, cur_ref,
92fabfda82f9 Let lib-storage handle matching namespace prefixes as well.
Timo Sirainen <tss@iki.fi>
parents: 6009
diff changeset
681 cur_ns_prefix, pattern)) {
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
682 pattern = mailbox_list_join_refpattern(ns->list,
6573
c901bdf0db75 Fixes for listing namespaces with prefixes and real != virtual separator.
Timo Sirainen <tss@iki.fi>
parents: 6496
diff changeset
683 ctx->ref, pattern);
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
684 array_append(&used_patterns, &pattern, 1);
4729
5ac887e3a53d If we had only prefixed namespaces and we listed for "%", INBOX's flags
Timo Sirainen <tss@iki.fi>
parents: 4639
diff changeset
685 }
2425
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
686 }
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
687
6573
c901bdf0db75 Fixes for listing namespaces with prefixes and real != virtual separator.
Timo Sirainen <tss@iki.fi>
parents: 6496
diff changeset
688 if (array_count(&used_patterns) == 0) {
8016
8b240457c4a4 LIST didn't show INBOX if list patterns didn't match namespace prefix.
Timo Sirainen <tss@iki.fi>
parents: 7808
diff changeset
689 if (!ctx->cur_ns_match_inbox) {
8b240457c4a4 LIST didn't show INBOX if list patterns didn't match namespace prefix.
Timo Sirainen <tss@iki.fi>
parents: 7808
diff changeset
690 /* it's possible that the namespace prefix matched,
8b240457c4a4 LIST didn't show INBOX if list patterns didn't match namespace prefix.
Timo Sirainen <tss@iki.fi>
parents: 7808
diff changeset
691 even though its children didn't */
8b240457c4a4 LIST didn't show INBOX if list patterns didn't match namespace prefix.
Timo Sirainen <tss@iki.fi>
parents: 7808
diff changeset
692 if (ctx->cur_ns_send_prefix)
8461
659667d89f69 Added list=children option for namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8082
diff changeset
693 list_namespace_send_prefix(ctx, FALSE);
8016
8b240457c4a4 LIST didn't show INBOX if list patterns didn't match namespace prefix.
Timo Sirainen <tss@iki.fi>
parents: 7808
diff changeset
694 return;
8b240457c4a4 LIST didn't show INBOX if list patterns didn't match namespace prefix.
Timo Sirainen <tss@iki.fi>
parents: 7808
diff changeset
695 }
8b240457c4a4 LIST didn't show INBOX if list patterns didn't match namespace prefix.
Timo Sirainen <tss@iki.fi>
parents: 7808
diff changeset
696 /* we should still list INBOX */
8b240457c4a4 LIST didn't show INBOX if list patterns didn't match namespace prefix.
Timo Sirainen <tss@iki.fi>
parents: 7808
diff changeset
697 pattern = "INBOX";
8b240457c4a4 LIST didn't show INBOX if list patterns didn't match namespace prefix.
Timo Sirainen <tss@iki.fi>
parents: 7808
diff changeset
698 array_append(&used_patterns, &pattern, 1);
6573
c901bdf0db75 Fixes for listing namespaces with prefixes and real != virtual separator.
Timo Sirainen <tss@iki.fi>
parents: 6496
diff changeset
699 }
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
700 (void)array_append_space(&used_patterns); /* NULL-terminate */
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
701 pat = array_idx(&used_patterns, 0);
2425
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
702
5500
4862cb37106c Moved namespace handling to lib-storage. Beginnings of namespace support for
Timo Sirainen <tss@iki.fi>
parents: 5438
diff changeset
703 cur_ref = mail_namespace_fix_sep(ns, cur_ref);
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
704 ctx->list_iter = mailbox_list_iter_init_multiple(ns->list, pat,
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
705 ctx->list_flags);
2425
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
706 }
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
707
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
708 static void list_inbox(struct cmd_list_context *ctx)
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
709 {
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
710 const char *str;
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
711
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
712 /* INBOX always exists */
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
713 if (!ctx->inbox_found && ctx->cur_ns_match_inbox &&
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
714 (ctx->ns->flags & NAMESPACE_FLAG_INBOX) != 0 &&
5829
1d73153584d2 Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents: 5818
diff changeset
715 (ctx->list_flags & MAILBOX_LIST_ITER_SELECT_SUBSCRIBED) == 0) {
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
716 str = t_strdup_printf("* LIST (\\Unmarked) \"%s\" \"INBOX\"",
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
717 ctx->ns->sep_str);
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
718 client_send_line(ctx->cmd->client, str);
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
719 }
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
720 }
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
721
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3856
diff changeset
722 static bool cmd_list_continue(struct client_command_context *cmd)
2425
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
723 {
3141
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 2590
diff changeset
724 struct cmd_list_context *ctx = cmd->context;
2425
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
725 int ret;
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
726
4939
ff2272c228cc Dovecot is now able to execute multiple commands at the same time.
Timo Sirainen <tss@iki.fi>
parents: 4848
diff changeset
727 if (cmd->cancel) {
5611
44db6ddd5a17 Removed mail_storage_set_list_error(). Handle the errors directly.
Timo Sirainen <tss@iki.fi>
parents: 5571
diff changeset
728 if (ctx->list_iter != NULL)
44db6ddd5a17 Removed mail_storage_set_list_error(). Handle the errors directly.
Timo Sirainen <tss@iki.fi>
parents: 5571
diff changeset
729 (void)mailbox_list_iter_deinit(&ctx->list_iter);
4939
ff2272c228cc Dovecot is now able to execute multiple commands at the same time.
Timo Sirainen <tss@iki.fi>
parents: 4848
diff changeset
730 return TRUE;
ff2272c228cc Dovecot is now able to execute multiple commands at the same time.
Timo Sirainen <tss@iki.fi>
parents: 4848
diff changeset
731 }
2425
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
732 for (; ctx->ns != NULL; ctx->ns = ctx->ns->next) {
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
733 if (ctx->list_iter == NULL) {
7226
e6693a0ec8e1 Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents: 7148
diff changeset
734 T_BEGIN {
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6856
diff changeset
735 list_namespace_init(ctx);
7226
e6693a0ec8e1 Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents: 7148
diff changeset
736 } T_END;
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
737 if (ctx->list_iter == NULL)
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
738 continue;
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
739 }
2425
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
740
7226
e6693a0ec8e1 Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents: 7148
diff changeset
741 T_BEGIN {
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6856
diff changeset
742 ret = list_namespace_mailboxes(ctx);
7226
e6693a0ec8e1 Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents: 7148
diff changeset
743 } T_END;
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6856
diff changeset
744 if (ret < 0) {
5611
44db6ddd5a17 Removed mail_storage_set_list_error(). Handle the errors directly.
Timo Sirainen <tss@iki.fi>
parents: 5571
diff changeset
745 client_send_list_error(cmd, ctx->ns->list);
2425
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
746 return TRUE;
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
747 }
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
748 if (ret == 0)
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
749 return FALSE;
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
750
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
751 if (ctx->cur_ns_send_prefix) {
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
752 /* no mailboxes in this namespace */
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
753 list_namespace_send_prefix(ctx, FALSE);
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
754 }
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
755 list_inbox(ctx);
2425
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
756 }
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
757
3141
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 2590
diff changeset
758 client_send_tagline(cmd, !ctx->lsub ?
2425
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
759 "OK List completed." :
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
760 "OK Lsub completed.");
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
761 return TRUE;
2350
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
762 }
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
763
5797
de3a087ea8d2 Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents: 5611
diff changeset
764 static void cmd_list_ref_root(struct client *client, const char *ref)
de3a087ea8d2 Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents: 5611
diff changeset
765 {
de3a087ea8d2 Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents: 5611
diff changeset
766 struct mail_namespace *ns;
de3a087ea8d2 Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents: 5611
diff changeset
767 const char *ns_prefix;
5802
8416f66ac5ab Make sure all listable namespaces use the same separator. If there's no ref
Timo Sirainen <tss@iki.fi>
parents: 5800
diff changeset
768 char ns_sep;
5797
de3a087ea8d2 Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents: 5611
diff changeset
769 string_t *str;
de3a087ea8d2 Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents: 5611
diff changeset
770
de3a087ea8d2 Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents: 5611
diff changeset
771 /* Special request to return the hierarchy delimiter and mailbox root
de3a087ea8d2 Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents: 5611
diff changeset
772 name. If namespace has a prefix, it's returned as the mailbox root.
de3a087ea8d2 Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents: 5611
diff changeset
773 Otherwise we'll emulate UW-IMAP behavior. */
8082
db66611fd195 Added struct mail_user and fixed the code to support multiple users per process.
Timo Sirainen <tss@iki.fi>
parents: 8016
diff changeset
774 ns = mail_namespace_find_visible(client->user->namespaces, &ref);
5802
8416f66ac5ab Make sure all listable namespaces use the same separator. If there's no ref
Timo Sirainen <tss@iki.fi>
parents: 5800
diff changeset
775 if (ns != NULL) {
5797
de3a087ea8d2 Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents: 5611
diff changeset
776 ns_prefix = ns->prefix;
5802
8416f66ac5ab Make sure all listable namespaces use the same separator. If there's no ref
Timo Sirainen <tss@iki.fi>
parents: 5800
diff changeset
777 ns_sep = ns->sep;
8416f66ac5ab Make sure all listable namespaces use the same separator. If there's no ref
Timo Sirainen <tss@iki.fi>
parents: 5800
diff changeset
778 } else {
5797
de3a087ea8d2 Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents: 5611
diff changeset
779 ns_prefix = "";
8082
db66611fd195 Added struct mail_user and fixed the code to support multiple users per process.
Timo Sirainen <tss@iki.fi>
parents: 8016
diff changeset
780 ns_sep = mail_namespace_get_root_sep(client->user->namespaces);
5797
de3a087ea8d2 Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents: 5611
diff changeset
781 }
de3a087ea8d2 Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents: 5611
diff changeset
782
de3a087ea8d2 Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents: 5611
diff changeset
783 str = t_str_new(64);
5802
8416f66ac5ab Make sure all listable namespaces use the same separator. If there's no ref
Timo Sirainen <tss@iki.fi>
parents: 5800
diff changeset
784 str_append(str, "* LIST (\\Noselect) \"");
8416f66ac5ab Make sure all listable namespaces use the same separator. If there's no ref
Timo Sirainen <tss@iki.fi>
parents: 5800
diff changeset
785 if (ns_sep == '\\' || ns_sep == '"')
8416f66ac5ab Make sure all listable namespaces use the same separator. If there's no ref
Timo Sirainen <tss@iki.fi>
parents: 5800
diff changeset
786 str_append_c(str, '\\');
8416f66ac5ab Make sure all listable namespaces use the same separator. If there's no ref
Timo Sirainen <tss@iki.fi>
parents: 5800
diff changeset
787 str_printfa(str, "%c\" ", ns_sep);
8416f66ac5ab Make sure all listable namespaces use the same separator. If there's no ref
Timo Sirainen <tss@iki.fi>
parents: 5800
diff changeset
788 if (*ns_prefix != '\0') {
5797
de3a087ea8d2 Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents: 5611
diff changeset
789 /* non-hidden namespace, use it as the root name */
de3a087ea8d2 Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents: 5611
diff changeset
790 imap_quote_append_string(str, ns_prefix, FALSE);
de3a087ea8d2 Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents: 5611
diff changeset
791 } else {
5799
75e3aedc0568 Put UW-IMAP emulation back after all
Timo Sirainen <tss@iki.fi>
parents: 5797
diff changeset
792 /* Hidden namespace or empty namespace prefix. We could just
75e3aedc0568 Put UW-IMAP emulation back after all
Timo Sirainen <tss@iki.fi>
parents: 5797
diff changeset
793 return an empty root name, but it's safer to emulate what
75e3aedc0568 Put UW-IMAP emulation back after all
Timo Sirainen <tss@iki.fi>
parents: 5797
diff changeset
794 UW-IMAP does. With full filesystem access this might even
75e3aedc0568 Put UW-IMAP emulation back after all
Timo Sirainen <tss@iki.fi>
parents: 5797
diff changeset
795 matter (root of "~user/mail/" is "~user/", not "") */
5802
8416f66ac5ab Make sure all listable namespaces use the same separator. If there's no ref
Timo Sirainen <tss@iki.fi>
parents: 5800
diff changeset
796 const char *p = strchr(ref, ns_sep);
5797
de3a087ea8d2 Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents: 5611
diff changeset
797
de3a087ea8d2 Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents: 5611
diff changeset
798 if (p == NULL)
de3a087ea8d2 Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents: 5611
diff changeset
799 str_append(str, "\"\"");
de3a087ea8d2 Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents: 5611
diff changeset
800 else {
de3a087ea8d2 Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents: 5611
diff changeset
801 imap_quote_append_string(str,
de3a087ea8d2 Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents: 5611
diff changeset
802 t_strdup_until(ref, p + 1),
de3a087ea8d2 Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents: 5611
diff changeset
803 FALSE);
de3a087ea8d2 Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents: 5611
diff changeset
804 }
de3a087ea8d2 Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents: 5611
diff changeset
805 }
de3a087ea8d2 Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents: 5611
diff changeset
806 client_send_line(client, str_c(str));
de3a087ea8d2 Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents: 5611
diff changeset
807 }
de3a087ea8d2 Cleaned up LIST ref "" handling. Removed some UW-IMAPisms, they shouldn't be
Timo Sirainen <tss@iki.fi>
parents: 5611
diff changeset
808
6418
46d9ee79f292 Removed _ prefix from all public APIs.
Timo Sirainen <tss@iki.fi>
parents: 6318
diff changeset
809 bool cmd_list_full(struct client_command_context *cmd, bool lsub)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
810 {
3141
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 2590
diff changeset
811 struct client *client = cmd->client;
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
812 const struct imap_arg *args, *arg;
2425
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
813 struct cmd_list_context *ctx;
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
814 ARRAY_DEFINE(patterns, const char *) = ARRAY_INIT;
6017
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
815 const char *pattern, *const *patterns_strarr;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
816
5829
1d73153584d2 Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents: 5818
diff changeset
817 /* [(<selection options>)] <reference> <pattern>|(<pattern list>)
1d73153584d2 Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents: 5818
diff changeset
818 [RETURN (<return options>)] */
3141
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 2590
diff changeset
819 if (!client_read_args(cmd, 0, 0, &args))
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
820 return FALSE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
821
6017
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
822 ctx = p_new(cmd->pool, struct cmd_list_context, 1);
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
823 ctx->cmd = cmd;
8082
db66611fd195 Added struct mail_user and fixed the code to support multiple users per process.
Timo Sirainen <tss@iki.fi>
parents: 8016
diff changeset
824 ctx->ns = client->user->namespaces;
6017
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
825 ctx->lsub = lsub;
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
826
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
827 cmd->context = ctx;
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
828
5832
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
829 if (args[0].type == IMAP_ARG_LIST && !lsub) {
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
830 /* LIST-EXTENDED selection options */
6017
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
831 ctx->used_listext = TRUE;
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
832 if (!parse_select_flags(ctx, IMAP_ARG_LIST_ARGS(&args[0])))
5832
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
833 return TRUE;
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
834 args++;
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
835 }
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
836
6017
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
837 ctx->ref = imap_arg_string(&args[0]);
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
838 if (ctx->ref == NULL) {
5832
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
839 /* broken */
6017
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
840 client_send_command_error(cmd, "Invalid reference.");
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
841 return TRUE;
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
842 }
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
843 if (args[1].type == IMAP_ARG_LIST) {
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
844 ctx->used_listext = TRUE;
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
845 /* convert pattern list to string array */
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
846 p_array_init(&patterns, cmd->pool,
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
847 IMAP_ARG_LIST_COUNT(&args[1]));
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
848 arg = IMAP_ARG_LIST_ARGS(&args[1]);
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
849 for (; arg->type != IMAP_ARG_EOL; arg++) {
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
850 if (!IMAP_ARG_TYPE_IS_STRING(arg->type)) {
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
851 /* broken */
6017
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
852 client_send_command_error(cmd,
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
853 "Invalid pattern list.");
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
854 return TRUE;
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
855 }
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
856 pattern = imap_arg_string(arg);
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
857 array_append(&patterns, &pattern, 1);
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
858 }
5832
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
859 args += 2;
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
860 } else {
5839
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5836
diff changeset
861 pattern = imap_arg_string(&args[1]);
6017
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
862 if (pattern == NULL) {
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
863 client_send_command_error(cmd, "Invalid pattern.");
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
864 return TRUE;
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
865 }
6017
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
866
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
867 p_array_init(&patterns, cmd->pool, 1);
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
868 array_append(&patterns, &pattern, 1);
5832
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
869 args += 2;
6017
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
870
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
871 if (lsub) {
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
872 size_t len = strlen(pattern);
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
873 ctx->lsub_no_unsubscribed = len == 0 ||
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
874 pattern[len-1] != '%';
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
875 }
5832
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
876 }
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
877
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
878 if (args[0].type == IMAP_ARG_ATOM && args[1].type == IMAP_ARG_LIST &&
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
879 strcasecmp(imap_arg_string(&args[0]), "RETURN") == 0) {
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
880 /* LIST-EXTENDED return options */
6017
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
881 ctx->used_listext = TRUE;
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
882 if (!parse_return_flags(ctx, IMAP_ARG_LIST_ARGS(&args[1])))
5832
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
883 return TRUE;
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
884 args += 2;
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
885 }
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
886
7492
ae8a3595d707 LIST-EXTENDED options were ignored.
Timo Sirainen <tss@iki.fi>
parents: 7255
diff changeset
887 ctx->list_flags |= MAILBOX_LIST_ITER_VIRTUAL_NAMES;
1895
bbdce1697239 LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents: 1890
diff changeset
888 if (lsub) {
bbdce1697239 LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents: 1890
diff changeset
889 /* LSUB - we don't care about flags */
6639
e1fde9940f7e Fixes to handling namespace prefixes and real!=virtual separator. Added a
Timo Sirainen <tss@iki.fi>
parents: 6603
diff changeset
890 ctx->list_flags |= MAILBOX_LIST_ITER_SELECT_SUBSCRIBED |
5829
1d73153584d2 Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents: 5818
diff changeset
891 MAILBOX_LIST_ITER_SELECT_RECURSIVEMATCH |
1d73153584d2 Mailbox listing API changed to support more features. Used to implement
Timo Sirainen <tss@iki.fi>
parents: 5818
diff changeset
892 MAILBOX_LIST_ITER_RETURN_NO_FLAGS;
6017
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
893 } else if (!ctx->used_listext) {
5832
1d91d36e14a4 Parse LIST-EXTENDED parameters more correctly.
Timo Sirainen <tss@iki.fi>
parents: 5829
diff changeset
894 /* non-extended LIST - return children flags always */
6639
e1fde9940f7e Fixes to handling namespace prefixes and real!=virtual separator. Added a
Timo Sirainen <tss@iki.fi>
parents: 6603
diff changeset
895 ctx->list_flags |= MAILBOX_LIST_ITER_RETURN_CHILDREN;
1244
40bae47bdba1 Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents: 1218
diff changeset
896 }
40bae47bdba1 Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents: 1218
diff changeset
897
6017
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
898 if (args[0].type != IMAP_ARG_EOL) {
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
899 client_send_command_error(cmd, "Extra arguments.");
1244
40bae47bdba1 Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents: 1218
diff changeset
900 return TRUE;
40bae47bdba1 Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents: 1218
diff changeset
901 }
40bae47bdba1 Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents: 1218
diff changeset
902
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
903 (void)array_append_space(&patterns); /* NULL-terminate */
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
904 patterns_strarr = array_idx(&patterns, 0);
6017
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
905 if (!ctx->used_listext && !lsub && *patterns_strarr[0] == '\0') {
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
906 /* Only LIST ref "" gets us here */
6017
895b0b2b183e code cleanups
Timo Sirainen <tss@iki.fi>
parents: 6014
diff changeset
907 cmd_list_ref_root(client, ctx->ref);
3141
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 2590
diff changeset
908 client_send_tagline(cmd, "OK List completed.");
2350
1371d41c375f Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
909 } else {
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5841
diff changeset
910 ctx->patterns = patterns_strarr;
5811
e0b451e0c190 Handle listing flags correctly for all namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents: 5809
diff changeset
911 p_array_init(&ctx->ns_prefixes_listed, cmd->pool, 8);
2425
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
912
3141
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 2590
diff changeset
913 if (!cmd_list_continue(cmd)) {
2425
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
914 /* unfinished */
7148
5e3188213724 Added "command state" for running commands. Use it instead of some bitfields
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
915 cmd->state = CLIENT_COMMAND_STATE_WAIT_OUTPUT;
3141
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 2590
diff changeset
916 cmd->func = cmd_list_continue;
2425
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
917 return FALSE;
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
918 }
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
919
3141
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 2590
diff changeset
920 cmd->context = NULL;
2425
8267d11cacfb LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents: 2374
diff changeset
921 return TRUE;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
922 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
923 return TRUE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
924 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
925
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3856
diff changeset
926 bool cmd_list(struct client_command_context *cmd)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
927 {
6418
46d9ee79f292 Removed _ prefix from all public APIs.
Timo Sirainen <tss@iki.fi>
parents: 6318
diff changeset
928 return cmd_list_full(cmd, FALSE);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
929 }