Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/imap/cmd-list.c @ 2350:1371d41c375f HEAD
Moved namespace and hierarchy separator handling to imap-specific code. LIST
now shows non-hidden namespaces in the LIST reply.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Fri, 23 Jul 2004 00:20:00 +0300 |
parents | 79790750c349 |
children | 974b0478a548 |
rev | line source |
---|---|
0 | 1 /* Copyright (C) 2002 Timo Sirainen */ |
2 | |
3 #include "common.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
|
4 #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
|
5 #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
|
6 #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
|
7 #include "imap-match.h" |
0 | 8 #include "commands.h" |
1655 | 9 #include "namespace.h" |
0 | 10 |
1895
bbdce1697239
LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents:
1890
diff
changeset
|
11 enum { |
bbdce1697239
LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents:
1890
diff
changeset
|
12 _MAILBOX_LIST_HIDE_CHILDREN = 0x1000000, |
bbdce1697239
LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents:
1890
diff
changeset
|
13 _MAILBOX_LIST_LISTEXT = 0x0800000 |
bbdce1697239
LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents:
1890
diff
changeset
|
14 }; |
bbdce1697239
LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents:
1890
diff
changeset
|
15 |
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
|
16 static const char * |
1895
bbdce1697239
LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents:
1890
diff
changeset
|
17 mailbox_flags2str(enum mailbox_flags flags, enum mailbox_list_flags list_flags) |
0 | 18 { |
19 const char *str; | |
20 | |
1244
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
21 if (flags & MAILBOX_PLACEHOLDER) { |
1650
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
1568
diff
changeset
|
22 i_assert((flags & ~MAILBOX_CHILDREN) == MAILBOX_PLACEHOLDER); |
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
1568
diff
changeset
|
23 |
1895
bbdce1697239
LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents:
1890
diff
changeset
|
24 if ((list_flags & _MAILBOX_LIST_LISTEXT) == 0) |
1650
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
1568
diff
changeset
|
25 flags = MAILBOX_NOSELECT; |
1244
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
26 flags |= MAILBOX_CHILDREN; |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
27 } |
1895
bbdce1697239
LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents:
1890
diff
changeset
|
28 if ((flags & MAILBOX_NONEXISTENT) != 0 && |
bbdce1697239
LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents:
1890
diff
changeset
|
29 (list_flags & _MAILBOX_LIST_LISTEXT) == 0) { |
1244
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
30 flags |= MAILBOX_NOSELECT; |
1895
bbdce1697239
LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents:
1890
diff
changeset
|
31 flags &= ~MAILBOX_NONEXISTENT; |
bbdce1697239
LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents:
1890
diff
changeset
|
32 } |
1218
a70ebd3a59e2
Removed list-sort workarounds. It's pretty much needed for maildir listing.
Timo Sirainen <tss@iki.fi>
parents:
1198
diff
changeset
|
33 |
1895
bbdce1697239
LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents:
1890
diff
changeset
|
34 if ((list_flags & _MAILBOX_LIST_HIDE_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
|
35 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
|
36 |
1890
66e5fdc07ac5
Children/NoChildren -> HasChildren/HasNoChildren
Timo Sirainen <tss@iki.fi>
parents:
1751
diff
changeset
|
37 str = t_strconcat( |
66e5fdc07ac5
Children/NoChildren -> HasChildren/HasNoChildren
Timo Sirainen <tss@iki.fi>
parents:
1751
diff
changeset
|
38 (flags & MAILBOX_NOSELECT) ? " \\Noselect" : "", |
66e5fdc07ac5
Children/NoChildren -> HasChildren/HasNoChildren
Timo Sirainen <tss@iki.fi>
parents:
1751
diff
changeset
|
39 (flags & MAILBOX_NONEXISTENT) ? " \\NonExistent" : "", |
66e5fdc07ac5
Children/NoChildren -> HasChildren/HasNoChildren
Timo Sirainen <tss@iki.fi>
parents:
1751
diff
changeset
|
40 (flags & MAILBOX_PLACEHOLDER) ? " \\PlaceHolder" : "", |
66e5fdc07ac5
Children/NoChildren -> HasChildren/HasNoChildren
Timo Sirainen <tss@iki.fi>
parents:
1751
diff
changeset
|
41 (flags & MAILBOX_CHILDREN) ? " \\HasChildren" : "", |
66e5fdc07ac5
Children/NoChildren -> HasChildren/HasNoChildren
Timo Sirainen <tss@iki.fi>
parents:
1751
diff
changeset
|
42 (flags & MAILBOX_NOCHILDREN) ? " \\HasNoChildren" : "", |
66e5fdc07ac5
Children/NoChildren -> HasChildren/HasNoChildren
Timo Sirainen <tss@iki.fi>
parents:
1751
diff
changeset
|
43 (flags & MAILBOX_NOINFERIORS) ? " \\NoInferiors" : "", |
66e5fdc07ac5
Children/NoChildren -> HasChildren/HasNoChildren
Timo Sirainen <tss@iki.fi>
parents:
1751
diff
changeset
|
44 (flags & MAILBOX_MARKED) ? " \\Marked" : "", |
66e5fdc07ac5
Children/NoChildren -> HasChildren/HasNoChildren
Timo Sirainen <tss@iki.fi>
parents:
1751
diff
changeset
|
45 (flags & MAILBOX_UNMARKED) ? " \\UnMarked" : "", |
66e5fdc07ac5
Children/NoChildren -> HasChildren/HasNoChildren
Timo Sirainen <tss@iki.fi>
parents:
1751
diff
changeset
|
46 NULL); |
0 | 47 |
48 return *str == '\0' ? "" : str+1; | |
49 } | |
50 | |
1244
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
51 static int parse_list_flags(struct client *client, struct imap_arg *args, |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
52 enum mailbox_list_flags *list_flags) |
1198
d28571e8c810
Rewrote LIST, LSUB and subscription file handling. LIST replies aren't
Timo Sirainen <tss@iki.fi>
parents:
1183
diff
changeset
|
53 { |
1244
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
54 const char *atom; |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
55 |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
56 while (args->type != IMAP_ARG_EOL) { |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
57 if (args->type != IMAP_ARG_ATOM) { |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
58 client_send_command_error(client, |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
59 "List options contains non-atoms."); |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
60 return FALSE; |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
61 } |
1198
d28571e8c810
Rewrote LIST, LSUB and subscription file handling. LIST replies aren't
Timo Sirainen <tss@iki.fi>
parents:
1183
diff
changeset
|
62 |
1244
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
63 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
|
64 |
1244
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
65 if (strcasecmp(atom, "SUBSCRIBED") == 0) |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
66 *list_flags |= MAILBOX_LIST_SUBSCRIBED; |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
67 else if (strcasecmp(atom, "CHILDREN") == 0) |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
68 *list_flags |= MAILBOX_LIST_CHILDREN; |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
69 else { |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
70 client_send_tagline(client, t_strconcat( |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
71 "BAD Invalid list option ", atom, NULL)); |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
72 return FALSE; |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
73 } |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
74 args++; |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
75 } |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
76 return TRUE; |
1198
d28571e8c810
Rewrote LIST, LSUB and subscription file handling. LIST replies aren't
Timo Sirainen <tss@iki.fi>
parents:
1183
diff
changeset
|
77 } |
d28571e8c810
Rewrote LIST, LSUB and subscription file handling. LIST replies aren't
Timo Sirainen <tss@iki.fi>
parents:
1183
diff
changeset
|
78 |
2350
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
79 static int |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
80 list_namespace_mailboxes(struct client *client, struct imap_match_glob *glob, |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
81 struct namespace *ns, struct mailbox_list_context *ctx, |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
82 enum mailbox_list_flags list_flags) |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
83 { |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
84 struct mailbox_list *list; |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
85 const char *name; |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
86 string_t *str, *name_str; |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
87 int inbox_found = FALSE; |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
88 |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
89 t_push(); |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
90 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
|
91 name_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
|
92 while ((list = mail_storage_mailbox_list_next(ctx)) != NULL) { |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
93 str_truncate(name_str, 0); |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
94 str_append(name_str, ns->prefix); |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
95 str_append(name_str, list->name); |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
96 |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
97 if (ns->sep != ns->real_sep) { |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
98 char *p = str_c_modifyable(name_str); |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
99 for (; *p != '\0'; p++) { |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
100 if (*p == ns->real_sep) |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
101 *p = ns->sep; |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
102 } |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
103 } |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
104 name = str_c(name_str); |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
105 |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
106 if (*ns->prefix != '\0') { |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
107 /* With masks containing '*' we do the checks here |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
108 so prefix is included in matching */ |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
109 if (glob != NULL && |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
110 imap_match(glob, name) != IMAP_MATCH_YES) |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
111 continue; |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
112 } else if (strcasecmp(list->name, "INBOX") == 0) { |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
113 if (!ns->inbox) |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
114 continue; |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
115 |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
116 name = "INBOX"; |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
117 inbox_found = TRUE; |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
118 } |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
119 |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
120 str_truncate(str, 0); |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
121 str_printfa(str, "* LIST (%s) \"%s\" ", |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
122 mailbox_flags2str(list->flags, list_flags), |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
123 ns->sep_str); |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
124 imap_quote_append_string(str, name, FALSE); |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
125 client_send_line(client, str_c(str)); |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
126 } |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
127 t_pop(); |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
128 |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
129 if (!inbox_found && ns->inbox) { |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
130 /* INBOX always exists */ |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
131 str_printfa(str, "* LIST () \"%s\" \"INBOX\"", ns->sep_str); |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
132 client_send_line(client, str_c(str)); |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
133 } |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
134 |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
135 return mail_storage_mailbox_list_deinit(ctx); |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
136 } |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
137 |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
138 static void skip_prefix(const char **prefix, const char **mask, int inbox) |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
139 { |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
140 size_t mask_len, prefix_len, len; |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
141 |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
142 prefix_len = strlen(*prefix); |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
143 mask_len = strlen(*mask); |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
144 len = I_MIN(prefix_len, mask_len); |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
145 |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
146 if (strncmp(*prefix, *mask, len) == 0 || |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
147 (inbox && len >= 6 && |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
148 strncasecmp(*prefix, *mask, 6) == 0)) { |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
149 *prefix += len; |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
150 *mask += len; |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
151 } |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
152 } |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
153 |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
154 static int list_mailboxes(struct client *client, |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
155 const char *ref, const char *mask, |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
156 enum mailbox_list_flags list_flags) |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
157 { |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
158 struct namespace *ns; |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
159 struct mailbox_list_context *ctx; |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
160 struct imap_match_glob *glob; |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
161 enum imap_match_result match; |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
162 const char *cur_prefix, *cur_ref, *cur_mask; |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
163 size_t len; |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
164 int inbox; |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
165 |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
166 inbox = strncasecmp(ref, "INBOX", 5) == 0 || |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
167 (*ref == '\0' && strncasecmp(mask, "INBOX", 5) == 0); |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
168 |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
169 for (ns = client->namespaces; ns != NULL; ns = ns->next) { |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
170 t_push(); |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
171 cur_prefix = ns->prefix; |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
172 cur_ref = ref; |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
173 cur_mask = mask; |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
174 if (*ref != '\0') { |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
175 skip_prefix(&cur_prefix, &cur_ref, inbox); |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
176 |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
177 if (*cur_ref != '\0' && *cur_prefix != '\0') { |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
178 /* reference parameter didn't match with |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
179 namespace prefix. skip this. */ |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
180 t_pop(); |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
181 continue; |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
182 } |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
183 } |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
184 |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
185 if (*cur_ref == '\0' && *cur_prefix != '\0') { |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
186 skip_prefix(&cur_prefix, &cur_mask, |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
187 inbox && cur_ref == ref); |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
188 } |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
189 |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
190 glob = imap_match_init(pool_datastack_create(), mask, |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
191 inbox && cur_ref == ref, ns->sep); |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
192 |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
193 if (*cur_ref != '\0' || *cur_prefix == '\0') |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
194 match = IMAP_MATCH_CHILDREN; |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
195 else { |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
196 len = strlen(cur_prefix); |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
197 if (cur_prefix[len-1] == ns->sep) |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
198 cur_prefix = t_strndup(cur_prefix, len-1); |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
199 match = ns->hidden ? IMAP_MATCH_NO : |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
200 imap_match(glob, cur_prefix); |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
201 |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
202 if (match == IMAP_MATCH_YES) { |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
203 /* The prefix itself matches */ |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
204 string_t *str = t_str_new(128); |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
205 str_printfa(str, "* LIST (%s) \"%s\" ", |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
206 mailbox_flags2str(MAILBOX_PLACEHOLDER, |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
207 list_flags), |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
208 ns->sep_str); |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
209 len = strlen(ns->prefix); |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
210 imap_quote_append_string(str, |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
211 t_strndup(ns->prefix, len-1), FALSE); |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
212 client_send_line(client, str_c(str)); |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
213 } |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
214 } |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
215 |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
216 if (match >= 0) { |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
217 unsigned int count = 0; |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
218 if (*cur_prefix != '\0') { |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
219 /* we'll have to fix mask */ |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
220 for (; *cur_prefix != '\0'; cur_prefix++) { |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
221 if (*cur_prefix == ns->sep) |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
222 count++; |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
223 } |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
224 if (count == 0) |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
225 count = 1; |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
226 |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
227 while (count > 0) { |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
228 if (*cur_ref != '\0') { |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
229 while (*cur_ref != '\0' && |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
230 *cur_ref++ != ns->sep) |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
231 ; |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
232 } else { |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
233 while (*cur_mask != '\0' && |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
234 *cur_mask != '*' && |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
235 *cur_mask != ns->sep) |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
236 cur_mask++; |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
237 if (*cur_mask == '*') { |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
238 cur_mask = "*"; |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
239 break; |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
240 } |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
241 if (*cur_mask == '\0') |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
242 break; |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
243 cur_mask++; |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
244 } |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
245 count--; |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
246 } |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
247 } |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
248 |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
249 if (*cur_mask != '*' || strcmp(mask, "*") == 0) |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
250 glob = NULL; |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
251 |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
252 cur_ref = namespace_fix_sep(ns, cur_ref); |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
253 cur_mask = namespace_fix_sep(ns, cur_mask); |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
254 |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
255 ctx = mail_storage_mailbox_list_init(ns->storage, |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
256 cur_ref, cur_mask, |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
257 list_flags); |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
258 if (list_namespace_mailboxes(client, glob, ns, ctx, |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
259 list_flags) < 0) { |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
260 client_send_storage_error(client, ns->storage); |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
261 t_pop(); |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
262 return -1; |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
263 } |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
264 } |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
265 t_pop(); |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
266 } |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
267 |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
268 return 0; |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
269 } |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
270 |
1244
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
271 int _cmd_list_full(struct client *client, int lsub) |
0 | 272 { |
1657 | 273 struct namespace *ns; |
1244
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
274 struct imap_arg *args; |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
275 enum mailbox_list_flags list_flags; |
1198
d28571e8c810
Rewrote LIST, LSUB and subscription file handling. LIST replies aren't
Timo Sirainen <tss@iki.fi>
parents:
1183
diff
changeset
|
276 const char *ref, *mask; |
0 | 277 |
1244
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
278 /* [(<options>)] <reference> <mailbox wildcards> */ |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
279 if (!client_read_args(client, 0, 0, &args)) |
0 | 280 return FALSE; |
281 | |
1895
bbdce1697239
LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents:
1890
diff
changeset
|
282 if (lsub) { |
bbdce1697239
LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents:
1890
diff
changeset
|
283 /* LSUB - we don't care about flags */ |
bbdce1697239
LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents:
1890
diff
changeset
|
284 list_flags = MAILBOX_LIST_SUBSCRIBED | MAILBOX_LIST_FAST_FLAGS | |
bbdce1697239
LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents:
1890
diff
changeset
|
285 _MAILBOX_LIST_HIDE_CHILDREN; |
bbdce1697239
LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents:
1890
diff
changeset
|
286 } else if (args[0].type != IMAP_ARG_LIST) { |
bbdce1697239
LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents:
1890
diff
changeset
|
287 /* LIST - allow children flags, but don't require them */ |
1244
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
288 list_flags = 0; |
1895
bbdce1697239
LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents:
1890
diff
changeset
|
289 } else { |
bbdce1697239
LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents:
1890
diff
changeset
|
290 list_flags = _MAILBOX_LIST_LISTEXT; |
bbdce1697239
LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents:
1890
diff
changeset
|
291 if (!parse_list_flags(client, IMAP_ARG_LIST(&args[0])->args, |
bbdce1697239
LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents:
1890
diff
changeset
|
292 &list_flags)) |
bbdce1697239
LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents:
1890
diff
changeset
|
293 return TRUE; |
bbdce1697239
LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents:
1890
diff
changeset
|
294 args++; |
bbdce1697239
LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents:
1890
diff
changeset
|
295 |
bbdce1697239
LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents:
1890
diff
changeset
|
296 /* don't show children flags unless explicitly specified */ |
bbdce1697239
LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents:
1890
diff
changeset
|
297 if ((list_flags & MAILBOX_LIST_CHILDREN) == 0) |
bbdce1697239
LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents:
1890
diff
changeset
|
298 list_flags |= _MAILBOX_LIST_HIDE_CHILDREN; |
1244
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
299 } |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
300 |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
301 ref = imap_arg_string(&args[0]); |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
302 mask = imap_arg_string(&args[1]); |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
303 |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
304 if (ref == NULL || mask == NULL) { |
1538
4d1c65eded2c
Give more verbose protocol level errors + some fixes.
Timo Sirainen <tss@iki.fi>
parents:
1329
diff
changeset
|
305 client_send_command_error(client, "Invalid arguments."); |
1244
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
306 return TRUE; |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
307 } |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
308 |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
309 if (*mask == '\0' && !lsub) { |
0 | 310 /* special request to return the hierarchy delimiter */ |
2350
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
311 ns = namespace_find(client->namespaces, &ref); |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
312 if (ns == NULL) { |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
313 const char *empty = ""; |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
314 ns = namespace_find(client->namespaces, &empty); |
0 | 315 } |
316 | |
2350
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
317 if (ns != NULL) { |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
318 client_send_line(client, t_strconcat( |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
319 "* LIST (\\Noselect) \"", ns->sep_str, |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
320 "\" \"\"", NULL)); |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
321 } |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
322 } else { |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
323 if (list_mailboxes(client, ref, mask, list_flags) < 0) |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
324 return TRUE; |
0 | 325 } |
326 | |
2350
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
327 client_send_tagline(client, !lsub ? |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
328 "OK List completed." : |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
329 "OK Lsub completed."); |
0 | 330 return TRUE; |
331 } | |
332 | |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
896
diff
changeset
|
333 int cmd_list(struct client *client) |
0 | 334 { |
699
cc795d74d08f
Use more warnings with GCC by default. Fixed several warnings.
Timo Sirainen <tss@iki.fi>
parents:
97
diff
changeset
|
335 return _cmd_list_full(client, FALSE); |
0 | 336 } |