From 393d0077495cb750ee47bab6ec44a60906a95179 Mon Sep 17 00:00:00 2001 From: Peter Bloomfield Date: Mon, 28 Nov 2011 03:00:55 +0000 Subject: 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. --- 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 +#ifndef HAVE_GMIME_2_5_7 #include +#else /* HAVE_GMIME_2_5_7 */ +#include +#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 #include #include +#ifdef HAVE_GMIME_2_5_7 +#include +#endif /* HAVE_GMIME_2_5_7 */ #include #include #include @@ -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) -- cgit v0.9.0.2