Add decrypt permanently feature
authorAndre Heinecke <aheinecke@gnupg.org>
Fri, 22 Feb 2019 05:47:18 +0000 (06:47 +0100)
committerAndre Heinecke <aheinecke@gnupg.org>
Fri, 22 Feb 2019 05:47:18 +0000 (06:47 +0100)
* src/gpgoladdin.cpp (GpgolRibbonExtender::GetIDsOfNames),
(GpgolRibbonExtender::Invoke),
(GetCustomUI_MIME): Add decrypt permanently.
* src/mail.cpp (Mail::decryptPermanently_o): New.
* src/ribbon-callbacks.cpp (decrypt_permanently): Wire up.

src/gpgoladdin.cpp
src/mail.cpp
src/mail.h
src/ribbon-callbacks.cpp
src/ribbon-callbacks.h

index c098a0b..4cc8c75 100644 (file)
@@ -718,6 +718,7 @@ GpgolRibbonExtender::GetIDsOfNames (REFIID riid, LPOLESTR *rgszNames,
       ID_MAPPER (L"printDecrypted", ID_CMD_PRINT_DECRYPTED)
       ID_MAPPER (L"openContactKey", ID_CMD_OPEN_CONTACT_KEY)
       ID_MAPPER (L"overrideFileClose", ID_CMD_FILE_CLOSE)
+      ID_MAPPER (L"decryptPermanently", ID_CMD_DECRYPT_PERMANENTLY)
     }
 
   if (cNames > 1)
@@ -805,6 +806,8 @@ GpgolRibbonExtender::Invoke (DISPID dispid, REFIID riid, LCID lcid,
           }
       case ID_CMD_PRINT_DECRYPTED:
         return print_decrypted (parms->rgvarg[0].pdispVal);
+      case ID_CMD_DECRYPT_PERMANENTLY:
+        return decrypt_permanently (parms->rgvarg[0].pdispVal);
       case ID_GET_IS_CRYPTO_MAIL:
         return get_is_crypto_mail (parms->rgvarg[0].pdispVal, result);
       case ID_CMD_OPEN_CONTACT_KEY:
@@ -1035,6 +1038,13 @@ GetCustomUI_MIME (BSTR RibbonID, BSTR * RibbonXml)
         "           getVisible=\"getIsCrypto\""
         "           insertAfterMso=\"FilePrintQuick\""
         "   />"
+        "   <button id=\"decryptPermanentlyBtn\""
+        "           label=\"%s\""
+        "           onAction=\"decryptPermanently\""
+        "           getImage=\"btnEncryptSmall\""
+        "           getVisible=\"getIsCrypto\""
+//"           insertAfterMso=\"FilePrintQuick\""
+        "   />"
         "  </contextMenu>"
         " </contextMenus>"
         "</customUI>",
@@ -1045,7 +1055,8 @@ GetCustomUI_MIME (BSTR RibbonID, BSTR * RibbonXml)
         _("Sign"), signTTip, signSTip,
         _("Encrypt"), encryptTTip, encryptSTip,
         optsSTip,
-        _("&amp;Print decrypted")
+        _("&amp;Print decrypted"),
+        _("Permanenlty &amp;decrypt")
         );
     }
   else if (!wcscmp (RibbonID, L"Microsoft.Outlook.Explorer"))
index db137b1..40812c2 100644 (file)
@@ -3925,3 +3925,45 @@ Mail::releaseCurrentItem()
   gpgol_release (tmp);
   TRETURN;
 }
+
+void
+Mail::decryptPermanently_o()
+{
+  if (!m_needs_wipe)
+    {
+      log_debug ("%s:%s: Mail does not yet need wipe. Called to early?",
+                 SRCNAME, __func__);
+      return;
+    }
+
+  /* Drop our state variables */
+  m_decrypt_result = GpgME::DecryptionResult();
+  m_verify_result = GpgME::VerificationResult();
+  m_needs_wipe = false;
+  m_processed = false;
+  m_is_smime = false;
+  m_type = MSGTYPE_UNKNOWN;
+
+  /* Remove our own attachments */
+  removeOurAttachments_o ();
+
+  updateSigstate();
+
+  removeCategories_o ();
+
+  auto msg = MAKE_SHARED (get_oom_base_message (m_mailitem));
+  if (!msg)
+    {
+      STRANGEPOINT;
+      return;
+    }
+  mapi_delete_gpgol_tags ((LPMESSAGE)msg.get());
+
+  mapi_set_mesage_class ((LPMESSAGE)msg.get(), "IPM.Note");
+
+  if (invoke_oom_method (m_mailitem, "Save", NULL))
+    {
+      log_error ("Failed to save decrypted mail: %p ", m_mailitem);
+    }
+  return;
+}
index 9a10cbf..83342d3 100644 (file)
@@ -601,6 +601,9 @@ public:
   /* Get the storeID for this mail */
   std::string storeID() { return m_store_id; }
 
+  /* Remove encryption permanently. */
+  void decryptPermanently_o ();
+
 private:
   void updateCategories_o ();
   void updateSigstate ();
index 8cafc9a..18bab16 100644 (file)
@@ -810,6 +810,21 @@ HRESULT print_decrypted (LPDISPATCH ctrl)
   return S_OK;
 }
 
+HRESULT decrypt_permanently (LPDISPATCH ctrl)
+{
+  MY_MAIL_GETTER
+
+  if (!mail)
+    {
+      log_error ("%s:%s: Failed to get mail.",
+                 SRCNAME, __func__);
+      return S_OK;
+    }
+
+  mail->decryptPermanently_o ();
+  return S_OK;
+}
+
 HRESULT open_contact_key (LPDISPATCH ctrl)
 {
   if (!ctrl)
index 83fd5d1..a084884 100644 (file)
@@ -51,6 +51,7 @@
 #define ID_GET_IS_CRYPTO_MAIL 35
 #define ID_CMD_OPEN_CONTACT_KEY 36
 #define ID_CMD_FILE_CLOSE 37
+#define ID_CMD_DECRYPT_PERMANENTLY 38
 
 #define ID_BTN_DECRYPT           IDI_DECRYPT_16_PNG
 #define ID_BTN_DECRYPT_LARGE     IDI_DECRYPT_48_PNG
@@ -91,4 +92,6 @@ HRESULT print_decrypted (LPDISPATCH ctrl);
 HRESULT open_contact_key (LPDISPATCH ctrl);
 /* An explorer is closed by File->Close */
 HRESULT override_file_close ();
+/* Decrypt permanently */
+HRESULT decrypt_permanently (LPDISPATCH ctrl);
 #endif