X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=notmuch-reply.c;h=e60a264b5d30acf8cec96412f17e150789e43c5c;hp=0c82755345aa4ff2d013b600c315ac75959430af;hb=90cd1bac4eeb0d57fbe2740625aaa58d8d925ee5;hpb=e03ed64c8f3365e9ec53ec665eb88feb1b7e561c diff --git a/notmuch-reply.c b/notmuch-reply.c index 0c827553..e60a264b 100644 --- a/notmuch-reply.c +++ b/notmuch-reply.c @@ -22,6 +22,7 @@ #include "notmuch-client.h" #include "gmime-filter-headers.h" +#include "sprinter.h" static void show_reply_headers (GMimeMessage *message) @@ -377,19 +378,18 @@ add_recipients_from_message (GMimeMessage *reply, static const char * guess_from_received_header (notmuch_config_t *config, notmuch_message_t *message) { - const char *received,*primary,*by; - const char **other; - char *tohdr; + const char *addr, *received, *by; char *mta,*ptr,*token; char *domain=NULL; char *tld=NULL; const char *delim=". \t"; - size_t i,j,other_len; - - const char *to_headers[] = {"Envelope-to", "X-Original-To"}; + size_t i; - primary = notmuch_config_get_user_primary_email (config); - other = notmuch_config_get_user_other_email (config, &other_len); + const char *to_headers[] = { + "Envelope-to", + "X-Original-To", + "Delivered-To", + }; /* sadly, there is no standard way to find out to which email * address a mail was delivered - what is in the headers depends @@ -400,28 +400,19 @@ guess_from_received_header (notmuch_config_t *config, notmuch_message_t *message * the To: or Cc: header. From here we try the following in order: * 1) check for an Envelope-to: header * 2) check for an X-Original-To: header - * 3) check for a (for ) clause in Received: headers - * 4) check for the domain part of known email addresses in the + * 3) check for a Delivered-To: header + * 4) check for a (for ) clause in Received: headers + * 5) check for the domain part of known email addresses in the * 'by' part of Received headers * If none of these work, we give up and return NULL */ - for (i = 0; i < sizeof(to_headers)/sizeof(*to_headers); i++) { - tohdr = xstrdup(notmuch_message_get_header (message, to_headers[i])); - if (tohdr && *tohdr) { - /* tohdr is potentialy a list of email addresses, so here we - * check if one of the email addresses is a substring of tohdr - */ - if (strcasestr(tohdr, primary)) { - free(tohdr); - return primary; - } - for (j = 0; j < other_len; j++) - if (strcasestr (tohdr, other[j])) { - free(tohdr); - return other[j]; - } - free(tohdr); - } + for (i = 0; i < ARRAY_SIZE (to_headers); i++) { + const char *tohdr = notmuch_message_get_header (message, to_headers[i]); + + /* Note: tohdr potentially contains a list of email addresses. */ + addr = user_address_in_string (tohdr, config); + if (addr) + return addr; } /* We get the concatenated Received: headers and search from the @@ -439,19 +430,12 @@ guess_from_received_header (notmuch_config_t *config, notmuch_message_t *message * header */ ptr = strstr (received, " for "); - if (ptr) { - /* the text following is potentialy a list of email addresses, - * so again we check if one of the email addresses is a - * substring of ptr - */ - if (strcasestr(ptr, primary)) { - return primary; - } - for (i = 0; i < other_len; i++) - if (strcasestr (ptr, other[i])) { - return other[i]; - } - } + + /* Note: ptr potentially contains a list of email addresses. */ + addr = user_address_in_string (ptr, config); + if (addr) + return addr; + /* Finally, we parse all the " by MTA ..." headers to guess the * email address that this was originally delivered to. * We extract just the MTA here by removing leading whitespace and @@ -492,15 +476,11 @@ guess_from_received_header (notmuch_config_t *config, notmuch_message_t *message */ *(tld-1) = '.'; - if (strcasestr(primary, domain)) { - free(mta); - return primary; + addr = string_in_user_address (domain, config); + if (addr) { + free (mta); + return addr; } - for (i = 0; i < other_len; i++) - if (strcasestr (other[i],domain)) { - free(mta); - return other[i]; - } } free (mta); } @@ -596,8 +576,7 @@ notmuch_reply_format_default(void *ctx, g_object_unref (G_OBJECT (reply)); reply = NULL; - if (mime_node_open (ctx, message, params->cryptoctx, params->decrypt, - &root) == NOTMUCH_STATUS_SUCCESS) { + if (mime_node_open (ctx, message, &(params->crypto), &root) == NOTMUCH_STATUS_SUCCESS) { format_part_reply (root); talloc_free (root); } @@ -618,6 +597,7 @@ notmuch_reply_format_json(void *ctx, notmuch_messages_t *messages; notmuch_message_t *message; mime_node_t *node; + sprinter_t *sp; if (notmuch_query_count_messages (query) != 1) { fprintf (stderr, "Error: search term did not match precisely one message.\n"); @@ -626,27 +606,28 @@ notmuch_reply_format_json(void *ctx, messages = notmuch_query_search_messages (query); message = notmuch_messages_get (messages); - if (mime_node_open (ctx, message, params->cryptoctx, params->decrypt, - &node) != NOTMUCH_STATUS_SUCCESS) + if (mime_node_open (ctx, message, &(params->crypto), &node) != NOTMUCH_STATUS_SUCCESS) return 1; reply = create_reply_message (ctx, config, message, reply_all); if (!reply) return 1; + sp = sprinter_json_create (ctx, stdout); + sp->begin_map (sp); + /* The headers of the reply message we've created */ - printf ("{\"reply-headers\": "); - format_headers_json (ctx, reply, TRUE); + sp->map_key (sp, "reply-headers"); + format_headers_json (sp, reply, TRUE); g_object_unref (G_OBJECT (reply)); reply = NULL; /* Start the original */ - printf (", \"original\": "); - - format_part_json (ctx, node, TRUE); + sp->map_key (sp, "original"); + format_part_json (ctx, sp, node, TRUE, TRUE); /* End */ - printf ("}\n"); + sp->end (sp); notmuch_message_destroy (message); return 0; @@ -727,7 +708,13 @@ notmuch_reply_command (void *ctx, int argc, char *argv[]) char *query_string; int opt_index, ret = 0; int (*reply_format_func)(void *ctx, notmuch_config_t *config, notmuch_query_t *query, notmuch_show_params_t *params, notmuch_bool_t reply_all); - notmuch_show_params_t params = { .part = -1 }; + notmuch_show_params_t params = { + .part = -1, + .crypto = { + .verify = FALSE, + .decrypt = FALSE + } + }; int format = FORMAT_DEFAULT; int reply_all = TRUE; @@ -741,7 +728,7 @@ notmuch_reply_command (void *ctx, int argc, char *argv[]) (notmuch_keyword_t []){ { "all", TRUE }, { "sender", FALSE }, { 0, 0 } } }, - { NOTMUCH_OPT_BOOLEAN, ¶ms.decrypt, "decrypt", 'd', 0 }, + { NOTMUCH_OPT_BOOLEAN, ¶ms.crypto.decrypt, "decrypt", 'd', 0 }, { 0, 0, 0, 0, 0 } }; @@ -758,25 +745,6 @@ notmuch_reply_command (void *ctx, int argc, char *argv[]) else reply_format_func = notmuch_reply_format_default; - if (params.decrypt) { -#ifdef GMIME_ATLEAST_26 - /* TODO: GMimePasswordRequestFunc */ - params.cryptoctx = g_mime_gpg_context_new (NULL, "gpg"); -#else - GMimeSession* session = g_object_new (g_mime_session_get_type(), NULL); - params.cryptoctx = g_mime_gpg_context_new (session, "gpg"); -#endif - if (params.cryptoctx) { - g_mime_gpg_context_set_always_trust ((GMimeGpgContext*) params.cryptoctx, FALSE); - } else { - params.decrypt = FALSE; - fprintf (stderr, "Failed to construct gpg context.\n"); - } -#ifndef GMIME_ATLEAST_26 - g_object_unref (session); -#endif - } - config = notmuch_config_open (ctx, NULL, NULL); if (config == NULL) return 1; @@ -805,11 +773,9 @@ notmuch_reply_command (void *ctx, int argc, char *argv[]) if (reply_format_func (ctx, config, query, ¶ms, reply_all) != 0) return 1; + notmuch_crypto_cleanup (¶ms.crypto); notmuch_query_destroy (query); notmuch_database_destroy (notmuch); - if (params.cryptoctx) - g_object_unref(params.cryptoctx); - return ret; }