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