Do not store modified drafts if decrypt failed
authorAndre Heinecke <aheinecke@gnupg.org>
Thu, 11 Apr 2019 12:36:12 +0000 (14:36 +0200)
committerAndre Heinecke <aheinecke@gnupg.org>
Thu, 11 Apr 2019 12:38:28 +0000 (14:38 +0200)
* src/mailitem-events.cpp (BeforeAutoSave, Write): Do
not allow writes if decryption failed.
* src/mail.cpp (decryptedSuccessfully): New helper.

--
Otherwise we would re-encrypt our error message ;-)

src/mail.cpp
src/mail.h
src/mailitem-events.cpp

index 6de8e1d..d123891 100644 (file)
@@ -3892,6 +3892,12 @@ Mail::setDoAutosecure_m (bool value)
   TRETURN;
 }
 
+bool
+Mail::decryptedSuccessfully () const
+{
+  return m_decrypt_result.isNull() || !m_decrypt_result.error();
+}
+
 void
 Mail::installFolderEventHandler_o()
 {
index 2b6a912..9fc7ce8 100644 (file)
@@ -610,6 +610,10 @@ public:
   /* State variable to check if we are about to encrypt a draft. */
   void setIsDraftEncrypt (bool value) { m_is_draft_encrypt = value; }
   bool isDraftEncrypt () { return m_is_draft_encrypt; }
+
+  /* Was this mail decrypted without error. Also returns true
+     if the mail was not encrypted. */
+  bool decryptedSuccessfully () const;
 private:
   void updateCategories_o ();
   void updateSigstate ();
index bbd339a..d5bdfb7 100644 (file)
@@ -149,6 +149,23 @@ EVENT_SINK_INVOKE(MailItemEvents)
         {
           log_oom ("%s:%s: BeforeAutoSave : %p",
                    SRCNAME, __func__, m_mail);
+          if (parms->cArgs != 1 || parms->rgvarg[0].vt != (VT_BOOL | VT_BYREF))
+           {
+             /* This happens in the weird case */
+             log_debug ("%s:%s: Uncancellable BeforeAutoSave.",
+                        SRCNAME, __func__);
+             TBREAK;
+           }
+
+          if (m_mail->isCryptoMail() && !m_mail->decryptedSuccessfully ())
+            {
+              *(parms->rgvarg[0].pboolVal) = VARIANT_TRUE;
+              log_debug ("%s:%s: Autosave for not successfuly decrypted mail."
+                         "Cancel it.",
+                         SRCNAME, __func__);
+              TBREAK;
+            }
+
           if (opt.draft_key && (m_mail->needs_crypto_m () & 1) &&
               !m_mail->isDraftEncrypt())
             {
@@ -601,8 +618,15 @@ EVENT_SINK_INVOKE(MailItemEvents)
           if (m_mail->isCryptoMail () && !m_mail->needsSave ())
             {
               if (opt.draft_key && (m_mail->needs_crypto_m () & 1) &&
-                  is_draft_mail (m_object))
+                  is_draft_mail (m_object) && m_mail->decryptedSuccessfully ())
                 {
+                  if (m_mail->cryptState () == Mail::NeedsFirstAfterWrite ||
+                      m_mail->cryptState () == Mail::NeedsSecondAfterWrite)
+                    {
+                      log_debug ("%s:%s: re-encryption in progress. Passing.",
+                                 SRCNAME, __func__);
+                      TBREAK;
+                    }
                   /* This is the case for a modified draft */
                   log_debug ("%s:%s: Draft re-encryption starting now.",
                              SRCNAME, __func__);