]> git.notmuchmail.org Git - notmuch/commitdiff
Merge branch 'release'
authorDavid Bremner <david@tethera.net>
Mon, 6 Nov 2017 00:25:54 +0000 (20:25 -0400)
committerDavid Bremner <david@tethera.net>
Mon, 6 Nov 2017 00:25:54 +0000 (20:25 -0400)
Changes from 0.25.2 release

1  2 
NEWS
mime-node.c

diff --combined NEWS
index 895b76273313adf53e59287a2a8f3e2f554fedbe,24e7982c9d7791ec85c6d7fa924844db8b1e0ee8..412c678d1bfdddc823fd826b2a4ec49b855e3172
--- 1/NEWS
--- 2/NEWS
+++ b/NEWS
@@@ -1,33 -1,17 +1,47 @@@
 +Notmuch 0.26 (UNRELEASED)
 +=========================
 +
 +Test Suite
 +----------
 +
 +Out-of-tree builds
 +
 +  The test suite now works properly with out-of-tree builds, i.e. with
 +  separate source and build directories. The --root option to tests
 +  has been dropped. The same can now be achieved more reliably using
 +  out-of-tree builds.
 +
 +Encrypted Mail
 +--------------
 +
 +Indexing cleartext of encrypted e-mails
 +
 +  It's now possible to include the cleartext of encrypted e-mails in
 +  the notmuch index.  This makes it possible to search your encrypted
 +  e-mails with the same ease as searching cleartext.  This can be done
 +  on a per-message basis with the --try-decrypt argument to indexing
 +  commands (new, insert, reindex), or by default by running "notmuch
 +  config set index.try_decrypt true".
 +
 +  Note that the contents of the index are sufficient to roughly
 +  reconstruct the cleartext of the message itself, so please ensure
 +  that the notmuch index itself is adequately protected.  DO NOT USE
 +  this feature without considering the security of your index.
 +
+ Notmuch 0.25.2 (2017-11-05)
+ ===========================
+ Command Line Interface
+ ----------------------
+ Fix segfault in notmuch-show crypto handling when compiled against
+ GMime 2.6; this was a regression in 0.25.
+ General
+ -------
+ Support for GMime before 3.0 is now deprecated, and will be removed in
+ a future release.
  
  Notmuch 0.25.1 (2017-09-11)
  ===========================
diff --combined mime-node.c
index c3d5cb9b47595ad2a43606e8faf08b8a0e28283d,1609173576e2fa4830e04540231f008bab48f2c8..e1aca969bef775d06659a556b1140e37897c1da9
@@@ -33,7 -33,7 +33,7 @@@ typedef struct mime_node_context 
      GMimeMessage *mime_message;
  
      /* Context provided by the caller. */
 -    notmuch_crypto_t *crypto;
 +    _notmuch_crypto_t *crypto;
  } mime_node_context_t;
  
  static int
@@@ -56,7 -56,7 +56,7 @@@ _mime_node_context_free (mime_node_cont
  
  notmuch_status_t
  mime_node_open (const void *ctx, notmuch_message_t *message,
 -              notmuch_crypto_t *crypto, mime_node_t **root_out)
 +              _notmuch_crypto_t *crypto, mime_node_t **root_out)
  {
      const char *filename = notmuch_message_get_filename (message);
      mime_node_context_t *mctx;
      }
      talloc_set_destructor (mctx, _mime_node_context_free);
  
 +    /* Fast path */
      mctx->file = fopen (filename, "r");
      if (! mctx->file) {
 -      fprintf (stderr, "Error opening %s: %s\n", filename, strerror (errno));
 -      status = NOTMUCH_STATUS_FILE_ERROR;
 -      goto DONE;
 -    }
 +      /* Slow path - for some reason the first file in the list is
 +       * not available anymore. This is clearly a problem in the
 +       * database, but we are not going to let this problem be a
 +       * show stopper */
 +      notmuch_filenames_t *filenames;
 +      for (filenames = notmuch_message_get_filenames (message);
 +           notmuch_filenames_valid (filenames);
 +           notmuch_filenames_move_to_next (filenames))
 +      {
 +          filename = notmuch_filenames_get (filenames);
 +          mctx->file = fopen (filename, "r");
 +          if (mctx->file)
 +              break;
 +      }
 +
 +      talloc_free (filenames);
 +      if (! mctx->file) {
 +          /* Give up */
 +          fprintf (stderr, "Error opening %s: %s\n", filename, strerror (errno));
 +              status = NOTMUCH_STATUS_FILE_ERROR;
 +              goto DONE;
 +          }
 +      }
  
      mctx->stream = g_mime_stream_file_new (mctx->file);
      if (!mctx->stream) {
        status = NOTMUCH_STATUS_OUT_OF_MEMORY;
        goto DONE;
      }
 -    g_mime_stream_file_set_owner (GMIME_STREAM_FILE (mctx->stream), FALSE);
 +    g_mime_stream_file_set_owner (GMIME_STREAM_FILE (mctx->stream), false);
  
      mctx->parser = g_mime_parser_new_with_stream (mctx->stream);
      if (!mctx->parser) {
@@@ -171,11 -151,11 +171,11 @@@ set_signature_list_destructor (mime_nod
  /* Verify a signed mime node (GMime 2.6) */
  static void
  node_verify (mime_node_t *node, GMimeObject *part,
 -           g_mime_3_unused(notmuch_crypto_context_t *cryptoctx))
 +           g_mime_3_unused(GMimeCryptoContext *cryptoctx))
  {
      GError *err = NULL;
  
 -    node->verify_attempted = TRUE;
 +    node->verify_attempted = true;
      node->sig_list = g_mime_multipart_signed_verify
        (GMIME_MULTIPART_SIGNED (part), cryptoctx, &err);
  
  /* Decrypt and optionally verify an encrypted mime node (GMime 2.6) */
  static void
  node_decrypt_and_verify (mime_node_t *node, GMimeObject *part,
 -                       g_mime_3_unused(notmuch_crypto_context_t *cryptoctx))
 +                       g_mime_3_unused(GMimeCryptoContext *cryptoctx))
  {
      GError *err = NULL;
      GMimeDecryptResult *decrypt_result = NULL;
      GMimeMultipartEncrypted *encrypteddata = GMIME_MULTIPART_ENCRYPTED (part);
  
 -    node->decrypt_attempted = TRUE;
 +    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");
        goto DONE;
      }
  
 -    node->decrypt_success = TRUE;
 -    node->verify_attempted = TRUE;
 +    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);
@@@ -231,7 -207,7 +231,7 @@@ static mime_node_t 
  _mime_node_create (mime_node_t *parent, GMimeObject *part)
  {
      mime_node_t *node = talloc_zero (parent, mime_node_t);
 -    notmuch_crypto_context_t *cryptoctx = NULL;
 +    GMimeCryptoContext *cryptoctx = NULL;
  
      /* Set basic node properties */
      node->part = 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_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