Deliberately populate the message's cryptographic status while walking the MIME tree from the CLI.
Note that the additional numchild argument added to _mime_node_create is a passthrough needed to be able to adequately populate the crypto state object. --- mime-node.c | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/mime-node.c b/mime-node.c index 272d23fb..6a6d3c8d 100644 --- a/mime-node.c +++ b/mime-node.c @@ -135,6 +135,8 @@ mime_node_open (const void *ctx, notmuch_message_t *message, goto DONE; } + mctx->msg_crypto = _notmuch_message_crypto_new (mctx); + mctx->crypto = crypto; /* Create the root node */ @@ -181,6 +183,7 @@ node_verify (mime_node_t *node, GMimeObject *part, g_mime_3_unused(GMimeCryptoContext *cryptoctx)) { GError *err = NULL; + notmuch_status_t status; node->verify_attempted = true; node->sig_list = g_mime_multipart_signed_verify @@ -194,6 +197,10 @@ node_verify (mime_node_t *node, GMimeObject *part, if (err) g_error_free (err); + + status = _notmuch_message_crypto_potential_sig_list(node->ctx->msg_crypto, node->sig_list); + if (status) /* this is a warning, not an error */ + fprintf (stderr, "Warning: failed to note signature status: %s.\n", notmuch_status_to_string (status)); } /* Decrypt and optionally verify an encrypted mime node (GMime 2.6) */ @@ -203,6 +210,7 @@ node_decrypt_and_verify (mime_node_t *node, GMimeObject *part, { GError *err = NULL; GMimeDecryptResult *decrypt_result = NULL; + notmuch_status_t status; GMimeMultipartEncrypted *encrypteddata = GMIME_MULTIPART_ENCRYPTED (part); notmuch_message_t *message = NULL; @@ -225,6 +233,9 @@ node_decrypt_and_verify (mime_node_t *node, GMimeObject *part, } node->decrypt_success = true; + status = _notmuch_message_crypto_successful_decryption (node->ctx->msg_crypto); + if (status) /* this is a warning, not an error */ + fprintf (stderr, "Warning: failed to note decryption status: %s.\n", notmuch_status_to_string (status)); if (decrypt_result) { /* This may be NULL if the part is not signed. */ @@ -233,6 +244,9 @@ node_decrypt_and_verify (mime_node_t *node, GMimeObject *part, node->verify_attempted = true; g_object_ref (node->sig_list); set_signature_list_destructor (node); + status = _notmuch_message_crypto_potential_sig_list(node->ctx->msg_crypto, node->sig_list); + if (status) /* this is a warning, not an error */ + fprintf (stderr, "Warning: failed to note signature status: %s.\n", notmuch_status_to_string (status)); } #if HAVE_GMIME_SESSION_KEYS @@ -255,10 +269,11 @@ node_decrypt_and_verify (mime_node_t *node, GMimeObject *part, } static mime_node_t * -_mime_node_create (mime_node_t *parent, GMimeObject *part) +_mime_node_create (mime_node_t *parent, GMimeObject *part, int numchild) { mime_node_t *node = talloc_zero (parent, mime_node_t); GMimeCryptoContext *cryptoctx = NULL; + notmuch_status_t status; /* Set basic node properties */ node->part = part; @@ -296,7 +311,6 @@ _mime_node_create (mime_node_t *parent, GMimeObject *part) || (GMIME_IS_MULTIPART_SIGNED (part) && node->ctx->crypto->verify)) { GMimeContentType *content_type = g_mime_object_get_content_type (part); const char *protocol = g_mime_content_type_get_parameter (content_type, "protocol"); - notmuch_status_t status; status = _notmuch_crypto_get_gmime_ctx_for_protocol (node->ctx->crypto, protocol, &cryptoctx); if (status) /* this is a warning, not an error */ @@ -326,6 +340,10 @@ _mime_node_create (mime_node_t *parent, GMimeObject *part) } else { node_verify (node, part, cryptoctx); } + } else { + status = _notmuch_message_crypto_potential_payload (node->ctx->msg_crypto, part, parent ? parent->part : NULL, numchild); + if (status) + fprintf (stderr, "Warning: failed to record potential crypto payload (%s).\n", notmuch_status_to_string (status)); } return node; @@ -353,7 +371,7 @@ mime_node_child (mime_node_t *parent, int child) INTERNAL_ERROR ("Unexpected GMimeObject type: %s", g_type_name (G_OBJECT_TYPE (parent->part))); } - node = _mime_node_create (parent, sub); + node = _mime_node_create (parent, sub, child); if (child == parent->next_child && parent->next_part_num != -1) { /* We're traversing in depth-first order. Record the child's -- 2.20.1 _______________________________________________ notmuch mailing list notmuch@notmuchmail.org https://notmuchmail.org/mailman/listinfo/notmuch