Signing with attachments does now work. w/o temp files.
authorWerner Koch <wk@gnupg.org>
Thu, 25 Aug 2005 09:56:01 +0000 (09:56 +0000)
committerWerner Koch <wk@gnupg.org>
Thu, 25 Aug 2005 09:56:01 +0000 (09:56 +0000)
src/MapiGPGME.cpp
src/engine-gpgme.c
src/engine.h
src/gpgmsg.cpp
src/gpgmsg.hh
src/msgcache.c
src/mymapi.h
src/olflange-rsrcs.rc [new file with mode: 0644]
src/passcache.c

index 29b499b..a88352e 100644 (file)
@@ -357,8 +357,6 @@ private:
   int   streamOnFile (const char *file, LPATTACH att);
   int   streamFromFile (const char *file, LPATTACH att);
   int   encryptAttachments (HWND hwnd);
-  void  decryptAttachments (HWND hwnd, GpgMsg *msg);
-  int   signAttachments (HWND hwnd);
   LPATTACH openAttachment (GpgMsg *msg, int pos);
   void  releaseAttachment (LPATTACH att);
   int   processAttachment (LPATTACH *att, HWND hwnd, int pos, int action);
@@ -384,7 +382,7 @@ initialize_mapi_gpgme (void)
   SECURITY_ATTRIBUTES sa;
   
   memset (&sa, 0, sizeof sa);
-  sa.bInheritHandle = TRUE;
+  sa.bInheritHandle = FALSE;
   sa.lpSecurityDescriptor = NULL;
   sa.nLength = sizeof sa;
   log_mutex = CreateMutex (&sa, FALSE, NULL);
@@ -841,8 +839,12 @@ MapiGPGMEImpl::decrypt (HWND hwnd, GpgMsg * msg)
 
   if (has_attach)
     {
-      log_debug ("decrypt attachments\n");
-      decryptAttachments (hwnd, msg);
+      unsigned int n;
+      
+      n = msg->getAttachments ();
+      log_debug ("%s:%s: message has %u attachments\n", __FILE__, __func__, n);
+      for (int i=0; i < n; i++) 
+        msg->decryptAttachment (hwnd, i, true);
     }
 
   log_debug ("%s:%s: leave (rc=%d)\n", __FILE__, __func__, err);
@@ -874,10 +876,20 @@ MapiGPGMEImpl::sign (HWND hwnd, GpgMsg * msg)
       msg->setSignedText (signedtext);
     }
   
-  if (msg->hasAttachments () && autoSignAtt)
-    signAttachments (hwnd);
+  if (autoSignAtt && msg->hasAttachments ())
+    {
+      unsigned int n;
+      
+      n = msg->getAttachments ();
+      log_debug ("%s:%s: message has %u attachments\n", __FILE__, __func__, n);
+      for (int i=0; i < n; i++) 
+        msg->signAttachment (hwnd, i, true);
+      /* FIXME: we should throw an error if signing of any attachment
+         failed. */
+    }
 
-  log_debug ("%s:%s: leave (rc=%d)\n", err);
+
+  log_debug ("%s:%s: leave (err=%d)\n", __FILE__, __func__, err);
   return err;
 }
 
@@ -1578,57 +1590,8 @@ MapiGPGMEImpl::processAttachment (LPATTACH *attm, HWND hwnd,
 }
 
 
