[balsa] Build with GMime 2.6.0
- From: Peter Bloomfield <PeterB src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [balsa] Build with GMime 2.6.0
- Date: Mon, 28 Nov 2011 03:01:28 +0000 (UTC)
commit 393d0077495cb750ee47bab6ec44a60906a95179
Author: Peter Bloomfield <PeterBloomfield bellsouth net>
Date: Sun Nov 27 22:00:55 2011 -0500
Build with GMime 2.6.0
* configure.in: check for GMime >= 2.5.7
* 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 >= 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):
ditto.
* 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 | 22 +++
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 | 94 ++++++++++-
9 files changed, 623 insertions(+), 15 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index bd95e68..d5c62f5 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,25 @@
+2011-11-27 Peter Bloomfield
+
+ Build with GMime 2.6.0
+
+ * configure.in: check for GMime >= 2.5.7
+ * 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 >= 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):
+ ditto.
+ * 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-11-22 Pawel Salek
* NEWS, configure.in: release balsa-2.4.11
diff --git a/configure.in b/configure.in
index 4a8320e..64d99f3 100644
--- a/configure.in
+++ b/configure.in
@@ -307,7 +307,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 a56e12c..df4a2e1 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,14 @@ libbalsa_body_check_signature(LibBalsaMessageBody * body,
#if !defined(HAVE_GMIME_2_6)
GMimeSession *session;
#endif /* HAVE_GMIME_2_6 */
- GMimeCipherContext *ctx;
+#ifndef HAVE_GMIME_2_5_7
+ GMimeCipherContext *g_mime_ctx;
GMimeSignatureValidity *valid;
+#else /* HAVE_GMIME_2_5_7 */
+ GMimeCryptoContext *g_mime_ctx;
+ GMimeSignatureList *valid;
+#endif /* HAVE_GMIME_2_5_7 */
+ GMimeGpgmeContext *ctx;
GError *error = NULL;
/* paranoia checks */
@@ -592,12 +625,12 @@ libbalsa_body_check_signature(LibBalsaMessageBody * body,
/* try to create GMimeGpgMEContext */
#if !defined(HAVE_GMIME_2_6)
session = g_object_new(g_mime_session_get_type(), NULL, NULL);
- ctx = g_mime_gpgme_context_new(session, protocol, &error);
+ g_mime_ctx = g_mime_gpgme_context_new(session, protocol, &error);
#else /* HAVE_GMIME_2_6 */
- ctx =
+ g_mime_ctx =
g_mime_gpgme_context_new(password_request_func, protocol, &error);
#endif /* HAVE_GMIME_2_6 */
- if (ctx == NULL) {
+ if (g_mime_ctx == NULL) {
if (error) {
libbalsa_information(LIBBALSA_INFORMATION_ERROR, "%s: %s",
_("creating a gpgme context failed"),
@@ -613,6 +646,7 @@ libbalsa_body_check_signature(LibBalsaMessageBody * body,
body->parts->next->sig_info->status = GPGME_SIG_STAT_ERROR;
return FALSE;
}
+ ctx = GMIME_GPGME_CONTEXT(g_mime_ctx);
/* S/MIME uses the protocol application/pkcs7-signature, but some ancient
mailers, not yet knowing RFC 2633, use application/x-pkcs7-signature,
@@ -622,14 +656,19 @@ libbalsa_body_check_signature(LibBalsaMessageBody * body,
g_mime_object_get_content_type_parameter(GMIME_OBJECT (body->mime_part),
"protocol");
if (!g_ascii_strcasecmp(cms_protocol, "application/x-pkcs7-signature"))
+#ifndef HAVE_GMIME_2_5_7
+ g_mime_ctx->sign_protocol = cms_protocol;
+#else /* HAVE_GMIME_2_5_7 */
ctx->sign_protocol = cms_protocol;
+#endif /* HAVE_GMIME_2_5_7 */
}
/* verify the signature */
libbalsa_mailbox_lock_store(body->message->mailbox);
valid = g_mime_multipart_signed_verify(GMIME_MULTIPART_SIGNED
- (body->mime_part), ctx, &error);
+ (body->mime_part), g_mime_ctx,
+ &error);
libbalsa_mailbox_unlock_store(body->message->mailbox);
if (valid == NULL) {
@@ -642,12 +681,16 @@ libbalsa_body_check_signature(LibBalsaMessageBody * body,
libbalsa_information(LIBBALSA_INFORMATION_ERROR,
_("signature verification failed"));
}
- if (GMIME_GPGME_CONTEXT(ctx)->sig_state) {
- body->parts->next->sig_info = GMIME_GPGME_CONTEXT(ctx)->sig_state;
+ if (ctx->sig_state) {
+ body->parts->next->sig_info = 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);
- g_object_unref(ctx);
+#else /* HAVE_GMIME_2_5_7 */
+ g_object_unref(valid);
+#endif /* HAVE_GMIME_2_5_7 */
+ g_object_unref(g_mime_ctx);
#if !defined(HAVE_GMIME_2_6)
g_object_unref(session);
#endif /* HAVE_GMIME_2_6 */
@@ -747,14 +790,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 +821,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 +974,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 +1050,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]