const char *imap_arg_as_nstring(const struct imap_arg *arg) { const char *str; if (!imap_arg_get_nstring(arg, &str)) i_unreached(); return str; }
const char *imap_id_args_get_log_reply(const struct imap_arg *args, const char *settings) { const char *const *keys, *key, *value; string_t *reply; bool log_all; if (settings == NULL || *settings == '\0') return NULL; if (!imap_arg_get_list(args, &args)) return NULL; log_all = strcmp(settings, "*") == 0; reply = t_str_new(256); keys = t_strsplit_spaces(settings, " "); while (!IMAP_ARG_IS_EOL(&args[0]) && !IMAP_ARG_IS_EOL(&args[1])) { if (!imap_arg_get_string(args, &key)) { /* broken input */ args += 2; continue; } args++; if (strlen(key) > 30) { /* broken: ID spec requires fields to be max. 30 octets */ args++; continue; } if (log_all || str_array_icase_find(keys, key)) { if (!imap_arg_get_nstring(args, &value)) value = ""; else if (value == NULL) value = "NIL"; if (str_len(reply) > 0) str_append(reply, ", "); str_append(reply, str_sanitize(key, 30)); str_append_c(reply, '='); str_append(reply, str_sanitize(value, 80)); } args++; } return str_len(reply) == 0 ? NULL : str_c(reply); }
static int cmd_id_handle_args(struct imap_client *client, const struct imap_arg *arg) { struct imap_client_cmd_id *id = client->cmd_id; const char *key, *value; switch (id->state) { case IMAP_CLIENT_ID_STATE_LIST: if (arg->type == IMAP_ARG_NIL) return 1; if (arg->type != IMAP_ARG_LIST) return -1; if (client->set->imap_id_log[0] == '\0') { /* no ID logging */ } else if (client->id_logged) { /* already logged the ID reply */ } else { id->log_reply = str_new(default_pool, 64); if (strcmp(client->set->imap_id_log, "*") == 0) { /* log all keys */ } else { /* log only specified keys */ id->log_keys = p_strsplit_spaces(default_pool, client->set->imap_id_log, " "); } } id->state = IMAP_CLIENT_ID_STATE_KEY; break; case IMAP_CLIENT_ID_STATE_KEY: if (!imap_arg_get_string(arg, &key)) return -1; if (i_strocpy(id->key, key, sizeof(id->key)) < 0) return -1; id->state = IMAP_CLIENT_ID_STATE_VALUE; break; case IMAP_CLIENT_ID_STATE_VALUE: if (!imap_arg_get_nstring(arg, &value)) return -1; cmd_id_handle_keyvalue(client, id->key, value); id->state = IMAP_CLIENT_ID_STATE_KEY; break; } return 0; }
static void imapc_untagged_list(const struct imapc_untagged_reply *reply, struct imapc_storage_client *client) { struct imapc_mailbox_list *list = client->_list; const struct imap_arg *args = reply->args; const char *sep, *name; if (list->root_sep == '\0') { /* we haven't asked for the separator yet. lets see if this is the reply for its request. */ if (args[0].type == IMAP_ARG_EOL || !imap_arg_get_nstring(&args[1], &sep) || !imap_arg_get_astring(&args[2], &name)) return; /* we can't handle NIL separator yet */ list->root_sep = sep == NULL ? '/' : sep[0]; mailbox_tree_set_separator(list->mailboxes, list->root_sep); } else { (void)imapc_list_update_tree(list, list->mailboxes, args); } }