Convey from address to the UI-server.
authorWerner Koch <wk@gnupg.org>
Thu, 12 Jun 2008 15:48:29 +0000 (15:48 +0000)
committerWerner Koch <wk@gnupg.org>
Thu, 12 Jun 2008 15:48:29 +0000 (15:48 +0000)
Add a Configure Engine button.

15 files changed:
doc/gpgol.texi
po/de.po
po/sv.po
src/ChangeLog
src/dialogs.h
src/dialogs.rc
src/engine-assuan.c
src/engine-assuan.h
src/engine.c
src/engine.h
src/mapihelp.cpp
src/mapihelp.h
src/mimemaker.c
src/mimeparser.c
src/olflange-dlgs.cpp

index 27debfe..a960f1d 100644 (file)
@@ -32,7 +32,7 @@ H
 40699 Erkrath, Germany
 @end iftex
 
-Copyright @copyright{} 2007 g10 Code GmbH
+Copyright @copyright{} 2007, 2008 g10 Code GmbH
 
 @quotation
 Permission is granted to copy, distribute and/or modify this document
@@ -89,6 +89,8 @@ Outlook MUA.
 * Assuan Protocol::             Description of the UI server protocol.
 * MAPI Properties::             MAPI Properties used by GpgOL.
 * Registry Settings::           How GpgOL uses the Registry.
+* MAPI Providers::              What MAPI Storage or Transport providers
+                                can do to help GpgOL.
 
 Appendices
 
@@ -330,6 +332,108 @@ after software upgrades.
 
 @end table
 
+@c xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+@c
+@c  MAPI Providers
+@c
+@c xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+@node MAPI Providers
+@chapter What MAPI Storage or Transport providers can do to help GpgOL
+
+GpgOL uses some tricks to make decryption of OpenPGP message better fit
+into the Outlook framework.  This is due to a lack of proper Plugin API
+for Outllok and becuase some features of Outlook --- meant as a security
+measure --- hinder a better implementation.  That is not to say that
+Outlook will be less secure when used with GpgOL --- to the opposite:
+Due to encryption and digital signature reading and sending mail with
+GpgOL support can be much more secure than using Outlook as is.
+
+There are some points where custom MAPI storage or transport
+providers can help GpgOL to gain better performance and to make it more
+secure.
+
+@section MAPI Message Class Renaming
+
+To implement S/MIME processing in GpgOL and inhibit XXXXXX
+
+
+@section MAPI Attachment Processing
+
+GpgOL creates a couple of attachments for the purpose of storing a
+parsed mail and to allow Outlook to display attachments in the usual way
+without sending them as plaintext to the storage.  The attachments are
+only stored on the local disk while being opened from the attachment's
+context menu for viewing.  Almost all these attchments are ephemeral and
+may be deleted when not displayed.  GpgOL re-creates them by parsing the
+orginal message if neeeded.  In fact they are always re-created after
+Outlook as been started again.  This is because the attachments holding
+the plaintext are symmetrical encrypted with an ephemeral session key,
+only valid as long as Outlook runs.
+
+TODO
+
+
+@section MAPI PR_BODY Processing
+
+GPOL does not use the PR_BODY property.  This is because internal
+Outlook syncronisation may change that property after the plaintext of a
+message has been displayed.  In general this is not a problem because
+the messages processed by GpgOL do not use that property (the orginal
+S/MIME and PGP/MIME message is stored in attachments).  However, there
+is one exception: Inline PGP message (in contrast to the modern PGP/MIME
+messages) are conveyed in the PR_BODY.  To avoid changing that orginal
+mail, GpgOL copies such a body to a new attachment named
+@file{gpgolPGP.dat}, flags it as hidden and sets the attach type to
+ATTACHTYPE_PGPBODY (See above under MAPI Properties).  That attachment
+may never be deleted!
+
+Due to internal OL syncronisation, plaintext data may end up in PR_BODY,
+GpgOL tries hard to delete PR_BODY so that it nevers shows up in the
+MAPI storage.  However this is hard and here a storage provider can help
+by deleting PR_BODY under one of these conditions:
+
+@itemize @bullet
+
+@item
+If the message class is either @code{IPM.Note.GpgOL.MultipartEncrypted}
+or @code{IPM.Note.GpgOL.OpaqueEncrypted} and in addition the message has
+a property @code{GpgOL Last Decrypted} (with any value), delete the
+properties @code{PR_BODY} and @code{PR_BODY_HTML}.
+
+@item
+If the message class is @code{IPM.Note.GpgOL.PGPMessage} and an
+attachment of ATTACHTYPE_PGPBODY with a filename @file{gpgolPGP.dat}
+exists, delete the properties @code{PR_BODY} and @code{PR_BODY_HTML}.
+
+@end itemize
+
+Instead of deleting it should be sufficient to make sure
+that such PR_BODYs are not update and don't make it to the disk or a
+strage server. 
+
+Implementing such a feature would really help with end-to-end encryption
+where the security policy requires that the plaintext of an encrypted
+message will never be stored on a disk or leave the local machine.
+
+
+@section Filtering GpgOL internal properties
+
+To avoid attacks by importing TNEF data with certain GpgOL internal
+properties, a MAPI provider may want to filter them out when receiving a
+message from an external location.  It is not yet clear whetehr this is
+really needed.
+
+FIXME.
+
+
+
+
+
+
+
+
+
+
 
 
 @c xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
