Decrypt again after a draft was closed
authorAndre Heinecke <aheinecke@gnupg.org>
Fri, 12 Apr 2019 09:13:00 +0000 (11:13 +0200)
committerAndre Heinecke <aheinecke@gnupg.org>
Fri, 12 Apr 2019 09:16:44 +0000 (11:16 +0200)
* src/mail.cpp (m_decrypt_again, isDecryptAgain, setDecryptAgain):
New state variable.
* src/mail.h: Update accordingly.
* src/mailitem-events.cpp (BeforeRead): Schedule
decrypt if a closed mail was before read again.
(Close): Mark closed drafts for potential decrypt again.
* src/windowmessage.cpp, src/windowmessages.h (DECRYPT): New.

--
This allows us to detach an inline editor draft, edit it,
close it and continue editing in the inline editor.

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

index 913bf9e..b07fb8e 100644 (file)
@@ -109,7 +109,8 @@ Mail::Mail (LPDISPATCH mailitem) :
     m_pass_write(false),
     m_locate_in_progress(false),
     m_is_junk(false),
-    m_is_draft_encrypt(false)
+    m_is_draft_encrypt(false),
+    m_decrypt_again(false)
 {
   TSTART;
   if (getMailForItem (mailitem))
@@ -1104,6 +1105,7 @@ Mail::decryptVerify_o ()
                  SRCNAME, __func__, m_mailitem);
       TRETURN 0;
     }
+  m_decrypt_again = false;
 
   auto cipherstream = get_attachment_stream_o (m_mailitem, m_moss_position);
   if (!cipherstream)
index 7d82d7d..a9db3c4 100644 (file)
@@ -622,6 +622,13 @@ public:
   /* Was this mail decrypted without error. Also returns true
      if the mail was not encrypted. */
   bool decryptedSuccessfully () const;
+
+  /* The mail should be decrypted again after the next
+   * encryption. So that we can save it for example and
+   * still work on it. */
+  void setDecryptAgain (bool value) { m_decrypt_again = value; }
+  bool isDecryptAgain () const { return m_decrypt_again; }
+
 private:
   void updateCategories_o ();
   void updateSigstate ();
@@ -677,5 +684,7 @@ private:
   std::string m_verify_category; /* The category string for the verify result */
   bool m_is_junk; /* Mail is in the junk folder */
   bool m_is_draft_encrypt; /* Mail is a draft that should be encrypted */
+  bool m_decrypt_again; /* Mail should be decrypted again if it sees
+                           another beforeread */
 };
 #endif // MAIL_H
index 82c5bc1..5b11d4e 100644 (file)
@@ -220,6 +220,13 @@ EVENT_SINK_INVOKE(MailItemEvents)
               log_error ("%s:%s: Pre process message failed.",
                          SRCNAME, __func__);
             }
+
+          if (m_mail->isDecryptAgain ())
+            {
+              log_debug ("%s:%s: Decrypting after 500ms",
+                         SRCNAME, __func__);
+              do_in_ui_thread_async (DECRYPT, m_mail, 500);
+            }
           TBREAK;
         }
       case Read:
@@ -800,6 +807,8 @@ EVENT_SINK_INVOKE(MailItemEvents)
                     */
                   log_oom ("%s:%s: Passing close because of draft status: %p",
                            SRCNAME, __func__, m_mail);
+                  m_mail->setDecryptAgain (true);
+                  TBREAK;
                 }
               /* Close. This happens when an Opened mail is closed.
                  To prevent the question of wether or not to save the changes
index 6ef4060..d0dc514 100644 (file)
@@ -296,6 +296,22 @@ gpgol_window_proc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
               Addressbook::update_key_o (ctx->data);
               TBREAK;
             }
+          case (DECRYPT):
+            {
+              auto mail = (Mail*) ctx->data;
+              if (!Mail::isValidPtr (mail))
+                {
+                  log_debug ("%s:%s: DECRYPT for mail which is gone.",
+                             SRCNAME, __func__);
+                  TBREAK;
+                }
+
+              log_debug ("%s:%s: Decrypting %p again.",
+                         SRCNAME, __func__, mail);
+              mail->preProcessMessage_m ();
+              mail->decryptVerify_o ();
+              TBREAK;
+            }
           default:
             log_debug ("%s:%s: Unknown msg %x",
                        SRCNAME, __func__, ctx->wmsg_type);
index 4e2ea56..5444a97 100644 (file)
@@ -56,6 +56,7 @@ typedef enum _gpgol_wmsg_type
   DO_AUTO_SECURE,
   DONT_AUTO_SECURE,
   CONFIG_KEY_DONE,
+  DECRYPT,
   /* External API, keep it stable! */
   EXT_API_CLOSE = 1301,
   EXT_API_CLOSE_ALL = 1302,