static int body_header_fields_parse(struct imap_fetch_init_context *ctx, struct imap_fetch_body_data *body, const char *prefix, const struct imap_arg *args, unsigned int args_count) { string_t *str; const char *value; size_t i; str = str_new(ctx->pool, 128); str_append(str, prefix); str_append(str, " ("); for (i = 0; i < args_count; i++) { if (!imap_arg_get_astring(&args[i], &value)) { ctx->error = "Invalid BODY[..] parameter: " "Header list contains non-strings"; return -1; } value = t_str_ucase(value); if (i != 0) str_append_c(str, ' '); if (args[i].type == IMAP_ARG_ATOM) str_append(str, value); else imap_append_quoted(str, value); } str_append_c(str, ')'); body->section = str_c(str); return 0; }
static const char * imap_id_reply_generate_from_imap_args(const struct imap_arg *args) { string_t *str; const char *key, *value; if (IMAP_ARG_IS_EOL(args)) return "NIL"; str = t_str_new(256); str_append_c(str, '('); for (; !IMAP_ARG_IS_EOL(args); args++) { if (!imap_arg_get_astring(args, &key)) { /* broken input */ if (IMAP_ARG_IS_EOL(&args[1])) break; args++; } else { /* key */ if (str_len(str) > 1) str_append_c(str, ' '); imap_append_quoted(str, key); str_append_c(str, ' '); /* value */ if (IMAP_ARG_IS_EOL(&args[1])) { str_append(str, "NIL"); break; } args++; if (!imap_arg_get_astring(args, &value)) value = NULL; else { if (strcmp(value, "*") == 0) value = imap_id_get_default(key); } imap_append_nstring(str, value); } } if (str_len(str) == 1) { /* broken */ return "NIL"; } str_append_c(str, ')'); return str_c(str); }
void imap_append_nstring(string_t *dest, const char *src) { unsigned int i, escape_count = 0; if (src == NULL) { str_append(dest, "NIL"); return; } /* first check if we can (or want to) write this as quoted or as literal. quoted-specials = DQUOTE / "\" QUOTED-CHAR = <any TEXT-CHAR except quoted-specials> / "\" quoted-specials TEXT-CHAR = <any CHAR except CR and LF> */ for (i = 0; src[i] != '\0'; i++) { switch (src[i]) { case '"': case '\\': if (escape_count++ < QUOTED_MAX_ESCAPE_CHARS) break; /* fall through */ case 13: case 10: imap_append_literal(dest, src, i); return; default: if ((unsigned char)src[i] >= 0x80) { imap_append_literal(dest, src, i); return; } break; } } imap_append_quoted(dest, src); }
static bool cmd_x_apple_push_service(struct client_command_context *cmd) { const struct imap_arg *args; struct mail_user *user = cmd->client->user; const char *aps_topic = mail_user_plugin_getenv(user, "push_notify_aps_topic"); if (!client_read_args(cmd, 0, 0, &args)) return FALSE; const char *aps_ver=NULL; const char *aps_acct_id=NULL; const char *aps_dev_token=NULL; const char *aps_sub_topic=NULL; const struct imap_arg *mailbox_list=NULL; unsigned int mailbox_count=NULL; bool mailbox_subscriptions=FALSE; const char *key, *value; /* must have a topic */ if (aps_topic == NULL || *aps_topic == '\0') return FALSE; /* scarf off the aps keys/values */ while (imap_arg_get_astring(&args[0], &key)) { if (imap_arg_get_astring(&args[1], &value)) { if (strcasecmp(key, "aps-version") == 0) aps_ver = t_strdup(value); else if (strcasecmp(key, "aps-account-id") == 0) aps_acct_id = t_strdup(value); else if (strcasecmp(key, "aps-device-token") == 0) aps_dev_token = t_strdup(value); else if (strcasecmp(key, "aps-subtopic") == 0) aps_sub_topic = t_strdup(value); else return FALSE; } else if (strcasecmp(key, "mailboxes") == 0) { mailbox_subscriptions = imap_arg_get_list_full(&args[1], &mailbox_list, &mailbox_count); } args += 2; } /* save notification settings */ if ( aps_ver && aps_acct_id && aps_dev_token && aps_sub_topic ) { msg_data_t msg_data; /* subscribe to notification node */ memset(&msg_data, 0, sizeof(struct msg_data_s)); msg_data.msg = 2; i_strocpy(msg_data.d1, user->username, sizeof(msg_data.d1)); i_strocpy(msg_data.d2, aps_acct_id, sizeof(msg_data.d2)); i_strocpy(msg_data.d3, aps_dev_token, sizeof(msg_data.d3)); i_strocpy(msg_data.d4, aps_sub_topic, sizeof(msg_data.d4)); send_msg_data(&msg_data); if(mailbox_subscriptions) { const char *mailbox; while (imap_arg_get_astring(&mailbox_list[0], &mailbox)) { T_BEGIN; string_t *mailbox_str = t_str_new(256); imap_append_quoted( mailbox_str, "mailbox"); str_append_c( mailbox_str, ' '); imap_append_quoted( mailbox_str, mailbox); send_response(cmd->client, mailbox_str); msg_data.msg = 4; i_strocpy(msg_data.d4, mailbox, sizeof(msg_data.d4)); send_msg_data(&msg_data); T_END; mailbox_list += 1; } } /* generate aps response */ string_t *str = t_str_new(256); imap_append_quoted( str, "aps-version" ); str_append_c(str, ' '); imap_append_quoted( str, APS_VERSION ); str_append_c(str, ' '); imap_append_quoted( str, "aps-topic" ); str_append_c(str, ' '); imap_append_quoted( str, aps_topic ); send_response(cmd->client, str); } client_send_tagline(cmd, "OK Provisioned"); return TRUE; }