]> git.notmuchmail.org Git - notmuch/blobdiff - mime-node.c
build: drop support for gmime-2.6
[notmuch] / mime-node.c
index daaae9f81ad5d510ed798aa20f55c7d14efe029a..053f044a7e72ab79695a5a0ff581be3f49fee5db 100644 (file)
@@ -149,7 +149,7 @@ DONE:
     return status;
 }
 
-/* Signature list destructor (GMime 2.6) */
+/* Signature list destructor */
 static int
 _signature_list_free (GMimeSignatureList **proxy)
 {
@@ -157,7 +157,7 @@ _signature_list_free (GMimeSignatureList **proxy)
     return 0;
 }
 
-/* Set up signature list destructor (GMime 2.6) */
+/* Set up signature list destructor */
 static void
 set_signature_list_destructor (mime_node_t *node)
 {
@@ -168,7 +168,7 @@ set_signature_list_destructor (mime_node_t *node)
     }
 }
 
-/* Verify a signed mime node (GMime 2.6) */
+/* Verify a signed mime node */
 static void
 node_verify (mime_node_t *node, GMimeObject *part,
             g_mime_3_unused(GMimeCryptoContext *cryptoctx))
@@ -189,7 +189,7 @@ node_verify (mime_node_t *node, GMimeObject *part,
        g_error_free (err);
 }
 
-/* Decrypt and optionally verify an encrypted mime node (GMime 2.6) */
+/* Decrypt and optionally verify an encrypted mime node */
 static void
 node_decrypt_and_verify (mime_node_t *node, GMimeObject *part,
                         g_mime_3_unused(GMimeCryptoContext *cryptoctx))
@@ -197,15 +197,18 @@ node_decrypt_and_verify (mime_node_t *node, GMimeObject *part,
     GError *err = NULL;
     GMimeDecryptResult *decrypt_result = NULL;
     GMimeMultipartEncrypted *encrypteddata = GMIME_MULTIPART_ENCRYPTED (part);
+    notmuch_message_t *message = NULL;
 
     if (! node->decrypted_child) {
-       mime_node_t *parent;
-       for (parent = node; parent; parent = parent->parent)
-           if (parent->envelope_file)
+       for (mime_node_t *parent = node; parent; parent = parent->parent)
+           if (parent->envelope_file) {
+               message = parent->envelope_file;
                break;
+           }
 
-       node->decrypt_attempted = true;
-       node->decrypted_child = _notmuch_crypto_decrypt (parent ? parent->envelope_file : NULL,
+       node->decrypted_child = _notmuch_crypto_decrypt (&node->decrypt_attempted,
+                                                        node->ctx->crypto->decrypt,
+                                                        message,
                                                         cryptoctx, encrypteddata, &decrypt_result, &err);
     }
     if (! node->decrypted_child) {
@@ -215,15 +218,27 @@ node_decrypt_and_verify (mime_node_t *node, GMimeObject *part,
     }
 
     node->decrypt_success = true;
-    node->verify_attempted = true;
 
     if (decrypt_result) {
        /* This may be NULL if the part is not signed. */
        node->sig_list = g_mime_decrypt_result_get_signatures (decrypt_result);
        if (node->sig_list) {
+           node->verify_attempted = true;
            g_object_ref (node->sig_list);
            set_signature_list_destructor (node);
        }
+
+#if HAVE_GMIME_SESSION_KEYS
+       if (node->ctx->crypto->decrypt == NOTMUCH_DECRYPT_TRUE && message) {
+           notmuch_database_t *db = notmuch_message_get_database (message);
+           const char *session_key = g_mime_decrypt_result_get_session_key (decrypt_result);
+           if (db && session_key)
+               print_status_message ("Failed to stash session key in the database",
+                                     message,
+                                     notmuch_message_add_property (message, "session-key",
+                                                                   session_key));
+       }
+#endif
        g_object_unref (decrypt_result);
     }
 
@@ -270,7 +285,7 @@ _mime_node_create (mime_node_t *parent, GMimeObject *part)
     }
 
 #if (GMIME_MAJOR_VERSION < 3)
-    if ((GMIME_IS_MULTIPART_ENCRYPTED (part) && node->ctx->crypto->decrypt)
+    if ((GMIME_IS_MULTIPART_ENCRYPTED (part) && (node->ctx->crypto->decrypt != NOTMUCH_DECRYPT_FALSE))
        || (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");
@@ -286,7 +301,7 @@ _mime_node_create (mime_node_t *parent, GMimeObject *part)
 #endif
 
     /* Handle PGP/MIME parts */
-    if (GMIME_IS_MULTIPART_ENCRYPTED (part) && node->ctx->crypto->decrypt) {
+    if (GMIME_IS_MULTIPART_ENCRYPTED (part) && (node->ctx->crypto->decrypt != NOTMUCH_DECRYPT_FALSE)) {
        if (node->nchildren != 2) {
            /* this violates RFC 3156 section 4, so we won't bother with it. */
            fprintf (stderr, "Error: %d part(s) for a multipart/encrypted "