static inline void rspamd_email_address_add (rspamd_mempool_t *pool, GPtrArray *ar, struct rspamd_email_address *addr, GString *name) { struct rspamd_email_address *elt; guint nlen; elt = g_malloc0 (sizeof (*elt)); if (addr != NULL) { memcpy (elt, addr, sizeof (*addr)); } else { elt->addr = ""; elt->domain = ""; elt->raw = "<>"; elt->raw_len = 2; elt->user = ""; elt->flags |= RSPAMD_EMAIL_ADDR_EMPTY; } if ((elt->flags & RSPAMD_EMAIL_ADDR_QUOTED) && elt->addr[0] == '"') { if (elt->flags & RSPAMD_EMAIL_ADDR_HAS_BACKSLASH) { /* We also need to unquote user */ rspamd_email_address_unescape (elt); } /* We need to unquote addr */ nlen = elt->domain_len + elt->user_len + 2; elt->addr = g_malloc (nlen + 1); elt->addr_len = rspamd_snprintf ((char *)elt->addr, nlen, "%*s@%*s", (gint)elt->user_len, elt->user, (gint)elt->domain_len, elt->domain); elt->flags |= RSPAMD_EMAIL_ADDR_ADDR_ALLOCATED; } if (name->len > 0) { elt->name = rspamd_mime_header_decode (pool, name->str, name->len); } g_ptr_array_add (ar, elt); }
void rspamd_content_disposition_add_param (rspamd_mempool_t *pool, struct rspamd_content_disposition *cd, const gchar *name_start, const gchar *name_end, const gchar *value_start, const gchar *value_end) { rspamd_ftok_t srch; gchar *decoded; struct rspamd_content_type_param *found = NULL, *nparam; g_assert (cd != NULL); srch.begin = name_start; srch.len = name_end - name_start; if (cd->attrs) { found = g_hash_table_lookup (cd->attrs, &srch); } else { cd->attrs = g_hash_table_new (rspamd_ftok_icase_hash, rspamd_ftok_icase_equal); } nparam = rspamd_mempool_alloc (pool, sizeof (*nparam)); nparam->name.begin = name_start; nparam->name.len = name_end - name_start; decoded = rspamd_mime_header_decode (pool, value_start, value_end - value_start); RSPAMD_FTOK_FROM_STR (&nparam->value, decoded); if (!found) { g_hash_table_insert (cd->attrs, &nparam->name, nparam); } DL_APPEND (found, nparam); srch.begin = "filename"; srch.len = 8; if (rspamd_ftok_cmp (&nparam->name, &srch) == 0) { /* Adjust filename */ cd->filename.begin = nparam->value.begin; cd->filename.len = nparam->value.len; } }