Initial handling for edits on encrypted drafts
authorAndre Heinecke <aheinecke@gnupg.org>
Wed, 10 Apr 2019 13:44:46 +0000 (15:44 +0200)
committerAndre Heinecke <aheinecke@gnupg.org>
Wed, 10 Apr 2019 13:44:46 +0000 (15:44 +0200)
* src/mail.cpp (Mail::updateOOMData_o): Cache body for
drafts, too.
* src/mailitem-events.cpp (Write): Encrypt drafts again on write.
(Close): Let Outlook ask for "want to save changes" for drafts.

--
This is still extremly buggy. Somehow after the write
in which we prepare the encrypt MAPI is not updated.
So we have to take our information from OOM. That's never
good.

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

index bbd6089..6de8e1d 100644 (file)
@@ -1739,7 +1739,7 @@ Mail::updateOOMData_o ()
   char *buf = nullptr;
   log_debug ("%s:%s", SRCNAME, __func__);
 
-  if (!isCryptoMail ())
+  if (!isCryptoMail () || isDraftEncrypt ())
     {
       /* Update the body format. */
       m_is_html_alternative = get_oom_int (m_mailitem, "BodyFormat") > 1;
index 37efae9..2c1c43b 100644 (file)
@@ -594,6 +594,18 @@ 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))
+                {
+                  /* This is the case for a modified draft */
+                  log_debug ("%s:%s: Draft re-encryption starting now.",
+                             SRCNAME, __func__);
+                  m_mail->setIsDraftEncrypt (true);
+                  m_mail->prepareCrypto_o ();
+                  /* Passing write to trigger encrypt in after write */
+                  TBREAK;
+                }
+
               Mail *last_mail = Mail::getLastMail ();
               if (Mail::isValidPtr (last_mail))
                 {
@@ -686,7 +698,7 @@ EVENT_SINK_INVOKE(MailItemEvents)
               m_mail->cryptState () != Mail::NeedsFirstAfterWrite &&
               m_mail->cryptState () != Mail::NeedsSecondAfterWrite)
             {
-              log_debug ("%s:%s: Canceling write because draft encrypt is on"
+              log_debug ("%s:%s: Canceling write because draft encrypt is in"
                          " progress.",
                          SRCNAME, __func__);
               *(parms->rgvarg[0].pboolVal) = VARIANT_TRUE;
@@ -737,7 +749,7 @@ EVENT_SINK_INVOKE(MailItemEvents)
         {
           log_oom ("%s:%s: Close : %p",
                          SRCNAME, __func__, m_mail);
-          if (m_mail->isCryptoMail ())
+          if (m_mail->isCryptoMail () && !is_draft_mail (m_object))
             {
               /* Close. This happens when an Opened mail is closed.
                  To prevent the question of wether or not to save the changes