X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=notmuch-show.c;h=bce7d8279b42060abfc2b9a2a3b6a431264ea89f;hb=be8f0ba92a302798b21cf02ef73c4ad783b66cba;hp=0816a5e1b8c786fdb70b0bc29d796c60403084a7;hpb=80728a95e6fd8bd1c4a4f8dd8040984ab5c4b04a;p=notmuch diff --git a/notmuch-show.c b/notmuch-show.c index 0816a5e1..bce7d827 100644 --- a/notmuch-show.c +++ b/notmuch-show.c @@ -197,7 +197,7 @@ _is_from_line (const char *line) void format_headers_sprinter (sprinter_t *sp, GMimeMessage *message, - bool reply) + bool reply, const _notmuch_message_crypto_t *msg_crypto) { /* Any changes to the JSON or S-Expression format should be * reflected in the file devel/schemata. */ @@ -209,7 +209,10 @@ format_headers_sprinter (sprinter_t *sp, GMimeMessage *message, sp->begin_map (sp); sp->map_key (sp, "Subject"); - sp->string (sp, g_mime_message_get_subject (message)); + if (msg_crypto && msg_crypto->payload_subject) { + sp->string (sp, msg_crypto->payload_subject); + } else + sp->string (sp, g_mime_message_get_subject (message)); sp->map_key (sp, "From"); sp->string (sp, g_mime_message_get_from_string (message)); @@ -487,8 +490,8 @@ format_part_text (const void *ctx, sprinter_t *sp, mime_node_t *node, { /* The disposition and content-type metadata are associated with * the envelope for message parts */ - GMimeObject *meta = node->envelope_part ? - GMIME_OBJECT (node->envelope_part) : node->part; + GMimeObject *meta = node->envelope_part ? ( + GMIME_OBJECT (node->envelope_part) ) : node->part ; GMimeContentType *content_type = g_mime_object_get_content_type (meta); const bool leaf = GMIME_IS_PART (node->part); GMimeStream *stream = params->out_stream; @@ -510,8 +513,8 @@ format_part_text (const void *ctx, sprinter_t *sp, mime_node_t *node, char *content_string; const char *disposition = _get_disposition (meta); const char *cid = g_mime_object_get_content_id (meta); - const char *filename = leaf ? - g_mime_part_get_filename (GMIME_PART (node->part)) : NULL; + const char *filename = leaf ? ( + g_mime_part_get_filename (GMIME_PART (node->part)) ) : NULL ; if (disposition && strcasecmp (disposition, GMIME_DISPOSITION_ATTACHMENT) == 0) @@ -616,6 +619,7 @@ format_part_sprinter (const void *ctx, sprinter_t *sp, mime_node_t *node, * reflected in the file devel/schemata. */ if (node->envelope_file) { + const _notmuch_message_crypto_t *msg_crypto = NULL; sp->begin_map (sp); format_message_sprinter (sp, node->envelope_file); @@ -626,8 +630,8 @@ format_part_sprinter (const void *ctx, sprinter_t *sp, mime_node_t *node, sp->end (sp); } + msg_crypto = mime_node_get_message_crypto_status (node); if (notmuch_format_version >= 4) { - const _notmuch_message_crypto_t *msg_crypto = mime_node_get_message_crypto_status (node); sp->map_key (sp, "crypto"); sp->begin_map (sp); if (msg_crypto->sig_list || @@ -641,6 +645,12 @@ format_part_sprinter (const void *ctx, sprinter_t *sp, mime_node_t *node, sp->map_key (sp, "encrypted"); sp->boolean (sp, msg_crypto->signature_encrypted); } + if (msg_crypto->payload_subject) { + sp->map_key (sp, "headers"); + sp->begin_list (sp); + sp->string (sp, "Subject"); + sp->end (sp); + } sp->end (sp); } if (msg_crypto->decryption_status != NOTMUCH_MESSAGE_DECRYPTED_NONE) { @@ -648,6 +658,21 @@ format_part_sprinter (const void *ctx, sprinter_t *sp, mime_node_t *node, sp->begin_map (sp); sp->map_key (sp, "status"); sp->string (sp, msg_crypto->decryption_status == NOTMUCH_MESSAGE_DECRYPTED_FULL ? "full" : "partial"); + + if (msg_crypto->payload_subject) { + const char *subject = g_mime_message_get_subject GMIME_MESSAGE (node->part); + if (subject == NULL || strcmp (subject, msg_crypto->payload_subject)) { + /* protected subject differs from the external header */ + sp->map_key (sp, "header-mask"); + sp->begin_map (sp); + sp->map_key (sp, "Subject"); + if (subject == NULL) + sp->null (sp); + else + sp->string (sp, subject); + sp->end (sp); + } + } sp->end (sp); } } @@ -655,7 +680,7 @@ format_part_sprinter (const void *ctx, sprinter_t *sp, mime_node_t *node, } sp->map_key (sp, "headers"); - format_headers_sprinter (sp, GMIME_MESSAGE (node->part), false); + format_headers_sprinter (sp, GMIME_MESSAGE (node->part), false, msg_crypto); sp->end (sp); return; @@ -663,14 +688,14 @@ format_part_sprinter (const void *ctx, sprinter_t *sp, mime_node_t *node, /* The disposition and content-type metadata are associated with * the envelope for message parts */ - GMimeObject *meta = node->envelope_part ? - GMIME_OBJECT (node->envelope_part) : node->part; + GMimeObject *meta = node->envelope_part ? ( + GMIME_OBJECT (node->envelope_part) ): node->part; GMimeContentType *content_type = g_mime_object_get_content_type (meta); char *content_string; const char *disposition = _get_disposition (meta); const char *cid = g_mime_object_get_content_id (meta); - const char *filename = GMIME_IS_PART (node->part) ? - g_mime_part_get_filename (GMIME_PART (node->part)) : NULL; + const char *filename = GMIME_IS_PART (node->part) ? ( + g_mime_part_get_filename (GMIME_PART (node->part) ) ) : NULL; int nclose = 0; int i; @@ -748,7 +773,7 @@ format_part_sprinter (const void *ctx, sprinter_t *sp, mime_node_t *node, sp->begin_map (sp); sp->map_key (sp, "headers"); - format_headers_sprinter (sp, GMIME_MESSAGE (node->part), false); + format_headers_sprinter (sp, GMIME_MESSAGE (node->part), false, NULL); sp->map_key (sp, "body"); sp->begin_list (sp);