1 /* Copyright (c) 2006-2018 Dovecot authors, see the included COPYING file */
2
3 #include "lib.h"
4 #include "array.h"
5 #include "imap-match.h"
6 #include "mailbox-list-private.h"
7
8 #define GLOBAL_TEMP_PREFIX ".temp."
9
10 struct noop_list_iterate_context {
11 struct mailbox_list_iterate_context ctx;
12 struct mailbox_info inbox_info;
13 bool list_inbox:1;
14 };
15
16 extern struct mailbox_list none_mailbox_list;
17
none_list_alloc(void)18 static struct mailbox_list *none_list_alloc(void)
19 {
20 struct mailbox_list *list;
21 pool_t pool;
22
23 pool = pool_alloconly_create("none list", 2048);
24
25 list = p_new(pool, struct mailbox_list, 1);
26 *list = none_mailbox_list;
27 list->props = MAILBOX_LIST_PROP_NO_LIST_INDEX;
28 list->pool = pool;
29 return list;
30 }
31
none_list_deinit(struct mailbox_list * list)32 static void none_list_deinit(struct mailbox_list *list)
33 {
34 pool_unref(&list->pool);
35 }
36
none_list_get_hierarchy_sep(struct mailbox_list * list ATTR_UNUSED)37 static char none_list_get_hierarchy_sep(struct mailbox_list *list ATTR_UNUSED)
38 {
39 return '/';
40 }
41
42 static int
none_list_get_path(struct mailbox_list * list ATTR_UNUSED,const char * name ATTR_UNUSED,enum mailbox_list_path_type type ATTR_UNUSED,const char ** path_r ATTR_UNUSED)43 none_list_get_path(struct mailbox_list *list ATTR_UNUSED,
44 const char *name ATTR_UNUSED,
45 enum mailbox_list_path_type type ATTR_UNUSED,
46 const char **path_r ATTR_UNUSED)
47 {
48 return 0;
49 }
50
51 static const char *
none_list_get_temp_prefix(struct mailbox_list * list ATTR_UNUSED,bool global ATTR_UNUSED)52 none_list_get_temp_prefix(struct mailbox_list *list ATTR_UNUSED,
53 bool global ATTR_UNUSED)
54 {
55 return GLOBAL_TEMP_PREFIX;
56 }
57
58 static int
none_list_subscriptions_refresh(struct mailbox_list * src_list ATTR_UNUSED,struct mailbox_list * dest_list ATTR_UNUSED)59 none_list_subscriptions_refresh(struct mailbox_list *src_list ATTR_UNUSED,
60 struct mailbox_list *dest_list ATTR_UNUSED)
61 {
62 return 0;
63 }
64
none_list_set_subscribed(struct mailbox_list * list,const char * name ATTR_UNUSED,bool set ATTR_UNUSED)65 static int none_list_set_subscribed(struct mailbox_list *list,
66 const char *name ATTR_UNUSED,
67 bool set ATTR_UNUSED)
68 {
69 mailbox_list_set_error(list, MAIL_ERROR_NOTPOSSIBLE, "Not supported");
70 return -1;
71 }
72
none_list_delete_mailbox(struct mailbox_list * list,const char * name ATTR_UNUSED)73 static int none_list_delete_mailbox(struct mailbox_list *list,
74 const char *name ATTR_UNUSED)
75 {
76 mailbox_list_set_error(list, MAIL_ERROR_NOTPOSSIBLE, "Not supported");
77 return -1;
78 }
79
none_list_delete_dir(struct mailbox_list * list,const char * name ATTR_UNUSED)80 static int none_list_delete_dir(struct mailbox_list *list,
81 const char *name ATTR_UNUSED)
82 {
83 mailbox_list_set_error(list, MAIL_ERROR_NOTPOSSIBLE, "Not supported");
84 return -1;
85 }
86
87 static int
none_list_rename_mailbox(struct mailbox_list * oldlist,const char * oldname ATTR_UNUSED,struct mailbox_list * newlist ATTR_UNUSED,const char * newname ATTR_UNUSED)88 none_list_rename_mailbox(struct mailbox_list *oldlist,
89 const char *oldname ATTR_UNUSED,
90 struct mailbox_list *newlist ATTR_UNUSED,
91 const char *newname ATTR_UNUSED)
92 {
93 mailbox_list_set_error(oldlist, MAIL_ERROR_NOTPOSSIBLE,
94 "Not supported");
95 return -1;
96 }
97
98 static struct mailbox_list_iterate_context *
none_list_iter_init(struct mailbox_list * list,const char * const * patterns,enum mailbox_list_iter_flags flags)99 none_list_iter_init(struct mailbox_list *list,
100 const char *const *patterns,
101 enum mailbox_list_iter_flags flags)
102 {
103 struct noop_list_iterate_context *ctx;
104 pool_t pool;
105
106 pool = pool_alloconly_create("mailbox list none iter", 1024);
107 ctx = p_new(pool, struct noop_list_iterate_context, 1);
108 ctx->ctx.pool = pool;
109 ctx->ctx.list = list;
110 ctx->ctx.flags = flags;
111 ctx->ctx.glob = imap_match_init_multiple(pool, patterns, TRUE,
112 mail_namespace_get_sep(list->ns));
113 array_create(&ctx->ctx.module_contexts, pool, sizeof(void *), 5);
114 if ((list->ns->flags & NAMESPACE_FLAG_INBOX_USER) != 0 &&
115 imap_match(ctx->ctx.glob, "INBOX") == IMAP_MATCH_YES) {
116 ctx->list_inbox = TRUE;
117 ctx->inbox_info.ns = list->ns;
118 ctx->inbox_info.vname = "INBOX";
119 }
120 return &ctx->ctx;
121 }
122
123 static int
none_list_iter_deinit(struct mailbox_list_iterate_context * ctx)124 none_list_iter_deinit(struct mailbox_list_iterate_context *ctx)
125 {
126 pool_unref(&ctx->pool);
127 return 0;
128 }
129
130 static const struct mailbox_info *
none_list_iter_next(struct mailbox_list_iterate_context * _ctx)131 none_list_iter_next(struct mailbox_list_iterate_context *_ctx)
132 {
133 struct noop_list_iterate_context *ctx =
134 (struct noop_list_iterate_context *)_ctx;
135
136 if (ctx->list_inbox) {
137 ctx->list_inbox = FALSE;
138 return &ctx->inbox_info;
139 }
140 return NULL;
141 }
142
143 static int
none_list_get_mailbox_flags(struct mailbox_list * list ATTR_UNUSED,const char * dir ATTR_UNUSED,const char * fname ATTR_UNUSED,enum mailbox_list_file_type type ATTR_UNUSED,enum mailbox_info_flags * flags)144 none_list_get_mailbox_flags(struct mailbox_list *list ATTR_UNUSED,
145 const char *dir ATTR_UNUSED,
146 const char *fname ATTR_UNUSED,
147 enum mailbox_list_file_type type ATTR_UNUSED,
148 enum mailbox_info_flags *flags)
149 {
150 *flags = MAILBOX_NONEXISTENT;
151 return 0;
152 }
153
154 struct mailbox_list none_mailbox_list = {
155 .name = MAILBOX_LIST_NAME_NONE,
156 .props = MAILBOX_LIST_PROP_NO_ROOT,
157 .mailbox_name_max_length = MAILBOX_LIST_NAME_MAX_LENGTH,
158
159 .v = {
160 .alloc = none_list_alloc,
161 .deinit = none_list_deinit,
162 .get_hierarchy_sep = none_list_get_hierarchy_sep,
163 .get_vname = mailbox_list_default_get_vname,
164 .get_storage_name = mailbox_list_default_get_storage_name,
165 .get_path = none_list_get_path,
166 .get_temp_prefix = none_list_get_temp_prefix,
167 .iter_init = none_list_iter_init,
168 .iter_next = none_list_iter_next,
169 .iter_deinit = none_list_iter_deinit,
170 .get_mailbox_flags = none_list_get_mailbox_flags,
171 .subscriptions_refresh = none_list_subscriptions_refresh,
172 .set_subscribed = none_list_set_subscribed,
173 .delete_mailbox = none_list_delete_mailbox,
174 .delete_dir = none_list_delete_dir,
175 .delete_symlink = none_list_delete_dir,
176 .rename_mailbox = none_list_rename_mailbox,
177 }
178 };
179