-/* Decrypt all attachemnts of message MSG.  HWND is the usual window
-   handle. */
-void 
-MapiGPGMEImpl::decryptAttachments (HWND hwnd, GpgMsg *msg)
-{
-  unsigned int n;
-  LPATTACH amsg;
-  
-
-  n = msg->getAttachments ();
-  log_debug ("%s:%s: message has %u attachments\n",
-             __FILE__, __func__, n);
-  if (!n)
-    return;
-  
-  for (int i=0; i < n; i++) 
-    {
-      //amsg = openAttachment (NULL/*FIXME*/,i);
-      if (amsg)
-        processAttachment (&amsg, hwnd, i, GPG_ATTACH_DECRYPT);
-    }
-  return;
-}
-
 
 
-int
-MapiGPGMEImpl::signAttachments (HWND hwnd)
-{
-//FIXME     if (!getAttachments ()) {
-//         log_debug ("MapiGPGME.signAttachments: getAttachments failed\n");
-//     return FALSE;
-//     }
-    
-    int n = 0/*FIXME countAttachments ()*/;
-    log_debug ("MapiGPGME.signAttachments: mail has %d attachments\n", n);
-    if (!n) {
-       freeAttachments ();
-       return TRUE;
-    }
-    for (int i=0; i < n; i++) {
-        LPATTACH amsg = openAttachment (NULL/*FIXME*/,i);
-       if (!amsg)
-           continue;
-       processAttachment (&amsg, hwnd, i, GPG_ATTACH_SIGN);
-       releaseAttachment (amsg);
-    }
-    freeAttachments ();
-    return 0;
-}
-
 
 int
 MapiGPGMEImpl::encryptAttachments (HWND hwnd)
index eb45fa7..c61cb74 100644 (file)
@@ -111,6 +111,51 @@ op_init (void)
 }
 
 
+/* The read callback used by GPGME to read data from an IStream object. */
+static ssize_t
+stream_read_cb (void *handle, void *buffer, size_t size)
+{
+  LPSTREAM stream = handle;
+  HRESULT hr;
+  ULONG nread;
+
+  /* For EOF detection we assume that Read returns no error and thus
+     nread will be 0.  The specs say that "Depending on the
+     implementation, either S_FALSE or an error code could be returned
+     when reading past the end of the stream"; thus we are not really
+     sure whether our assumption is correct.  OTOH, at another place
+     the docuemntation says that the implementation used by
+     ISequentialStream exhibits the same EOF behaviour has found on
+     the MSDOS FAT file system.  So we seem to have good karma. */
+  hr = IStream_Read (stream, buffer, size, &nread);
+  if (hr != S_OK)
+    {
+      log_debug ("%s:%s: Read failed: hr=%#lx", __FILE__, __func__, hr);
+      errno = EIO;
+      return -1;
+    }
+  return nread;
+}
+
+/* The write callback used by GPGME to write data to an IStream object. */
+static ssize_t
+stream_write_cb (void *handle, const void *buffer, size_t size)
+{
+  LPSTREAM stream = handle;
+  HRESULT hr;
+  ULONG nwritten;
+
+  hr = IStream_Write (stream, buffer, size, &nwritten);
+  if (hr != S_OK)
+    {
+      log_debug ("%s:%s: Write failed: hr=%#lx", __FILE__, __func__, hr);
+      errno = EIO;
+      return -1;
+    }
+  return nwritten;
+}
+
+
 /* Release a GPGME key array KEYS. */
 static void
 free_recipients (gpgme_key_t *keys)
@@ -348,6 +393,57 @@ op_sign_file (int mode, const char *infile, const char *outfile, int ttl)
 }
 
 
+/* Create a signature from INSTREAM and write it to OUTSTREAM.  Use
+   signature mode MODE and a passphrase caching time of TTL. */
+int
+op_sign_stream (LPSTREAM instream, LPSTREAM outstream, int mode, int ttl)
+{
+  struct gpgme_data_cbs cbs;
+  struct decrypt_key_s dk;
+  gpgme_data_t in = NULL;
+  gpgme_data_t out = NULL;
+  gpgme_ctx_t ctx = NULL;
+  gpgme_error_t err;
+  
+  memset (&cbs, 0, sizeof cbs);
+  cbs.read = stream_read_cb;
+  cbs.write = stream_write_cb;
+
+  memset (&dk, 0, sizeof dk);
+  dk.ttl = ttl;
+  dk.flags = 0x01; /* fixme: Use a more macro for documentation reasons. */
+
+  err = gpgme_data_new_from_cbs (&in, &cbs, instream);
+  if (err)
+    goto fail;
+
+  err = gpgme_data_new_from_cbs (&out, &cbs, outstream);
+  if (err)
+    goto fail;
+
+  err = gpgme_new (&ctx);
+  if (err)
+    goto fail;
+  
+  gpgme_set_armor (ctx, 1);
+
+  gpgme_set_passphrase_cb (ctx, passphrase_callback_box, &dk);
+  dk.ctx = ctx;
+  err = gpgme_op_sign (ctx, in, out, mode);
+  dk.ctx = NULL;
+  update_passphrase_cache (err, &dk);
+  
+ fail:
+  if (in)
+    gpgme_data_release (in);
+  if (out)
+    gpgme_data_release (out);
+  if (ctx)
+    gpgme_release (ctx);    
+  return err;
+}
+
+
 /* Decrypt file INFILE into file OUTFILE. */
 int
 op_decrypt_file (const char *infile, const char *outfile)
