[balsa/gtk3] Build with GMime version >= 2.5.7



commit 1947b1be7b13f6c3876dd3b53dd3ab52634fff01
Author: Peter Bloomfield <PeterBloomfield bellsouth net>
Date:   Wed Nov 9 17:38:27 2011 -0500

    Build with GMime version >= 2.5.7
    
    	* configure.in: check GMime version.
    	* libbalsa/gmime-application-pkcs7.c
    	(g_mime_application_pkcs7_sign), (g_mime_application_pkcs7_verify),
    	(g_mime_application_pkcs7_encrypt),
    	(g_mime_application_pkcs7_decrypt): build with GMime version >=
    	2.5.7.
    	* libbalsa/gmime-application-pkcs7.h: ditto.
    	* libbalsa/gmime-gpgme-context.c (g_mime_gpgme_context_get_type),
    	(g_mime_gpgme_context_class_init), (g_mime_gpgme_context_finalize),
    	(g_mime_gpgme_digest_id): ditto.
    	* libbalsa/gmime-gpgme-context.h: ditto.
    	* libbalsa/gmime-part-rfc2440.c (g_mime_part_rfc2440_sign_encrypt),
    	(g_mime_part_rfc2440_verify), (g_mime_part_rfc2440_decrypt):
    	* libbalsa/gmime-part-rfc2440.h: ditto.
    	* libbalsa/rfc3156.c (password_request_func),
    	(libbalsa_sign_mime_object), (libbalsa_encrypt_mime_object),
    	(libbalsa_body_check_signature), (libbalsa_body_decrypt): ditto.

 ChangeLog                          |   34 +++-
 configure.in                       |    7 +-
 libbalsa/gmime-application-pkcs7.c |   77 ++++++++-
 libbalsa/gmime-application-pkcs7.h |   23 +++
 libbalsa/gmime-gpgme-context.c     |  318 ++++++++++++++++++++++++++++++++++++
 libbalsa/gmime-gpgme-context.h     |   21 +++
 libbalsa/gmime-part-rfc2440.c      |   67 ++++++++-
 libbalsa/gmime-part-rfc2440.h      |    9 +
 libbalsa/rfc3156.c                 |   73 ++++++++-
 9 files changed, 614 insertions(+), 15 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index dd1710a..08f6196 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,25 @@
+2011-11-09  Peter Bloomfield
+
+	Build with GMime version >= 2.5.7
+
+	* configure.in: check GMime version.
+	* libbalsa/gmime-application-pkcs7.c
+	(g_mime_application_pkcs7_sign), (g_mime_application_pkcs7_verify),
+	(g_mime_application_pkcs7_encrypt),
+	(g_mime_application_pkcs7_decrypt): build with GMime version >=
+	2.5.7.
+	* libbalsa/gmime-application-pkcs7.h: ditto.
+	* libbalsa/gmime-gpgme-context.c (g_mime_gpgme_context_get_type),
+	(g_mime_gpgme_context_class_init), (g_mime_gpgme_context_finalize),
+	(g_mime_gpgme_digest_id): ditto.
+	* libbalsa/gmime-gpgme-context.h: ditto.
+	* libbalsa/gmime-part-rfc2440.c (g_mime_part_rfc2440_sign_encrypt),
+	(g_mime_part_rfc2440_verify), (g_mime_part_rfc2440_decrypt):
+	* libbalsa/gmime-part-rfc2440.h: ditto.
+	* libbalsa/rfc3156.c (password_request_func),
+	(libbalsa_sign_mime_object), (libbalsa_encrypt_mime_object),
+	(libbalsa_body_check_signature), (libbalsa_body_decrypt): ditto.
+
 2011-10-26  Peter Bloomfield
 
 	* src/sendmsg-window.c (create_info_pane): do not set vertical
@@ -9,7 +31,7 @@
 	* src/main.c (threads_init): use g_type_init, which is required,
 	not g_threads_init, which is redundant.
 
-2011-10-24  Peter Bloomfield  <peter t43 bellsouth net>
+2011-10-24  Peter Bloomfield
 
 	* src/main.c (balsa_handle_automation_options), (balsa_init),
 	(scan_mailboxes_idle_cb): handle multiple -o options.
@@ -283,16 +305,14 @@
 	* src/print-gtk.c (draw_page): use ngettext for plural; fixes
 	bgo #659390.
 
-2011-09-09  Peter Bloomfield  <peter t43 bellsouth net>
+2011-09-09  Peter Bloomfield
 
 	* src/main-window.c: use checking_mail_lock to protect access to
 	checking_mail.
 	* src/main.c (balsa_cleanup): ditto.
 	* src/threads.h: declare checking_mail.
 
-2011-09-08  Peter Bloomfield  <peter t43 bellsouth net>
-
-	reviewed by: <delete if not using a buddy>
+2011-09-08  Peter Bloomfield
 
 	* src/main-window.c: set view-filter in an idle callback.
 
@@ -1559,9 +1579,7 @@
 	notebook page;
 	(empty_trash): check for NULL window.
 
-2010-01-18  Peter Bloomfield  <peter t43 bellsouth net>
-
-	reviewed by: <delete if not using a buddy>
+2010-01-18  Peter Bloomfield
 
 	* src/balsa-index.c (bndx_mbnode_weak_notify), (bndx_destroy),
 	(balsa_index_load_mailbox_node): clear BalsaIndex::mailbox_node
diff --git a/configure.in b/configure.in
index afd124a..89c1cdc 100644
--- a/configure.in
+++ b/configure.in
@@ -322,7 +322,12 @@ fi
 case "$with_gmime" in
     2.4) ;;
     2.6) AC_DEFINE([HAVE_GMIME_2_6], [1],
-                   [Defined to build with GMime version 2.5 or 2.6]) ;;
+                   [Defined to build with GMime version 2.5 or 2.6])
+         if $PKG_CONFIG --atleast-version=2.5.7 gmime-2.6; then
+             AC_DEFINE([HAVE_GMIME_2_5_7], [1],
+                       [Defined when GMime version is at least 2.5.7])
+         fi
+         ;;
     *) AC_MSG_ERROR([unknown GMime version $with_gmime]) ;;
 esac
 