index 13b9541..32d964b 100644 (file)
--- a/po/de.po
+++ b/po/de.po
@@ -7,8 +7,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: GpgOL 0.10.0\n"
 "Report-Msgid-Bugs-To: bug-gpgol@g10code.com\n"
-"POT-Creation-Date: 2008-05-28 15:37+0200\n"
-"PO-Revision-Date: 2008-05-28 15:38+0200\n"
+"POT-Creation-Date: 2008-06-12 17:11+0200\n"
+"PO-Revision-Date: 2008-06-12 17:13+0200\n"
 "Last-Translator: Werner Koch <wk@gnupg.org>\n"
 "Language-Team: de\n"
 "MIME-Version: 1.0\n"
@@ -48,7 +48,7 @@ msgstr "GpgOL - Sichern der entschlüsselten Anlage"
 msgid "Debug output (for analysing problems)"
 msgstr "Debugausgabe (zur Problemanalyse)"
 
-#: src/engine.c:405
+#: src/engine.c:425
 msgid ""
 "The user interface server is not available or does not work.  Using an "
 "internal user interface.\n"
@@ -68,7 +68,7 @@ msgstr ""
 "   (unter \"GnuPG für Windows\") oder auf einem anderen Weg starten.\n"
 "   Sobald \"Kleopatra\" läuft, erneut Outlook starten."
 
-#: src/engine.c:409 src/ext-commands.cpp:753 src/main.c:676 src/main.c:682
+#: src/engine.c:429 src/ext-commands.cpp:753 src/main.c:676 src/main.c:682
 #: src/message.cpp:301
 msgid "GpgOL"
 msgstr "GpgOL"
@@ -344,7 +344,11 @@ msgstr ""
 "\n"
 "geschrieben."
 
-#: src/mapihelp.cpp:1626
+#: src/mapihelp.cpp:1115 src/mapihelp.cpp:1123 src/mapihelp.cpp:1131
+msgid "[no subject]"
+msgstr "[Kein Betreff]"
+
+#: src/mapihelp.cpp:1705
 msgid ""
 "[The content of this message is not visible because it has been decrypted by "
 "another Outlook session.  Use the \"decrypt/verify\" command to make it "
@@ -354,7 +358,7 @@ msgstr ""
 "Outlook Sitzung entschlüsselt wurde.  Verwenden Sie den Menüpunkt "
 "\"entschlüsseln/verifizieren\" um den Inhalt wieder sichtbar zu machen.]"
 
-#: src/mapihelp.cpp:2403
+#: src/mapihelp.cpp:2482
 msgid ""
 "[The content of this message is not visible due to an processing error in "
 "GpgOL.]"
@@ -499,7 +503,11 @@ msgstr "HTML Darstellung anzeigen wenn möglich"
 msgid "Present encrypted message as attachment"
 msgstr "Verschlüsselte Nachricht as Anlage anzeigen"
 