@@ -393,68 +489,24 @@ op_decrypt_file (const char *infile, const char *outfile)
 }
 
 
-/* The read callback used by GPGME to read data from an IStream object. */
-static ssize_t
-stream_read_cb (void *handle, void *buffer, size_t size)
-{
-  LPSTREAM stream = handle;
-  HRESULT hr;
-  ULONG nread;
-
-  /* For EOF detection we assume that Read returns no error and thus
-     nread will be 0.  The specs say that "Depending on the
-     implementation, either S_FALSE or an error code could be returned
-     when reading past the end of the stream"; thus we are not really
-     sure whether our assumption is correct.  OTOH, at another place
-     the docuemntation says that the implementation used by
-     ISequentialStream exhibits the same EOF behaviour has found on
-     the MSDOS FAT file system.  So we seem to have good karma. */
-  hr = IStream_Read (stream, buffer, size, &nread);
-  if (hr != S_OK)
-    {
-      log_debug ("%s:%s: Read failed: hr=%#lx", __FILE__, __func__, hr);
-      errno = EIO;
-      return -1;
-    }
-  return nread;
-}
-
-/* The write callback used by GPGME to write data to an IStream object. */
-static ssize_t
-stream_write_cb (void *handle, const void *buffer, size_t size)
-{
-  LPSTREAM stream = handle;
-  HRESULT hr;
-  ULONG nwritten;
-
-  hr = IStream_Write (stream, buffer, size, &nwritten);
-  if (hr != S_OK)
-    {
-      log_debug ("%s:%s: Write failed: hr=%#lx", __FILE__, __func__, hr);
-      errno = EIO;
-      return -1;
-    }
-  return nwritten;
-}
-
 
 /* Decrypt the stream INSTREAM directly to the stream OUTSTREAM.
    Returns 0 on success or an gpgme error code on failure. */
 int
 op_decrypt_stream (LPSTREAM instream, LPSTREAM outstream)
 {    
+  struct decrypt_key_s dk;
+  struct gpgme_data_cbs cbs;
   gpgme_data_t in = NULL;
   gpgme_data_t out = NULL;    
   gpgme_ctx_t ctx = NULL;
   gpgme_error_t err;
-  struct decrypt_key_s *dk;
-  struct gpgme_data_cbs cbs;
   
   memset (&cbs, 0, sizeof cbs);
   cbs.read = stream_read_cb;
   cbs.write = stream_write_cb;
 
-  dk = xcalloc (1, sizeof *dk);
+  memset (&dk, 0, sizeof dk);
 
   err = gpgme_data_new_from_cbs (&in, &cbs, instream);
   if (err)
@@ -468,11 +520,11 @@ op_decrypt_stream (LPSTREAM instream, LPSTREAM outstream)
   if (err)
     goto fail;
 
-  gpgme_set_passphrase_cb (ctx, passphrase_callback_box, dk);
-  dk->ctx = ctx;
+  gpgme_set_passphrase_cb (ctx, passphrase_callback_box, &dk);
+  dk.ctx = ctx;
   err = gpgme_op_decrypt (ctx, in, out);
-  dk->ctx = NULL;
-  update_passphrase_cache (err, dk);
+  dk.ctx = NULL;
+  update_passphrase_cache (err, &dk);
 
  fail:
   if (in)
@@ -481,7 +533,6 @@ op_decrypt_stream (LPSTREAM instream, LPSTREAM outstream)
     gpgme_data_release (out);
   if (ctx)
     gpgme_release (ctx);
-  xfree (dk);
   return err;
 }
 
