static void test_imap_parse_system_flag(void) { test_begin("imap_parse_system_flag"); test_assert(imap_parse_system_flag("\\aNswered") == MAIL_ANSWERED); test_assert(imap_parse_system_flag("\\fLagged") == MAIL_FLAGGED); test_assert(imap_parse_system_flag("\\dEleted") == MAIL_DELETED); test_assert(imap_parse_system_flag("\\sEen") == MAIL_SEEN); test_assert(imap_parse_system_flag("\\dRaft") == MAIL_DRAFT); test_assert(imap_parse_system_flag("\\rEcent") == MAIL_RECENT); test_assert(imap_parse_system_flag("answered") == 0); test_assert(imap_parse_system_flag("\\broken") == 0); test_assert(imap_parse_system_flag("\\") == 0); test_assert(imap_parse_system_flag("") == 0); test_end(); }
static int arg_modseq_set_ext(struct mail_search_build_context *ctx, struct mail_search_arg *sarg, const char *name) { const char *value; name = t_str_lcase(name); if (strncmp(name, "/flags/", 7) != 0) return 0; name += 7; /* set name */ if (*name == '\\') { /* system flag */ sarg->value.flags = imap_parse_system_flag(name); if (sarg->value.flags == 0 || sarg->value.flags == MAIL_RECENT) { ctx->_error = "Invalid MODSEQ system flag"; return -1; } } else { sarg->value.str = p_strdup(ctx->pool, name); } /* set type */ if (mail_search_parse_string(ctx->parser, &value) < 0) return -1; if (arg_modseq_set_type(ctx, sarg->value.modseq, value) < 0) return -1; return 1; }
bool client_parse_mail_flags(struct client_command_context *cmd, const struct imap_arg *args, enum mail_flags *flags_r, const char *const **keywords_r) { const char *atom; enum mail_flags flag; ARRAY(const char *) keywords; *flags_r = 0; *keywords_r = NULL; p_array_init(&keywords, cmd->pool, 16); while (!IMAP_ARG_IS_EOL(args)) { if (!imap_arg_get_atom(args, &atom)) { client_send_command_error(cmd, "Flags list contains non-atoms."); return FALSE; } if (*atom == '\\') { /* system flag */ atom = t_str_ucase(atom); flag = imap_parse_system_flag(atom); if (flag != 0 && flag != MAIL_RECENT) *flags_r |= flag; else { client_send_command_error(cmd, t_strconcat( "Invalid system flag ", atom, NULL)); return FALSE; } } else { /* keyword validity checks are done by lib-storage */ array_append(&keywords, &atom, 1); } args++; } if (array_count(&keywords) == 0) *keywords_r = NULL; else { array_append_zero(&keywords); /* NULL-terminate */ *keywords_r = array_idx(&keywords, 0); } return TRUE; }
static void cmd_flags_init(struct doveadm_mail_cmd_context *_ctx, const char *const args[]) { struct flags_cmd_context *ctx = (struct flags_cmd_context *)_ctx; const char *const *tmp; enum mail_flags flag; ARRAY_TYPE(const_string) keywords; if (args[0] == NULL || args[1] == NULL) { switch (ctx->modify_type) { case MODIFY_ADD: doveadm_mail_help_name("flags add"); case MODIFY_REMOVE: doveadm_mail_help_name("flags remove"); case MODIFY_REPLACE: doveadm_mail_help_name("flags replace"); } i_unreached(); } p_array_init(&keywords, _ctx->pool, 8); for (tmp = t_strsplit(args[0], " "); *tmp != NULL; tmp++) { const char *str = *tmp; if (str[0] == '\\') { flag = imap_parse_system_flag(str); if (flag == 0) i_fatal("Invalid system flag: %s", str); ctx->flags |= flag; } else { str = p_strdup(_ctx->pool, str); array_append(&keywords, &str, 1); } } if (array_count(&keywords) > 0 || ctx->modify_type == MODIFY_REPLACE) { array_append_zero(&keywords); ctx->keywords = array_idx(&keywords, 0); } _ctx->search_args = doveadm_mail_build_search_args(args+1); }