-#: src/olflange-dlgs.cpp:212
+#: src/olflange-dlgs.cpp:59
+msgid "Crypto Engine"
+msgstr "Kryptoserver"
+
+#: src/olflange-dlgs.cpp:215
 msgid ""
 "You have enabled GpgOL's support for the S/MIME protocol.\n"
 "\n"
@@ -518,7 +526,7 @@ msgstr ""
 "kann."
 
 #. TRANSLATORS: See the source for the full english text.
-#: src/olflange-dlgs.cpp:267
+#: src/olflange-dlgs.cpp:270
 msgid "-#GpgOLFullHelpText#-"
 msgstr ""
 "GpgOL ist ein Plugin für Microsoft Outlook, welches es ermöglicht\n"
@@ -543,12 +551,12 @@ msgstr ""
 "Public License erhalten haben.  Falls nicht, finden Sie diese\n"
 "unter der Webadresse <http://www.gnu.org/licenses/>."
 
-#: src/olflange-dlgs.cpp:273
+#: src/olflange-dlgs.cpp:276
 #, c-format
 msgid "This is GpgOL version %s"
 msgstr "Dies ist GpgOL Version %s"
 
-#: src/olflange.cpp:339
+#: src/olflange.cpp:343
 msgid ""
 "You have installed a new version of GpgOL.\n"
 "\n"
@@ -562,7 +570,7 @@ msgstr ""
 "die die Einstellungen für Sie noch stimmen.  Sie finden die Einstellungen im "
 "Hauptmenu unter:  Extras->Optionen->GpgOL.\n"
 
-#: src/olflange.cpp:507
+#: src/olflange.cpp:511
 msgid ""
 "This version of Outlook is too old!\n"
 "\n"
index b2475f9..b7e5fe8 100644 (file)
--- a/po/sv.po
+++ b/po/sv.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: GPGol\n"
 "Report-Msgid-Bugs-To: bug-gpgol@g10code.com\n"
-"POT-Creation-Date: 2008-05-28 15:37+0200\n"
+"POT-Creation-Date: 2008-06-12 17:11+0200\n"
 "PO-Revision-Date: 2006-12-12 23:52+0100\n"
 "Last-Translator: Daniel Nylander <po@danielnylander.se>\n"
 "Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
@@ -48,7 +48,7 @@ msgstr "GPG - Spara dekrypterad bilaga"
 msgid "Debug output (for analysing problems)"
 msgstr ""
 
-#: src/engine.c:405
+#: src/engine.c:425
 msgid ""
 "The user interface server is not available or does not work.  Using an "
 "internal user interface.\n"
@@ -57,7 +57,7 @@ msgid ""
 "are not readable."
 msgstr ""
 
-#: src/engine.c:409 src/ext-commands.cpp:753 src/main.c:676 src/main.c:682
+#: src/engine.c:429 src/ext-commands.cpp:753 src/main.c:676 src/main.c:682
 #: src/message.cpp:301
 msgid "GpgOL"
 msgstr ""
@@ -333,14 +333,18 @@ msgid ""
 "\"%s\""
 msgstr ""
 
-#: src/mapihelp.cpp:1626
+#: src/mapihelp.cpp:1115 src/mapihelp.cpp:1123 src/mapihelp.cpp:1131
+msgid "[no subject]"
+msgstr ""
+
+#: src/mapihelp.cpp:1705
 msgid ""
 "[The content of this message is not visible because it has been decrypted by "
 "another Outlook session.  Use the \"decrypt/verify\" command to make it "
 "visible]"
 msgstr ""
 
-#: src/mapihelp.cpp:2403
+#: src/mapihelp.cpp:2482
 msgid ""
 "[The content of this message is not visible due to an processing error in "
 "GpgOL.]"
@@ -472,7 +476,11 @@ msgstr ""
 msgid "Present encrypted message as attachment"
 msgstr ""
 
-#: src/olflange-dlgs.cpp:212
+#: src/olflange-dlgs.cpp:59
+msgid "Crypto Engine"
+msgstr ""
+
+#: src/olflange-dlgs.cpp:215
 msgid ""
 "You have enabled GpgOL's support for the S/MIME protocol.\n"
 "\n"
