summaryrefslogblamecommitdiffstats
path: root/source/xap/pan/patches/0001-e5be4d4a1d9d08796c1b5a5c763379383b8c119a.patch
blob: 4cd6de196bdc66abb03e19dd8cb5b76c0f7c0ab4 (plain) (tree)






















































































































































































































                                                                                                                        
From e5be4d4a1d9d08796c1b5a5c763379383b8c119a Mon Sep 17 00:00:00 2001
From: Detlef Graef <detlef.graef@yahoo.de>
Date: Fri, 19 Apr 2019 15:12:27 +0200
Subject: [PATCH] Fix to build Pan with options --with-gmime30 and
 --with-gmime-crypto

---
 pan/usenet-utils/gpg.cc        | 76 ++++++++++++++++++++++++++--------
 pan/usenet-utils/mime-utils.cc | 35 ++++++++++++++++
 2 files changed, 94 insertions(+), 17 deletions(-)

diff --git a/pan/usenet-utils/gpg.cc b/pan/usenet-utils/gpg.cc
index f24e723..4df4525 100644
--- a/pan/usenet-utils/gpg.cc
+++ b/pan/usenet-utils/gpg.cc
@@ -70,6 +70,45 @@ namespace pan
       signer.key_id = sig->cert->keyid ? sig->cert->keyid : "(null)";
       signer.fpr = sig->cert->fingerprint ? sig->cert->fingerprint : "(null)";
 
+#ifdef HAVE_GMIME_30
+      switch (sig->cert->trust) {
+      case GMIME_TRUST_UNKNOWN:
+        signer.trust = "None";
+        break;
+      case GMIME_TRUST_NEVER:
+        signer.trust = "Never";
+        break;
+      case GMIME_TRUST_UNDEFINED:
+        signer.trust = "Undefined";
+        break;
+      case GMIME_TRUST_MARGINAL:
+        signer.trust = "Marginal";
+        break;
+      case GMIME_TRUST_FULL:
+        signer.trust = "Fully";
+        break;
+      case GMIME_TRUST_ULTIMATE:
+        signer.trust = "Ultimate";
+        break;
+      }
+
+      switch (sig->status) {
+      case GMIME_SIGNATURE_STATUS_GREEN:
+        signer.status = "GOOD";
+        break;
+      case GMIME_SIGNATURE_STATUS_RED:
+        signer.status = "BAD";
+        break;
+      case GMIME_SIGNATURE_STATUS_SYS_ERROR:
+        signer.status = "ERROR";
+        break;
+      }
+
+      signer.created = sig->created;
+      signer.expires = sig->expires;
+      if (sig->expires == (time_t) 0)
+        signer.never_expires = true;
+#else
       switch (sig->cert->trust) {
       case GMIME_CERTIFICATE_TRUST_NONE:
         signer.trust = "None";
@@ -102,25 +141,28 @@ namespace pan
         signer.status = "ERROR";
         break;
       }
+#endif
 
       signer.created = sig->created;
       signer.expires = sig->expires;
       if (sig->expires == (time_t) 0)
         signer.never_expires = true;
 
-      if (sig->errors) {
-
-        if (sig->errors & GMIME_SIGNATURE_ERROR_EXPSIG)
-          signer.error = "Expired";
-        if (sig->errors & GMIME_SIGNATURE_ERROR_NO_PUBKEY)
-          signer.error = "No Pub Key";
-        if (sig->errors & GMIME_SIGNATURE_ERROR_EXPKEYSIG)
-          signer.error = "Key Expired";
-        if (sig->errors & GMIME_SIGNATURE_ERROR_REVKEYSIG)
-          signer.error = "Key Revoked";
-      } else {
-          signer.error = "No errors for this signer";
-      }
+// https://developer.gnome.org/gmime/stable/gmime-changes-3-0.html
+// GMimeSignatureStatus and GMimeSignatureErrors have been merged into a single bitfield (GMimeSignatureStatus) ...
+//      if (sig->errors) {
+
+//        if (sig->errors & GMIME_SIGNATURE_ERROR_EXPSIG)
+//          signer.error = "Expired";
+//        if (sig->errors & GMIME_SIGNATURE_ERROR_NO_PUBKEY)
+//          signer.error = "No Pub Key";
+//        if (sig->errors & GMIME_SIGNATURE_ERROR_EXPKEYSIG)
+//          signer.error = "Key Expired";
+//        if (sig->errors & GMIME_SIGNATURE_ERROR_REVKEYSIG)
+//          signer.error = "Key Revoked";
+//      } else {
+//          signer.error = "No errors for this signer";
+//      }
 
       info.signers.push_back(signer);
     }
