Add junk mail handling
authorAndre Heinecke <aheinecke@intevation.de>
Tue, 6 Nov 2018 07:54:26 +0000 (08:54 +0100)
committerAndre Heinecke <aheinecke@intevation.de>
Tue, 6 Nov 2018 07:54:26 +0000 (08:54 +0100)
* src/categorymanager.cpp (getJunkMailCategory): New.
* src/mail.cpp (Mail::decryptVerify_o): Handle junk.
* src/mail.h (Mail::m_is_junk): New.

--
Junk mails are special. An addon can't access the attachments
so we can't decrypt PGP-MIME. We just add a marker to let
the user now and register our folder event handler so
that the mail can be moved out of junk.

GnuPG-Bug-Id: T4188

src/categorymanager.cpp
src/categorymanager.h
src/mail.cpp
src/mail.h

index e671f2d..d8c67e0 100644 (file)
@@ -251,3 +251,16 @@ CategoryManager::getEncMailCategory ()
     }
   return decStr;
 }
+
+/* static */
+const std::string &
+CategoryManager::getJunkMailCategory ()
+{
+  static std::string decStr;
+  if (decStr.empty())
+    {
+      decStr = std::string ("GpgOL: ") +
+                            std::string (_("Junk Email cannot be processed"));
+    }
+  return decStr;
+}
index 0e96485..f76018d 100644 (file)
@@ -61,6 +61,8 @@ public:
     /** Get the name of the encryption category. */
     static const std::string & getEncMailCategory ();
 
+    /** Get the name of the junk category. */
+    static const std::string & getJunkMailCategory ();
 private:
     class Private;
     std::shared_ptr<Private> d;
index 9305057..eafa3ef 100644 (file)
@@ -107,7 +107,8 @@ Mail::Mail (LPDISPATCH mailitem) :
     m_first_autosecure_check(true),
     m_locate_count(0),
     m_is_about_to_be_moved(false),
-    m_locate_in_progress(false)
+    m_locate_in_progress(false),
+    m_is_junk(false)
 {
   TSTART;
   if (getMailForItem (mailitem))
@@ -1058,6 +1059,7 @@ int
 Mail::decryptVerify_o ()
 {
   TSTART;
+
   if (!isCryptoMail ())
     {
       log_debug ("%s:%s: Decrypt Verify for non crypto mail: %p.",
@@ -1070,10 +1072,31 @@ Mail::decryptVerify_o ()
                  SRCNAME, __func__, m_mailitem);
       TRETURN 1;
     }
+
+  auto cipherstream = get_attachment_stream_o (m_mailitem, m_moss_position);
+  if (!cipherstream)
+    {
+      m_is_junk = is_junk_mail (m_mailitem);
+      if (m_is_junk)
+        {
+          log_debug ("%s:%s: Detected: %p as junk",
+                     SRCNAME, __func__, m_mailitem);
+          auto mngr = CategoryManager::instance ();
+          m_store_id = mngr->addCategoryToMail (this,
+                                   CategoryManager::getJunkMailCategory (),
+                                   3 /* peach */);
+          installFolderEventHandler_o ();
+          TRETURN 0;
+        }
+      log_debug ("%s:%s: Failed to get cipherstream. Aborting handling.",
+                 SRCNAME, __func__);
+      m_type = MSGTYPE_UNKNOWN;
+      TRETURN 1;
+    }
+
   setUUID_o ();
   m_processed = true;
 
-
   /* Insert placeholder */
   char *placeholder_buf = nullptr;
   if (m_type == MSGTYPE_GPGOL_WKS_CONFIRMATION)
@@ -1133,22 +1156,12 @@ Mail::decryptVerify_o ()
   memdbg_alloc (placeholder_buf);
   xfree (placeholder_buf);
 
-  /* Do the actual parsing */
-  auto cipherstream = get_attachment_stream_o (m_mailitem, m_moss_position);
-
   if (m_type == MSGTYPE_GPGOL_WKS_CONFIRMATION)
     {
       WKSHelper::instance ()->handle_confirmation_read (this, cipherstream);
       TRETURN 0;
     }
 
-  if (!cipherstream)
-    {
-      log_debug ("%s:%s: Failed to get cipherstream.",
-                 SRCNAME, __func__);
-      TRETURN 1;
-    }
-
   m_parser = std::shared_ptr <ParseController> (new ParseController (cipherstream, m_type));
   m_parser->setSender(GpgME::UserID::addrSpecFromString(getSender_o ().c_str()));
   log_data ("%s:%s: Parser for \"%s\" is %p",
@@ -2212,6 +2225,13 @@ Mail::removeCategories_o ()
       CategoryManager::instance ()->removeCategory (this,
                                 CategoryManager::getEncMailCategory ());
     }
+  if (m_is_junk)
+    {
+      log_oom ("%s:%s: Unreffing junk category",
+                       SRCNAME, __func__);
+      CategoryManager::instance ()->removeCategory (this,
+                                CategoryManager::getJunkMailCategory ());
+    }
   TRETURN;
 }
 
@@ -2347,15 +2367,15 @@ Mail::updateCategories_o ()
       int color = 0;
       if (lvl == 2)
         {
-          color = 7;
+          color = 7; /* Olive */
         }
       if (lvl == 3)
         {
-          color = 5;
+          color = 5; /* Green */
         }
       if (lvl == 4)
         {
-          color = 20;
+          color = 20; /* Dark Green */
         }
       m_store_id = mngr->addCategoryToMail (this, buf, color);
       m_verify_category = buf;
@@ -2370,7 +2390,7 @@ Mail::updateCategories_o ()
     {
       const auto id = mngr->addCategoryToMail (this,
                                  CategoryManager::getEncMailCategory (),
-                                 8);
+                                 8 /* Blue */);
       if (m_store_id.empty())
         {
           m_store_id = id;
index 05d26d0..170770c 100644 (file)
@@ -654,5 +654,6 @@ private:
   bool m_locate_in_progress; /* Simplified state variable for locate */
   std::string m_store_id; /* Store id for categories */
   std::string m_verify_category; /* The category string for the verify result */
+  bool m_is_junk; /* Mail is in the junk folder */
 };
 #endif // MAIL_H