[gmime] Replace get/set_always_trust() and get/set_retrieve_session_key() with flags



commit c630d9b1f9a7b7a9aeec31fff608ef2b336d45b1
Author: Jeffrey Stedfast <jestedfa microsoft com>
Date:   Sat Feb 18 18:08:20 2017 -0500

    Replace get/set_always_trust() and get/set_retrieve_session_key() with flags

 gmime/gmime-application-pkcs7-mime.c |   15 ++-
 gmime/gmime-application-pkcs7-mime.h |   11 ++-
 gmime/gmime-crypto-context.c         |  171 +++++---------------------------
 gmime/gmime-crypto-context.h         |   85 +++++++++++------
 gmime/gmime-gpg-context.c            |  180 ++++++++--------------------------
 gmime/gmime-gpg-context.h            |    4 -
 gmime/gmime-multipart-encrypted.c    |   15 ++-
 gmime/gmime-multipart-encrypted.h    |    4 +-
 gmime/gmime-multipart-signed.c       |    5 +-
 gmime/gmime-multipart-signed.h       |    2 +-
 gmime/gmime-pkcs7-context.c          |  141 ++++++++-------------------
 gmime/gmime-pkcs7-context.h          |    3 -
 12 files changed, 197 insertions(+), 439 deletions(-)
