Accept sent on behalf of as the sender address
authorAndre Heinecke <aheinecke@intevation.de>
Wed, 29 Aug 2018 09:02:52 +0000 (11:02 +0200)
committerAndre Heinecke <aheinecke@intevation.de>
Wed, 29 Aug 2018 09:10:00 +0000 (11:10 +0200)
* src/mail.cpp (Mail::updateOOMData_o): Cache sent on behalf.
(Mail::updateSigstate): Fallback to sent on behalf.
(m_sent_on_behalf): New cache variable.
* src/oomhelp.cpp (get_sender_SentRepresentingAddress): New.

--
Outlook clearly shows in the mail:
"foo@bar.baz at behalf of foo2@bar.baz"

So we can accept "foo2@bar.baz" also as the sender address
as it is visible.

GnuPG-Bug-ID: T4110

src/mail.cpp
src/mail.h
src/oomhelp.cpp
src/oomhelp.h

index eeddb92..04d0b8e 100644 (file)
@@ -1601,6 +1601,16 @@ Mail::updateOOMData_o ()
           /* Try the sender Object */
           buf = get_sender_Sender (m_mailitem);
         }
+
+      /* We also want to cache sent representing email address so that
+         we can use it for verification information. */
+      char *buf2 = get_sender_SentRepresentingAddress (m_mailitem);
+
+      if (buf2)
+        {
+          m_sent_on_behalf = buf2;
+          xfree (buf2);
+        }
     }
 
   if (!buf)
@@ -2014,6 +2024,17 @@ Mail::updateSigstate ()
                                                         true);
       m_uid = get_uid_for_sender (key, sender.c_str());
 
+      if (m_uid.isNull() && !m_sent_on_behalf.empty ())
+        {
+          m_uid = get_uid_for_sender (key, m_sent_on_behalf.c_str ());
+          if (!m_uid.isNull())
+            {
+              log_debug ("%s:%s: Using sent on behalf '%s' instead of '%s'",
+                         SRCNAME, __func__, m_sent_on_behalf.c_str(),
+                         sender.c_str ());
+            }
+        }
+
       if ((sig.summary() & Signature::Summary::Valid) &&
           m_uid.origin() == GpgME::Key::OriginWKD &&
           (sig.validity() == Signature::Validity::Unknown ||
index ee7fcac..7865336 100644 (file)
@@ -617,6 +617,7 @@ private:
   int m_moss_position; /* The number of the original message attachment. */
   int m_crypto_flags;
   std::string m_sender;
+  std::string m_sent_on_behalf;
   char *m_cached_html_body; /* Cached html body. */
   char *m_cached_plain_body; /* Cached plain body. */
   std::vector<std::string> m_cached_recipients;
index 06fd72d..0870b34 100644 (file)
@@ -2213,6 +2213,21 @@ get_sender_SenderEMailAddress (LPDISPATCH mailitem)
 }
 
 char *
+get_sender_SentRepresentingAddress (LPDISPATCH mailitem)
+{
+  char *buf = get_pa_string (mailitem,
+                             PR_SENT_REPRESENTING_EMAIL_ADDRESS_W_DASL);
+  if (buf && strlen (buf))
+    {
+      log_debug ("%s:%s Found sent representing address \"%s\"",
+                 SRCNAME, __func__, buf);
+      return buf;
+    }
+  xfree (buf);
+  return nullptr;
+}
+
+char *
 get_inline_body ()
 {
   LPDISPATCH app = GpgolAddin::get_instance ()->get_application ();
index ca7c1fd..0ef2c01 100644 (file)
@@ -135,6 +135,8 @@ DEFINE_OLEGUID(IID_IOleWindow,                0x00000114, 0, 0);
   "http://schemas.microsoft.com/mapi/string/{00020386-0000-0000-C000-000000000046}/content-type/0x0000001F"
 #define PR_BLOCK_STATUS_DASL \
   "http://schemas.microsoft.com/mapi/proptag/0x10960003"
+#define PR_SENT_REPRESENTING_EMAIL_ADDRESS_W_DASL \
+  "http://schemas.microsoft.com/mapi/proptag/0x0065001F"
 
 #define DISTRIBUTION_LIST_ADDRESS_ENTRY_TYPE 11
 
@@ -357,6 +359,7 @@ char *get_sender_CurrentUser (LPDISPATCH mailitem);
 char *get_sender_Sender (LPDISPATCH mailitem);
 char *get_sender_SenderEMailAddress (LPDISPATCH mailitem);
 
+
 /* Get the body of the active inline response */
 char *get_inline_body (void);
 
@@ -370,6 +373,9 @@ int get_ol_ui_language (void);
 
 char *get_sender_SendUsingAccount (LPDISPATCH mailitem, bool *r_is_GSuite);
 
+/* Get the SentRepresentingAddress */
+char *get_sender_SentRepresentingAddress (LPDISPATCH mailitem);
+
 /* memtracing query interface */
 HRESULT gpgol_queryInterface (LPUNKNOWN pObj, REFIID riid, LPVOID FAR *ppvObj);