@@ -128,11 +170,11 @@ namespace pan
 
   void init_gpg()
   {
-    gpg_ctx = g_mime_gpg_context_new (request_passwd, "gpg2");
+//    gpg_ctx = g_mime_gpg_context_new (request_passwd, "gpg2");
     if (!gpg_ctx) gpg_inited = false; else gpg_inited = true;
-    g_mime_gpg_context_set_auto_key_retrieve(GMIME_GPG_CONTEXT(gpg_ctx),true);
-    g_mime_gpg_context_set_always_trust(GMIME_GPG_CONTEXT(gpg_ctx),false);
-    g_mime_gpg_context_set_use_agent(GMIME_GPG_CONTEXT(gpg_ctx), false);
+//    g_mime_gpg_context_set_auto_key_retrieve(GMIME_GPG_CONTEXT(gpg_ctx),true);
+//    g_mime_gpg_context_set_always_trust(GMIME_GPG_CONTEXT(gpg_ctx),false);
+//    g_mime_gpg_context_set_use_agent(GMIME_GPG_CONTEXT(gpg_ctx), false);
   }
 
 
diff --git a/pan/usenet-utils/mime-utils.cc b/pan/usenet-utils/mime-utils.cc
index 135f469..881df7b 100644
--- a/pan/usenet-utils/mime-utils.cc
+++ b/pan/usenet-utils/mime-utils.cc
@@ -1634,12 +1634,20 @@ namespace pan
   GMimeSignatureStatus
   get_sig_status (GMimeSignatureList *signatures)
   {
+#ifdef HAVE_GMIME_30
+	GMimeSignatureStatus status = GMIME_SIGNATURE_STATUS_VALID;
+#else
     GMimeSignatureStatus status = GMIME_SIGNATURE_STATUS_GOOD;
+#endif
     GMimeSignature *sig;
     int i;
 
     if (!signatures || signatures->array->len == 0)
+#ifdef HAVE_GMIME_30
+      return GMIME_SIGNATURE_STATUS_SYS_ERROR;
+#else
       return GMIME_SIGNATURE_STATUS_ERROR;
+#endif
 
     for (i = 0; i < g_mime_signature_list_length (signatures); i++) {
       sig = g_mime_signature_list_get_signature (signatures, i);
@@ -1673,18 +1681,30 @@ namespace pan
 
     if (info.type == GPG_VERIFY)
     {
+#ifdef HAVE_GMIME_30
+      GMimeSignatureList * sigs = g_mime_multipart_signed_verify (mps, GMIME_VERIFY_NONE, &info.err);
+#else
       GMimeSignatureList * sigs = g_mime_multipart_signed_verify (mps, gpg_ctx, &info.err);
+#endif
       if (info.err || !sigs) return false;
       if (sigs) info.no_sigs = false;
       fill_signer_info(info.signers, sigs);
+#ifdef HAVE_GMIME_30
+      bool status = get_sig_status(sigs) == GMIME_SIGNATURE_STATUS_VALID;
+#else
       bool status = get_sig_status(sigs) == GMIME_SIGNATURE_STATUS_GOOD;
+#endif
       g_object_unref(sigs);
       return status;
     }
 
     if (info.type == GPG_DECODE)
     {
+#ifdef HAVE_GMIME_30
+      info.decrypted = g_mime_multipart_encrypted_decrypt (mpe, GMIME_DECRYPT_NONE, NULL, &info.result, &info.err);
+#else
       info.decrypted = g_mime_multipart_encrypted_decrypt (mpe, gpg_ctx, &info.result, &info.err);
+#endif
       if (!info.decrypted)
         if (info.err) return false;
 
@@ -1693,7 +1713,11 @@ namespace pan
       {
         info.no_sigs = false;
         fill_signer_info(info.signers, sigs);
+#ifdef HAVE_GMIME_30
+        bool status = get_sig_status(info.result->signatures) == GMIME_SIGNATURE_STATUS_VALID;
+#else
         bool status = get_sig_status(info.result->signatures) == GMIME_SIGNATURE_STATUS_GOOD;
+#endif
         g_object_unref(sigs);
         return status;
       }
@@ -1722,7 +1746,13 @@ namespace pan
     mps = g_mime_multipart_signed_new ();
 
     /* sign the part */
+#ifdef HAVE_GMIME_30
+    GMimeObject *gmo;
+    gmo = g_mime_message_get_mime_part (body);
+    if (g_mime_multipart_signed_sign (gpg_ctx, gmo, uid.c_str(), &err) <0)
+#else
     if (g_mime_multipart_signed_sign (mps, GMIME_OBJECT (part), gpg_ctx, uid.c_str(), GMIME_DIGEST_ALGO_SHA1, &err) <0)
+#endif
     {
       g_object_unref(mps);
       g_object_unref(G_OBJECT(part));
@@ -1752,8 +1782,13 @@ namespace pan
 
     GMimeMultipartEncrypted * mpe = g_mime_multipart_encrypted_new();
 
+#ifdef HAVE_GMIME_30
+    if (g_mime_multipart_encrypted_encrypt(gpg_ctx, GMIME_OBJECT (part), sign, uid.c_str(),
+                                           GMIME_ENCRYPT_NONE, rcp, &err) < 0)
+#else
     if (g_mime_multipart_encrypted_encrypt(mpe, GMIME_OBJECT (part), gpg_ctx, sign,
                                            uid.c_str(), GMIME_DIGEST_ALGO_SHA1, rcp, &err) < 0)
+#endif
     {
       g_object_unref(mpe);
       g_object_unref(G_OBJECT(part));