@@ -764,8 +815,8 @@ do_sign (gpgme_key_t locusr, const char *inbuf, char **outbuf)
     gpgme_data_release (in);
   if (out)
     gpgme_data_release (out);
-  log_debug ("engine-gpgme.do_sign: leave (rc=%d (%s))\n",
-             err, gpgme_strerror (err));
+  log_debug ("%s:%s: leave (rc=%d (%s))\n",
+             __FILE__, __func__, err, gpgme_strerror (err));
   return err;
 }
 
index cf61d0f..867b8ae 100644 (file)
@@ -57,6 +57,7 @@ int op_verify_start (const char *inbuf, char **outbuf);
 
 int op_sign_start (const char *inbuf, char **outbuf);
 int op_sign_file (int mode, const char *infile, const char *outfile, int ttl);
+int op_sign_stream (LPSTREAM instream, LPSTREAM outstream, int mode, int ttl);
 
 int op_decrypt_file (const char *infile, const char *outfile);
 int op_decrypt_stream (LPSTREAM instream, LPSTREAM outstream);
index 302b1a0..36ae8a1 100644 (file)
 /* The string used as the standard XXXXX of decrypted attachments. */
 #define ATT_FILE_PREFIX ".pgpenc"
 
+#define TRACEPOINT() do { log_debug ("%s:%s:%d: tracepoint\n", \
+                                       __FILE__, __func__, __LINE__); \
+                        } while (0)
+
 
 
 /*
@@ -120,6 +124,7 @@ public:
   char **getRecipients (void);
   unsigned int getAttachments (void);
   void decryptAttachment (HWND hwnd, int pos, bool save_plaintext);
+  void signAttachment (HWND hwnd, int pos, int ttl);
 
 
 private:
@@ -553,6 +558,8 @@ GpgMsgImpl::getAttachments (void)
                            NULL, NULL, 0, &rows);
       if (FAILED (hr))
         {
+          log_debug ("%s:%s: HrQueryAllRows failed: hr=%#lx",
+                     __FILE__, __func__, hr);
           table->Release ();
           return 0;
         }
@@ -560,10 +567,10 @@ GpgMsgImpl::getAttachments (void)
       attach.rows = rows;
     }
 
-  return rows->cRows > 0? rows->cRows : 0;
+  return attach.rows->cRows > 0? attach.rows->cRows : 0;
 }
 
-/* Return the attachemnt method for attachmet OBJ. In case of error we
+/* Return the attachment method for attachment OBJ. In case of error we
    return 0 which happens to be not defined. */
 static int
 get_attach_method (LPATTACH obj)
@@ -648,23 +655,6 @@ get_save_filename (HWND root, const char *srcname)
   OPENFILENAME ofn;
 
   memset (fname, 0, sizeof (fname));
-
-#if 0
-  /* FIXME: What the heck does this code? Looking for a prefix in a
-     string an removing it.  Why?.  Also: possible buffer overflow
-     with possible user supplied data.  --- My guess is that we don't
-     need it anymore, now that we are wrinting directly to the
-     outfile. */
-  s = strstr (srcname, ATT_FILE_PREFIX);
-  if (!s)
-    strncpy (fname, srcname, MAX_PATH);
-  else 
-    {
-      strncpy (fname, srcname, (p-srcname));
-      strcat (fname, srcname+(p-srcname)+strlen (ATT_FILE_PREFIX));    
-    }
-#endif
-
   memset (&ofn, 0, sizeof (ofn));
   ofn.lStructSize = sizeof (ofn);
   ofn.hwndOwner = root;
@@ -692,7 +682,6 @@ GpgMsgImpl::decryptAttachment (HWND hwnd, int pos, bool save_plaintext)
   HRESULT hr;
   LPATTACH att;
   int method, err;
-  BOOL success = TRUE;
 
   /* Make sure that we can access the attachment table. */
   if (!message || !getAttachments ())
