static struct mail_search_arg * imap_search_x_mailbox(struct mail_search_build_context *ctx) { struct mail_search_arg *sarg; string_t *utf8_name; sarg = mail_search_build_str(ctx, SEARCH_MAILBOX_GLOB); if (sarg == NULL) return NULL; utf8_name = t_str_new(strlen(sarg->value.str)); if (imap_utf7_to_utf8(sarg->value.str, utf8_name) < 0) { ctx->_error = "X-MAILBOX name not mUTF-7"; return NULL; } sarg->value.str = p_strdup(ctx->pool, str_c(utf8_name)); return sarg; }
static void cmd_mailbox_mutf7(int argc, char *argv[]) { string_t *str; bool from_utf8; unsigned int i; int c; from_utf8 = TRUE; while ((c = getopt(argc, argv, "78")) > 0) { switch (c) { case '7': from_utf8 = FALSE; break; case '8': from_utf8 = TRUE; break; default: help(&doveadm_cmd_mailbox_mutf7); } } argv += optind; if (argv[0] == NULL) help(&doveadm_cmd_mailbox_mutf7); str = t_str_new(128); for (i = 0; argv[i] != NULL; i++) { str_truncate(str, 0); if (from_utf8) { if (imap_utf8_to_utf7(argv[i], str) < 0) { i_error("Mailbox name not valid UTF-8: %s", argv[i]); doveadm_exit_code = EX_DATAERR; } } else { if (imap_utf7_to_utf8(argv[i], str) < 0) { i_error("Mailbox name not valid mUTF-7: %s", argv[i]); doveadm_exit_code = EX_DATAERR; } } printf("%s\n", str_c(str)); } }
struct mail_namespace * client_find_namespace_full(struct client *client, const char **mailbox, const char **error_r) { struct mail_namespace *namespaces = client->user->namespaces; struct mail_namespace *ns; string_t *utf8_name; utf8_name = t_str_new(64); if (imap_utf7_to_utf8(*mailbox, utf8_name) < 0) { *error_r = "NO Mailbox name is not valid mUTF-7"; return NULL; } ns = mail_namespace_find(namespaces, str_c(utf8_name)); if ((ns->flags & NAMESPACE_FLAG_AUTOCREATED) != 0 && ns->prefix_len == 0) { /* this matched only the autocreated prefix="" namespace. give a nice human-readable error message */ *error_r = t_strdup_printf( "NO Client tried to access nonexistent namespace. " "(Mailbox name should probably be prefixed with: %s)", mail_namespace_find_inbox(namespaces)->prefix); return NULL; } if ((client->set->parsed_workarounds & WORKAROUND_TB_EXTRA_MAILBOX_SEP) != 0 && str_len(utf8_name) > 0 && str_c(utf8_name)[str_len(utf8_name)-1] == mail_namespace_get_sep(ns)) { /* drop the extra trailing hierarchy separator */ str_truncate(utf8_name, str_len(utf8_name)-1); } *mailbox = str_c(utf8_name); return ns; }