@@ -483,16 +491,16 @@ msgid ""
 msgstr ""
 
 #. TRANSLATORS: See the source for the full english text.
-#: src/olflange-dlgs.cpp:267
+#: src/olflange-dlgs.cpp:270
 msgid "-#GpgOLFullHelpText#-"
 msgstr ""
 
-#: src/olflange-dlgs.cpp:273
+#: src/olflange-dlgs.cpp:276
 #, c-format
 msgid "This is GpgOL version %s"
 msgstr ""
 
-#: src/olflange.cpp:339
+#: src/olflange.cpp:343
 msgid ""
 "You have installed a new version of GpgOL.\n"
 "\n"
@@ -501,7 +509,7 @@ msgid ""
 ">Options->GpgOL.\n"
 msgstr ""
 
-#: src/olflange.cpp:507
+#: src/olflange.cpp:511
 msgid ""
 "This version of Outlook is too old!\n"
 "\n"
index 272c7b8..1e2a68b 100644 (file)
@@ -1,5 +1,18 @@
 2008-06-12  Werner Koch  <wk@g10code.com>
 
+       * dialogs.rc: Add button for calling the engine's configuration.
+       * dialogs.h (IDC_GPG_CONF): New.
+       * engine.c (engine_start_confdialog): New.
+       * engine-assuan.c (op_assuan_start_confdialog): New.
+       * olflange-dlgs.cpp (GPGOptionsDlgProc): Act upon the button.
+
+       * mapihelp.cpp (mapi_get_from_address): New.
+       * engine.c (engine_decrypt_start, engine_verify_start): Add new
+       arg FROM_ADDRESS.
+       * engine-assuan.c (op_assuan_verify, op_assuan_decrypt): Ditto.
+       * mimeparser.c (mime_verify, mime_verify_opaque, mime_decrypt):
+       Pass FROM_ADDRESS to the backend.
+
        * olflange.cpp (DllUnregisterServer): Delete CLSIDs.
 
 2008-06-05  Werner Koch  <wk@g10code.com>
index 5c24364..3188dc5 100644 (file)
@@ -40,6 +40,7 @@
 #define IDC_G_SEND                      4024
 #define IDC_G_RECV                      4025
 #define IDC_BODY_AS_ATTACHMENT          4026
+#define IDC_GPG_CONF                    4027
 
 
 /* Ids for the extended options dialog.  */
index b9a5964..f1ce3fe 100644 (file)
@@ -97,7 +97,10 @@ BEGIN
                       8, 212, 150, 64
 
     PUSHBUTTON      "advanced", IDC_GPG_OPTIONS,
-                    209, 240, 50, 14
+                    130, 240, 50, 14
+
+    PUSHBUTTON      "gpgconf", IDC_GPG_CONF,
+                    190, 240, 70, 14
 
 END
 