@@ -829,3 +818,150 @@ GpgMsgImpl::decryptAttachment (HWND hwnd, int pos, bool save_plaintext)
   /* Close this attachment. */
   att->Release ();
 }
+
+
+/* Sign the attachment with the internal number POS.  TTL is caching
+   time for a required passphrase. */
+void
+GpgMsgImpl::signAttachment (HWND hwnd, int pos, int ttl)
+{    
+  HRESULT hr;
+  LPATTACH att;
+  int method, err;
+  LPSTREAM from = NULL;
+  LPSTREAM to = NULL;
+  char *signame = NULL;
+  LPATTACH newatt = NULL;
+
+  /* Make sure that we can access the attachment table. */
+  if (!message || !getAttachments ())
+    {
+      log_debug ("%s:%s: no attachemnts at all", __FILE__, __func__);
+      return;
+    }
+
+  hr = message->OpenAttach (pos, NULL, MAPI_BEST_ACCESS, &att);        
+  if (FAILED (hr))
+    {
+      log_debug ("%s:%s: can't open attachment %d: hr=%#lx",
+                 __FILE__, __func__, pos, hr);
+      return;
+    }
+
+  /* Construct a filename for the new attachment. */
+  {
+    char *tmpname = get_attach_filename (att);
+    if (!tmpname)
+      {
+        signame = (char*)xmalloc (70);
+        snprintf (signame, 70, "gpg-signature-%d.asc", pos);
+      }
+    else
+      {
+        signame = (char*)xmalloc (strlen (tmpname) + 4 + 1);
+        strcpy (stpcpy (signame, tmpname), ".asc");
+        xfree (tmpname);
+      }
+  }
+
+  method = get_attach_method (att);
+  if (method == ATTACH_EMBEDDED_MSG)
+    {
+      log_debug ("%s:%s: signing embedded attachments is not supported",
+                 __FILE__, __func__);
+    }
+  else if (method == ATTACH_BY_VALUE)
+    {
+      ULONG newpos;
+      SPropValue prop;
+
+      hr = att->OpenProperty (PR_ATTACH_DATA_BIN, &IID_IStream, 
+                              0, 0, (LPUNKNOWN*)&from);
+      if (FAILED (hr))
+        {
+          log_error ("%s:%s: can't open data of attachment %d: hr=%#lx",
+                     __FILE__, __func__, pos, hr);
+          goto leave;
+        }
+
+      hr = message->CreateAttach (NULL, 0, &newpos, &newatt);
+      if (hr != S_OK)
+        {
+          log_error ("%s:%s: can't create attachment: hr=%#lx\n",
+                     __FILE__, __func__, hr); 
+          goto leave;
+        }
+
+      prop.ulPropTag = PR_ATTACH_METHOD;
+      prop.Value.ul = ATTACH_BY_VALUE;
+      hr = HrSetOneProp (newatt, &prop);
+      if (hr != S_OK)
+        {
+          log_error ("%s:%s: can't set attach method: hr=%#lx\n",
+                     __FILE__, __func__, hr); 
+          goto leave;
+        }
+      
+      prop.ulPropTag = PR_ATTACH_LONG_FILENAME_A;
+      prop.Value.lpszA = signame;   
+      hr = HrSetOneProp (newatt, &prop);
+      if (hr != S_OK)
+        {
+          log_error ("%s:%s: can't set attach filename: hr=%#lx\n",
+                     __FILE__, __func__, hr); 
+          goto leave;
+        }
+      log_debug ("%s:%s: setting filename of attachment %d/%ld to `%s'",
+                 __FILE__, __func__, pos, newpos, signame);
+
+      hr = newatt->OpenProperty (PR_ATTACH_DATA_BIN, &IID_IStream, 0,
+                                 MAPI_CREATE | MAPI_MODIFY, (LPUNKNOWN*)&to);
+      if (FAILED (hr)) 
+        {
+          log_error ("%s:%s: can't create output stream: hr=%#lx\n",
+                     __FILE__, __func__, hr); 
+          goto leave;
+        }
+      
+      err = op_sign_stream (from, to, OP_SIG_DETACH, ttl);
+      if (err)
+        {
+          log_debug ("%s:%s: sign stream failed: %s",
+                     __FILE__, __func__, op_strerror (err)); 
+          to->Revert ();
+          MessageBox (NULL, op_strerror (err),
+                      "GPG Attachment Signing", MB_ICONERROR|MB_OK);
+          goto leave;
+        }
+      from->Release ();
+      from = NULL;
+      to->Commit (0);
+      to->Release ();
+      to = NULL;
+
+      hr = newatt->SaveChanges (0);
+      if (hr != S_OK)
+        {
+          log_error ("%s:%s: SaveChanges failed: hr=%#lx\n",
+                     __FILE__, __func__, hr); 
+          goto leave;
+        }
+
+    }
+  else
+    {
+      log_error ("%s:%s: attachment %d: method %d not supported",
+                 __FILE__, __func__, pos, method);
+    }
+
+ leave:
+  if (from)
+    from->Release ();
+  if (to)
+    to->Release ();
+  xfree (signame);
+  if (newatt)
+    newatt->Release ();
+
+  att->Release ();
+}
index d602ce8..f0270fc 100644 (file)
@@ -107,6 +107,8 @@ public:
      attachemnt is not yet supported. */
   virtual void decryptAttachment (HWND hwnd, int pos, bool save_plaintext);
 
