]> git.notmuchmail.org Git - notmuch/blobdiff - mime-node.c
mime-node: handle decrypt_result more safely
[notmuch] / mime-node.c
index 02e3df48b48b28feeba83dbab325232e97125063..7c8b26024460346ff3387df68234dddfd1256a36 100644 (file)
@@ -200,7 +200,11 @@ node_decrypt_and_verify (mime_node_t *node, GMimeObject *part,
 
     node->decrypt_attempted = true;
     node->decrypted_child = g_mime_multipart_encrypted_decrypt
+#if (GMIME_MAJOR_VERSION < 3)
        (encrypteddata, cryptoctx, &decrypt_result, &err);
+#else
+        (encrypteddata, GMIME_DECRYPT_NONE, NULL, &decrypt_result, &err);
+#endif
     if (! node->decrypted_child) {
        fprintf (stderr, "Failed to decrypt part: %s\n",
                 err ? err->message : "no error explanation given");
@@ -210,13 +214,15 @@ node_decrypt_and_verify (mime_node_t *node, GMimeObject *part,
     node->decrypt_success = true;
     node->verify_attempted = true;
 
-    /* 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) {
-       g_object_ref (node->sig_list);
-       set_signature_list_destructor (node);
+    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) {
+           g_object_ref (node->sig_list);
+           set_signature_list_destructor (node);
+       }
+       g_object_unref (decrypt_result);
     }
-    g_object_unref (decrypt_result);
 
  DONE:
     if (err)
@@ -265,9 +271,14 @@ _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");
-       cryptoctx = _notmuch_crypto_get_gmime_context (node->ctx->crypto, 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 */
+           fprintf (stderr, "Warning: %s (%s).\n", notmuch_status_to_string (status),
+                    protocol ? protocol : "NULL");
        if (!cryptoctx)
-           return NULL;
+           return node;
     }
 #endif