index 370fe85..8b1a0a6 100644 (file)
@@ -1769,8 +1769,8 @@ sign_closure (closure_data_t cld)
 /* Created a detached signature for INDATA and write it to OUTDATA.
    On termination of the signing command engine_private_finished() is
    called with FILTER as the first argument.  SENDER is the sender's
-   mail address (a mailbox).  The used protocol wioll be stored at
-   R_PROTOCOL. */
+   mail address (a mailbox).  The used protocol will be stored at
+   R_USED_PROTOCOL on return. */
 int 
 op_assuan_sign (protocol_t protocol, 
                 gpgme_data_t indata, gpgme_data_t outdata,
@@ -1896,7 +1896,7 @@ int
 op_assuan_decrypt (protocol_t protocol,
                    gpgme_data_t indata, gpgme_data_t outdata, 
                    engine_filter_t filter, void *hwnd,
-                   int with_verify)
+                   int with_verify, const char *from_address)
 {
   gpg_error_t err;
   closure_data_t cld;
@@ -1931,6 +1931,13 @@ op_assuan_decrypt (protocol_t protocol,
     goto leave;
 
   send_session_info (ctx, filter);
+  if (with_verify && from_address)
+    {
+      snprintf (line, sizeof line, "SENDER --info -- %s", from_address);
+      err = assuan_transact (ctx, line, NULL, NULL, NULL, NULL, NULL, NULL);
+      if (err)
+        goto leave;
+    }
 
   snprintf (line, sizeof line, "INPUT FD=%ld", (unsigned long int)inpipe[0]);
   err = assuan_transact (ctx, line, NULL, NULL, NULL, NULL, NULL, NULL);
@@ -1996,7 +2003,7 @@ int
 op_assuan_verify (gpgme_protocol_t protocol, 
                   gpgme_data_t msgdata, const char *signature, size_t sig_len,
                   gpgme_data_t outdata,
-                  engine_filter_t filter, void *hwnd)
+                  engine_filter_t filter, void *hwnd, const char *from_address)
 {
   gpg_error_t err;
   closure_data_t cld = NULL;
@@ -2062,6 +2069,13 @@ op_assuan_verify (gpgme_protocol_t protocol,
     goto leave;
 
   send_session_info (ctx, filter);
+  if (from_address)
+    {
+      snprintf (line, sizeof line, "SENDER --info -- %s", from_address);
+      err = assuan_transact (ctx, line, NULL, NULL, NULL, NULL, NULL, NULL);
+      if (err)
+        goto leave;
+    }
 
   if (!opaque_mode)
     {
@@ -2142,3 +2156,24 @@ op_assuan_start_keymanager (void *hwnd)
     }
   return err;
 }
+
+
+\f
+/* Ask the server to fire up the config dialog.  */
+int 
+op_assuan_start_confdialog (void *hwnd)
+{
+  gpg_error_t err;
+  assuan_context_t ctx;
+  ULONG cmdid;
+  pid_t pid;
+
+  err = connect_uiserver (&ctx, &pid, &cmdid, hwnd);
+  if (!err)
+    {
+      err = assuan_transact (ctx, "START_CONFDIALOG",
+                             NULL, NULL, NULL, NULL, NULL, NULL);
+      assuan_disconnect (ctx);
+    }
+  return err;
+}
index eff568f..702f50f 100644 (file)
@@ -51,14 +51,17 @@ int op_assuan_sign (protocol_t protocol,
 int op_assuan_decrypt (protocol_t protocol,
                        gpgme_data_t indata, gpgme_data_t outdata, 
                        engine_filter_t filter, void *hwnd,
-                       int with_verify);
+                       int with_verify, const char *from_address);
 int op_assuan_verify (gpgme_protocol_t protocol, 
                       gpgme_data_t data, const char *signature, size_t sig_len,
                       gpgme_data_t outdata,
-                      engine_filter_t filter, void *hwnd);
+                      engine_filter_t filter, void *hwnd,
+                      const char *from_address);
 
 int op_assuan_start_keymanager (void *hwnd);
 
+int op_assuan_start_confdialog (void *hwnd);
+
 
 #ifdef __cplusplus
 }
index b0667cc..d1a1571 100644 (file)
@@ -924,16 +924,18 @@ engine_sign_start (engine_filter_t filter, HWND hwnd, protocol_t protocol,
    finish the operation.  A filter object may not be reused after
    having been used through this function.  However, the lifetime of
    the filter object lasts until the final engine_wait or
-   engine_cancel.  */
+   engine_cancel.  FROM_ADDRESS may be passed to allow the backend
+   matching the sender's address with the one in the certificate (in
+   case the decrypted message ncludes a signed message). */
 int
 engine_decrypt_start (engine_filter_t filter, HWND hwnd, protocol_t protocol,
-                      int with_verify)
+                      int with_verify, const char *from_address)
 {
   gpg_error_t err;
 
   if (filter->use_assuan)
     err = op_assuan_decrypt (protocol, filter->indata, filter->outdata,
-                            filter, hwnd, with_verify);
+                            filter, hwnd, with_verify, from_address);
   else
     err = op_gpgme_decrypt (protocol, filter->indata, filter->outdata,
                             filter, hwnd, with_verify);
