Show signer KeyID and UserID for valid mails
authorAndre Heinecke <aheinecke@intevation.de>
Wed, 26 Sep 2018 13:47:48 +0000 (15:47 +0200)
committerAndre Heinecke <aheinecke@intevation.de>
Wed, 26 Sep 2018 13:47:48 +0000 (15:47 +0200)
* src/mail.cpp (Mail::updateSigFlag_o): Set the flag.
(Mail::flagChangeTriggered): New helper to carry the state.
(pretty_id): Helper to format a fingerprint / long keyid.
* src/mailitem-events.cpp (PropertyChange): Ignore our
own changes.

--
This has two purposes. If the name of the sender is large
or looks like a mail address it is not visible at first
glance which key was used to verify as the real mail
address might be out of the screen.

Additionally this serves as another split between the
Verified Sender category and the body to make it even
harder to undetectable fake this through HTML. It
is never possible to fake it or replace it together
with the changed status icon.

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

index d3b0f0d..bef35de 100644 (file)
@@ -104,7 +104,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_flag_change_triggered(false)
 {
   TSTART;
   if (getMailForItem (mailitem))
@@ -1408,6 +1409,10 @@ Mail::parsing_done()
   updateCategories_o ();
 
   TRACEPOINT;
+  /* Show the signers uid as a flag */
+  updateSigFlag_o ();
+  TRACEPOINT;
+
   m_block_html = m_parser->shouldBlockHtml ();
 
   if (m_block_html)
@@ -2238,6 +2243,84 @@ Mail::updateCategories_o ()
   TRETURN;
 }
 
+static std::string
+pretty_id (const char *keyId)
+{
+  /* Three spaces, four quads and a NULL */
+  char buf[20];
+  buf[19] = '\0';
+  if (!keyId)
+    {
+      return std::string ("null");
+    }
+  size_t len = strlen (keyId);
+  if (!len)
+    {
+      return std::string ("empty");
+    }
+  if (len < 16)
+    {
+      return std::string (_("Invalid Key"));
+    }
+  const char *p = keyId + (len - 16);
+  int j = 0;
+  for (size_t i = 0; i < 16; i++)
+    {
+      if (i && i % 4 == 0)
+        {
+          buf[j++] = ' ';
+        }
+      buf[j++] = *(p + i);
+    }
+  return std::string (buf);
+}
+
+void
+Mail::updateSigFlag_o ()
+{
+  TSTART;
+  if (isValidSig ())
+    {
+      char *buf;
+      /* Resolve to the primary fingerprint */
+      const auto sigKey = KeyCache::instance ()->getByFpr (m_sig.fingerprint (),
+                                                           true);
+      const char *sigFpr;
+      if (sigKey.isNull())
+        {
+          sigFpr = m_sig.fingerprint ();
+        }
+      else
+        {
+          sigFpr = sigKey.primaryFingerprint ();
+        }
+
+      gpgrt_asprintf (&buf, "%s: %s (%s)", _("Signer"), m_uid.email(),
+                      pretty_id (sigFpr).c_str ());
+      memdbg_alloc (buf);
+      log_debug ("%s:%s: Setting signer flag %s",
+                 SRCNAME, __func__, anonstr (buf));
+      m_flag_change_triggered = true;
+      put_oom_string (m_mailitem, "FlagRequest", buf);
+      m_flag_change_triggered = false;
+      xfree (buf);
+    }
+  else
+    {
+      char *flag = get_oom_string (m_mailitem, "FlagRequest");
+      if (flag && (strstr (flag, _("Signer")) || strstr (flag, "Signer")))
+        {
+          m_flag_change_triggered = true;
+          log_debug ("%s:%s: Removing flag containting Signer.",
+                     SRCNAME, __func__);
+          put_oom_string (m_mailitem, "FlagRequest", "");
+          m_flag_change_triggered = false;
+        }
+      xfree (flag);
+    }
+  TRETURN;
+}
+
 bool
 Mail::isSigned () const
 {
index c4f2369..d925dde 100644 (file)
@@ -598,7 +598,11 @@ public:
   /* Gets an additional reference for GetInspector.CurrentItem */
   void refCurrentItem ();
 
+  /* Check if a flag change was triggered and can be ignored. */
+  bool flagChangeTriggered () const { return m_flag_change_triggered; }
+
 private:
+  void updateSigFlag_o ();
   void updateCategories_o ();
   void updateSigstate ();
 
@@ -649,5 +653,6 @@ private:
   int m_locate_count; /* The number of key locates pending for this mail. */
   bool m_is_about_to_be_moved;
   bool m_locate_in_progress; /* Simplified state variable for locate */
+  bool m_flag_change_triggered; /* We trigger a flagrequest change */
 };
 #endif // MAIL_H
index 31acc40..b02ad0e 100644 (file)
@@ -263,6 +263,14 @@ EVENT_SINK_INVOKE(MailItemEvents)
                   TRETURN S_OK;
                 }
             }
+          if (m_mail->flagChangeTriggered () &&
+              (!wcscmp (prop_name, L"FlagStatus") || !wcscmp (prop_name, L"FlagRequest") ||
+               !wcscmp (prop_name, L"FlagIcon") || !wcscmp (prop_name, L"FlagDueBy")))
+            {
+              log_oom ("%s:%s: Message %p propchange: %ls was requested.",
+                       SRCNAME, __func__, m_object, prop_name);
+              TRETURN S_OK;
+            }
           log_oom ("%s:%s: Message %p propchange: %ls.",
                    SRCNAME, __func__, m_object, prop_name);