X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=notmuch-reply.c;h=e60a264b5d30acf8cec96412f17e150789e43c5c;hp=51cb6de8dc66c3ca9f20548a2a1a616e339af98c;hb=58b222d597c4b2e8b8bc0b251929ead60eb29bf9;hpb=6d44c5af6568d2a559c163ace14d27cc7e2ba1bc diff --git a/notmuch-reply.c b/notmuch-reply.c index 51cb6de8..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) @@ -384,7 +385,11 @@ guess_from_received_header (notmuch_config_t *config, notmuch_message_t *message const char *delim=". \t"; size_t i; - const char *to_headers[] = {"Envelope-to", "X-Original-To"}; + 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 @@ -395,8 +400,9 @@ 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 */ @@ -570,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); } @@ -592,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"); @@ -600,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; @@ -701,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; @@ -715,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 } }; @@ -732,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; @@ -779,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; }