virtual-config.c revision 84078771687fabf75819918f0f3aecdc3ed08b36
5a580c3a38ced62d4bcc95b8ac7c4f2935b5d294Timo Sirainen/* Copyright (c) 2008-2010 Dovecot authors, see the included COPYING file */
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainenvirtual_search_args_parse(const string_t *rule, const char **error_r)
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch input = i_stream_create_from_data(str_data(rule), str_len(rule));
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch imap_parser = imap_parser_create(input, NULL, (size_t)-1);
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch ret = imap_parser_finish_line(imap_parser, 0, 0, &args);
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch *error_r = t_strdup(imap_parser_get_error(imap_parser, &fatal));
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch if (mail_search_build(mail_search_register_get_imap(),
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Boschvirtual_config_add_rule(struct virtual_parse_context *ctx, const char **error_r)
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch unsigned int i, count;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch if (ctx->rule_idx == array_count(&ctx->mbox->backend_boxes)) {
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch crc32_str_more(ctx->mbox->search_args_crc32, str_c(ctx->rule));
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch search_args = virtual_search_args_parse(ctx->rule, error_r);
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch *error_r = t_strconcat("Previous search rule is invalid: ",
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch /* update at all the mailboxes that were introduced since the previous
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch bboxes = array_get(&ctx->mbox->backend_boxes, &count);
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch ctx->rule_idx = array_count(&ctx->mbox->backend_boxes);
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Boschvirtual_config_parse_line(struct virtual_parse_context *ctx, const char *line,
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch const char **error_r)
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch struct mail_user *user = ctx->mbox->storage->storage.user;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch /* continues the previous search rule */
5afe997e79978b7e989aa3b0bfdf4a813ecdc6f6Timo Sirainen if (ctx->rule_idx == array_count(&ctx->mbox->backend_boxes)) {
d730192e34fbedbc590a5abc7351e5af5e120c5fTimo Sirainen /* if there is no rule yet, it means we want the previous mailboxes
d730192e34fbedbc590a5abc7351e5af5e120c5fTimo Sirainen to use the rule that comes later */
d730192e34fbedbc590a5abc7351e5af5e120c5fTimo Sirainen if (virtual_config_add_rule(ctx, error_r) < 0)
d730192e34fbedbc590a5abc7351e5af5e120c5fTimo Sirainen /* new mailbox. the search args are added to it later. */
d730192e34fbedbc590a5abc7351e5af5e120c5fTimo Sirainen bbox = p_new(ctx->pool, struct virtual_backend_box, 1);
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch mail_namespace_find(user->namespaces, &line) :
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch *error_r = t_strdup_printf("Namespace not found for %s",
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch name = bbox->name[0] == '-' ? bbox->name + 1 : bbox->name;
4afd5082f38342fd688acb5796912329f57dd02cTimo Sirainen bbox->glob = imap_match_init(ctx->pool, name, TRUE, ctx->sep);
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch /* save messages here */
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch array_append(&ctx->mbox->backend_boxes, &bbox, 1);
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Boschvirtual_mailbox_get_list_patterns(struct virtual_parse_context *ctx)
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch unsigned int i, count;
4afd5082f38342fd688acb5796912329f57dd02cTimo Sirainen bboxes = array_get_modifiable(&mbox->backend_boxes, &count);
4afd5082f38342fd688acb5796912329f57dd02cTimo Sirainen p_array_init(&mbox->list_include_patterns, ctx->pool, count);
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch p_array_init(&mbox->list_exclude_patterns, ctx->pool, count);
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch for (i = 0; i < count; i++) {
4afd5082f38342fd688acb5796912329f57dd02cTimo Sirainenseparate_wildcard_mailboxes(struct virtual_mailbox *mbox,
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch ARRAY_TYPE(virtual_backend_box) *wildcard_boxes,
5afe997e79978b7e989aa3b0bfdf4a813ecdc6f6Timo Sirainen unsigned int i, count;
5afe997e79978b7e989aa3b0bfdf4a813ecdc6f6Timo Sirainen bboxes = array_get_modifiable(&mbox->backend_boxes, &count);
5afe997e79978b7e989aa3b0bfdf4a813ecdc6f6Timo Sirainen t_array_init(wildcard_boxes, I_MIN(16, count));
5afe997e79978b7e989aa3b0bfdf4a813ecdc6f6Timo Sirainen for (i = 0; i < count;) {
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch bboxes = array_get_modifiable(&mbox->backend_boxes,
4afd5082f38342fd688acb5796912329f57dd02cTimo Sirainenstatic void virtual_config_copy_expanded(struct virtual_parse_context *ctx,
4afd5082f38342fd688acb5796912329f57dd02cTimo Sirainen bbox = p_new(ctx->pool, struct virtual_backend_box, 1);
4afd5082f38342fd688acb5796912329f57dd02cTimo Sirainen array_append(&ctx->mbox->backend_boxes, &bbox, 1);
4afd5082f38342fd688acb5796912329f57dd02cTimo Sirainenstatic bool virtual_config_match(const struct mailbox_info *info,
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch unsigned int *idx_r)
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch unsigned int i, count;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch boxes = array_get_modifiable(boxes_arr, &count);
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch for (i = 0; i < count; i++) {
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch /* we match only one namespace for each pattern. */
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch if (strcmp(boxes[i]->name + 1, info->name) == 0) {
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Boschstatic int virtual_config_expand_wildcards(struct virtual_parse_context *ctx)
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch NAMESPACE_PRIVATE | NAMESPACE_SHARED | NAMESPACE_PUBLIC;
const char **patterns;
unsigned int i, j, count;
if (count == 0) {
for (i = 0; i < count; i++)
for (i = 0; i < count; i++)
unsigned int i, count;
for (i = 0; i < count; i++) {
unsigned int linenum = 0;
linenum++;
if (ret < 0) {
if (ret == 0) {
if (ret < 0) {
if (ret == 0)
return ret;
unsigned int i, count;
for (i = 0; i < count; i++) {