---
diff --git a/gmime/gmime-application-pkcs7-mime.c b/gmime/gmime-application-pkcs7-mime.c
index 2416fc6..dc6b45b 100644
--- a/gmime/gmime-application-pkcs7-mime.c
+++ b/gmime/gmime-application-pkcs7-mime.c
@@ -255,6 +255,7 @@ g_mime_application_pkcs7_mime_decompress (GMimeApplicationPkcs7Mime *pkcs7_mime,
  * g_mime_application_pkcs7_mime_encrypt:
  * @ctx: a #GMimePkcs7Context
  * @entity: a #GMimeObject to encrypt
+ * @flags: a #GMimeEncryptFlags
  * @recipients: the list of recipients to encrypt to
  * @err: a #GError
  *
@@ -263,7 +264,7 @@ g_mime_application_pkcs7_mime_decompress (GMimeApplicationPkcs7Mime *pkcs7_mime,
  * Returns: The encrypted @entity.
  **/
 GMimeApplicationPkcs7Mime *
-g_mime_application_pkcs7_mime_encrypt (GMimePkcs7Context *ctx, GMimeObject *entity, GPtrArray *recipients, 
GError **err)
+g_mime_application_pkcs7_mime_encrypt (GMimePkcs7Context *ctx, GMimeObject *entity, GMimeEncryptFlags flags, 
GPtrArray *recipients, GError **err)
 {
        GMimeStream *filtered_stream, *ciphertext, *stream;
        GMimeApplicationPkcs7Mime *pkcs7_mime;
@@ -292,7 +293,7 @@ g_mime_application_pkcs7_mime_encrypt (GMimePkcs7Context *ctx, GMimeObject *enti
        
        /* encrypt the content stream */
        ciphertext = g_mime_stream_mem_new ();
-       if (g_mime_crypto_context_encrypt ((GMimeCryptoContext *) ctx, FALSE, NULL, 
GMIME_DIGEST_ALGO_DEFAULT, recipients, stream, ciphertext, err) == -1) {
+       if (g_mime_crypto_context_encrypt ((GMimeCryptoContext *) ctx, FALSE, NULL, 
GMIME_DIGEST_ALGO_DEFAULT, flags, recipients, stream, ciphertext, err) == -1) {
                g_object_unref (ciphertext);
                g_object_unref (stream);
                return NULL;
@@ -342,6 +343,7 @@ g_mime_data_wrapper_get_decoded_stream (GMimeDataWrapper *wrapper)
  * g_mime_application_pkcs7_mime_decrypt:
  * @pkcs7_mime: a #GMimeApplicationPkcs7Mime
  * @ctx: a #GMimePkcs7Context
+ * @flags: a #GMimeDecryptFlags
  * @session_key: session key to use or %NULL
  * @result: the decryption result
  * @err: a #GError
@@ -364,8 +366,8 @@ g_mime_data_wrapper_get_decoded_stream (GMimeDataWrapper *wrapper)
  **/
 GMimeObject *
 g_mime_application_pkcs7_mime_decrypt (GMimeApplicationPkcs7Mime *pkcs7_mime, GMimePkcs7Context *ctx,
-                                      const char *session_key, GMimeDecryptResult **result,
-                                      GError **err)
+                                      GMimeDecryptFlags flags, const char *session_key,
+                                      GMimeDecryptResult **result, GError **err)
 {
        GMimeStream *filtered_stream, *ciphertext, *stream;
        GMimeDataWrapper *wrapper;
@@ -392,7 +394,7 @@ g_mime_application_pkcs7_mime_decrypt (GMimeApplicationPkcs7Mime *pkcs7_mime, GM
        g_object_unref (crlf_filter);
        
        /* decrypt the content stream */
-       if (!(res = g_mime_crypto_context_decrypt ((GMimeCryptoContext *) ctx, session_key, ciphertext, 
filtered_stream, err))) {
+       if (!(res = g_mime_crypto_context_decrypt ((GMimeCryptoContext *) ctx, flags, session_key, 
ciphertext, filtered_stream, err))) {
                g_object_unref (filtered_stream);
                g_object_unref (ciphertext);
                g_object_unref (stream);
@@ -496,6 +498,7 @@ g_mime_application_pkcs7_mime_sign (GMimePkcs7Context *ctx, GMimeObject *entity,
  * g_mime_application_pkcs7_mime_verify:
  * @pkcs7_mime: a #GMimeApplicationPkcs7Mime
  * @ctx: a #GMimePkcs7Context
+ * @flags: a #GMimeVerifyFlags
  * @entity: the extracted entity
  * @err: a #GError
  *
@@ -504,7 +507,7 @@ g_mime_application_pkcs7_mime_sign (GMimePkcs7Context *ctx, GMimeObject *entity,
  * Returns: the list of signers.
  **/
 GMimeSignatureList *
-g_mime_application_pkcs7_mime_verify (GMimeApplicationPkcs7Mime *pkcs7_mime, GMimePkcs7Context *ctx, 
GMimeObject **entity, GError **err)
+g_mime_application_pkcs7_mime_verify (GMimeApplicationPkcs7Mime *pkcs7_mime, GMimePkcs7Context *ctx, 
GMimeVerifyFlags flags, GMimeObject **entity, GError **err)
 {
        g_return_val_if_fail (GMIME_IS_APPLICATION_PKCS7_MIME (pkcs7_mime), NULL);
        g_return_val_if_fail (GMIME_IS_PKCS7_CONTEXT (ctx), NULL);
diff --git a/gmime/gmime-application-pkcs7-mime.h b/gmime/gmime-application-pkcs7-mime.h
index 661246d..c197d48 100644
--- a/gmime/gmime-application-pkcs7-mime.h
+++ b/gmime/gmime-application-pkcs7-mime.h
@@ -85,16 +85,19 @@ GMimeSecureMimeType g_mime_application_pkcs7_mime_get_smime_type (GMimeApplicati
 /*GMimeObject *g_mime_application_pkcs7_mime_decompress (GMimeApplicationPkcs7Mime *pkcs7_mime, 
GMimePkcs7Context *ctx);*/
 
 GMimeApplicationPkcs7Mime *g_mime_application_pkcs7_mime_encrypt (GMimePkcs7Context *ctx, GMimeObject 
*entity,
-                                                                 GPtrArray *recipients, GError **err);
+                                                                 GMimeEncryptFlags flags, GPtrArray 
*recipients,
+                                                                 GError **err);
+
 GMimeObject *g_mime_application_pkcs7_mime_decrypt (GMimeApplicationPkcs7Mime *pkcs7_mime, GMimePkcs7Context 
*ctx,
-                                                   const char *session_key, GMimeDecryptResult **result,
-                                                   GError **err);
+                                                   GMimeDecryptFlags flags, const char *session_key,
+                                                   GMimeDecryptResult **result, GError **err);
 
 GMimeApplicationPkcs7Mime *g_mime_application_pkcs7_mime_sign (GMimePkcs7Context *ctx, GMimeObject *entity,
                                                               const char *userid, GMimeDigestAlgo digest,
                                                               GError **err);
+
 GMimeSignatureList *g_mime_application_pkcs7_mime_verify (GMimeApplicationPkcs7Mime *pkcs7_mime, 
GMimePkcs7Context *ctx,
-                                                         GMimeObject **entity, GError **err);
+                                                         GMimeVerifyFlags flags, GMimeObject **entity, 
GError **err);
 
 G_END_DECLS
 
diff --git a/gmime/gmime-crypto-context.c b/gmime/gmime-crypto-context.c
index f0f4692..54d8d1e 100644
--- a/gmime/gmime-crypto-context.c
+++ b/gmime/gmime-crypto-context.c
@@ -53,29 +53,24 @@ static const char *crypto_get_signature_protocol (GMimeCryptoContext *ctx);
 static const char *crypto_get_encryption_protocol (GMimeCryptoContext *ctx);
 static const char *crypto_get_key_exchange_protocol (GMimeCryptoContext *ctx);
 
-static int crypto_set_retrieve_session_key (GMimeCryptoContext *ctx, gboolean retrieve_session_key, GError 
**err);
-static gboolean crypto_get_retrieve_session_key (GMimeCryptoContext *ctx);
-
-static void crypto_set_always_trust (GMimeCryptoContext *ctx, gboolean always_trust);
-static gboolean crypto_get_always_trust (GMimeCryptoContext *ctx);
-
 static int crypto_sign (GMimeCryptoContext *ctx, gboolean detach,
                        const char *userid, GMimeDigestAlgo digest,
                        GMimeStream *istream, GMimeStream *ostream,
                        GError **err);
        
-static GMimeSignatureList *crypto_verify (GMimeCryptoContext *ctx, GMimeDigestAlgo digest,
-                                         GMimeStream *istream, GMimeStream *sigstream,
-                                         GError **err);
+static GMimeSignatureList *crypto_verify (GMimeCryptoContext *ctx, GMimeVerifyFlags flags,
+                                         GMimeDigestAlgo digest, GMimeStream *istream,
+                                         GMimeStream *sigstream, GError **err);
        
 static int crypto_encrypt (GMimeCryptoContext *ctx, gboolean sign,
                           const char *userid, GMimeDigestAlgo digest,
-                          GPtrArray *recipients, GMimeStream *istream,
-                          GMimeStream *ostream, GError **err);
+                          GMimeEncryptFlags flags, GPtrArray *recipients,
+                          GMimeStream *istream, GMimeStream *ostream,
+                          GError **err);
 
-static GMimeDecryptResult *crypto_decrypt (GMimeCryptoContext *ctx, const char *session_key,
-                                          GMimeStream *istream, GMimeStream *ostream,
-                                          GError **err);
+static GMimeDecryptResult *crypto_decrypt (GMimeCryptoContext *ctx, GMimeDecryptFlags flags,
+                                          const char *session_key, GMimeStream *istream,
+                                          GMimeStream *ostream, GError **err);
 
 static int crypto_import_keys (GMimeCryptoContext *ctx, GMimeStream *istream,
                               GError **err);
@@ -136,10 +131,6 @@ g_mime_crypto_context_class_init (GMimeCryptoContextClass *klass)
        klass->get_signature_protocol = crypto_get_signature_protocol;
        klass->get_encryption_protocol = crypto_get_encryption_protocol;
        klass->get_key_exchange_protocol = crypto_get_key_exchange_protocol;
-       klass->get_retrieve_session_key = crypto_get_retrieve_session_key;
-       klass->set_retrieve_session_key = crypto_set_retrieve_session_key;
-       klass->get_always_trust = crypto_get_always_trust;
-       klass->set_always_trust = crypto_set_always_trust;
 }
 
 static void
@@ -399,8 +390,8 @@ g_mime_crypto_context_sign (GMimeCryptoContext *ctx, gboolean detach, const char
 
 
 static GMimeSignatureList *
-crypto_verify (GMimeCryptoContext *ctx, GMimeDigestAlgo digest, GMimeStream *istream,
-              GMimeStream *sigstream, GError **err)
+crypto_verify (GMimeCryptoContext *ctx, GMimeVerifyFlags flags, GMimeDigestAlgo digest,
+              GMimeStream *istream, GMimeStream *sigstream, GError **err)
 {
        g_set_error (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED,
                     "Verifying is not supported by this crypto context");
@@ -412,6 +403,7 @@ crypto_verify (GMimeCryptoContext *ctx, GMimeDigestAlgo digest, GMimeStream *ist
 /**
  * g_mime_crypto_context_verify:
  * @ctx: a #GMimeCryptoContext
+ * @flags: a #GMimeVerifyFlags
  * @digest: digest algorithm used, if known
  * @istream: input stream
  * @sigstream: optional detached-signature stream
@@ -426,19 +418,20 @@ crypto_verify (GMimeCryptoContext *ctx, GMimeDigestAlgo digest, GMimeStream *ist
  * the status of each signature or %NULL on error.
  **/
 GMimeSignatureList *
-g_mime_crypto_context_verify (GMimeCryptoContext *ctx, GMimeDigestAlgo digest, GMimeStream *istream,
-                             GMimeStream *sigstream, GError **err)
+g_mime_crypto_context_verify (GMimeCryptoContext *ctx, GMimeVerifyFlags flags, GMimeDigestAlgo digest,
+                             GMimeStream *istream, GMimeStream *sigstream, GError **err)
 {
        g_return_val_if_fail (GMIME_IS_CRYPTO_CONTEXT (ctx), NULL);
        g_return_val_if_fail (GMIME_IS_STREAM (istream), NULL);
        
-       return GMIME_CRYPTO_CONTEXT_GET_CLASS (ctx)->verify (ctx, digest, istream, sigstream, err);
+       return GMIME_CRYPTO_CONTEXT_GET_CLASS (ctx)->verify (ctx, flags, digest, istream, sigstream, err);
 }
 
 
 static int
 crypto_encrypt (GMimeCryptoContext *ctx, gboolean sign, const char *userid, GMimeDigestAlgo digest,
-               GPtrArray *recipients, GMimeStream *istream, GMimeStream *ostream, GError **err)
+               GMimeEncryptFlags flags, GPtrArray *recipients, GMimeStream *istream, GMimeStream *ostream,
+               GError **err)
 {
        g_set_error (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED,
                     "Encryption is not supported by this crypto context");
@@ -453,6 +446,7 @@ crypto_encrypt (GMimeCryptoContext *ctx, gboolean sign, const char *userid, GMim
  * @sign: sign as well as encrypt
  * @userid: key id (or email address) to use when signing (assuming @sign is %TRUE)
  * @digest: digest algorithm to use when signing
+ * @flags: a #GMimeEncryptFlags
  * @recipients: (element-type utf8): an array of recipient key ids
  *   and/or email addresses
  * @istream: cleartext input stream
@@ -466,20 +460,20 @@ crypto_encrypt (GMimeCryptoContext *ctx, gboolean sign, const char *userid, GMim
  **/
 int
 g_mime_crypto_context_encrypt (GMimeCryptoContext *ctx, gboolean sign, const char *userid, GMimeDigestAlgo 
digest,
-                              GPtrArray *recipients, GMimeStream *istream, GMimeStream *ostream, GError 
**err)
+                              GMimeEncryptFlags flags, GPtrArray *recipients, GMimeStream *istream, 
GMimeStream *ostream,
+                              GError **err)
 {
        g_return_val_if_fail (GMIME_IS_CRYPTO_CONTEXT (ctx), -1);
        g_return_val_if_fail (GMIME_IS_STREAM (istream), -1);
        g_return_val_if_fail (GMIME_IS_STREAM (ostream), -1);
        
-       return GMIME_CRYPTO_CONTEXT_GET_CLASS (ctx)->encrypt (ctx, sign, userid, digest, recipients, istream, 
ostream, err);
+       return GMIME_CRYPTO_CONTEXT_GET_CLASS (ctx)->encrypt (ctx, sign, userid, digest, flags, recipients, 
istream, ostream, err);
 }
 
 
 static GMimeDecryptResult *
-crypto_decrypt (GMimeCryptoContext *ctx, const char *session_key,
-               GMimeStream *istream, GMimeStream *ostream,
-               GError **err)
+crypto_decrypt (GMimeCryptoContext *ctx, GMimeDecryptFlags flags, const char *session_key,
+               GMimeStream *istream, GMimeStream *ostream, GError **err)
 {
        g_set_error (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED,
                     "Decryption is not supported by this crypto context");
@@ -491,6 +485,7 @@ crypto_decrypt (GMimeCryptoContext *ctx, const char *session_key,
 /**
  * g_mime_crypto_context_decrypt:
  * @ctx: a #GMimeCryptoContext
+ * @flags: a #GMimeDecryptFlags
  * @session_key: session key to use or %NULL
  * @istream: input/ciphertext stream
  * @ostream: output/cleartext stream
@@ -520,15 +515,14 @@ crypto_decrypt (GMimeCryptoContext *ctx, const char *session_key,
  * on error.
  **/
 GMimeDecryptResult *
-g_mime_crypto_context_decrypt (GMimeCryptoContext *ctx, const char *session_key,
-                              GMimeStream *istream, GMimeStream *ostream,
-                              GError **err)
+g_mime_crypto_context_decrypt (GMimeCryptoContext *ctx, GMimeDecryptFlags flags, const char *session_key,
+                              GMimeStream *istream, GMimeStream *ostream, GError **err)
 {
        g_return_val_if_fail (GMIME_IS_CRYPTO_CONTEXT (ctx), NULL);
        g_return_val_if_fail (GMIME_IS_STREAM (istream), NULL);
        g_return_val_if_fail (GMIME_IS_STREAM (ostream), NULL);
        
-       return GMIME_CRYPTO_CONTEXT_GET_CLASS (ctx)->decrypt (ctx, session_key, istream, ostream, err);
+       return GMIME_CRYPTO_CONTEXT_GET_CLASS (ctx)->decrypt (ctx, flags, session_key, istream, ostream, err);
 }
 
 
@@ -600,117 +594,6 @@ g_mime_crypto_context_export_keys (GMimeCryptoContext *ctx, const char *keys[],
 }
 
 
-static gboolean
-crypto_get_retrieve_session_key (GMimeCryptoContext *ctx)
-{
-       return FALSE;
-}
-
-/**
- * g_mime_crypto_context_get_retrieve_session_key:
- * @ctx: a #GMimeCryptoContext
- *
- * Gets whether or not the @ctx is configured to retrieve a session
- * key during decryption (see g_mime_decrypt_result_get_session_key()).
- *
- * Returns: %TRUE if the @ctx is configured to retrieve a session key
- * or %FALSE otherwise.
- **/
-gboolean
-g_mime_crypto_context_get_retrieve_session_key (GMimeCryptoContext *ctx)
-{
-       g_return_val_if_fail (GMIME_IS_CRYPTO_CONTEXT (ctx), FALSE);
-       
-       return GMIME_CRYPTO_CONTEXT_GET_CLASS (ctx)->get_retrieve_session_key (ctx);
-}
-
-static int
-crypto_set_retrieve_session_key (GMimeCryptoContext *ctx, gboolean retrieve_session_key,
-                                GError **err)
-{
-       if (!retrieve_session_key)
-               return 0;
-       
-       g_set_error (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED,
-                    "Session key retrieval is not supported by this crypto context");
-       
-       return -1;
-}
-
-/**
- * g_mime_crypto_context_set_retrieve_session_key:
- * @ctx: a #GMimeCryptoContext
- * @retrieve_session_key: whether to retrieve session keys during decryption
- * @err: a #GError
- *
- * Configures whether @ctx should produce a session key during future
- * decryption operations (see
- * g_mime_decrypt_result_get_session_key()).
- *
- * Returns: %0 on success or %-1 on fail.
- **/
-int
-g_mime_crypto_context_set_retrieve_session_key (GMimeCryptoContext *ctx,
-                                               gboolean retrieve_session_key,
-                                               GError **err)
-{
-       if (!GMIME_IS_CRYPTO_CONTEXT (ctx)) {
-               g_set_error (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED,
-                            "Not a GMimeCryptoContext, can't set retrieve_session_key");
-               return -1;
-       }
-       
-       return GMIME_CRYPTO_CONTEXT_GET_CLASS (ctx)->set_retrieve_session_key (ctx, retrieve_session_key, 
err);
-}
-
-
-static gboolean
-crypto_get_always_trust (GMimeCryptoContext *ctx)
-{
-       return FALSE;
-}
-
-
-/**
- * g_mime_crypto_context_get_always_trust:
- * @ctx: a #GMimeCryptoContext
- *
- * Gets whther or not keys should always be trusted when encrypting.
- *
- * Returns: %TRUE if keys should always be trusted when encrypting or
- * %FALSE otherwise.
- **/
-gboolean
-g_mime_crypto_context_get_always_trust (GMimeCryptoContext *ctx)
-{
-       g_return_val_if_fail (GMIME_IS_CRYPTO_CONTEXT (ctx), FALSE);
-       
-       return GMIME_CRYPTO_CONTEXT_GET_CLASS (ctx)->get_always_trust (ctx);
-}
-
-
-static void
-crypto_set_always_trust (GMimeCryptoContext *ctx, gboolean always_trust)
-{
-}
-
-
-/**
- * g_mime_crypto_context_set_always_trust:
- * @ctx: a #GMimeCryptoContext
- * @always_trust: %TRUE if keys should always be trusted when encrypting
- *
- * Sets whether or not key should always be trusted when encrypting.
- **/
-void
-g_mime_crypto_context_set_always_trust (GMimeCryptoContext *ctx, gboolean always_trust)
-{
-       g_return_if_fail (GMIME_IS_CRYPTO_CONTEXT (ctx));
-       
-       GMIME_CRYPTO_CONTEXT_GET_CLASS (ctx)->set_always_trust (ctx, always_trust);
-}
-
-
 
 static void g_mime_decrypt_result_class_init (GMimeDecryptResultClass *klass);
 static void g_mime_decrypt_result_init (GMimeDecryptResult *cert, GMimeDecryptResultClass *klass);
diff --git a/gmime/gmime-crypto-context.h b/gmime/gmime-crypto-context.h
index 4ff3790..6051527 100644
--- a/gmime/gmime-crypto-context.h
+++ b/gmime/gmime-crypto-context.h
@@ -77,6 +77,45 @@ typedef GMimeCryptoContext * (* GMimeCryptoContextNewFunc) (void);
 
 
 /**
+ * GMimeDecryptFlags:
+ * @GMIME_DECRYPT_FLAGS_NONE: No flags specified.
+ * @GMIME_DECRYPT_FLAGS_EXPORT_SESSION_KEY: Export the decryption session-key
+ *
+ * Decryption flags.
+ **/
+typedef enum {
+       GMIME_DECRYPT_FLAGS_NONE               = 0,
+       GMIME_DECRYPT_FLAGS_EXPORT_SESSION_KEY = 1 << 0,
+} GMimeDecryptFlags;
+
+
+/**
+ * GMimeEncryptFlags:
+ * @GMIME_ENCRYPT_FLAGS_NONE: No flags specified.
+ * @GMIME_ENCRYPT_FLAGS_ALWAYS_TRUST: Always trust the specified keys.
+ *
+ * Encryption flags.
+ **/
+typedef enum {
+       GMIME_ENCRYPT_FLAGS_NONE         = 0,
+       GMIME_ENCRYPT_FLAGS_ALWAYS_TRUST = 1 << 0,
+} GMimeEncryptFlags;
+
+
+/**
+ * GMimeVerifyFlags:
+ * @GMIME_VERIFY_FLAGS_NONE: No flags specified.
+ * @GMIME_VERIFY_FLAGS_AUTO_KEY_RETRIEVE: Automatically retrieve keys from a keyserver.
+ *
+ * Signature verification flags.
+ **/
+typedef enum {
+       GMIME_VERIFY_FLAGS_NONE              = 0,
+       GMIME_VERIFY_FLAGS_AUTO_KEY_RETRIEVE = 1 << 0,
+} GMimeVerifyFlags;
+
+
+/**
  * GMimeCryptoContext:
  * @parent_object: parent #GObject
  * @request_passwd: a callback for requesting a password
@@ -104,30 +143,25 @@ struct _GMimeCryptoContextClass {
                                                  GMimeStream *istream, GMimeStream *ostream,
                                                  GError **err);
        
-       GMimeSignatureList *     (* verify)      (GMimeCryptoContext *ctx, GMimeDigestAlgo digest,
-                                                 GMimeStream *istream, GMimeStream *sigstream,
-                                                 GError **err);
+       GMimeSignatureList *     (* verify)      (GMimeCryptoContext *ctx, GMimeVerifyFlags flags,
+                                                 GMimeDigestAlgo digest, GMimeStream *istream,
+                                                 GMimeStream *sigstream, GError **err);
        
        int                      (* encrypt)     (GMimeCryptoContext *ctx, gboolean sign,
                                                  const char *userid, GMimeDigestAlgo digest,
-                                                 GPtrArray *recipients, GMimeStream *istream,
-                                                 GMimeStream *ostream, GError **err);
-       
-       GMimeDecryptResult *     (* decrypt)     (GMimeCryptoContext *ctx, const char *session_key,
+                                                 GMimeEncryptFlags flags, GPtrArray *recipients,
                                                  GMimeStream *istream, GMimeStream *ostream,
                                                  GError **err);
        
+       GMimeDecryptResult *     (* decrypt)     (GMimeCryptoContext *ctx, GMimeDecryptFlags flags,
+                                                 const char *session_key, GMimeStream *istream,
+                                                 GMimeStream *ostream, GError **err);
+       
        int                      (* import_keys) (GMimeCryptoContext *ctx, GMimeStream *istream,
                                                  GError **err);
        
        int                      (* export_keys) (GMimeCryptoContext *ctx, const char *keys[],
                                                  GMimeStream *ostream, GError **err);
-       
-       gboolean                 (* get_retrieve_session_key) (GMimeCryptoContext *ctx);
-       
-       int                      (* set_retrieve_session_key) (GMimeCryptoContext *ctx,
-                                                              gboolean retrieve_session_key,
-                                                              GError **err);
 
        gboolean                 (* get_always_trust) (GMimeCryptoContext *ctx);
        void                     (* set_always_trust) (GMimeCryptoContext *ctx, gboolean always_trust);
@@ -156,18 +190,19 @@ int g_mime_crypto_context_sign (GMimeCryptoContext *ctx, gboolean detach,
                                GMimeStream *istream, GMimeStream *ostream,
                                GError **err);
 
-GMimeSignatureList *g_mime_crypto_context_verify (GMimeCryptoContext *ctx, GMimeDigestAlgo digest,
-                                                 GMimeStream *istream, GMimeStream *sigstream,
-                                                 GError **err);
+GMimeSignatureList *g_mime_crypto_context_verify (GMimeCryptoContext *ctx, GMimeVerifyFlags flags,
+                                                 GMimeDigestAlgo digest, GMimeStream *istream,
+                                                 GMimeStream *sigstream, GError **err);
 
 int g_mime_crypto_context_encrypt (GMimeCryptoContext *ctx, gboolean sign,
                                   const char *userid, GMimeDigestAlgo digest,
-                                  GPtrArray *recipients, GMimeStream *istream,
-                                  GMimeStream *ostream, GError **err);
+                                  GMimeEncryptFlags flags, GPtrArray *recipients,
+                                  GMimeStream *istream, GMimeStream *ostream,
+                                  GError **err);
 
-GMimeDecryptResult *g_mime_crypto_context_decrypt (GMimeCryptoContext *ctx, const char *session_key,
-                                                  GMimeStream *istream, GMimeStream *ostream,
-                                                  GError **err);
+GMimeDecryptResult *g_mime_crypto_context_decrypt (GMimeCryptoContext *ctx, GMimeDecryptFlags flags,
+                                                  const char *session_key, GMimeStream *istream,
+                                                  GMimeStream *ostream, GError **err);
 
 /* key/certificate routines */
 int g_mime_crypto_context_import_keys (GMimeCryptoContext *ctx, GMimeStream *istream, GError **err);
@@ -175,14 +210,6 @@ int g_mime_crypto_context_import_keys (GMimeCryptoContext *ctx, GMimeStream *ist
 int g_mime_crypto_context_export_keys (GMimeCryptoContext *ctx, const char *keys[],
                                       GMimeStream *ostream, GError **err);
 
-gboolean g_mime_crypto_context_get_retrieve_session_key (GMimeCryptoContext *ctx);
-int g_mime_crypto_context_set_retrieve_session_key (GMimeCryptoContext *ctx,
-                                                   gboolean retrieve_session_key,
-                                                   GError **err);
-
-gboolean g_mime_crypto_context_get_always_trust (GMimeCryptoContext *ctx);
-void g_mime_crypto_context_set_always_trust (GMimeCryptoContext *ctx, gboolean always_trust);
-
 
 /**
  * GMimeCipherAlgo:
diff --git a/gmime/gmime-gpg-context.c b/gmime/gmime-gpg-context.c
index da86e0b..58ff76c 100644
--- a/gmime/gmime-gpg-context.c
+++ b/gmime/gmime-gpg-context.c
@@ -69,8 +69,6 @@ struct _GMimeGpgContext {
        GMimeCryptoContext parent_object;
        
 #ifdef ENABLE_CRYPTO
-       gpgme_encrypt_flags_t encrypt_flags;
-       gboolean auto_key_retrieve;
        gpgme_ctx_t ctx;
 #endif
 };
@@ -88,13 +86,6 @@ static void g_mime_gpg_context_finalize (GObject *object);
 static GMimeDigestAlgo gpg_digest_id (GMimeCryptoContext *ctx, const char *name);
 static const char *gpg_digest_name (GMimeCryptoContext *ctx, GMimeDigestAlgo digest);
 
-static gboolean gpg_get_retrieve_session_key (GMimeCryptoContext *context);
-static int gpg_set_retrieve_session_key (GMimeCryptoContext *ctx, gboolean retrieve_session_key,
-                                        GError **err);
-
-static gboolean gpg_get_always_trust (GMimeCryptoContext *context);
-static void gpg_set_always_trust (GMimeCryptoContext *ctx, gboolean always_trust);
-
 static int gpg_sign (GMimeCryptoContext *ctx, gboolean detach,
                     const char *userid, GMimeDigestAlgo digest,
                     GMimeStream *istream, GMimeStream *ostream,
@@ -104,20 +95,18 @@ static const char *gpg_get_signature_protocol (GMimeCryptoContext *ctx);
 static const char *gpg_get_encryption_protocol (GMimeCryptoContext *ctx);
 static const char *gpg_get_key_exchange_protocol (GMimeCryptoContext *ctx);
 
-static GMimeSignatureList *gpg_verify (GMimeCryptoContext *ctx, GMimeDigestAlgo digest,
-                                      GMimeStream *istream, GMimeStream *sigstream,
-                                      GError **err);
+static GMimeSignatureList *gpg_verify (GMimeCryptoContext *ctx, GMimeVerifyFlags flags,
+                                      GMimeDigestAlgo digest, GMimeStream *istream,
+                                      GMimeStream *sigstream, GError **err);
 
-static int gpg_encrypt (GMimeCryptoContext *ctx, gboolean sign, const char *userid,
-                       GMimeDigestAlgo digest, GPtrArray *recipients, GMimeStream *istream,
-                       GMimeStream *ostream, GError **err);
+static int gpg_encrypt (GMimeCryptoContext *ctx, gboolean sign, const char *userid, GMimeDigestAlgo digest,
+                       GMimeEncryptFlags flags, GPtrArray *recipients, GMimeStream *istream, GMimeStream 
*ostream,
+                       GError **err);
 
-static GMimeDecryptResult *gpg_decrypt (GMimeCryptoContext *ctx, const char *session_key,
-                                       GMimeStream *istream, GMimeStream *ostream,
-                                       GError **err);
+static GMimeDecryptResult *gpg_decrypt (GMimeCryptoContext *ctx, GMimeDecryptFlags flags, const char 
*session_key,
+                                       GMimeStream *istream, GMimeStream *ostream, GError **err);
 
-static int gpg_import_keys (GMimeCryptoContext *ctx, GMimeStream *istream,
-                           GError **err);
+static int gpg_import_keys (GMimeCryptoContext *ctx, GMimeStream *istream, GError **err);
 
 static int gpg_export_keys (GMimeCryptoContext *ctx, const char *keys[],
                            GMimeStream *ostream, GError **err);
@@ -172,18 +161,12 @@ g_mime_gpg_context_class_init (GMimeGpgContextClass *klass)
        crypto_class->get_signature_protocol = gpg_get_signature_protocol;
        crypto_class->get_encryption_protocol = gpg_get_encryption_protocol;
        crypto_class->get_key_exchange_protocol = gpg_get_key_exchange_protocol;
-       crypto_class->get_retrieve_session_key = gpg_get_retrieve_session_key;
-       crypto_class->set_retrieve_session_key = gpg_set_retrieve_session_key;
-       crypto_class->get_always_trust = gpg_get_always_trust;
-       crypto_class->set_always_trust = gpg_set_always_trust;
 }
 
 static void
 g_mime_gpg_context_init (GMimeGpgContext *gpg, GMimeGpgContextClass *klass)
 {
 #ifdef ENABLE_CRYPTO
-       gpg->auto_key_retrieve = FALSE;
-       gpg->encrypt_flags = 0;
        gpg->ctx = NULL;
 #endif
 }
@@ -611,9 +594,8 @@ gpg_get_signatures (GMimeGpgContext *gpg, gboolean verify)
 #endif /* ENABLE_CRYPTO */
 
 static GMimeSignatureList *
-gpg_verify (GMimeCryptoContext *context, GMimeDigestAlgo digest,
-           GMimeStream *istream, GMimeStream *sigstream,
-           GError **err)
+gpg_verify (GMimeCryptoContext *context, GMimeVerifyFlags flags, GMimeDigestAlgo digest,
+           GMimeStream *istream, GMimeStream *sigstream, GError **err)
 {
 #ifdef ENABLE_CRYPTO
        GMimeGpgContext *gpg = (GMimeGpgContext *) context;
@@ -636,6 +618,8 @@ gpg_verify (GMimeCryptoContext *context, GMimeDigestAlgo digest,
                signature = NULL;
        }
        
+       // FIXME: enable auto-key-retrieve
+       
        if ((error = gpgme_op_verify (gpg->ctx, signature, message, NULL)) != GPG_ERR_NO_ERROR) {
                g_set_error (err, GMIME_GPGME_ERROR, error, _("Could not verify gpg signature"));
                if (signature)
@@ -675,18 +659,22 @@ key_list_free (gpgme_key_t *keys)
 #endif /* ENABLE_CRYPTO */
 
 static int
-gpg_encrypt (GMimeCryptoContext *context, gboolean sign, const char *userid,
-            GMimeDigestAlgo digest, GPtrArray *recipients, GMimeStream *istream,
-            GMimeStream *ostream, GError **err)
+gpg_encrypt (GMimeCryptoContext *context, gboolean sign, const char *userid, GMimeDigestAlgo digest,
+            GMimeEncryptFlags flags, GPtrArray *recipients, GMimeStream *istream, GMimeStream *ostream,
+            GError **err)
 {
 #ifdef ENABLE_CRYPTO
        GMimeGpgContext *gpg = (GMimeGpgContext *) context;
+       gpgme_encrypt_flags_t encrypt_flags = 0;
        gpgme_data_t input, output;
        gpgme_error_t error;
        gpgme_key_t *rcpts;
        gpgme_key_t key;
        guint i;
        
+       if (flags & GMIME_ENCRYPT_FLAGS_ALWAYS_TRUST)
+               encrypt_flags |= GPGME_ENCRYPT_ALWAYS_TRUST;
+       
        /* create an array of recipient keys for GpgMe */
        rcpts = g_new0 (gpgme_key_t, recipients->len + 1);
        for (i = 0; i < recipients->len; i++) {
@@ -720,11 +708,11 @@ gpg_encrypt (GMimeCryptoContext *context, gboolean sign, const char *userid,
                        return -1;
                }
                
-               error = gpgme_op_encrypt_sign (gpg->ctx, rcpts, gpg->encrypt_flags, input, output);
+               error = gpgme_op_encrypt_sign (gpg->ctx, rcpts, encrypt_flags, input, output);
                
                gpgme_signers_clear (gpg->ctx);
        } else {
-               error = gpgme_op_encrypt (gpg->ctx, rcpts, gpg->encrypt_flags, input, output);
+               error = gpgme_op_encrypt (gpg->ctx, rcpts, encrypt_flags, input, output);
        }
        
        gpgme_data_release (output);
@@ -781,9 +769,8 @@ gpg_get_decrypt_result (GMimeGpgContext *gpg)
 #endif /* ENABLE_CRYPTO */
 
 static GMimeDecryptResult *
-gpg_decrypt (GMimeCryptoContext *context, const char *session_key,
-            GMimeStream *istream, GMimeStream *ostream,
-            GError **err)
+gpg_decrypt (GMimeCryptoContext *context, GMimeDecryptFlags flags, const char *session_key,
+            GMimeStream *istream, GMimeStream *ostream, GError **err)
 {
 #ifdef ENABLE_CRYPTO
        GMimeGpgContext *gpg = (GMimeGpgContext *) context;
@@ -803,18 +790,33 @@ gpg_decrypt (GMimeCryptoContext *context, const char *session_key,
                return NULL;
        }
        
-       gpgme_set_ctx_flag (gpg->ctx, "override-session-key", session_key);
+       if (flags & GMIME_DECRYPT_FLAGS_EXPORT_SESSION_KEY)
+               gpgme_set_ctx_flag (gpg->ctx, "export-session-key", "1");
+       
+       if (session_key)
+               gpgme_set_ctx_flag (gpg->ctx, "override-session-key", session_key);
        
        /* decrypt the input stream */
        if ((error = gpgme_op_decrypt_verify (gpg->ctx, input, output)) != GPG_ERR_NO_ERROR) {
                g_set_error (err, GMIME_GPGME_ERROR, error, _("Decryption failed"));
-               gpgme_set_ctx_flag (gpg->ctx, "override-session-key", NULL);
+               
+               if (flags & GMIME_DECRYPT_FLAGS_EXPORT_SESSION_KEY)
+                       gpgme_set_ctx_flag (gpg->ctx, "export-session-key", "0");
+               
+               if (session_key)
+                       gpgme_set_ctx_flag (gpg->ctx, "override-session-key", NULL);
+               
                gpgme_data_release (output);
                gpgme_data_release (input);
                return NULL;
        }
        
-       gpgme_set_ctx_flag (gpg->ctx, "override-session-key", NULL);
+       if (flags & GMIME_DECRYPT_FLAGS_EXPORT_SESSION_KEY)
+               gpgme_set_ctx_flag (gpg->ctx, "export-session-key", "0");
+       
+       if (session_key)
+               gpgme_set_ctx_flag (gpg->ctx, "override-session-key", NULL);
+       
        gpgme_data_release (output);
        gpgme_data_release (input);
        
@@ -888,68 +890,6 @@ gpg_export_keys (GMimeCryptoContext *context, const char *keys[], GMimeStream *o
 #endif /* ENABLE_CRYPTO */
 }
 
-static gboolean
-gpg_get_retrieve_session_key (GMimeCryptoContext *context)
-{
-#ifdef ENABLE_CRYPTO
-       GMimeGpgContext *ctx = (GMimeGpgContext *) context;
-       const char *value;
-       
-       value = gpgme_get_ctx_flag (ctx->ctx, "export-session-key");
-       
-       return value && *value && *value != '0';
-#else
-       return FALSE;
-#endif /* ENABLE_CRYPTO */
-}
-
-
-static int
-gpg_set_retrieve_session_key (GMimeCryptoContext *context, gboolean retrieve_session_key, GError **err)
-{
-#ifdef ENABLE_CRYPTO
-       GMimeGpgContext *ctx = (GMimeGpgContext *) context;
-       gpgme_error_t error;
-       
-       if ((error = gpgme_set_ctx_flag (ctx->ctx, "export-session-key", retrieve_session_key ? "1" : "0")) 
!= 0) {
-               g_set_error (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED,
-                            _("Session key retrieval is not supported by this crypto context"));
-               return -1;
-       }
-       
-       return 0;
-#else
-       g_set_error (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED,
-                    _("Session key retrieval is not supported by this crypto context"));
-       return -1;
-#endif /* ENABLE_CRYPTO */
-}
-
-static gboolean
-gpg_get_always_trust (GMimeCryptoContext *context)
-{
-#ifdef ENABLE_CRYPTO
-       GMimeGpgContext *gpg = (GMimeGpgContext *) context;
-       
-       return (gpg->encrypt_flags & GPGME_ENCRYPT_ALWAYS_TRUST) != 0;
-#else
-       return FALSE;
-#endif /* ENABLE_CRYPTO */
-}
-
-static void
-gpg_set_always_trust (GMimeCryptoContext *context, gboolean always_trust)
-{
-#ifdef ENABLE_CRYPTO
-       GMimeGpgContext *gpg = (GMimeGpgContext *) context;
-       
-       if (always_trust)
-               gpg->encrypt_flags |= GPGME_ENCRYPT_ALWAYS_TRUST;
-       else
-               gpg->encrypt_flags &= ~GPGME_ENCRYPT_ALWAYS_TRUST;
-#endif /* ENABLE_CRYPTO */
-}
-
 
 /**
  * g_mime_gpg_context_new:
@@ -984,39 +924,3 @@ g_mime_gpg_context_new (void)
        return NULL;
 #endif /* ENABLE_CRYPTO */
 }
-
-
-/**
- * g_mime_gpg_context_get_auto_key_retrieve:
- * @ctx: a #GMimeGpgContext
- *
- * Gets whether or not gpg should auto-retrieve keys from a keyserver
- * when verifying signatures.
- *
- * Returns: %TRUE if gpg should auto-retrieve keys from a keyserver or
- * %FALSE otherwise.
- **/
-gboolean
-g_mime_gpg_context_get_auto_key_retrieve (GMimeGpgContext *ctx)
-{
-       g_return_val_if_fail (GMIME_IS_GPG_CONTEXT (ctx), FALSE);
-       
-       return ctx->auto_key_retrieve;
-}
-
-
-/**
- * g_mime_gpg_context_set_auto_key_retrieve:
- * @ctx: a #GMimeGpgContext
- * @auto_key_retrieve: %TRUE if gpg should auto-retrieve keys from a keys server
- *
- * Sets whether or not gpg should auto-retrieve keys from a keyserver
- * when verifying signatures.
- **/
-void
-g_mime_gpg_context_set_auto_key_retrieve (GMimeGpgContext *ctx, gboolean auto_key_retrieve)
-{
-       g_return_if_fail (GMIME_IS_GPG_CONTEXT (ctx));
-       
-       ctx->auto_key_retrieve = auto_key_retrieve;
-}
diff --git a/gmime/gmime-gpg-context.h b/gmime/gmime-gpg-context.h
index 6b255d6..bf1b2dd 100644
--- a/gmime/gmime-gpg-context.h
+++ b/gmime/gmime-gpg-context.h
@@ -39,12 +39,8 @@ typedef struct _GMimeGpgContextClass GMimeGpgContextClass;
 
 GType g_mime_gpg_context_get_type (void);
 
-
 GMimeCryptoContext *g_mime_gpg_context_new (void);
 
-gboolean g_mime_gpg_context_get_auto_key_retrieve (GMimeGpgContext *ctx);
-void g_mime_gpg_context_set_auto_key_retrieve (GMimeGpgContext *ctx, gboolean auto_key_retrieve);
-
 G_END_DECLS
 
 #endif /* __GMIME_GPG_CONTEXT_H__ */
diff --git a/gmime/gmime-multipart-encrypted.c b/gmime/gmime-multipart-encrypted.c
index f0765a7..4125b45 100644
--- a/gmime/gmime-multipart-encrypted.c
+++ b/gmime/gmime-multipart-encrypted.c
@@ -144,6 +144,7 @@ g_mime_multipart_encrypted_new (void)
  * @sign: %TRUE if the content should also be signed or %FALSE otherwise
  * @userid: user id to use for signing (only used if @sign is %TRUE)
  * @digest: digest algorithm to use when signing
+ * @flags: a #GMimeEncryptFlags
  * @recipients: (element-type utf8): an array of recipients to encrypt to
  * @err: a #GError
  *
@@ -158,8 +159,8 @@ g_mime_multipart_encrypted_new (void)
  **/
 int
 g_mime_multipart_encrypted_encrypt (GMimeMultipartEncrypted *mpe, GMimeObject *content,
-                                   GMimeCryptoContext *ctx, gboolean sign,
-                                   const char *userid, GMimeDigestAlgo digest,
+                                   GMimeCryptoContext *ctx, gboolean sign, const char *userid,
+                                   GMimeDigestAlgo digest, GMimeEncryptFLags flags,
                                    GPtrArray *recipients, GError **err)
 {
        GMimeParserOptions *options = g_mime_parser_options_get_default ();
@@ -196,7 +197,7 @@ g_mime_multipart_encrypted_encrypt (GMimeMultipartEncrypted *mpe, GMimeObject *c
        
        /* encrypt the content stream */
        ciphertext = g_mime_stream_mem_new ();
-       if (g_mime_crypto_context_encrypt (ctx, sign, userid, digest, recipients, stream, ciphertext, err) == 
-1) {
+       if (g_mime_crypto_context_encrypt (ctx, sign, userid, digest, flags, recipients, stream, ciphertext, 
err) == -1) {
                g_object_unref (ciphertext);
                g_object_unref (stream);
                return -1;
@@ -272,6 +273,7 @@ g_mime_data_wrapper_get_decoded_stream (GMimeDataWrapper *wrapper)
 /**
  * g_mime_multipart_encrypted_decrypt:
  * @mpe: multipart/encrypted object
+ * @flags: a #GMimeDecryptFlags
  * @session_key: session key to use or %NULL
  * @result: a #GMimeDecryptionResult
  * @err: a #GError
@@ -294,8 +296,9 @@ g_mime_data_wrapper_get_decoded_stream (GMimeDataWrapper *wrapper)
  * @err to provide information as to why the failure occured.
  **/
 GMimeObject *
-g_mime_multipart_encrypted_decrypt (GMimeMultipartEncrypted *mpe, const char *session_key,
-                                   GMimeDecryptResult **result, GError **err)
+g_mime_multipart_encrypted_decrypt (GMimeMultipartEncrypted *mpe, GMimeDecryptFLags flags,
+                                   const char *session_key, GMimeDecryptResult **result,
+                                   GError **err)
 {
        GMimeObject *decrypted, *version, *encrypted;
        GMimeStream *stream, *ciphertext;
@@ -379,7 +382,7 @@ g_mime_multipart_encrypted_decrypt (GMimeMultipartEncrypted *mpe, const char *se
        g_object_unref (crlf_filter);
        
        /* get the cleartext */
-       if (!(res = g_mime_crypto_context_decrypt (ctx, session_key, ciphertext, filtered_stream, err))) {
+       if (!(res = g_mime_crypto_context_decrypt (ctx, flags, session_key, ciphertext, filtered_stream, 
err))) {
                g_object_unref (filtered_stream);
                g_object_unref (ciphertext);
                g_object_unref (stream);
diff --git a/gmime/gmime-multipart-encrypted.h b/gmime/gmime-multipart-encrypted.h
index ebbe7b3..4a7f6d9 100644
--- a/gmime/gmime-multipart-encrypted.h
+++ b/gmime/gmime-multipart-encrypted.h
@@ -67,9 +67,11 @@ GMimeMultipartEncrypted *g_mime_multipart_encrypted_new (void);
 int g_mime_multipart_encrypted_encrypt (GMimeMultipartEncrypted *mpe, GMimeObject *content,
                                        GMimeCryptoContext *ctx, gboolean sign,
                                        const char *userid, GMimeDigestAlgo digest,
-                                       GPtrArray *recipients, GError **err);
+                                       GMimeEncryptFlags flags, GPtrArray *recipients,
+                                       GError **err);
 
 GMimeObject *g_mime_multipart_encrypted_decrypt (GMimeMultipartEncrypted *mpe,
+                                                GMimeDecryptFlags flags,
                                                 const char *session_key,
                                                 GMimeDecryptResult **result,
                                                 GError **err);
diff --git a/gmime/gmime-multipart-signed.c b/gmime/gmime-multipart-signed.c
index e667351..9ffaf74 100644
--- a/gmime/gmime-multipart-signed.c
+++ b/gmime/gmime-multipart-signed.c
@@ -359,6 +359,7 @@ check_protocol_supported (const char *protocol, const char *supported)
 /**
  * g_mime_multipart_signed_verify:
  * @mps: multipart/signed object
+ * @flags: a #GMimeVerifyFlags
  * @err: exception
  *
  * Attempts to verify the signed MIME part contained within the
@@ -370,7 +371,7 @@ check_protocol_supported (const char *protocol, const char *supported)
  * occured.
  **/
 GMimeSignatureList *
-g_mime_multipart_signed_verify (GMimeMultipartSigned *mps, GError **err)
+g_mime_multipart_signed_verify (GMimeMultipartSigned *mps, GMimeVerifyFlags flags, GError **err)
 {
        const char *supported, *protocol, *micalg;
        GMimeObject *content, *signature;
@@ -469,7 +470,7 @@ g_mime_multipart_signed_verify (GMimeMultipartSigned *mps, GError **err)
        
        /* verify the signature */
        digest = g_mime_crypto_context_digest_id (ctx, micalg);
-       signatures = g_mime_crypto_context_verify (ctx, digest, stream, sigstream, err);
+       signatures = g_mime_crypto_context_verify (ctx, flags, digest, stream, sigstream, err);
        
        d(printf ("attempted to verify:\n----- BEGIN SIGNED PART -----\n%.*s----- END SIGNED PART -----\n",
                  (int) GMIME_STREAM_MEM (stream)->buffer->len, GMIME_STREAM_MEM (stream)->buffer->data));
diff --git a/gmime/gmime-multipart-signed.h b/gmime/gmime-multipart-signed.h
index 5ccd1cc..4cfbb55 100644
--- a/gmime/gmime-multipart-signed.h
+++ b/gmime/gmime-multipart-signed.h
@@ -68,7 +68,7 @@ int g_mime_multipart_signed_sign (GMimeMultipartSigned *mps, GMimeObject *conten
                                  GMimeCryptoContext *ctx, const char *userid,
                                  GMimeDigestAlgo digest, GError **err);
 
-GMimeSignatureList *g_mime_multipart_signed_verify (GMimeMultipartSigned *mps, GError **err);
+GMimeSignatureList *g_mime_multipart_signed_verify (GMimeMultipartSigned *mps, GMimeVerifyFlags flags, 
GError **err);
 
 G_END_DECLS
 
diff --git a/gmime/gmime-pkcs7-context.c b/gmime/gmime-pkcs7-context.c
index 86f860d..4e5f751 100644
--- a/gmime/gmime-pkcs7-context.c
+++ b/gmime/gmime-pkcs7-context.c
@@ -69,7 +69,6 @@ struct _GMimePkcs7Context {
        GMimeCryptoContext parent_object;
        
 #ifdef ENABLE_CRYPTO
-       gpgme_encrypt_flags_t encrypt_flags;
        gpgme_ctx_t ctx;
 #endif
 };
@@ -86,13 +85,6 @@ static void g_mime_pkcs7_context_finalize (GObject *object);
 static GMimeDigestAlgo pkcs7_digest_id (GMimeCryptoContext *ctx, const char *name);
 static const char *pkcs7_digest_name (GMimeCryptoContext *ctx, GMimeDigestAlgo digest);
 
-static gboolean pkcs7_get_retrieve_session_key (GMimeCryptoContext *context);
-static int pkcs7_set_retrieve_session_key (GMimeCryptoContext *ctx, gboolean retrieve_session_key,
-                                          GError **err);
-
-static gboolean pkcs7_get_always_trust (GMimeCryptoContext *context);
-static void pkcs7_set_always_trust (GMimeCryptoContext *ctx, gboolean always_trust);
-
 static const char *pkcs7_get_signature_protocol (GMimeCryptoContext *ctx);
 static const char *pkcs7_get_encryption_protocol (GMimeCryptoContext *ctx);
 static const char *pkcs7_get_key_exchange_protocol (GMimeCryptoContext *ctx);
@@ -102,20 +94,18 @@ static int pkcs7_sign (GMimeCryptoContext *ctx, gboolean detach,
                       GMimeStream *istream, GMimeStream *ostream,
                       GError **err);
        
-static GMimeSignatureList *pkcs7_verify (GMimeCryptoContext *ctx, GMimeDigestAlgo digest,
-                                        GMimeStream *istream, GMimeStream *sigstream,
-                                        GError **err);
+static GMimeSignatureList *pkcs7_verify (GMimeCryptoContext *ctx, GMimeVerifyFlags flags,
+                                        GMimeDigestAlgo digest, GMimeStream *istream,
+                                        GMimeStream *sigstream, GError **err);
 
-static int pkcs7_encrypt (GMimeCryptoContext *ctx, gboolean sign, const char *userid,
-                         GMimeDigestAlgo digest, GPtrArray *recipients, GMimeStream *istream,
+static int pkcs7_encrypt (GMimeCryptoContext *ctx, gboolean sign, const char *userid, GMimeDigestAlgo digest,
+                         GMimeEncryptFlags flags, GPtrArray *recipients, GMimeStream *istream,
                          GMimeStream *ostream, GError **err);
 
-static GMimeDecryptResult *pkcs7_decrypt (GMimeCryptoContext *ctx, const char *session_key,
-                                         GMimeStream *istream, GMimeStream *ostream,
-                                         GError **err);
+static GMimeDecryptResult *pkcs7_decrypt (GMimeCryptoContext *ctx, GMimeDecryptFlags flags, const char 
*session_key,
+                                         GMimeStream *istream, GMimeStream *ostream, GError **err);
 
-static int pkcs7_import_keys (GMimeCryptoContext *ctx, GMimeStream *istream,
-                             GError **err);
+static int pkcs7_import_keys (GMimeCryptoContext *ctx, GMimeStream *istream, GError **err);
 
 static int pkcs7_export_keys (GMimeCryptoContext *ctx, const char *keys[],
                              GMimeStream *ostream, GError **err);
@@ -170,17 +160,12 @@ g_mime_pkcs7_context_class_init (GMimePkcs7ContextClass *klass)
        crypto_class->get_signature_protocol = pkcs7_get_signature_protocol;
        crypto_class->get_encryption_protocol = pkcs7_get_encryption_protocol;
        crypto_class->get_key_exchange_protocol = pkcs7_get_key_exchange_protocol;
-       crypto_class->get_retrieve_session_key = pkcs7_get_retrieve_session_key;
-       crypto_class->set_retrieve_session_key = pkcs7_set_retrieve_session_key;
-       crypto_class->get_always_trust = pkcs7_get_always_trust;
-       crypto_class->set_always_trust = pkcs7_set_always_trust;
 }
 
 static void
 g_mime_pkcs7_context_init (GMimePkcs7Context *pkcs7, GMimePkcs7ContextClass *klass)
 {
 #ifdef ENABLE_CRYPTO
-       pkcs7->encrypt_flags = 0;
        pkcs7->ctx = NULL;
 #endif
 }
@@ -603,9 +588,8 @@ pkcs7_get_signatures (GMimePkcs7Context *pkcs7, gboolean verify)
 #endif /* ENABLE_CRYPTO */
 
 static GMimeSignatureList *
-pkcs7_verify (GMimeCryptoContext *context, GMimeDigestAlgo digest,
-             GMimeStream *istream, GMimeStream *sigstream,
-             GError **err)
+pkcs7_verify (GMimeCryptoContext *context, GMimeVerifyFlags flags, GMimeDigestAlgo digest,
+             GMimeStream *istream, GMimeStream *sigstream, GError **err)
 {
 #ifdef ENABLE_CRYPTO
        GMimePkcs7Context *pkcs7 = (GMimePkcs7Context *) context;
@@ -628,6 +612,8 @@ pkcs7_verify (GMimeCryptoContext *context, GMimeDigestAlgo digest,
                signature = NULL;
        }
        
+       // FIXME: enable auto-key-retrieve
+       
        if ((error = gpgme_op_verify (pkcs7->ctx, signature, message, NULL)) != GPG_ERR_NO_ERROR) {
                g_set_error (err, GMIME_GPGME_ERROR, error, _("Could not verify pkcs7 signature"));
                if (signature)
@@ -667,12 +653,13 @@ key_list_free (gpgme_key_t *keys)
 #endif /* ENABLE_CRYPTO */
 
 static int
-pkcs7_encrypt (GMimeCryptoContext *context, gboolean sign, const char *userid,
-              GMimeDigestAlgo digest, GPtrArray *recipients, GMimeStream *istream,
-              GMimeStream *ostream, GError **err)
+pkcs7_encrypt (GMimeCryptoContext *context, gboolean sign, const char *userid, GMimeDigestAlgo digest,
+              GMimeEncryptFlags flags, GPtrArray *recipients, GMimeStream *istream, GMimeStream *ostream,
+              GError **err)
 {
 #ifdef ENABLE_CRYPTO
        GMimePkcs7Context *pkcs7 = (GMimePkcs7Context *) context;
+       gpgme_encrypt_flags_t encrypt_flags = 0;
        gpgme_data_t input, output;
        gpgme_error_t error;
        gpgme_key_t *rcpts;
@@ -685,6 +672,9 @@ pkcs7_encrypt (GMimeCryptoContext *context, gboolean sign, const char *userid,
                return -1;
        }
        
+       if (flags & GMIME_ENCRYPT_FLAGS_ALWAYS_TRUST)
+               encrypt_flags |= GPGME_ENCRYPT_ALWAYS_TRUST;
+       
        /* create an array of recipient keys for GpgMe */
        rcpts = g_new0 (gpgme_key_t, recipients->len + 1);
        for (i = 0; i < recipients->len; i++) {
@@ -710,7 +700,7 @@ pkcs7_encrypt (GMimeCryptoContext *context, gboolean sign, const char *userid,
        }
        
        /* encrypt the input stream */
-       error = gpgme_op_encrypt (pkcs7->ctx, rcpts, pkcs7->encrypt_flags, input, output);
+       error = gpgme_op_encrypt (pkcs7->ctx, rcpts, encrypt_flags, input, output);
        gpgme_data_release (output);
        gpgme_data_release (input);
        key_list_free (rcpts);
@@ -765,9 +755,8 @@ pkcs7_get_decrypt_result (GMimePkcs7Context *pkcs7)
 #endif /* ENABLE_CRYPTO */
 
 static GMimeDecryptResult *
-pkcs7_decrypt (GMimeCryptoContext *context, const char *session_key,
-              GMimeStream *istream, GMimeStream *ostream,
-              GError **err)
+pkcs7_decrypt (GMimeCryptoContext *context, GMimeDecryptFlags flags, const char *session_key,
+              GMimeStream *istream, GMimeStream *ostream, GError **err)
 {
 #ifdef ENABLE_CRYPTO
        GMimePkcs7Context *pkcs7 = (GMimePkcs7Context *) context;
@@ -787,18 +776,33 @@ pkcs7_decrypt (GMimeCryptoContext *context, const char *session_key,
                return NULL;
        }
        
-       gpgme_set_ctx_flag (pkcs7->ctx, "override-session-key", session_key);
+       if (flags & GMIME_DECRYPT_FLAGS_EXPORT_SESSION_KEY)
+               gpgme_set_ctx_flag (pkcs7->ctx, "export-session-key", "1");
+       
+       if (session_key)
+               gpgme_set_ctx_flag (pkcs7->ctx, "override-session-key", session_key);
        
        /* decrypt the input stream */
        if ((error = gpgme_op_decrypt_verify (pkcs7->ctx, input, output)) != GPG_ERR_NO_ERROR) {
                g_set_error (err, GMIME_GPGME_ERROR, error, _("Decryption failed"));
-               gpgme_set_ctx_flag (pkcs7->ctx, "override-session-key", NULL);
+               
+               if (flags & GMIME_DECRYPT_FLAGS_EXPORT_SESSION_KEY)
+                       gpgme_set_ctx_flag (pkcs7->ctx, "export-session-key", "0");
+               
+               if (session_key)
+                       gpgme_set_ctx_flag (pkcs7->ctx, "override-session-key", NULL);
+               
                gpgme_data_release (output);
                gpgme_data_release (input);
                return NULL;
        }
        
-       gpgme_set_ctx_flag (pkcs7->ctx, "override-session-key", NULL);
+       if (flags & GMIME_DECRYPT_FLAGS_EXPORT_SESSION_KEY)
+               gpgme_set_ctx_flag (pkcs7->ctx, "export-session-key", "0");
+       
+       if (session_key)
+               gpgme_set_ctx_flag (pkcs7->ctx, "override-session-key", NULL);
+       
        gpgme_data_release (output);
        gpgme_data_release (input);
        
@@ -873,71 +877,6 @@ pkcs7_export_keys (GMimeCryptoContext *context, const char *keys[], GMimeStream
 }
 
 
-static gboolean
-pkcs7_get_retrieve_session_key (GMimeCryptoContext *context)
-{
-#ifdef ENABLE_CRYPTO
-       GMimePkcs7Context *ctx = (GMimePkcs7Context *) context;
-       const char *value;
-       
-       value = gpgme_get_ctx_flag (ctx->ctx, "export-session-key");
-       
-       return value && *value && *value != '0';
-#else
-       return FALSE;
-#endif /* ENABLE_CRYPTO */
-}
-
-
-static int
-pkcs7_set_retrieve_session_key (GMimeCryptoContext *context, gboolean retrieve_session_key, GError **err)
-{
-#ifdef ENABLE_CRYPTO
-       GMimePkcs7Context *ctx = (GMimePkcs7Context *) context;
-       gpgme_error_t error;
-       
-       if ((error = gpgme_set_ctx_flag (ctx->ctx, "export-session-key", retrieve_session_key ? "1" : "0")) 
!= 0) {
-               g_set_error (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED,
-                            _("Session key retrieval is not supported by this crypto context"));
-               return -1;
-       }
-       
-       return 0;
-#else
-       g_set_error (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED,
-                    _("Session key retrieval is not supported by this crypto context"));
-       return -1;
-#endif /* ENABLE_CRYPTO */
-}
-
-
-static gboolean
-pkcs7_get_always_trust (GMimeCryptoContext *context)
-{
-#ifdef ENABLE_CRYPTO
-       GMimePkcs7Context *pkcs7 = (GMimePkcs7Context *) context;
-       
-       return (pkcs7->encrypt_flags & GPGME_ENCRYPT_ALWAYS_TRUST) != 0;
-#else
-       return FALSE;
-#endif /* ENABLE_CRYPTO */
-}
-
-
-static void
-pkcs7_set_always_trust (GMimeCryptoContext *context, gboolean always_trust)
-{
-#ifdef ENABLE_CRYPTO
-       GMimePkcs7Context *pkcs7 = (GMimePkcs7Context *) context;
-       
-       if (always_trust)
-               pkcs7->encrypt_flags |= GPGME_ENCRYPT_ALWAYS_TRUST;
-       else
-               pkcs7->encrypt_flags &= ~GPGME_ENCRYPT_ALWAYS_TRUST;
-#endif /* ENABLE_CRYPTO */
-}
-
-
 /**
  * g_mime_pkcs7_context_new:
  *
diff --git a/gmime/gmime-pkcs7-context.h b/gmime/gmime-pkcs7-context.h
index 34a2352..54b045d 100644
--- a/gmime/gmime-pkcs7-context.h
+++ b/gmime/gmime-pkcs7-context.h
@@ -40,9 +40,6 @@ GType g_mime_pkcs7_context_get_type (void);
 
 GMimeCryptoContext *g_mime_pkcs7_context_new (void);
 
-gboolean g_mime_pkcs7_context_get_always_trust (GMimePkcs7Context *ctx);
-void g_mime_pkcs7_context_set_always_trust (GMimePkcs7Context *ctx, gboolean always_trust);
-
 G_END_DECLS
 
 #endif /* __GMIME_PKCS7_CONTEXT_H__ */


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