diff --git a/libbalsa/gmime-application-pkcs7.c b/libbalsa/gmime-application-pkcs7.c
index 12f4f8f..63b8087 100644
--- a/libbalsa/gmime-application-pkcs7.c
+++ b/libbalsa/gmime-application-pkcs7.c
@@ -96,8 +96,14 @@ g_mime_application_pkcs7_sign (GMimePart *pkcs7, GMimeObject *content,
     GMimeFilter *crlf_filter, *from_filter;
 	
     g_return_val_if_fail (GMIME_IS_PART (pkcs7), -1);
+#ifndef HAVE_GMIME_2_5_7
     g_return_val_if_fail (GMIME_IS_CIPHER_CONTEXT (ctx), -1);
     g_return_val_if_fail (ctx->sign_protocol != NULL, -1);
+#else /* HAVE_GMIME_2_5_7 */
+    g_return_val_if_fail (GMIME_IS_CRYPTO_CONTEXT (ctx), -1);
+    g_return_val_if_fail(g_mime_crypto_context_get_signature_protocol(ctx)
+                         != NULL, -1);
+#endif /* HAVE_GMIME_2_5_7 */
     g_return_val_if_fail (GMIME_IS_OBJECT (content), -1);
 	
     /* Prepare all the parts for signing... */
@@ -127,7 +133,14 @@ g_mime_application_pkcs7_sign (GMimePart *pkcs7, GMimeObject *content,
     sig_data_stream = g_mime_stream_mem_new ();
 	
     /* get the signed content */
-    if (g_mime_cipher_context_sign (ctx, userid, GMIME_CIPHER_HASH_DEFAULT, filtered_stream, sig_data_stream, err) == -1) {
+#ifndef HAVE_GMIME_2_5_7
+    if (g_mime_cipher_context_sign (ctx, userid, GMIME_CIPHER_HASH_DEFAULT, filtered_stream, sig_data_stream, err) == -1)
+#else /* HAVE_GMIME_2_5_7 */
+    if (g_mime_crypto_context_sign
+        (ctx, userid, GMIME_CIPHER_HASH_DEFAULT, filtered_stream,
+         sig_data_stream, err) == -1)
+#endif /* HAVE_GMIME_2_5_7 */
+    {
 	g_object_unref (filtered_stream);
 	g_object_unref (sig_data_stream);
 	g_object_unref (stream);
@@ -168,9 +181,15 @@ g_mime_application_pkcs7_sign (GMimePart *pkcs7, GMimeObject *content,
  * decrypting it again. In this case, validity is undefined.
  */
 GMimeObject *
+#ifndef HAVE_GMIME_2_5_7
 g_mime_application_pkcs7_verify(GMimePart * pkcs7,
 				GMimeSignatureValidity ** validity,
 				GMimeCipherContext * ctx, GError ** err)
+#else /* HAVE_GMIME_2_5_7 */
+g_mime_application_pkcs7_verify(GMimePart * pkcs7,
+                                GMimeSignatureList ** list,
+                                GMimeCryptoContext * ctx, GError ** err)
+#endif /* HAVE_GMIME_2_5_7 */
 {
     GMimeObject *decrypted;
     GMimeDataWrapper *wrapper;
@@ -181,8 +200,14 @@ g_mime_application_pkcs7_verify(GMimePart * pkcs7,
     const char *smime_type;
 
     g_return_val_if_fail(GMIME_IS_PART(pkcs7), NULL);
+#ifndef HAVE_GMIME_2_5_7
     g_return_val_if_fail(GMIME_IS_CIPHER_CONTEXT(ctx), NULL);
     g_return_val_if_fail(ctx->encrypt_protocol != NULL, NULL);
+#else /* HAVE_GMIME_2_5_7 */
+    g_return_val_if_fail(GMIME_IS_CRYPTO_CONTEXT(ctx), NULL);
+    g_return_val_if_fail(g_mime_crypto_context_get_encryption_protocol(ctx)
+                         != NULL, NULL);
+#endif /* HAVE_GMIME_2_5_7 */
 
     /* some sanity checks */
     smime_type =
@@ -208,9 +233,16 @@ g_mime_application_pkcs7_verify(GMimePart * pkcs7,
     g_object_unref(crlf_filter);
 
     /* get the cleartext */
+#ifndef HAVE_GMIME_2_5_7
     *validity = g_mime_cipher_context_verify(ctx, GMIME_CIPHER_HASH_DEFAULT,
 				     ciphertext, filtered_stream, err);
-    if (!*validity) {
+    if (!*validity)
+#else /* HAVE_GMIME_2_5_7 */
+    *list = g_mime_crypto_context_verify(ctx, GMIME_CIPHER_ALGO_DEFAULT,
+                                         ciphertext, filtered_stream, err);
+    if (!*list)
+#endif /* HAVE_GMIME_2_5_7 */
+    {
 	g_object_unref(filtered_stream);
 	g_object_unref(ciphertext);
 	g_object_unref(stream);
@@ -248,7 +280,12 @@ g_mime_application_pkcs7_verify(GMimePart * pkcs7,
  */
 int
 g_mime_application_pkcs7_encrypt (GMimePart *pkcs7, GMimeObject *content,
+#ifndef HAVE_GMIME_2_5_7
 				  GMimeCipherContext *ctx, GPtrArray *recipients,
+#else /* HAVE_GMIME_2_5_7 */
+				  GMimeCryptoContext *ctx,
+                                  GPtrArray *recipients,
+#endif /* HAVE_GMIME_2_5_7 */
 				  GError **err)
 {
     GMimeDataWrapper *wrapper;
@@ -257,8 +294,14 @@ g_mime_application_pkcs7_encrypt (GMimePart *pkcs7, GMimeObject *content,
     GMimeFilter *crlf_filter;
 	
     g_return_val_if_fail (GMIME_IS_PART (pkcs7), -1);
+#ifndef HAVE_GMIME_2_5_7
     g_return_val_if_fail (GMIME_IS_CIPHER_CONTEXT (ctx), -1);
     g_return_val_if_fail (ctx->encrypt_protocol != NULL, -1);
+#else /* HAVE_GMIME_2_5_7 */
+    g_return_val_if_fail (GMIME_IS_CRYPTO_CONTEXT (ctx), -1);
+    g_return_val_if_fail(g_mime_crypto_context_get_encryption_protocol(ctx)
+                         != NULL, -1);
+#endif /* HAVE_GMIME_2_5_7 */
     g_return_val_if_fail (GMIME_IS_OBJECT (content), -1);
 	
     /* get the cleartext */
@@ -279,7 +322,15 @@ g_mime_application_pkcs7_encrypt (GMimePart *pkcs7, GMimeObject *content,
 	
     /* encrypt the content stream */
     ciphertext = g_mime_stream_mem_new ();
-    if (g_mime_cipher_context_encrypt (ctx, FALSE, NULL, recipients, stream, ciphertext, err) == -1) {
+#ifndef HAVE_GMIME_2_5_7
+    if (g_mime_cipher_context_encrypt (ctx, FALSE, NULL, recipients, stream, ciphertext, err) == -1)
+#else /* HAVE_GMIME_2_5_7 */
+    if (g_mime_crypto_context_encrypt
+        (ctx, FALSE, NULL,
+         GMIME_CIPHER_ALGO_DEFAULT,
+         recipients, stream, ciphertext, err) == -1)
+#endif /* HAVE_GMIME_2_5_7 */
+    {
 	g_object_unref (ciphertext);
 	g_object_unref (stream);
 	return -1;
@@ -313,8 +364,14 @@ g_mime_application_pkcs7_encrypt (GMimePart *pkcs7, GMimeObject *content,
  * err with more information about the reason.
  */
 GMimeObject *
+#ifndef HAVE_GMIME_2_5_7
 g_mime_application_pkcs7_decrypt (GMimePart *pkcs7, GMimeCipherContext *ctx,
 				  GError **err)
+#else /* HAVE_GMIME_2_5_7 */
+g_mime_application_pkcs7_decrypt (GMimePart *pkcs7,
+                                  GMimeCryptoContext *ctx,
+				  GError **err)
+#endif /* HAVE_GMIME_2_5_7 */
 {
     GMimeObject *decrypted;
     GMimeDataWrapper *wrapper;
@@ -325,8 +382,14 @@ g_mime_application_pkcs7_decrypt (GMimePart *pkcs7, GMimeCipherContext *ctx,
     const char *smime_type;
 
     g_return_val_if_fail(GMIME_IS_PART(pkcs7), NULL);
+#ifndef HAVE_GMIME_2_5_7
     g_return_val_if_fail(GMIME_IS_CIPHER_CONTEXT(ctx), NULL);
     g_return_val_if_fail(ctx->encrypt_protocol != NULL, NULL);
+#else /* HAVE_GMIME_2_5_7 */
+    g_return_val_if_fail(GMIME_IS_CRYPTO_CONTEXT(ctx), NULL);
+    g_return_val_if_fail(g_mime_crypto_context_get_encryption_protocol(ctx)
+                         != NULL, NULL);
+#endif /* HAVE_GMIME_2_5_7 */
 
     /* some sanity checks */
     smime_type =
@@ -353,7 +416,13 @@ g_mime_application_pkcs7_decrypt (GMimePart *pkcs7, GMimeCipherContext *ctx,
     g_object_unref(crlf_filter);
 
     /* get the cleartext */
-    if (g_mime_cipher_context_decrypt(ctx, ciphertext, filtered_stream, err) == NULL) {
+#ifndef HAVE_GMIME_2_5_7
+    if (g_mime_cipher_context_decrypt(ctx, ciphertext, filtered_stream, err) == NULL)
+#else /* HAVE_GMIME_2_5_7 */
+    if (g_mime_crypto_context_decrypt
+        (ctx, ciphertext, filtered_stream, err) == NULL)
+#endif /* HAVE_GMIME_2_5_7 */
+    {
 	g_object_unref(filtered_stream);
 	g_object_unref(ciphertext);
 	g_object_unref(stream);
diff --git a/libbalsa/gmime-application-pkcs7.h b/libbalsa/gmime-application-pkcs7.h
index 03fa401..6678ff5 100644
--- a/libbalsa/gmime-application-pkcs7.h
+++ b/libbalsa/gmime-application-pkcs7.h
@@ -28,7 +28,11 @@ extern "C" {
 #endif				/* __cplusplus */
 
 #include <gmime/gmime-part.h>
+#ifndef HAVE_GMIME_2_5_7
 #include <gmime/gmime-cipher-context.h>
+#else /* HAVE_GMIME_2_5_7 */
+#include <gmime/gmime-crypto-context.h>
+#endif /* HAVE_GMIME_2_5_7 */
 
 #undef HAS_APPLICATION_PKCS7_MIME_SIGNED_SUPPORT
 
@@ -39,21 +43,40 @@ extern "C" {
  * Balsa always encodes S/MIME signed stuff as multipart/signed. */
 int g_mime_application_pkcs7_sign(GMimePart * pkcs7,
 				  GMimeObject * content,
+#ifndef HAVE_GMIME_2_5_7
 				  GMimeCipherContext * ctx,
+#else /* HAVE_GMIME_2_5_7 */
+				  GMimeCryptoContext * ctx,
+#endif /* HAVE_GMIME_2_5_7 */
 				  const char *userid, GError ** err);
 #endif
 
+#ifndef HAVE_GMIME_2_5_7
 GMimeObject *g_mime_application_pkcs7_verify(GMimePart * pkcs7,
 					     GMimeSignatureValidity ** validity,
 					     GMimeCipherContext * ctx, GError ** err);
+#else /* HAVE_GMIME_2_5_7 */
+GMimeObject *g_mime_application_pkcs7_verify(GMimePart * pkcs7,
+					     GMimeSignatureList ** validity,
+					     GMimeCryptoContext * ctx, GError ** err);
+#endif /* HAVE_GMIME_2_5_7 */
 
 int g_mime_application_pkcs7_encrypt(GMimePart * pkcs7,
 				     GMimeObject * content,
+#ifndef HAVE_GMIME_2_5_7
 				     GMimeCipherContext * ctx,
+#else /* HAVE_GMIME_2_5_7 */
+				     GMimeCryptoContext * ctx,
+#endif /* HAVE_GMIME_2_5_7 */
 				     GPtrArray * recipients, GError ** err);
 
+#ifndef HAVE_GMIME_2_5_7
 GMimeObject *g_mime_application_pkcs7_decrypt(GMimePart * pkcs7,
 					      GMimeCipherContext * ctx, GError ** err);
+#else /* HAVE_GMIME_2_5_7 */
+GMimeObject *g_mime_application_pkcs7_decrypt(GMimePart * pkcs7,
+					      GMimeCryptoContext * ctx, GError ** err);
+#endif /* HAVE_GMIME_2_5_7 */
 
 #ifdef __cplusplus
 }
diff --git a/libbalsa/gmime-gpgme-context.c b/libbalsa/gmime-gpgme-context.c
index 24b140b..0c56f94 100644
--- a/libbalsa/gmime-gpgme-context.c
+++ b/libbalsa/gmime-gpgme-context.c
@@ -27,6 +27,9 @@
 #include <unistd.h>
 #include <glib.h>
 #include <gmime/gmime.h>
+#ifdef HAVE_GMIME_2_5_7
+#include <gmime/gmime-certificate.h>
+#endif /* HAVE_GMIME_2_5_7 */
 #include <gpgme.h>
 #include <time.h>
 #include <glib/gi18n.h>
@@ -44,6 +47,7 @@ static gboolean g_mime_gpgme_context_check_protocol(GMimeGpgmeContextClass
 						    protocol,
 						    GError ** error);
 
+#ifndef HAVE_GMIME_2_5_7
 static GMimeCipherHash g_mime_gpgme_hash_id(GMimeCipherContext * ctx,
 					    const char *hash);
 
@@ -70,6 +74,46 @@ static GMimeSignatureValidity *g_mime_gpgme_decrypt(GMimeCipherContext *
                                                     GMimeStream * istream,
                                                     GMimeStream * ostream,
                                                     GError ** err);
+#else /* HAVE_GMIME_2_5_7 */
+static GMimeDigestAlgo g_mime_gpgme_digest_id(GMimeCryptoContext * ctx,
+                                              const char *hash);
+
+static const char *g_mime_gpgme_digest_name(GMimeCryptoContext * ctx,
+                                            GMimeDigestAlgo hash);
+
+static const char
+    *g_mime_gpgme_get_signature_protocol(GMimeCryptoContext * context);
+static const char
+    *g_mime_gpgme_get_encryption_protocol(GMimeCryptoContext * context);
+static const char
+    *g_mime_gpgme_get_key_exchange_protocol(GMimeCryptoContext * context);
+
+static int g_mime_gpgme_sign(GMimeCryptoContext * ctx,
+                             const char * userid,
+			     GMimeDigestAlgo hash,
+                             GMimeStream * istream,
+			     GMimeStream * ostream,
+                             GError ** err);
+
+static GMimeSignatureList *g_mime_gpgme_verify(GMimeCryptoContext * ctx,
+                                               GMimeDigestAlgo hash,
+                                               GMimeStream * istream,
+                                               GMimeStream * sigstream,
+                                               GError ** err);
+
+static int g_mime_gpgme_encrypt(GMimeCryptoContext * ctx,
+                                gboolean sign,
+				const char *userid,
+                                GMimeDigestAlgo digest,
+                                GPtrArray * recipients,
+				GMimeStream * istream,
+				GMimeStream * ostream, GError ** err);
+
+static GMimeDecryptResult *g_mime_gpgme_decrypt(GMimeCryptoContext * ctx,
+                                                GMimeStream * istream,
+                                                GMimeStream * ostream,
+                                                GError ** err);
+#endif /* HAVE_GMIME_2_5_7 */
 
 
 /* internal passphrase callback */
@@ -102,7 +146,11 @@ static void g_set_error_from_gpgme(GError ** error, gpgme_error_t gpgme_err,
 				   const gchar * message);
 
 
+#ifndef HAVE_GMIME_2_5_7
 static GMimeCipherContextClass *parent_class = NULL;
+#else /* HAVE_GMIME_2_5_7 */
+static GMimeCryptoContextClass *parent_class = NULL;
+#endif /* HAVE_GMIME_2_5_7 */
 
 
 GType
@@ -124,8 +172,13 @@ g_mime_gpgme_context_get_type(void)
 	};
 
 	type =
+#ifndef HAVE_GMIME_2_5_7
 	    g_type_register_static(GMIME_TYPE_CIPHER_CONTEXT,
 				   "GMimeGpgmeContext", &info, 0);
+#else /* HAVE_GMIME_2_5_7 */
+	    g_type_register_static(GMIME_TYPE_CRYPTO_CONTEXT,
+				   "GMimeGpgmeContext", &info, 0);
+#endif /* HAVE_GMIME_2_5_7 */
     }
 
     return type;
@@ -136,19 +189,39 @@ static void
 g_mime_gpgme_context_class_init(GMimeGpgmeContextClass * klass)
 {
     GObjectClass *object_class = G_OBJECT_CLASS(klass);
+#ifndef HAVE_GMIME_2_5_7
     GMimeCipherContextClass *cipher_class =
 	GMIME_CIPHER_CONTEXT_CLASS(klass);
+#else /* HAVE_GMIME_2_5_7 */
+    GMimeCryptoContextClass *crypto_class =
+	GMIME_CRYPTO_CONTEXT_CLASS(klass);
+#endif /* HAVE_GMIME_2_5_7 */
 
     parent_class = g_type_class_ref(G_TYPE_OBJECT);
 
     object_class->finalize = g_mime_gpgme_context_finalize;
 
+#ifndef HAVE_GMIME_2_5_7
     cipher_class->hash_id = g_mime_gpgme_hash_id;
     cipher_class->hash_name = g_mime_gpgme_hash_name;
     cipher_class->sign = g_mime_gpgme_sign;
     cipher_class->verify = g_mime_gpgme_verify;
     cipher_class->encrypt = g_mime_gpgme_encrypt;
     cipher_class->decrypt = g_mime_gpgme_decrypt;
+#else /* HAVE_GMIME_2_5_7 */
+    crypto_class->digest_id = g_mime_gpgme_digest_id;
+    crypto_class->digest_name = g_mime_gpgme_digest_name;
+    crypto_class->get_signature_protocol =
+        g_mime_gpgme_get_signature_protocol;
+    crypto_class->get_encryption_protocol =
+        g_mime_gpgme_get_encryption_protocol;
+    crypto_class->get_key_exchange_protocol =
+        g_mime_gpgme_get_key_exchange_protocol;
+    crypto_class->sign = g_mime_gpgme_sign;
+    crypto_class->verify = g_mime_gpgme_verify;
+    crypto_class->encrypt = g_mime_gpgme_encrypt;
+    crypto_class->decrypt = g_mime_gpgme_decrypt;
+#endif /* HAVE_GMIME_2_5_7 */
 
     if (gpgme_engine_check_version(GPGME_PROTOCOL_OpenPGP) ==
 	GPG_ERR_NO_ERROR)
@@ -190,7 +263,11 @@ g_mime_gpgme_context_finalize(GObject * object)
     }
 
 #if !defined(HAVE_GMIME_2_6)
+#ifndef HAVE_GMIME_2_5_7
     g_object_unref(GMIME_CIPHER_CONTEXT(ctx)->session);
+#else /* HAVE_GMIME_2_5_7 */
+    g_object_unref(GMIME_CRYPTO_CONTEXT(ctx)->session);
+#endif /* HAVE_GMIME_2_5_7 */
 #endif                          /* HAVE_GMIME_2_6 */
 
     G_OBJECT_CLASS(parent_class)->finalize(object);
@@ -200,15 +277,26 @@ g_mime_gpgme_context_finalize(GObject * object)
 /*
  * Convert a hash algorithm name to a number
  */
+#ifndef HAVE_GMIME_2_5_7
 static GMimeCipherHash
 g_mime_gpgme_hash_id(GMimeCipherContext * ctx, const char *hash)
+#else /* HAVE_GMIME_2_5_7 */
+static GMimeDigestAlgo
+g_mime_gpgme_digest_id(GMimeCryptoContext * ctx, const char *hash)
+#endif /* HAVE_GMIME_2_5_7 */
 {
+#ifndef HAVE_GMIME_2_5_7
     if (hash == NULL)
 	return GMIME_CIPHER_HASH_DEFAULT;
+#else /* HAVE_GMIME_2_5_7 */
+    if (hash == NULL)
+	return GMIME_DIGEST_ALGO_DEFAULT;
+#endif /* HAVE_GMIME_2_5_7 */
 
     if (!g_ascii_strcasecmp(hash, "pgp-"))
 	hash += 4;
 
+#ifndef HAVE_GMIME_2_5_7
     if (!g_ascii_strcasecmp(hash, "md2"))
 	return GMIME_CIPHER_HASH_MD2;
     else if (!g_ascii_strcasecmp(hash, "md5"))
@@ -223,6 +311,22 @@ g_mime_gpgme_hash_id(GMimeCipherContext * ctx, const char *hash)
 	return GMIME_CIPHER_HASH_HAVAL5160;
 
     return GMIME_CIPHER_HASH_DEFAULT;
+#else /* HAVE_GMIME_2_5_7 */
+    if (!g_ascii_strcasecmp(hash, "md2"))
+	return GMIME_DIGEST_ALGO_MD2;
+    else if (!g_ascii_strcasecmp(hash, "md5"))
+	return GMIME_DIGEST_ALGO_MD5;
+    else if (!g_ascii_strcasecmp(hash, "sha1"))
+	return GMIME_DIGEST_ALGO_SHA1;
+    else if (!g_ascii_strcasecmp(hash, "ripemd160"))
+	return GMIME_DIGEST_ALGO_RIPEMD160;
+    else if (!g_ascii_strcasecmp(hash, "tiger192"))
+	return GMIME_DIGEST_ALGO_TIGER192;
+    else if (!g_ascii_strcasecmp(hash, "haval-5-160"))
+	return GMIME_DIGEST_ALGO_HAVAL5160;
+
+    return GMIME_DIGEST_ALGO_DEFAULT;
+#endif /* HAVE_GMIME_2_5_7 */
 }
 
 
@@ -230,7 +334,11 @@ g_mime_gpgme_hash_id(GMimeCipherContext * ctx, const char *hash)
  * Convert a hash algorithm number to a string
  */
 static const char *
+#ifndef HAVE_GMIME_2_5_7
 g_mime_gpgme_hash_name(GMimeCipherContext * context, GMimeCipherHash hash)
+#else /* HAVE_GMIME_2_5_7 */
+g_mime_gpgme_digest_name(GMimeCryptoContext * context, GMimeDigestAlgo hash)
+#endif /* HAVE_GMIME_2_5_7 */
 {
     GMimeGpgmeContext *ctx = GMIME_GPGME_CONTEXT(context);
     char *p;
@@ -239,6 +347,7 @@ g_mime_gpgme_hash_name(GMimeCipherContext * context, GMimeCipherHash hash)
     g_return_val_if_fail(ctx->gpgme_ctx, NULL);
 
     /* note: this is only a subset of the hash algorithms gpg(me) supports */
+#ifndef HAVE_GMIME_2_5_7
     switch (hash) {
     case GMIME_CIPHER_HASH_MD2:
 	p = "pgp-md2";
@@ -258,6 +367,27 @@ g_mime_gpgme_hash_name(GMimeCipherContext * context, GMimeCipherHash hash)
     case GMIME_CIPHER_HASH_HAVAL5160:
 	p = "pgp-haval-5-160";
 	break;
+#else /* HAVE_GMIME_2_5_7 */
+    switch (hash) {
+    case GMIME_DIGEST_ALGO_MD2:
+	p = "pgp-md2";
+	break;
+    case GMIME_DIGEST_ALGO_MD5:
+	p = "pgp-md5";
+	break;
+    case GMIME_DIGEST_ALGO_SHA1:
+	p = "pgp-sha1";
+	break;
+    case GMIME_DIGEST_ALGO_RIPEMD160:
+	p = "pgp-ripemd160";
+	break;
+    case GMIME_DIGEST_ALGO_TIGER192:
+	p = "pgp-tiger192";
+	break;
+    case GMIME_DIGEST_ALGO_HAVAL5160:
+	p = "pgp-haval-5-160";
+	break;
+#endif /* HAVE_GMIME_2_5_7 */
     default:
 	if (!(p = ctx->micalg))
 	    return p;
@@ -270,6 +400,29 @@ g_mime_gpgme_hash_name(GMimeCipherContext * context, GMimeCipherHash hash)
     return p;
 }
 
+#ifdef HAVE_GMIME_2_5_7
+static const char *
+g_mime_gpgme_get_signature_protocol(GMimeCryptoContext * context)
+{
+    GMimeGpgmeContext *ctx = GMIME_GPGME_CONTEXT(context);
+    return ctx->sign_protocol;
+}
+
+static const char *
+g_mime_gpgme_get_encryption_protocol(GMimeCryptoContext * context)
+{
+    GMimeGpgmeContext *ctx = GMIME_GPGME_CONTEXT(context);
+    return ctx->encrypt_protocol;
+}
+
+static const char *
+g_mime_gpgme_get_key_exchange_protocol(GMimeCryptoContext * context)
+{
+    GMimeGpgmeContext *ctx = GMIME_GPGME_CONTEXT(context);
+    return ctx->key_protocol;
+}
+
+#endif /* HAVE_GMIME_2_5_7 */
 
 /*
  * Wrapper to convert the passphrase returned from the gmime session to gpgme.
@@ -279,7 +432,11 @@ g_mime_session_passphrase(void *HOOK, const char *UID_HINT,
 			  const char *PASSPHRASE_INFO, int PREV_WAS_BAD,
 			  int FD)
 {
+#ifndef HAVE_GMIME_2_5_7
     GMimeCipherContext *ctx = GMIME_CIPHER_CONTEXT(HOOK);
+#else /* HAVE_GMIME_2_5_7 */
+    GMimeCryptoContext *ctx = GMIME_CRYPTO_CONTEXT(HOOK);
+#endif /* HAVE_GMIME_2_5_7 */
 #if defined(HAVE_GMIME_2_6)
     GMimeStream *stream;
     gboolean rc;
@@ -366,9 +523,15 @@ cb_data_release(void *handle)
  * arg, but set the value in the context.
  */
 static int
+#ifndef HAVE_GMIME_2_5_7
 g_mime_gpgme_sign(GMimeCipherContext * context, const char *userid,
 		  GMimeCipherHash hash, GMimeStream * istream,
 		  GMimeStream * ostream, GError ** error)
+#else /* HAVE_GMIME_2_5_7 */
+g_mime_gpgme_sign(GMimeCryptoContext * context, const char *userid,
+		  GMimeDigestAlgo hash, GMimeStream * istream,
+		  GMimeStream * ostream, GError ** error)
+#endif /* HAVE_GMIME_2_5_7 */
 {
     GMimeGpgmeContext *ctx = (GMimeGpgmeContext *) context;
     gpgme_sig_mode_t sig_mode;
@@ -460,6 +623,7 @@ g_mime_gpgme_sign(GMimeCipherContext * context, const char *userid,
 }
 
 
+#ifndef HAVE_GMIME_2_5_7
 /*
  * In standard mode, verify that sigstream contains a detached signature for
  * istream. In single-part mode (RFC 2440, RFC 2633 application/pkcs7-mime),
@@ -471,13 +635,33 @@ static GMimeSignatureValidity *
 g_mime_gpgme_verify(GMimeCipherContext * context, GMimeCipherHash hash,
 		    GMimeStream * istream, GMimeStream * sigstream,
 		    GError ** error)
+#else /* HAVE_GMIME_2_5_7 */
+/*
+ * In standard mode, verify that sigstream contains a detached signature for
+ * istream. In single-part mode (RFC 2440, RFC 2633 application/pkcs7-mime),
+ * istream contains clearsigned data, and sigstream will be filled with the
+ * verified plaintext. The routine returns a GMimeSignatureList object.
+ * More information is saved in the context's signature object.
+ * On error error is set accordingly.
+ */
+static GMimeSignatureList *
+g_mime_gpgme_verify(GMimeCryptoContext * context, GMimeDigestAlgo hash,
+		    GMimeStream * istream, GMimeStream * sigstream,
+		    GError ** error)
+#endif /* HAVE_GMIME_2_5_7 */
 {
     GMimeGpgmeContext *ctx = (GMimeGpgmeContext *) context;
     gpgme_ctx_t gpgme_ctx;
     gpgme_protocol_t protocol;
     gpgme_error_t err;
     gpgme_data_t msg, sig;
+#ifndef HAVE_GMIME_2_5_7
     GMimeSignatureValidity *validity;
+#else /* HAVE_GMIME_2_5_7 */
+    GMimeSignatureList *list;
+    GMimeSignature *signature;
+
+#endif /* HAVE_GMIME_2_5_7 */
     struct gpgme_data_cbs cbs = {
 	(gpgme_data_read_cb_t) g_mime_gpgme_stream_rd,	/* read method */
 	(gpgme_data_write_cb_t) g_mime_gpgme_stream_wr,	/* write method */
@@ -521,6 +705,7 @@ g_mime_gpgme_verify(GMimeCipherContext * context, GMimeCipherHash hash,
 	ctx->sig_state =
 	    g_mime_gpgme_sigstat_new_from_gpgme_ctx(gpgme_ctx);
 
+#ifndef HAVE_GMIME_2_5_7
     validity = g_mime_signature_validity_new();
     if (ctx->sig_state) {
 	switch (ctx->sig_state->status)
@@ -536,12 +721,44 @@ g_mime_gpgme_verify(GMimeCipherContext * context, GMimeCipherHash hash,
 	    }
     } else
 	g_mime_signature_validity_set_status(validity, GMIME_SIGNATURE_STATUS_UNKNOWN);
+#else /* HAVE_GMIME_2_5_7 */
+    list = g_mime_signature_list_new();
+    signature = g_mime_signature_new();
+    g_mime_signature_list_add(list, signature);
+
+    if (ctx->sig_state) {
+	switch (ctx->sig_state->status)
+	    {
+	    case GPG_ERR_NO_ERROR:
+		g_mime_signature_set_status(signature,
+                                            GMIME_SIGNATURE_STATUS_GOOD);
+		break;
+	    case GPG_ERR_NOT_SIGNED:
+		g_mime_signature_set_status(signature,
+                                            GMIME_SIGNATURE_STATUS_ERROR);
+		g_mime_signature_set_errors(signature,
+                                            GMIME_SIGNATURE_ERROR_NONE);
+		break;
+	    default:
+		g_mime_signature_set_status(signature,
+                                            GMIME_SIGNATURE_STATUS_BAD);
+	    }
+    } else {
+	g_mime_signature_set_status(signature,
+                                    GMIME_SIGNATURE_STATUS_ERROR);
+        g_mime_signature_set_errors(signature, GMIME_SIGNATURE_ERROR_NONE);
+    }
+#endif /* HAVE_GMIME_2_5_7 */
 
     /* release gmgme data buffers */
     gpgme_data_release(msg);
     gpgme_data_release(sig);
 
+#ifndef HAVE_GMIME_2_5_7
     return validity;
+#else /* HAVE_GMIME_2_5_7 */
+    return list;
+#endif /* HAVE_GMIME_2_5_7 */
 }
 
 
@@ -549,10 +766,19 @@ g_mime_gpgme_verify(GMimeCipherContext * context, GMimeCipherHash hash,
  * Encrypt istream to ostream for recipients. If sign is set, sign by userid.
  */
 static int
+#ifndef HAVE_GMIME_2_5_7
 g_mime_gpgme_encrypt(GMimeCipherContext * context, gboolean sign,
 		     const char *userid, GPtrArray * recipients,
 		     GMimeStream * istream, GMimeStream * ostream,
 		     GError ** error)
+#else /* HAVE_GMIME_2_5_7 */
+g_mime_gpgme_encrypt(GMimeCryptoContext * context, gboolean sign,
+		     const char *userid,
+                     GMimeDigestAlgo digest,
+                     GPtrArray * recipients,
+		     GMimeStream * istream, GMimeStream * ostream,
+		     GError ** error)
+#endif /* HAVE_GMIME_2_5_7 */
 {
     GMimeGpgmeContext *ctx = (GMimeGpgmeContext *) context;
     gpgme_ctx_t gpgme_ctx;
@@ -653,9 +879,15 @@ g_mime_gpgme_encrypt(GMimeCipherContext * context, gboolean sign,
  * Decrypt istream to ostream. In RFC 2440 mode, also try to check an included
  * signature (if any).
  */
+#ifndef HAVE_GMIME_2_5_7
 static GMimeSignatureValidity *
 g_mime_gpgme_decrypt(GMimeCipherContext * context, GMimeStream * istream,
 		     GMimeStream * ostream, GError ** error)
+#else /* HAVE_GMIME_2_5_7 */
+static GMimeDecryptResult *
+g_mime_gpgme_decrypt(GMimeCryptoContext * context, GMimeStream * istream,
+		     GMimeStream * ostream, GError ** error)
+#endif /* HAVE_GMIME_2_5_7 */
 {
     GMimeGpgmeContext *ctx = (GMimeGpgmeContext *) context;
     gpgme_ctx_t gpgme_ctx;
@@ -668,7 +900,13 @@ g_mime_gpgme_decrypt(GMimeCipherContext * context, GMimeStream * istream,
 	NULL,			/* seek method */
 	cb_data_release		/* release method */
     };
+#ifndef HAVE_GMIME_2_5_7
     GMimeSignatureValidity *validity;
+#else /* HAVE_GMIME_2_5_7 */
+    GMimeDecryptResult *result;
+    GMimeSignatureList *list;
+    GMimeSignature *signature;
+#endif /* HAVE_GMIME_2_5_7 */
 
     /* some paranoia checks */
     g_return_val_if_fail(ctx, NULL);
@@ -716,6 +954,7 @@ g_mime_gpgme_decrypt(GMimeCipherContext * context, GMimeStream * istream,
     /* try to get information about the signature (if any) */
     ctx->sig_state = g_mime_gpgme_sigstat_new_from_gpgme_ctx(gpgme_ctx);
 
+#ifndef HAVE_GMIME_2_5_7
     validity = g_mime_signature_validity_new();
     if (ctx->sig_state) {
 	switch (ctx->sig_state->status)
@@ -733,14 +972,57 @@ g_mime_gpgme_decrypt(GMimeCipherContext * context, GMimeStream * istream,
 	g_mime_signature_validity_set_status(validity, GMIME_SIGNATURE_STATUS_UNKNOWN);
 
     return validity;
+#else /* HAVE_GMIME_2_5_7 */
+    list = g_mime_signature_list_new();
+    signature = g_mime_signature_new();
+    g_mime_signature_list_add(list, signature);
+    result = g_mime_decrypt_result_new();
+    g_mime_decrypt_result_set_signatures(result, list);
+
+    if (ctx->sig_state) {
+	switch (ctx->sig_state->status)
+	    {
+	    case GPG_ERR_NO_ERROR:
+		g_mime_signature_set_status(signature,
+                                            GMIME_SIGNATURE_STATUS_GOOD);
+		break;
+	    case GPG_ERR_NOT_SIGNED:
+		g_mime_signature_set_status(signature,
+                                            GMIME_SIGNATURE_STATUS_ERROR);
+		g_mime_signature_set_errors(signature,
+                                            GMIME_SIGNATURE_ERROR_NONE);
+		break;
+	    default:
+		g_mime_signature_set_status(signature,
+                                            GMIME_SIGNATURE_STATUS_BAD);
+	    }
+    } else {
+	g_mime_signature_set_status(signature,
+                                    GMIME_SIGNATURE_STATUS_ERROR);
+        g_mime_signature_set_errors(signature, GMIME_SIGNATURE_ERROR_NONE);
+    }
+
+    return result;
+#endif /* HAVE_GMIME_2_5_7 */
 }
 
 
+#ifndef HAVE_GMIME_2_5_7
 /*
  * Create a new gpgme cipher context with protocol. If anything fails, return
  * NULL and set error.
  */
+#else /* HAVE_GMIME_2_5_7 */
+/*
+ * Create a new gpgme crypto context with protocol. If anything fails, return
+ * NULL and set error.
+ */
+#endif /* HAVE_GMIME_2_5_7 */
+#ifndef HAVE_GMIME_2_5_7
 GMimeCipherContext *
+#else /* HAVE_GMIME_2_5_7 */
+GMimeCryptoContext *
+#endif /* HAVE_GMIME_2_5_7 */
 #if defined(HAVE_GMIME_2_6)
 g_mime_gpgme_context_new(GMimePasswordRequestFunc request_passwd,
                          gpgme_protocol_t protocol, GError ** error)
@@ -749,7 +1031,11 @@ g_mime_gpgme_context_new(GMimeSession * session,
 			 gpgme_protocol_t protocol, GError ** error)
 #endif                          /* HAVE_GMIME_2_6 */
 {
+#ifndef HAVE_GMIME_2_5_7
     GMimeCipherContext *cipher;
+#else /* HAVE_GMIME_2_5_7 */
+    GMimeCryptoContext *crypto;
+#endif /* HAVE_GMIME_2_5_7 */
     GMimeGpgmeContext *ctx;
     gpgme_error_t err;
     gpgme_ctx_t gpgme_ctx;
@@ -766,14 +1052,22 @@ g_mime_gpgme_context_new(GMimeSession * session,
 	return NULL;
     }
 
+#ifndef HAVE_GMIME_2_5_7
     /* create the cipher context */
+#else /* HAVE_GMIME_2_5_7 */
+    /* create the crypto context */
+#endif /* HAVE_GMIME_2_5_7 */
     ctx = g_object_new(GMIME_TYPE_GPGME_CONTEXT, NULL, NULL);
     if (!ctx) {
 	gpgme_release(gpgme_ctx);
 	return NULL;
     } else
 	ctx->gpgme_ctx = gpgme_ctx;
+#ifndef HAVE_GMIME_2_5_7
     cipher = (GMimeCipherContext *) ctx;
+#else /* HAVE_GMIME_2_5_7 */
+    crypto = (GMimeCryptoContext *) ctx;
+#endif /* HAVE_GMIME_2_5_7 */
 
     /* check if the requested protocol is available */
     if (!g_mime_gpgme_context_check_protocol
@@ -785,23 +1079,47 @@ g_mime_gpgme_context_new(GMimeSession * session,
 
     /* setup according to requested protocol */
 #if defined(HAVE_GMIME_2_6)
+#ifndef HAVE_GMIME_2_5_7
     cipher->request_passwd = request_passwd;
+#else /* HAVE_GMIME_2_5_7 */
+    crypto->request_passwd = request_passwd;
+#endif /* HAVE_GMIME_2_5_7 */
 #else                           /* HAVE_GMIME_2_6 */
+#ifndef HAVE_GMIME_2_5_7
     cipher->session = session;
+#else /* HAVE_GMIME_2_5_7 */
+    crypto->session = session;
+#endif /* HAVE_GMIME_2_5_7 */
     g_object_ref(session);
 #endif                          /* HAVE_GMIME_2_6 */
     gpgme_set_protocol(gpgme_ctx, protocol);
     if (protocol == GPGME_PROTOCOL_OpenPGP) {
+#ifndef HAVE_GMIME_2_5_7
 	cipher->sign_protocol = "application/pgp-signature";
 	cipher->encrypt_protocol = "application/pgp-encrypted";
 	cipher->key_protocol = NULL;	/* FIXME */
+#else /* HAVE_GMIME_2_5_7 */
+	ctx->sign_protocol = "application/pgp-signature";
+	ctx->encrypt_protocol = "application/pgp-encrypted";
+	ctx->key_protocol = NULL;	/* FIXME */
+#endif /* HAVE_GMIME_2_5_7 */
     } else {
+#ifndef HAVE_GMIME_2_5_7
 	cipher->sign_protocol = "application/pkcs7-signature";
 	cipher->encrypt_protocol = "application/pkcs7-mime";
 	cipher->key_protocol = NULL;	/* FIXME */
+#else /* HAVE_GMIME_2_5_7 */
+	ctx->sign_protocol = "application/pkcs7-signature";
+	ctx->encrypt_protocol = "application/pkcs7-mime";
+	ctx->key_protocol = NULL;	/* FIXME */
+#endif /* HAVE_GMIME_2_5_7 */
     }
 
+#ifndef HAVE_GMIME_2_5_7
     return cipher;
+#else /* HAVE_GMIME_2_5_7 */
+    return crypto;
+#endif /* HAVE_GMIME_2_5_7 */
 }
 
 
diff --git a/libbalsa/gmime-gpgme-context.h b/libbalsa/gmime-gpgme-context.h
index 585d927..19c5fae 100644
--- a/libbalsa/gmime-gpgme-context.h
+++ b/libbalsa/gmime-gpgme-context.h
@@ -63,7 +63,11 @@ typedef gboolean(*GMimeGpgmeKeyTrustCB) (const gchar * name,
 					 GMimeGpgmeContext * ctx);
 
 struct _GMimeGpgmeContext {
+#ifndef HAVE_GMIME_2_5_7
     GMimeCipherContext parent_object;
+#else /* HAVE_GMIME_2_5_7 */
+    GMimeCryptoContext parent_object;
+#endif /* HAVE_GMIME_2_5_7 */
 
     gpgme_ctx_t gpgme_ctx;	/* gpgme context */
     gboolean singlepart_mode;	/* set context to single-part mode (RFC 2440, 2633) */
@@ -73,11 +77,21 @@ struct _GMimeGpgmeContext {
     GMimeGpgmeKeySelectCB key_select_cb;	/* key selection callback */
     GMimeGpgmeKeyTrustCB key_trust_cb;          /* low trust key cb */
     gpgme_passphrase_cb_t passphrase_cb;	/* passphrase callback */
+#ifdef HAVE_GMIME_2_5_7
+
+    const gchar *sign_protocol;
+    const gchar *encrypt_protocol;
+    const gchar *key_protocol;
+#endif /* HAVE_GMIME_2_5_7 */
 };
 
 
 struct _GMimeGpgmeContextClass {
+#ifndef HAVE_GMIME_2_5_7
     GMimeCipherContextClass parent_class;
+#else /* HAVE_GMIME_2_5_7 */
+    GMimeCryptoContextClass parent_class;
+#endif /* HAVE_GMIME_2_5_7 */
 
     gboolean has_proto_openpgp;
     gboolean has_proto_cms;
@@ -86,10 +100,17 @@ struct _GMimeGpgmeContextClass {
 
 GType g_mime_gpgme_context_get_type(void);
 #if defined(HAVE_GMIME_2_6)
+#ifndef HAVE_GMIME_2_5_7
 GMimeCipherContext *g_mime_gpgme_context_new(GMimePasswordRequestFunc
                                              request_passwd,
 					     gpgme_protocol_t protocol,
 					     GError ** error);
+#else /* HAVE_GMIME_2_5_7 */
+GMimeCryptoContext *g_mime_gpgme_context_new(GMimePasswordRequestFunc
+                                             request_passwd,
+					     gpgme_protocol_t protocol,
+					     GError ** error);
+#endif /* HAVE_GMIME_2_5_7 */
 #else                           /* HAVE_GMIME_2_6 */
 GMimeCipherContext *g_mime_gpgme_context_new(GMimeSession * session,
 					     gpgme_protocol_t protocol,
diff --git a/libbalsa/gmime-part-rfc2440.c b/libbalsa/gmime-part-rfc2440.c
index 795d2e1..e79c4cb 100644
--- a/libbalsa/gmime-part-rfc2440.c
+++ b/libbalsa/gmime-part-rfc2440.c
@@ -112,8 +112,13 @@ g_mime_part_rfc2440_sign_encrypt(GMimePart * part,
 
     g_return_val_if_fail(GMIME_IS_PART(part), -1);
     g_return_val_if_fail(GMIME_IS_GPGME_CONTEXT(ctx), -1);
+#ifndef HAVE_GMIME_2_5_7
     g_return_val_if_fail(GMIME_CIPHER_CONTEXT(ctx)->sign_protocol != NULL,
 			 -1);
+#else /* HAVE_GMIME_2_5_7 */
+    g_return_val_if_fail(g_mime_crypto_context_get_signature_protocol
+                         (GMIME_CRYPTO_CONTEXT(ctx)) != NULL, -1);
+#endif /* HAVE_GMIME_2_5_7 */
     g_return_val_if_fail(recipients != NULL || sign_userid != NULL, -1);
 
     /* get the raw content */
@@ -131,14 +136,27 @@ g_mime_part_rfc2440_sign_encrypt(GMimePart * part,
     ctx->singlepart_mode = TRUE;
     if (recipients == NULL)
 	result =
+#ifndef HAVE_GMIME_2_5_7
 	    g_mime_cipher_context_sign(GMIME_CIPHER_CONTEXT(ctx), sign_userid,
 			       GMIME_CIPHER_HASH_DEFAULT, stream,
 			       cipherstream, err);
+#else /* HAVE_GMIME_2_5_7 */
+	    g_mime_crypto_context_sign(GMIME_CRYPTO_CONTEXT(ctx), sign_userid,
+			       GMIME_CIPHER_ALGO_DEFAULT, stream,
+			       cipherstream, err);
+#endif /* HAVE_GMIME_2_5_7 */
     else
 	result =
+#ifndef HAVE_GMIME_2_5_7
 	    g_mime_cipher_context_encrypt(GMIME_CIPHER_CONTEXT(ctx),
 				  sign_userid != NULL, sign_userid,
 				  recipients, stream, cipherstream, err);
+#else /* HAVE_GMIME_2_5_7 */
+	    g_mime_crypto_context_encrypt(GMIME_CRYPTO_CONTEXT(ctx),
+				  sign_userid != NULL, sign_userid,
+                                  GMIME_CIPHER_ALGO_DEFAULT,
+				  recipients, stream, cipherstream, err);
+#endif /* HAVE_GMIME_2_5_7 */
     if (result == -1) {
 	g_object_unref(cipherstream);
 	return -1;
@@ -202,18 +220,31 @@ g_mime_part_rfc2440_sign_encrypt(GMimePart * part,
  * set on err to provide more information. Upon success, the content
  * of part is replaced by the verified output of the crypto engine.
  */
+#ifndef HAVE_GMIME_2_5_7
 GMimeSignatureValidity *
+#else /* HAVE_GMIME_2_5_7 */
+GMimeSignatureList *
+#endif /* HAVE_GMIME_2_5_7 */
 g_mime_part_rfc2440_verify(GMimePart * part,
 			   GMimeGpgmeContext * ctx, GError ** err)
 {
     GMimeStream *stream, *plainstream;
     GMimeDataWrapper * wrapper;
+#ifndef HAVE_GMIME_2_5_7
     GMimeSignatureValidity *valid;
+#else /* HAVE_GMIME_2_5_7 */
+    GMimeSignatureList *list;
+#endif /* HAVE_GMIME_2_5_7 */
 
     g_return_val_if_fail(GMIME_IS_PART(part), NULL);
     g_return_val_if_fail(GMIME_IS_GPGME_CONTEXT(ctx), NULL);
+#ifndef HAVE_GMIME_2_5_7
     g_return_val_if_fail(GMIME_CIPHER_CONTEXT(ctx)->sign_protocol != NULL,
 			 NULL);
+#else /* HAVE_GMIME_2_5_7 */
+    g_return_val_if_fail(g_mime_crypto_context_get_signature_protocol
+                         (GMIME_CRYPTO_CONTEXT(ctx)) != NULL, NULL);
+#endif /* HAVE_GMIME_2_5_7 */
 
     /* get the raw content */
     wrapper = g_mime_part_get_content_object(GMIME_PART(part));
@@ -227,13 +258,25 @@ g_mime_part_rfc2440_verify(GMimePart * part,
 
     /* verify the signature */
     ctx->singlepart_mode = TRUE;
+#ifndef HAVE_GMIME_2_5_7
     valid =
 	g_mime_cipher_context_verify(GMIME_CIPHER_CONTEXT(ctx),
 			     GMIME_CIPHER_HASH_DEFAULT, stream,
 			     plainstream, err);
+#else /* HAVE_GMIME_2_5_7 */
+    list =
+	g_mime_crypto_context_verify(GMIME_CRYPTO_CONTEXT(ctx),
+			     GMIME_CIPHER_ALGO_DEFAULT, stream,
+			     plainstream, err);
+#endif /* HAVE_GMIME_2_5_7 */
 
     /* upon success, replace the signed content by the checked one */
-    if (valid) {
+#ifndef HAVE_GMIME_2_5_7
+    if (valid)
+#else /* HAVE_GMIME_2_5_7 */
+    if (list)
+#endif /* HAVE_GMIME_2_5_7 */
+    {
 	GMimeDataWrapper *wrapper = g_mime_data_wrapper_new();
 
 	g_mime_data_wrapper_set_stream(wrapper, plainstream);
@@ -242,7 +285,11 @@ g_mime_part_rfc2440_verify(GMimePart * part,
     }
     g_object_unref(plainstream);
 
+#ifndef HAVE_GMIME_2_5_7
     return valid;
+#else /* HAVE_GMIME_2_5_7 */
+    return list;
+#endif /* HAVE_GMIME_2_5_7 */
 }
 
 
@@ -255,19 +302,32 @@ g_mime_part_rfc2440_verify(GMimePart * part,
  * verified and the result is placed in ctx by the underlying gpgme
  * context.
  */
+#ifndef HAVE_GMIME_2_5_7
 GMimeSignatureValidity *
+#else /* HAVE_GMIME_2_5_7 */
+GMimeDecryptResult *
+#endif /* HAVE_GMIME_2_5_7 */
 g_mime_part_rfc2440_decrypt(GMimePart * part,
 			    GMimeGpgmeContext * ctx, GError ** err)
 {
     GMimeStream *stream, *plainstream;
     GMimeDataWrapper * wrapper;
+#ifndef HAVE_GMIME_2_5_7
     GMimeSignatureValidity *result;
+#else /* HAVE_GMIME_2_5_7 */
+    GMimeDecryptResult *result;
+#endif /* HAVE_GMIME_2_5_7 */
     gchar *headbuf = g_malloc0(1024);
 
     g_return_val_if_fail(GMIME_IS_PART(part), NULL);
     g_return_val_if_fail(GMIME_IS_GPGME_CONTEXT(ctx), NULL);
+#ifndef HAVE_GMIME_2_5_7
     g_return_val_if_fail(GMIME_CIPHER_CONTEXT(ctx)->encrypt_protocol !=
 			 NULL, NULL);
+#else /* HAVE_GMIME_2_5_7 */
+    g_return_val_if_fail(g_mime_crypto_context_get_encryption_protocol
+                         (GMIME_CRYPTO_CONTEXT(ctx)) != NULL, NULL);
+#endif /* HAVE_GMIME_2_5_7 */
 
     /* get the raw content */
     wrapper = g_mime_part_get_content_object(part);
@@ -284,8 +344,13 @@ g_mime_part_rfc2440_decrypt(GMimePart * part,
 
     /* decrypt and (if possible) verify the input */
     result =
+#ifndef HAVE_GMIME_2_5_7
 	g_mime_cipher_context_decrypt(GMIME_CIPHER_CONTEXT(ctx), stream,
 			      plainstream, err);
+#else /* HAVE_GMIME_2_5_7 */
+	g_mime_crypto_context_decrypt(GMIME_CRYPTO_CONTEXT(ctx), stream,
+                                      plainstream, err);
+#endif /* HAVE_GMIME_2_5_7 */
 
     if (result != NULL) {
 	GMimeStream *filter_stream;
diff --git a/libbalsa/gmime-part-rfc2440.h b/libbalsa/gmime-part-rfc2440.h
index 48be5a4..cc1901a 100644
--- a/libbalsa/gmime-part-rfc2440.h
+++ b/libbalsa/gmime-part-rfc2440.h
@@ -53,12 +53,21 @@ int g_mime_part_rfc2440_sign_encrypt(GMimePart * part,
 				     GPtrArray * recipients,
 				     const char *sign_userid,
 				     GError ** err);
+#ifndef HAVE_GMIME_2_5_7
 GMimeSignatureValidity *g_mime_part_rfc2440_verify(GMimePart * part,
 						   GMimeGpgmeContext * ctx,
 						   GError ** err);
 GMimeSignatureValidity *g_mime_part_rfc2440_decrypt(GMimePart * part,
                                                     GMimeGpgmeContext *
                                                     ctx, GError ** err);
+#else /* HAVE_GMIME_2_5_7 */
+GMimeSignatureList *g_mime_part_rfc2440_verify(GMimePart * part,
+                                               GMimeGpgmeContext * ctx,
+                                               GError ** err);
+GMimeDecryptResult *g_mime_part_rfc2440_decrypt(GMimePart * part,
+                                                GMimeGpgmeContext * ctx,
+                                                GError ** err);
+#endif /* HAVE_GMIME_2_5_7 */
 
 #ifdef __cplusplus
 }
diff --git a/libbalsa/rfc3156.c b/libbalsa/rfc3156.c
index 04eab2b..e7806d3 100644
--- a/libbalsa/rfc3156.c
+++ b/libbalsa/rfc3156.c
@@ -268,9 +268,15 @@ libbalsa_message_body_protection(LibBalsaMessageBody * body)
 
 #if defined(HAVE_GMIME_2_6)
 static gboolean
+#ifndef HAVE_GMIME_2_5_7
 password_request_func(GMimeCipherContext * ctx, const char *user_id,
                       const char *prompt_ctx, gboolean reprompt,
                       GMimeStream * response, GError ** err)
+#else /* HAVE_GMIME_2_5_7 */
+password_request_func(GMimeCryptoContext * ctx, const char *user_id,
+                      const char *prompt_ctx, gboolean reprompt,
+                      GMimeStream * response, GError ** err)
+#endif /* HAVE_GMIME_2_5_7 */
 {
     gint fd;
     gchar *name_used;
@@ -366,9 +372,16 @@ libbalsa_sign_mime_object(GMimeObject ** content, const gchar * rfc822_for,
 	return FALSE;
     }
 
+#ifndef HAVE_GMIME_2_5_7
     if (g_mime_multipart_signed_sign
 	(mps, *content, GMIME_CIPHER_CONTEXT(ctx), rfc822_for,
-	 GMIME_CIPHER_HASH_DEFAULT, error) != 0) {
+	 GMIME_CIPHER_HASH_DEFAULT, error) != 0)
+#else /* HAVE_GMIME_2_5_7 */
+    if (g_mime_multipart_signed_sign
+	(mps, *content, GMIME_CRYPTO_CONTEXT(ctx), rfc822_for,
+	 GMIME_DIGEST_ALGO_DEFAULT, error) != 0)
+#endif /* HAVE_GMIME_2_5_7 */
+    {
 	g_object_unref(mps);
 	g_object_unref(ctx);
 #if !defined(HAVE_GMIME_2_6)
@@ -458,10 +471,18 @@ libbalsa_encrypt_mime_object(GMimeObject ** content, GList * rfc822_for,
 
 	encrypted_obj = GMIME_OBJECT(mpe);
 	result = 
+#ifndef HAVE_GMIME_2_5_7
 	    g_mime_multipart_encrypted_encrypt(mpe, *content,
 					       GMIME_CIPHER_CONTEXT(ctx),
                                                FALSE, NULL,
 					       recipients, error);
+#else /* HAVE_GMIME_2_5_7 */
+	    g_mime_multipart_encrypted_encrypt(mpe, *content,
+					       GMIME_CRYPTO_CONTEXT(ctx),
+                                               FALSE, NULL,
+                                               GMIME_DIGEST_ALGO_DEFAULT,
+					       recipients, error);
+#endif /* HAVE_GMIME_2_5_7 */
     }
 #ifdef HAVE_SMIME
     else {
@@ -471,9 +492,15 @@ libbalsa_encrypt_mime_object(GMimeObject ** content, GList * rfc822_for,
 	encrypted_obj = GMIME_OBJECT(pkcs7);
 	ctx->singlepart_mode = TRUE;
 	result = 
+#ifndef HAVE_GMIME_2_5_7
 	    g_mime_application_pkcs7_encrypt(pkcs7, *content,
 					     GMIME_CIPHER_CONTEXT(ctx),
 					     recipients, error);
+#else /* HAVE_GMIME_2_5_7 */
+	    g_mime_application_pkcs7_encrypt(pkcs7, *content,
+					     GMIME_CRYPTO_CONTEXT(ctx),
+					     recipients, error);
+#endif /* HAVE_GMIME_2_5_7 */
     }
 #endif
 
@@ -565,8 +592,13 @@ libbalsa_body_check_signature(LibBalsaMessageBody * body,
 #if !defined(HAVE_GMIME_2_6)
     GMimeSession *session;
 #endif                          /* HAVE_GMIME_2_6 */
+#ifndef HAVE_GMIME_2_5_7
     GMimeCipherContext *ctx;
     GMimeSignatureValidity *valid;
+#else /* HAVE_GMIME_2_5_7 */
+    GMimeCryptoContext *ctx;
+    GMimeSignatureList *valid;
+#endif /* HAVE_GMIME_2_5_7 */
     GError *error = NULL;
 
     /* paranoia checks */
@@ -614,6 +646,7 @@ libbalsa_body_check_signature(LibBalsaMessageBody * body,
 	return FALSE;
     }
 
+#ifndef HAVE_GMIME_2_5_7
     /* S/MIME uses the protocol application/pkcs7-signature, but some ancient
        mailers, not yet knowing RFC 2633, use application/x-pkcs7-signature,
        so tweak the context if necessary... */
@@ -625,6 +658,7 @@ libbalsa_body_check_signature(LibBalsaMessageBody * body,
 	    ctx->sign_protocol = cms_protocol;
     }
 
+#endif /* ! HAVE_GMIME_2_5_7 */
     /* verify the signature */
 
     libbalsa_mailbox_lock_store(body->message->mailbox);
@@ -646,7 +680,11 @@ libbalsa_body_check_signature(LibBalsaMessageBody * body,
 	body->parts->next->sig_info = GMIME_GPGME_CONTEXT(ctx)->sig_state;
 	g_object_ref(G_OBJECT(body->parts->next->sig_info));
     }
+#ifndef HAVE_GMIME_2_5_7
     g_mime_signature_validity_free(valid);
+#else /* HAVE_GMIME_2_5_7 */
+    g_object_unref(valid);
+#endif /* HAVE_GMIME_2_5_7 */
     g_object_unref(ctx);
 #if !defined(HAVE_GMIME_2_6)
     g_object_unref(session);
@@ -747,14 +785,26 @@ libbalsa_body_decrypt(LibBalsaMessageBody * body,
     libbalsa_mailbox_lock_store(body->message->mailbox);
     if (protocol == GPGME_PROTOCOL_OpenPGP)
 	mime_obj =
+#ifndef HAVE_GMIME_2_5_7
 	    g_mime_multipart_encrypted_decrypt(GMIME_MULTIPART_ENCRYPTED(body->mime_part),
 					       GMIME_CIPHER_CONTEXT(ctx),
 					       &error);
+#else /* HAVE_GMIME_2_5_7 */
+	    g_mime_multipart_encrypted_decrypt(GMIME_MULTIPART_ENCRYPTED(body->mime_part),
+					       GMIME_CRYPTO_CONTEXT(ctx),
+                                               NULL,
+					       &error);
+#endif /* HAVE_GMIME_2_5_7 */
 #ifdef HAVE_SMIME
     else if (smime_signed) {
+#ifndef HAVE_GMIME_2_5_7
 	GMimeSignatureValidity *valid;
+#else /* HAVE_GMIME_2_5_7 */
+	GMimeSignatureList *valid;
+#endif /* HAVE_GMIME_2_5_7 */
 
 	ctx->singlepart_mode = TRUE;
+#ifndef HAVE_GMIME_2_5_7
 	mime_obj =
 	    g_mime_application_pkcs7_verify(GMIME_PART(body->mime_part),
 					    &valid,
@@ -766,6 +816,19 @@ libbalsa_body_decrypt(LibBalsaMessageBody * body,
 	    g_mime_application_pkcs7_decrypt(GMIME_PART(body->mime_part),
 					       GMIME_CIPHER_CONTEXT(ctx),
 					       &error);
+#else /* HAVE_GMIME_2_5_7 */
+	mime_obj =
+	    g_mime_application_pkcs7_verify(GMIME_PART(body->mime_part),
+					    &valid,
+					    GMIME_CRYPTO_CONTEXT(ctx),
+					    &error);
+	g_object_unref(valid);
+    } else
+	mime_obj =
+	    g_mime_application_pkcs7_decrypt(GMIME_PART(body->mime_part),
+					       GMIME_CRYPTO_CONTEXT(ctx),
+					       &error);
+#endif /* HAVE_GMIME_2_5_7 */
 #endif
     libbalsa_mailbox_unlock_store(body->message->mailbox);
 
@@ -906,7 +969,11 @@ libbalsa_rfc2440_verify(GMimePart * part, GMimeGpgmeSigstat ** sig_info)
     GMimeSession *session;
 #endif                          /* HAVE_GMIME_2_6 */
     GMimeGpgmeContext *ctx;
+#ifndef HAVE_GMIME_2_5_7
     GMimeSignatureValidity *valid;
+#else /* HAVE_GMIME_2_5_7 */
+    GMimeSignatureList *valid;
+#endif /* HAVE_GMIME_2_5_7 */
     GError *error = NULL;
     gpgme_error_t retval;
 
@@ -978,7 +1045,11 @@ libbalsa_rfc2440_verify(GMimePart * part, GMimeGpgmeSigstat ** sig_info)
     }
 
     /* clean up */
+#ifndef HAVE_GMIME_2_5_7
     g_mime_signature_validity_free(valid);
+#else /* HAVE_GMIME_2_5_7 */
+    g_object_unref(valid);
+#endif /* HAVE_GMIME_2_5_7 */
     retval = ctx->sig_state->status;
     g_object_unref(ctx);
 #if !defined(HAVE_GMIME_2_6)



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]