+  virtual void signAttachment (HWND hwnd, int pos, int ttl);
+
 };
 
 
index a2fea6c..26122b5 100644 (file)
@@ -112,7 +112,7 @@ initialize_msgcache (void)
   SECURITY_ATTRIBUTES sa;
   
   memset (&sa, 0, sizeof sa);
-  sa.bInheritHandle = TRUE;
+  sa.bInheritHandle = FALSE;
   sa.lpSecurityDescriptor = NULL;
   sa.nLength = sizeof sa;
   cache_mutex = CreateMutex (&sa, FALSE, NULL);
index 298d4be..662b24b 100644 (file)
@@ -136,6 +136,7 @@ typedef struct MapiMessage_s *lpMapiMessage;
 #define FORCE_SAVE                    0x00000004
 #define MAPI_DEFERRED_ERRORS          0x00000008
 
+#define SOF_UNIQUEFILENAME            0x80000000
 
 #define RTF_SYNC_RTF_CHANGED          1
 #define RTF_SYNC_BODY_CHANGED         2
diff --git a/src/olflange-rsrcs.rc b/src/olflange-rsrcs.rc
new file mode 100644 (file)
index 0000000..98dc1d9
--- /dev/null
@@ -0,0 +1,229 @@
+/* olflange-rsrcs.rc - Olflange specific resource.
+ *     Copyright (C) 2004, 2005 g10 Code GmbH
+ * 
+ * This file is part of OutlGPG.
+ * 
+ * OutlGPG is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ * 
+ * OutlGPG is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+
+#include "olflange-ids.h"
+
+#include "afxres.h"
+
+
+/////////////////////////////////////////////////////////////////////////////
+// Deutsch (Deutschland) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU)
+#ifdef _WIN32
+LANGUAGE LANG_GERMAN, SUBLANG_GERMAN
+#pragma code_page(1252)
+#endif //_WIN32
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Bitmap
+//
+
+IDB_DECRYPT             BITMAP  DISCARDABLE     "decrypt.bmp"
+IDB_ENCRYPT             BITMAP  DISCARDABLE     "encrypt.bmp"
+IDB_SIGN                BITMAP  DISCARDABLE     "sign.bmp"
+IDB_KEY_MANAGER         BITMAP  DISCARDABLE     "key_mana.bmp"
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog
+//
+
+IDD_GPG_OPTIONS_DE DIALOG DISCARDABLE  0, 0, 266, 201
+STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "GnuPG"
+FONT 8, "MS Sans Serif"
+BEGIN
+    GROUPBOX        "Optionen",IDC_STATIC,9,9,242,87
+    CONTROL         "Neue Nachrichten per Voreinstellung verschlüsseln",
+                    IDC_ENCRYPT_DEFAULT,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,24,19,177,10
+    CONTROL         "Neue Nachrichten per Voreinstellung signieren",
+                    IDC_SIGN_DEFAULT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,
+                    24,30,162,10
+    CONTROL         "Entschlüsselte Attachments automatisch speichern",
+                    IDC_SAVE_DECRYPTED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,
+                    24,42,175,10
+    CONTROL         "Automatisch Attachments signieren",IDC_SIGN_ATTACHMENTS,
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,24,54,126,10
+    CONTROL         "Nachricht ebenfalls mit voreingestellten Schlüssel verschlüsseln",
+                    IDC_ENCRYPT_WITH_STANDARD_KEY,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,24,67,215,10
+    EDITTEXT        IDC_ENCRYPT_TO,36,79,133,12,ES_AUTOHSCROLL
+    GROUPBOX        "Passphrase",IDC_STATIC,9,100,242,31
+    LTEXT           "Passphrase speichern für",IDC_STATIC,24,114,80,8
+    EDITTEXT        IDC_TIME_PHRASES,107,113,39,14,ES_AUTOHSCROLL
+    LTEXT           "Sekunden",IDC_STATIC,151,115,34,8
+    GROUPBOX        "Debug (nur für erfahrene Benutzer)",IDC_STATIC,9,134,
+                    242,28
+    LTEXT           "Logdatei",IDC_STATIC,18,146,28,8
+    EDITTEXT        IDC_DEBUG_LOGFILE,48,145,138,13,ES_AUTOHSCROLL
+    PUSHBUTTON      "&Erweitert...",IDC_GPG_OPTIONS,202,166,50,14
+    LTEXT           "By g10 Code GmbH; available under the LGPL",
+                    IDC_STATIC,8,185,148,8
+    LTEXT           "Version 0.99",IDC_VERSION_INFO,161,185,98,9
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// DESIGNINFO
+//
+
+#ifdef APSTUDIO_INVOKED
+GUIDELINES DESIGNINFO DISCARDABLE 
+BEGIN
+    IDD_GPG_OPTIONS_DE, DIALOG
+    BEGIN
+        LEFTMARGIN, 4
+        RIGHTMARGIN, 259
+        TOPMARGIN, 4
+        BOTTOMMARGIN, 194
+    END
+END
+#endif    // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// String Table
+//
+
+STRINGTABLE DISCARDABLE 
+BEGIN
+    IDS_DECRYPT_MENU_ITEM   "&Decrypt and verify message"
+    IDS_DECRYPT_HELP        "Decrypt and verify the message."
+    IDS_APP_NAME            "GnuPG"
+    IDS_DECRYPT_STATUSBAR   "."
+    IDS_DECRYPT_TOOLTIP     "Decrypt message and verify signature"
+    IDS_ENCRYPT_MENU_ITEM   "GPG &encrypt message"
+    IDS_SIGN_MENU_ITEM      "GPG &sign message"
+    IDS_ENCRYPT_HELP        "Select this option to encrypt the message."
+    IDS_SIGN_HELP           "Select this option to sign the message."
+    IDS_SIGN_STATUSBAR      "."
+    IDS_SIGN_TOOLTIP        "Sign message with GPG"
+    IDS_ENCRYPT_STATUSBAR   "."
+    IDS_ENCRYPT_TOOLTIP     "Encrypt message with GPG"
+END
+
+STRINGTABLE DISCARDABLE 
+BEGIN
+    IDS_KEY_MANAGER         "GnuPG Key &Manager"
+    IDS_KEY_MANAGER_HELP    "Open GnuPG Key Manager"
+    IDS_KEY_MANAGER_STATUSBAR "."
+    IDS_KEY_MANAGER_TOOLTIP "Open GnuPG Key Manager"
+    IDS_ERR_REPLACE_TEXT    "The message text could not be refreshed.\nPlease close the message and open it again."
+    IDS_ATT_DECRYPT_AND_SAVE 
+                            "Please close the message and open it again, to open the encrypted attachments or to save them."
+    IDS_SAVE_ATT_TITLE      "Save decrypted attachment"
+END
+
+STRINGTABLE DISCARDABLE 
+BEGIN
+    IDS_SAVE_ATT_FILTER     "All Files (*.*)|*.*||"
+    IDS_ERR_REPLACE_TEXT_ASK_SAVE 
+                            "The message text could not be refreshed. You can only read the message, when you save the decrypted message. Then you need to close it and open it again.\n\nShould the decrypted message be saved?"
+    IDS_ERR_ENCRYPT_ATTACHMENTS 
+                            "An error occured during the encryption of the attachments. The message cannot be sent."
+    IDS_COPY_KEY_TO_CLIPBOARD 
+                            "The key was written to the clipboard. Please add it to the message."
+    IDS_ERR_ENCRYPT_EMBEDDED_OLE 
+                            "Messaged with embedded OLE-objects cannot be encrypted."
+END
+
+#endif    // Deutsch (Deutschland) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+/////////////////////////////////////////////////////////////////////////////
+// Englisch (USA) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
+#ifdef _WIN32
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+#pragma code_page(1252)
+#endif //_WIN32
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog
+//
+
+IDD_GPG_OPTIONS DIALOG DISCARDABLE  0, 0, 266, 201
+STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "GnuPG"
+FONT 8, "MS Sans Serif"
+BEGIN
+    GROUPBOX        "Options",IDC_STATIC,9,9,242,87
+    CONTROL         "&Encrypt new messages by default",IDC_ENCRYPT_DEFAULT,
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,24,19,121,10
+    CONTROL         "&Sign new messages by default",IDC_SIGN_DEFAULT,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,24,30,111,10
+    CONTROL         "Save decrypted message &automatically",
+                    IDC_SAVE_DECRYPTED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,
+                    24,42,139,10
+    CONTROL         "Automatically sign attachments",IDC_SIGN_ATTACHMENTS,
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,24,54,113,10
+    CONTROL         "Also encrypt message with the &default key",
+                    IDC_ENCRYPT_WITH_STANDARD_KEY,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,24,67,148,10
+    EDITTEXT        IDC_ENCRYPT_TO,36,79,133,12,ES_AUTOHSCROLL
+    GROUPBOX        "Passphrase",IDC_STATIC,9,100,242,31
+    LTEXT           "Cache &passphrase for",IDC_STATIC,24,114,70,8
+    EDITTEXT        IDC_TIME_PHRASES,107,113,39,14,ES_AUTOHSCROLL
+    LTEXT           "seconds",IDC_STATIC,151,115,28,8
+    GROUPBOX        "Debug (advanced users only)",IDC_STATIC,9,134,242,28
+    LTEXT           "Logfile",IDC_STATIC,18,146,22,8
+    EDITTEXT        IDC_DEBUG_LOGFILE,48,145,138,13,ES_AUTOHSCROLL
+    PUSHBUTTON      "Ad&vanced..",IDC_GPG_OPTIONS,202,166,50,14
+    LTEXT           "By g10 Code GmbH; available under the LGPL",
+                    IDC_STATIC,8,185,148,8
+    LTEXT           "Version 0.99",IDC_VERSION_INFO,161,185,98,9
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// DESIGNINFO
+//
+
+#ifdef APSTUDIO_INVOKED
+GUIDELINES DESIGNINFO DISCARDABLE 
+BEGIN
+    IDD_GPG_OPTIONS, DIALOG
+    BEGIN
+        LEFTMARGIN, 4
+        RIGHTMARGIN, 259
+        TOPMARGIN, 4
+        BOTTOMMARGIN, 194
+    END
+END
+#endif    // APSTUDIO_INVOKED
+
+#endif    // Englisch (USA) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+
index d461c40..b3413a0 100644 (file)
@@ -73,7 +73,7 @@ initialize_passcache (void)
   SECURITY_ATTRIBUTES sa;
   
   memset (&sa, 0, sizeof sa);
-  sa.bInheritHandle = TRUE;
+  sa.bInheritHandle = FALSE;
   sa.lpSecurityDescriptor = NULL;
   sa.nLength = sizeof sa;
   cache_mutex = CreateMutex (&sa, FALSE, NULL);