@@ -947,10 +949,13 @@ engine_decrypt_start (engine_filter_t filter, HWND hwnd, protocol_t protocol,
    signature.  The caller needs to call engine_wait to finish the
    operation.  A filter object may not be reused after having been
    used through this function.  However, the lifetime of the filter
-   object lasts until the final engine_wait or engine_cancel.  */
+   object lasts until the final engine_wait or engine_cancel.
+   FROM_ADDRESS may be passed to allow the backend matching the
+   sender's address with the one in the certificate. */
 int
 engine_verify_start (engine_filter_t filter, HWND hwnd, const char *signature,
-                    size_t sig_len, protocol_t protocol)
+                    size_t sig_len, protocol_t protocol, 
+                     const char *from_address)
 {
   gpg_error_t err;
 
@@ -964,10 +969,10 @@ engine_verify_start (engine_filter_t filter, HWND hwnd, const char *signature,
 
   if (filter->use_assuan && !signature)
     err = op_assuan_verify (protocol, filter->indata, NULL, 0,
-                           filter->outdata, filter, hwnd);
+                           filter->outdata, filter, hwnd, from_address);
   else if (filter->use_assuan)
     err = op_assuan_verify (protocol, filter->indata, signature, sig_len,
-                           NULL, filter, hwnd);
+                           NULL, filter, hwnd, from_address);
   else
     err = op_gpgme_verify (protocol, filter->indata, signature, sig_len,
                            filter, hwnd);
@@ -984,3 +989,13 @@ engine_start_keymanager (HWND hwnd)
   else
     return gpg_error (GPG_ERR_NOT_SUPPORTED);
 }
+
+/* Fire up the config dialog.  Returns 0 on success.  */
+int
+engine_start_confdialog (HWND hwnd)
+{
+  if (use_assuan)
+    return op_assuan_start_confdialog (hwnd);
+  else
+    return gpg_error (GPG_ERR_NOT_SUPPORTED);
+}
index 9aeb0f7..205fac3 100644 (file)
@@ -79,12 +79,15 @@ int engine_sign_start (engine_filter_t filter, HWND hwnd, protocol_t protocol,
                        const char *sender, protocol_t *r_protocol);
 
 int engine_decrypt_start (engine_filter_t filter, HWND hwnd,
-                          protocol_t protocol, int with_verify);
+                          protocol_t protocol, int with_verify,
+                          const char *from_address);
 int engine_verify_start (engine_filter_t filter, HWND hwnd,
                          const char *signature, size_t sig_len,
-                        protocol_t protocol);
+                        protocol_t protocol,
+                         const char *from_address);
 
 int engine_start_keymanager (HWND hwnd);
+int engine_start_confdialog (HWND hwnd);
 
 
 
index 0670b62..69e7b83 100644 (file)
@@ -1055,6 +1055,46 @@ mapi_get_sender (LPMESSAGE message)
   return buf;
 }
 
+/* Return the from address of the message as a malloced UTF-8 string.
+   Returns NULL if that address is not available.  */
+char *
+mapi_get_from_address (LPMESSAGE message)
+{
+  HRESULT hr;
+  LPSPropValue propval = NULL;
+  char *buf;
+  
+  if (!message)
+    return xstrdup ("[no message]"); /* Ooops.  */
+
+  hr = HrGetOneProp ((LPMAPIPROP)message, PR_SENDER_EMAIL_ADDRESS_W, &propval);
+  if (FAILED (hr))
+    {
+      log_debug ("%s:%s: HrGetOneProp failed: hr=%#lx\n",
+                 SRCNAME, __func__, hr);
+      return NULL;
+    }
+    
+  if (PROP_TYPE (propval->ulPropTag) != PT_UNICODE) 
+    {
+      log_debug ("%s:%s: HrGetOneProp returns invalid type %lu\n",
+                 SRCNAME, __func__, PROP_TYPE (propval->ulPropTag) );
+      MAPIFreeBuffer (propval);
+      return NULL;
+    }
+  
+  buf = wchar_to_utf8 (propval->Value.lpszW);
+  MAPIFreeBuffer (propval);
+  if (!buf)
+    {
+      log_error ("%s:%s: error converting to utf8\n", SRCNAME, __func__);
+      return NULL;
+    }
+
+  return buf;
+}
+
+
 /* Return the subject of the message as a malloced UTF-8 string.
    Returns a replacement string if a subject is missing.  */
 char *
