From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from localhost (localhost [127.0.0.1]) by arlo.cworth.org (Postfix) with ESMTP id 2B3C76DE0B26 for ; Sun, 16 Aug 2015 08:34:24 -0700 (PDT) X-Virus-Scanned: Debian amavisd-new at cworth.org X-Spam-Flag: NO X-Spam-Score: 0.129 X-Spam-Level: X-Spam-Status: No, score=0.129 tagged_above=-999 required=5 tests=[AWL=0.119, T_HEADER_FROM_DIFFERENT_DOMAINS=0.01] autolearn=disabled Received: from arlo.cworth.org ([127.0.0.1]) by localhost (arlo.cworth.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 0VTWOAOrvhpZ for ; Sun, 16 Aug 2015 08:34:21 -0700 (PDT) Received: from gitolite.debian.net (gitolite.debian.net [87.98.215.224]) by arlo.cworth.org (Postfix) with ESMTPS id 5459C6DE01D3 for ; Sun, 16 Aug 2015 08:34:20 -0700 (PDT) Received: from remotemail by gitolite.debian.net with local (Exim 4.80) (envelope-from ) id 1ZQzwI-0003E5-1s; Sun, 16 Aug 2015 15:33:38 +0000 Received: (nullmailer pid 11162 invoked by uid 1000); Sun, 16 Aug 2015 15:33:29 -0000 From: David Bremner To: notmuch@notmuchmail.org Subject: [PATCH] cli/lib: remove support for GMime 2.4 Date: Sun, 16 Aug 2015 17:33:21 +0200 Message-Id: <1439739201-11068-1-git-send-email-david@tethera.net> X-Mailer: git-send-email 2.5.0 X-BeenThere: notmuch@notmuchmail.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: "Use and development of the notmuch mail system." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 16 Aug 2015 15:34:24 -0000 It's becoming a maintenance burden to do anything things with the crypto glue code twice, once for 2.4 and once for 2.6. I don't have any 2.4 version available to test on my development machine anymore, so the 2.4 specific code paths are likely not very well tested. --- I started to rebase the SMIME signature verification patches and got aggravated at solving the same conflicts twice in every file. 2.6.7 is from 2012, so that's a bit newer than some of our requirements, but I think not so bad. YMMV. INSTALL | 6 ++-- configure | 49 ++++++++++----------------------- crypto.c | 25 ----------------- mime-node.c | 83 ------------------------------------------------------- notmuch-show.c | 87 ---------------------------------------------------------- 5 files changed, 17 insertions(+), 233 deletions(-) diff --git a/INSTALL b/INSTALL index eaccd93..b1b9cd5 100644 --- a/INSTALL +++ b/INSTALL @@ -20,7 +20,7 @@ configure stage. Dependencies ------------ -Notmuch depends on four libraries: Xapian, GMime 2.4 or 2.6, +Notmuch depends on four libraries: Xapian, GMime 2.6, Talloc, and zlib which are each described below: Xapian @@ -39,8 +39,8 @@ Talloc, and zlib which are each described below: reading mail while notmuch would wait for Xapian when removing the "inbox" and "unread" tags from messages in a thread. - GMime 2.4 or 2.6 - ---------------- + GMime 2.6 + ---------- GMime provides decoding of MIME email messages for Notmuch. Without GMime, Notmuch would not be able to extract and index diff --git a/configure b/configure index d289880..440d678 100755 --- a/configure +++ b/configure @@ -71,16 +71,6 @@ WITH_BASH=1 WITH_RUBY=1 WITH_ZSH=1 -# Compatible GMime versions (with constraints). -# If using GMime 2.6, we need to have a version >= 2.6.5 to avoid a -# crypto bug. We need 2.6.7 for permissive "From " header handling. -GMIME_24_VERSION_CTR='' -GMIME_24_VERSION="gmime-2.4 $GMIME_24_VERSION_CTR" -GMIME_26_VERSION_CTR='>= 2.6.7' -GMIME_26_VERSION="gmime-2.6 $GMIME_26_VERSION_CTR" - -WITH_GMIME_VERSIONS="$GMIME_26_VERSION;$GMIME_24_VERSION" - usage () { cat <= 2.6.5 to avoid a crypto bug. We need +# 2.6.7 for permissive "From " header handling. +GMIME_MINVER=2.6.7 + printf "Checking for GMime development files... " -have_gmime=0 -IFS=';' -for gmimepc in $WITH_GMIME_VERSIONS; do - if pkg-config --exists $gmimepc; then - printf "Yes ($gmimepc).\n" - have_gmime=1 - gmime_cflags=$(pkg-config --cflags $gmimepc) - gmime_ldflags=$(pkg-config --libs $gmimepc) - break - fi -done -IFS=$DEFAULT_IFS -if [ "$have_gmime" = "0" ]; then +if pkg-config --exists "gmime-2.6 >= $GMIME_MINVER"; then + printf "Yes.\n" + have_gmime=1 + gmime_cflags=$(pkg-config --cflags gmime-2.6) + gmime_ldflags=$(pkg-config --libs gmime-2.6) +else + have_gmime=0 printf "No.\n" errors=$((errors + 1)) fi @@ -640,7 +619,7 @@ EOF echo fi if [ $have_gmime -eq 0 ]; then - echo " Either GMime 2.4 library" $GMIME_24_VERSION_CTR "or GMime 2.6 library" $GMIME_26_VERSION_CTR + echo " GMime 2.6 library >= $GMIME_MINVER" echo " (including development files such as headers)" echo " http://spruce.sourceforge.net/gmime/" echo @@ -1026,7 +1005,7 @@ LINKER_RESOLVES_LIBRARY_DEPENDENCIES = ${linker_resolves_library_dependencies} XAPIAN_CXXFLAGS = ${xapian_cxxflags} XAPIAN_LDFLAGS = ${xapian_ldflags} -# Flags needed to compile and link against GMime-2.4 +# Flags needed to compile and link against GMime GMIME_CFLAGS = ${gmime_cflags} GMIME_LDFLAGS = ${gmime_ldflags} diff --git a/crypto.c b/crypto.c index 026640f..a6eb27d 100644 --- a/crypto.c +++ b/crypto.c @@ -20,8 +20,6 @@ #include "notmuch-client.h" -#ifdef GMIME_ATLEAST_26 - /* Create a GPG context (GMime 2.6) */ static notmuch_crypto_context_t * create_gpg_context (const char *gpgpath) @@ -39,29 +37,6 @@ create_gpg_context (const char *gpgpath) return gpgctx; } -#else /* GMIME_ATLEAST_26 */ - -/* Create a GPG context (GMime 2.4) */ -static notmuch_crypto_context_t * -create_gpg_context (const char* gpgpath) -{ - GMimeSession *session; - notmuch_crypto_context_t *gpgctx; - - session = g_object_new (g_mime_session_get_type (), NULL); - gpgctx = g_mime_gpg_context_new (session, gpgpath ? gpgpath : "gpg"); - g_object_unref (session); - - if (! gpgctx) - return NULL; - - g_mime_gpg_context_set_always_trust ((GMimeGpgContext *) gpgctx, FALSE); - - return gpgctx; -} - -#endif /* GMIME_ATLEAST_26 */ - /* for the specified protocol return the context pointer (initializing * if needed) */ notmuch_crypto_context_t * diff --git a/mime-node.c b/mime-node.c index fd9e4a4..e96e663 100644 --- a/mime-node.c +++ b/mime-node.c @@ -129,8 +129,6 @@ DONE: return status; } -#ifdef GMIME_ATLEAST_26 - /* Signature list destructor (GMime 2.6) */ static int _signature_list_free (GMimeSignatureList **proxy) @@ -205,87 +203,6 @@ node_decrypt_and_verify (mime_node_t *node, GMimeObject *part, g_error_free (err); } -#else /* GMIME_ATLEAST_26 */ - -/* Signature validity destructor (GMime 2.4) */ -static int -_signature_validity_free (GMimeSignatureValidity **proxy) -{ - g_mime_signature_validity_free (*proxy); - return 0; -} - -/* Set up signature validity destructor (GMime 2.4) */ -static void -set_signature_validity_destructor (mime_node_t *node, - GMimeSignatureValidity *sig_validity) -{ - GMimeSignatureValidity **proxy = talloc (node, GMimeSignatureValidity *); - if (proxy) { - *proxy = sig_validity; - talloc_set_destructor (proxy, _signature_validity_free); - } -} - -/* Verify a signed mime node (GMime 2.4) */ -static void -node_verify (mime_node_t *node, GMimeObject *part, - notmuch_crypto_context_t *cryptoctx) -{ - GError *err = NULL; - GMimeSignatureValidity *sig_validity; - - node->verify_attempted = TRUE; - sig_validity = g_mime_multipart_signed_verify - (GMIME_MULTIPART_SIGNED (part), cryptoctx, &err); - node->sig_validity = sig_validity; - if (sig_validity) { - set_signature_validity_destructor (node, sig_validity); - } else { - fprintf (stderr, "Failed to verify signed part: %s\n", - err ? err->message : "no error explanation given"); - } - - if (err) - g_error_free (err); -} - -/* Decrypt and optionally verify an encrypted mime node (GMime 2.4) */ -static void -node_decrypt_and_verify (mime_node_t *node, GMimeObject *part, - notmuch_crypto_context_t *cryptoctx) -{ - GError *err = NULL; - GMimeMultipartEncrypted *encrypteddata = GMIME_MULTIPART_ENCRYPTED (part); - - node->decrypt_attempted = TRUE; - node->decrypted_child = g_mime_multipart_encrypted_decrypt - (encrypteddata, cryptoctx, &err); - 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; - - /* The GMimeSignatureValidity returned here is a const, unlike the - * one returned by g_mime_multipart_signed_verify() in - * node_verify() above, so the destructor is not needed. - */ - node->sig_validity = g_mime_multipart_encrypted_get_signature_validity (encrypteddata); - if (! node->sig_validity) - fprintf (stderr, "Failed to verify encrypted signed part: %s\n", - err ? err->message : "no error explanation given"); - - DONE: - if (err) - g_error_free (err); -} - -#endif /* GMIME_ATLEAST_26 */ - static mime_node_t * _mime_node_create (mime_node_t *parent, GMimeObject *part) { diff --git a/notmuch-show.c b/notmuch-show.c index b80933a..21015fd 100644 --- a/notmuch-show.c +++ b/notmuch-show.c @@ -334,8 +334,6 @@ show_text_part_content (GMimeObject *part, GMimeStream *stream_out, g_object_unref(stream_filter); } -#ifdef GMIME_ATLEAST_26 - /* Get signature status string (GMime 2.6) */ static const char* signature_status_to_string (GMimeSignatureStatus x) @@ -427,91 +425,6 @@ format_part_sigstatus_sprinter (sprinter_t *sp, mime_node_t *node) sp->end (sp); } -#else /* GMIME_ATLEAST_26 */ - -/* Get signature status string (GMime 2.4) */ -static const char* -signer_status_to_string (GMimeSignerStatus x) -{ - switch (x) { - case GMIME_SIGNER_STATUS_NONE: - return "none"; - case GMIME_SIGNER_STATUS_GOOD: - return "good"; - case GMIME_SIGNER_STATUS_BAD: - return "bad"; - case GMIME_SIGNER_STATUS_ERROR: - return "error"; - } - return "unknown"; -} - -/* Signature status sprinter (GMime 2.4) */ -static void -format_part_sigstatus_sprinter (sprinter_t *sp, mime_node_t *node) -{ - const GMimeSignatureValidity* validity = node->sig_validity; - - sp->begin_list (sp); - - if (!validity) { - sp->end (sp); - return; - } - - const GMimeSigner *signer = g_mime_signature_validity_get_signers (validity); - while (signer) { - sp->begin_map (sp); - - /* status */ - sp->map_key (sp, "status"); - sp->string (sp, signer_status_to_string (signer->status)); - - if (signer->status == GMIME_SIGNER_STATUS_GOOD) - { - if (signer->fingerprint) { - sp->map_key (sp, "fingerprint"); - sp->string (sp, signer->fingerprint); - } - /* these dates are seconds since the epoch; should we - * provide a more human-readable format string? */ - if (signer->created) { - sp->map_key (sp, "created"); - sp->integer (sp, signer->created); - } - if (signer->expires) { - sp->map_key (sp, "expires"); - sp->integer (sp, signer->expires); - } - /* output user id only if validity is FULL or ULTIMATE. */ - /* note that gmime is using the term "trust" here, which - * is WRONG. It's actually user id "validity". */ - if ((signer->name) && (signer->trust)) { - if ((signer->trust == GMIME_SIGNER_TRUST_FULLY) || (signer->trust == GMIME_SIGNER_TRUST_ULTIMATE)) { - sp->map_key (sp, "userid"); - sp->string (sp, signer->name); - } - } - } else { - if (signer->keyid) { - sp->map_key (sp, "keyid"); - sp->string (sp, signer->keyid); - } - } - if (signer->errors != GMIME_SIGNER_ERROR_NONE) { - sp->map_key (sp, "errors"); - sp->integer (sp, signer->errors); - } - - sp->end (sp); - signer = signer->next; - } - - sp->end (sp); -} - -#endif /* GMIME_ATLEAST_26 */ - static notmuch_status_t format_part_text (const void *ctx, sprinter_t *sp, mime_node_t *node, int indent, const notmuch_show_params_t *params) -- 2.5.0