index 90999f4..4b351d0 100644 (file)
@@ -117,6 +117,7 @@ int mapi_to_mime (LPMESSAGE message, const char *filename);
 
 char *mapi_get_binary_prop (LPMESSAGE message,ULONG proptype,size_t *r_nbytes);
 
+char *mapi_get_from_address (LPMESSAGE message);
 char *mapi_get_subject (LPMESSAGE message);
 
 LPSTREAM mapi_get_body_as_stream (LPMESSAGE message);
index 9dc2699..0dea70a 100644 (file)
@@ -1159,7 +1159,7 @@ do_mime_sign (LPMESSAGE message, HWND hwnd, protocol_t protocol,
         return -1;
     }
 
-  /* Prepare the signing.  FIXME: figure out the signer of the mail.  */
+  /* Prepare the signing. */
   if (engine_create_filter (&filter, collect_signature, &sigbuffer))
     goto failure;
   if (engine_sign_start (filter, hwnd, protocol, 
index dfe3992..25d7d85 100644 (file)
@@ -1244,8 +1244,13 @@ mime_verify (protocol_t protocol, const char *message, size_t messagelen,
         engine_set_session_title (filter, tmp);
         xfree (tmp);
       }
-      if ((err=engine_verify_start (filter, hwnd, signature, sig_len,
-                                   ctx->protocol)))
+      {
+        char *from = mapi_get_from_address (mapi_message);
+        err = engine_verify_start (filter, hwnd, signature, sig_len,
+                                   ctx->protocol, from);
+        xfree (from);
+      }
+      if (err)
         goto leave;
 
       /* Filter the data.  */
@@ -1362,7 +1367,12 @@ mime_verify_opaque (protocol_t protocol, LPSTREAM instream,
     engine_set_session_title (filter, tmp);
     xfree (tmp);
   }
-  if ((err=engine_verify_start (filter, hwnd, NULL, 0, protocol)))
+  {
+    char *from = mapi_get_from_address (mapi_message);
+    err = engine_verify_start (filter, hwnd, NULL, 0, protocol, from);
+    xfree (from);
+  }
+  if (err);
     goto leave;
 
   if (instream)
@@ -1708,7 +1718,12 @@ mime_decrypt (protocol_t protocol, LPSTREAM instream, LPMESSAGE mapi_message,
     engine_set_session_title (filter, tmp);
     xfree (tmp);
   }
-  if ((err=engine_decrypt_start (filter, hwnd, protocol, !preview_mode)))
+  {
+    char *from = preview_mode? NULL : mapi_get_from_address (mapi_message);
+    err = engine_decrypt_start (filter, hwnd, protocol, !preview_mode, from);
+    xfree (from);
+  }
+  if (err)
     goto leave;
 
   if (decctx)
index 43a28e9..b6b583f 100644 (file)
@@ -32,7 +32,7 @@
 #include "ol-ext-callback.h"
 #include "olflange-def.h"
 #include "dialogs.h"
-
+#include "engine.h"
 
 /* To avoid writing a dialog template for each language we use gettext
    for the labels and hope that there is enough space in the dialog to
@@ -56,6 +56,7 @@ set_labels (HWND dlg)
     { IDC_BODY_AS_ATTACHMENT, N_("Present encrypted message as attachment")},
 
     { IDC_GPG_OPTIONS,      "Debug..."},
+    { IDC_GPG_CONF,         N_("Crypto Engine")},
     { IDC_VERSION_INFO,  "Version "VERSION "  ("__DATE__")"},
     { 0, NULL}
   };
@@ -165,6 +166,8 @@ GPGOptionsDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
        }
       if (opt.enable_debug && LOWORD (wParam) == IDC_GPG_OPTIONS)
        config_dialog_box (hDlg);
+      else if (LOWORD (wParam) == IDC_GPG_CONF)
+        engine_start_confdialog (hDlg);
       break;
        
     case WM_NOTIFY: