Added missing commands for engine-assuan.c.
authorWerner Koch <wk@gnupg.org>
Wed, 10 Oct 2007 17:16:51 +0000 (17:16 +0000)
committerWerner Koch <wk@gnupg.org>
Wed, 10 Oct 2007 17:16:51 +0000 (17:16 +0000)
Add option to select S/MIME.

14 files changed:
src/ChangeLog
src/common.h
src/engine-assuan.c
src/ext-commands.cpp
src/ext-commands.h
src/main.c
src/message-events.cpp
src/message.cpp
src/message.h
src/olflange-dlgs.cpp
src/olflange-ids.h
src/olflange-rsrcs.rc
src/olflange.cpp
src/olflange.h

index 1f7111b..cd6f003 100644 (file)
@@ -1,3 +1,8 @@
+2007-10-10  Werner Koch  <wk@g10code.com>
+
+       * main.c (read_options): Remove saveDecryptedAttachment.  Add
+       smimeDefault.
+
 2007-10-08  Werner Koch  <wk@g10code.com>
 
        * main.c (do_log): Remove trailing LF from w32 error message and
index 96cfdc8..816aa04 100644 (file)
@@ -103,9 +103,9 @@ extern
 struct 
 {
   int passwd_ttl;            /* Time in seconds the passphrase is stored. */
+  int smime_default;         /* Use S/MIME by default. */
   int encrypt_default;       /* Encrypt by default. */
   int sign_default;          /* Sign by default. */
-  int save_decrypted_attach; /* Save decrypted attachments. */
   int auto_sign_attach;             /* Sign all outgoing attachments. */
   int enc_format;            /* Encryption format for attachments. */
   char *default_key;         /* The key we want to always encrypt to. */
index 6e898a8..226c00e 100644 (file)
@@ -69,6 +69,7 @@ struct closure_data_s
   gpgme_data_t status_data;
   status_buffer_t status_buffer; /* Allocated on demand.  */
   int status_ready;
+  gpgme_data_t sigdata;   /* Used by verify_closure.  */
   gpg_error_t last_err;
 };
 
@@ -138,6 +139,20 @@ create_command_id (void)
 }
 
 
+static void
+close_pipe (HANDLE apipe[2])
+{
+  int i;
+
+  for (i=0; i < 2; i++)
+    if (apipe[i] != INVALID_HANDLE_VALUE)
+      {
+        CloseHandle (apipe[i]);
+        apipe[i] = INVALID_HANDLE_VALUE;
+      }
+}
+
+
 /* Duplicate HANDLE into the server's process and close HANDLE.  Note
    that HANDLE is closed even if the function fails.  Returns the
    duplicated handle on success or INVALID_HANDLE_VALUE on error.  */
@@ -1099,10 +1114,21 @@ start_command (assuan_context_t ctx, closure_data_t cld,
 }
 
 
+static const char *
+get_protocol_name (protocol_t protocol)
+{
+  switch (protocol)
+    {
+    case PROTOCOL_OPENPGP: return "OpenPGP"; break;
+    case PROTOCOL_SMIME:   return "CMS"; break;
+    default: return NULL;
+    }
+}
+
 
 \f
 /* Note that this closure is called in the context of the
-   waiter_thread.  */
+   async_worker_thread.  */
 static void
 encrypt_closure (closure_data_t cld)
 {
@@ -1134,6 +1160,10 @@ op_assuan_encrypt (protocol_t protocol,
   pid_t pid;
   int i;
   char *p;
+  const char *protocol_name;
+
+  if (!(protocol_name = get_protocol_name (protocol)))
+    return gpg_error(GPG_ERR_INV_VALUE);
 
   err = connect_uiserver (&ctx, &pid, &cmdid, hwnd);
   if (err)
@@ -1143,8 +1173,7 @@ op_assuan_encrypt (protocol_t protocol,
     return err;
   if ((err = create_io_pipe (outpipe, pid, 0)))
     {
-      CloseHandle (inpipe[0]);
-      CloseHandle (outpipe[0]);
+      close_pipe (inpipe);
       return err;
     }
 
@@ -1183,12 +1212,8 @@ op_assuan_encrypt (protocol_t protocol,
                     cmdid, NULL, 0); 
   enqueue_callback ("output", ctx, outdata, outpipe[0], 0, finalize_handler, 
                     cmdid, NULL, 1 /* Wait on success */); 
-  err = start_command (ctx, cld, cmdid, 
-                       (protocol == PROTOCOL_OPENPGP
-                        ? "ENCRYPT --protocol=OpenPGP"
-                        : protocol == PROTOCOL_SMIME
-                        ? "ENCRYPT --protocol=CMS"
-                        : "ENCRYPT --protocol=unknown-protocol"));
+  snprintf (line, sizeof line, "ENCRYPT --protocol=%s", protocol_name);
+  err = start_command (ctx, cld, cmdid, line);
   cld = NULL; /* Now owned by start_command.  */
   if (err)
     goto leave;
@@ -1198,14 +1223,8 @@ op_assuan_encrypt (protocol_t protocol,
   if (err)
     {
       /* Fixme: Cancel stuff in the work_queue. */
-      if (inpipe[0] != INVALID_HANDLE_VALUE)
-        CloseHandle (inpipe[0]);
-      if (inpipe[1] != INVALID_HANDLE_VALUE)
-        CloseHandle (inpipe[1]);
-      if (outpipe[0] != INVALID_HANDLE_VALUE)
-        CloseHandle (outpipe[0]);
-      if (outpipe[1] != INVALID_HANDLE_VALUE)
-        CloseHandle (outpipe[1]);
+      close_pipe (inpipe);
+      close_pipe (outpipe);
       xfree (cld);
       assuan_disconnect (ctx);
     }
@@ -1216,33 +1235,278 @@ op_assuan_encrypt (protocol_t protocol,
 
 
 \f
+/* Note that this closure is called in the context of the
+   async_worker_thread.  */
+static void
+sign_closure (closure_data_t cld)
+{
+  engine_private_finished (cld->filter, cld->final_err);
+}
+
+
+/* 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.  */
 int 
 op_assuan_sign (protocol_t protocol, 
                 gpgme_data_t indata, gpgme_data_t outdata,
                 engine_filter_t filter, void *hwnd)
 {
-  return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
+  gpg_error_t err;
+  closure_data_t cld;
+  assuan_context_t ctx;
+  char line[1024];
+  HANDLE inpipe[2], outpipe[2];
+  ULONG cmdid;
+  pid_t pid;
+  const char *protocol_name;
+
+
+  if (!(protocol_name = get_protocol_name (protocol)))
+    return gpg_error(GPG_ERR_INV_VALUE);
+
+  err = connect_uiserver (&ctx, &pid, &cmdid, hwnd);
+  if (err)
+    return err;
+
+  if ((err = create_io_pipe (inpipe, pid, 1)))
+    return err;
+  if ((err = create_io_pipe (outpipe, pid, 0)))
+    {
+      close_pipe (inpipe);
+      return err;
+    }
+
+  cld = xcalloc (1, sizeof *cld);
+  cld->closure = sign_closure;
+  cld->filter = filter;
+
+  err = assuan_transact (ctx, "RESET", 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);
+  if (err)
+    goto leave;
+  snprintf (line, sizeof line, "OUTPUT FD=%ld", (unsigned long int)outpipe[1]);
+  err = assuan_transact (ctx, line, NULL, NULL, NULL, NULL, NULL, NULL);
+  if (err)
+    goto leave;
+
+  /* FIXME: Implement the optinonal SENDER command. */
+
+  enqueue_callback (" input", ctx, indata, inpipe[1], 1, finalize_handler,
+                    cmdid, NULL, 0); 
+  enqueue_callback ("output", ctx, outdata, outpipe[0], 0, finalize_handler, 
+                    cmdid, NULL, 1 /* Wait on success */); 
+
+  snprintf (line, sizeof line, "SIGN --protocol=%s --detached",
+            protocol_name);
+  err = start_command (ctx, cld, cmdid, line);
+  cld = NULL; /* Now owned by start_command.  */
+  if (err)
+    goto leave;
+
+
+ leave:
+  if (err)
+    {
+      /* Fixme: Cancel stuff in the work_queue. */
+      close_pipe (inpipe);
+      close_pipe (outpipe);
+      xfree (cld);
+      assuan_disconnect (ctx);
+    }
+  else
+    engine_private_set_cancel (filter, ctx);
+  return err;
 }
 
 
+
 \f
+/* Note that this closure is called in the context of the
+   async_worker_thread.  */
+static void
+decrypt_closure (closure_data_t cld)
+{
+  engine_private_finished (cld->filter, cld->final_err);
+}
+
+
+/* Decrypt data from INDATA to OUTDATE.  If WITH_VERIFY is set, the
+   signature of a PGP/MIME combined message is also verified the same
+   way as with op_assuan_verify.  */
 int 
 op_assuan_decrypt (protocol_t protocol,
                    gpgme_data_t indata, gpgme_data_t outdata, 
                    engine_filter_t filter, void *hwnd,
                    int with_verify)
 {
-  return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
+  gpg_error_t err;
+  closure_data_t cld;
+  assuan_context_t ctx;
+  char line[1024];
+  HANDLE inpipe[2], outpipe[2];
+  ULONG cmdid;
+  pid_t pid;
+  const char *protocol_name;
+
+  if (!(protocol_name = get_protocol_name (protocol)))
+    return gpg_error(GPG_ERR_INV_VALUE);
+
+  err = connect_uiserver (&ctx, &pid, &cmdid, hwnd);
+  if (err)
+    return err;
+
+  if ((err = create_io_pipe (inpipe, pid, 1)))
+    return err;
+  if ((err = create_io_pipe (outpipe, pid, 0)))
+    {
+      close_pipe (inpipe);
+      return err;
+    }
+
+  cld = xcalloc (1, sizeof *cld);
+  cld->closure = decrypt_closure;
+  cld->filter = filter;
+
+  err = assuan_transact (ctx, "RESET", 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);
+  if (err)
+    goto leave;
+  snprintf (line, sizeof line, "OUTPUT FD=%ld", (unsigned long int)outpipe[1]);
+  err = assuan_transact (ctx, line, NULL, NULL, NULL, NULL, NULL, NULL);
+  if (err)
+    goto leave;
+
+  enqueue_callback (" input", ctx, indata, inpipe[1], 1, finalize_handler,
+                    cmdid, NULL, 0); 
+  enqueue_callback ("output", ctx, outdata, outpipe[0], 0, finalize_handler, 
+                    cmdid, NULL, 1 /* Wait on success */); 
+
+  snprintf (line, sizeof line, "DECRYPT --protocol=%s%s",
+            protocol_name, with_verify? "":" --no-verify");
+  err = start_command (ctx, cld, cmdid, line);
+  cld = NULL; /* Now owned by start_command.  */
+  if (err)
+    goto leave;
+
+
+ leave:
+  if (err)
+    {
+      /* Fixme: Cancel stuff in the work_queue. */
+      close_pipe (inpipe);
+      close_pipe (outpipe);
+      xfree (cld);
+      assuan_disconnect (ctx);
+    }
+  else
+    engine_private_set_cancel (filter, ctx);
+  return err;
 }
 
 
 \f
+/* Note that this closure is called in the context of the
+   async_worker_thread.  */
+static void
+verify_closure (closure_data_t cld)
+{
+  gpgme_data_release (cld->sigdata);
+  cld->sigdata = NULL;
+  engine_private_finished (cld->filter, cld->final_err);
+}
+
+
+/* Verify a detached message where the data is in the gpgme object
+   MSGDATA and the signature given as the string SIGNATURE. */
 int 
 op_assuan_verify (gpgme_protocol_t protocol, 
-                   gpgme_data_t data, const char *signature,
-                   engine_filter_t filter, void *hwnd)
+                  gpgme_data_t msgdata, const char *signature,
+                  engine_filter_t filter, void *hwnd)
 {
-  return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
+  gpg_error_t err;
+  closure_data_t cld = NULL;
+  assuan_context_t ctx;
+  char line[1024];
+  HANDLE msgpipe[2], sigpipe[2];
+  ULONG cmdid;
+  pid_t pid;
+  gpgme_data_t sigdata = NULL;
+  const char *protocol_name;
+
+  msgpipe[0] = INVALID_HANDLE_VALUE;
+  msgpipe[1] = INVALID_HANDLE_VALUE;
+  sigpipe[0] = INVALID_HANDLE_VALUE;
+  sigpipe[1] = INVALID_HANDLE_VALUE;
+
+  if (!(protocol_name = get_protocol_name (protocol)))
+    return gpg_error(GPG_ERR_INV_VALUE);
+
+  err = gpgme_data_new_from_mem (&sigdata, signature, strlen (signature), 0);
+  if (err)
+    goto leave;
+
+  err = connect_uiserver (&ctx, &pid, &cmdid, hwnd);
+  if (err)
+    goto leave;
+
+  if ((err = create_io_pipe (msgpipe, pid, 1)))
+    goto leave;
+  if ((err = create_io_pipe (sigpipe, pid, 1)))
+    goto leave;
+
+  cld = xcalloc (1, sizeof *cld);
+  cld->closure = verify_closure;
+  cld->filter = filter;
+  cld->sigdata = sigdata;
+
+  err = assuan_transact (ctx, "RESET", NULL, NULL, NULL, NULL, NULL, NULL);
+  if (err)
+    goto leave;
+
+  snprintf (line, sizeof line, "MESSAGE FD=%ld",(unsigned long int)msgpipe[0]);
+  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)sigpipe[0]);
+  err = assuan_transact (ctx, line, NULL, NULL, NULL, NULL, NULL, NULL);
+  if (err)
+    goto leave;
+
+  enqueue_callback ("   msg", ctx, msgdata, msgpipe[1], 1, finalize_handler,
+                    cmdid, NULL, 0); 
+  enqueue_callback ("   sig", ctx, sigdata, sigpipe[1], 1, finalize_handler, 
+                    cmdid, NULL, 0); 
+
+  snprintf (line, sizeof line, "VERIFY --protocol=%s",  protocol_name);
+  err = start_command (ctx, cld, cmdid, line);
+  cld = NULL;     /* Now owned by start_command.  */
+  sigdata = NULL; /* Ditto.  */
+  if (err)
+    goto leave;
+
+
+ leave:
+  if (err)
+    {
+      /* Fixme: Cancel stuff in the work_queue. */
+      close_pipe (msgpipe);
+      close_pipe (sigpipe);
+      gpgme_data_release (sigdata);
+      xfree (cld);
+      assuan_disconnect (ctx);
+    }
+  else
+    engine_private_set_cancel (filter, ctx);
+  return err;
 }
 
 
index 368f270..becc5d3 100644 (file)
@@ -78,6 +78,7 @@ GpgolExtCommands::GpgolExtCommands (GpgolExt* pParentInterface)
   m_pExchExt = pParentInterface; 
   m_lRef = 0; 
   m_lContext = 0; 
+  m_nCmdSelectSmime = 0;
   m_nCmdEncrypt = 0;  
   m_nCmdDecrypt = 0;  
   m_nCmdSign = 0; 
@@ -88,8 +89,10 @@ GpgolExtCommands::GpgolExtCommands (GpgolExt* pParentInterface)
   m_nCmdDebug2 = 0;
   m_nToolbarButtonID1 = 0; 
   m_nToolbarButtonID2 = 0; 
+  m_nToolbarButtonID3 = 0; 
   m_nToolbarBitmap1 = 0;
   m_nToolbarBitmap2 = 0; 
+  m_nToolbarBitmap3 = 0; 
   m_hWnd = NULL; 
 }
 
@@ -345,6 +348,7 @@ GpgolExtCommands::InstallCommands (
   if (m_lContext == EECONTEXT_SENDNOTEMESSAGE) 
     {
       toolbar_add_menu (pEECB, pnCommandIDBase, "", NULL,
+                        _("use S/MIME protocol"), &m_nCmdSelectSmime,
                         _("&encrypt message with GnuPG"), &m_nCmdEncrypt,
                         _("&sign message with GnuPG"), &m_nCmdSign,
                         NULL );
@@ -367,8 +371,16 @@ GpgolExtCommands::InstallCommands (
           tbab.nID = IDB_SIGN;
           m_nToolbarBitmap2 = SendMessage (hwnd_toolbar, TB_ADDBITMAP,
                                            1, (LPARAM)&tbab);
+
+          m_nToolbarButtonID3 = pTBEArray[tb_idx].itbbBase;
+          pTBEArray[tb_idx].itbbBase++;
+
+          tbab.nID = IDB_SELECT_SMIME;
+          m_nToolbarBitmap3 = SendMessage (hwnd_toolbar, TB_ADDBITMAP,
+                                           1, (LPARAM)&tbab);
         }
 
+      m_pExchExt->m_gpgSelectSmime = opt.smime_default;
       m_pExchExt->m_gpgEncrypt = opt.encrypt_default;
       m_pExchExt->m_gpgSign    = opt.sign_default;
       if (force_encrypt)
@@ -509,6 +521,11 @@ GpgolExtCommands::DoCommand (
       ul_release (message);
       ul_release (mdb);
     }
+  else if (nCommandID == m_nCmdSelectSmime
+           && m_lContext == EECONTEXT_SENDNOTEMESSAGE) 
+    {
+      m_pExchExt->m_gpgSelectSmime = !m_pExchExt->m_gpgSelectSmime;
+    }
   else if (nCommandID == m_nCmdEncrypt
            && m_lContext == EECONTEXT_SENDNOTEMESSAGE) 
     {
@@ -588,6 +605,13 @@ GpgolExtCommands::Help (LPEXCHEXTCALLBACK pEECB, UINT nCommandID)
                   _("Check the signature now and display the result"),
                   "GpgOL", MB_OK);
     }
+  else if (nCommandID == m_nCmdSelectSmime
+           && m_lContext == EECONTEXT_SENDNOTEMESSAGE) 
+    {
+      MessageBox (m_hWnd,
+                  _("Select this option to select the S/MIME protocol."),
+                  "GpgOL", MB_OK);     
+    } 
   else if (nCommandID == m_nCmdEncrypt 
            && m_lContext == EECONTEXT_SENDNOTEMESSAGE) 
     {
@@ -656,6 +680,16 @@ GpgolExtCommands::QueryHelpText(UINT nCommandID, ULONG lFlags,
                   _("Check the signature now and display the result"),
                   nCharCnt);
     }
+  else if (nCommandID == m_nCmdSelectSmime
+           && m_lContext == EECONTEXT_SENDNOTEMESSAGE) 
+    {
+      if (lFlags == EECQHT_STATUS)
+        lstrcpyn (pszText, ".", nCharCnt);
+      if (lFlags == EECQHT_TOOLTIP)
+        lstrcpyn (pszText,
+                  _("Use S/MIME for sign/encrypt"),
+                  nCharCnt);
+    }
   else if (nCommandID == m_nCmdEncrypt
            && m_lContext == EECONTEXT_SENDNOTEMESSAGE) 
     {
@@ -749,6 +783,20 @@ GpgolExtCommands::QueryButtonInfo (ULONG toolbarid, UINT buttonid,
       lstrcpyn (description, _("Sign message with GPG"),
                 description_size);
     }
+  else if (buttonid == m_nToolbarButtonID3
+           && m_lContext == EECONTEXT_SENDNOTEMESSAGE)
+    {
+      pTBB->iBitmap = m_nToolbarBitmap3;             
+      pTBB->idCommand = m_nCmdSelectSmime;
+      pTBB->fsState = TBSTATE_ENABLED;
+      if (m_pExchExt->m_gpgSelectSmime)
+        pTBB->fsState |= TBSTATE_CHECKED;
+      pTBB->fsStyle = TBSTYLE_BUTTON | TBSTYLE_CHECK;
+      pTBB->dwData = 0;
+      pTBB->iString = -1;
+      lstrcpyn (description, _("Use the S/MIME protocol"),
+                description_size);
+    }
   else if (buttonid == m_nToolbarButtonID1
            && m_lContext == EECONTEXT_VIEWER)
     {
index aad237c..cf8f242 100644 (file)
@@ -37,6 +37,7 @@ private:
   ULONG m_lRef;
   ULONG m_lContext;
   
+  UINT  m_nCmdSelectSmime;
   UINT  m_nCmdEncrypt;
   UINT  m_nCmdDecrypt;
   UINT  m_nCmdSign;
@@ -48,8 +49,10 @@ private:
 
   UINT  m_nToolbarButtonID1;
   UINT  m_nToolbarButtonID2;     
+  UINT  m_nToolbarButtonID3;     
   UINT  m_nToolbarBitmap1;
   UINT  m_nToolbarBitmap2;
+  UINT  m_nToolbarBitmap3;
   
   HWND  m_hWnd;
   
index 8b091c6..9287e1d 100644 (file)
@@ -483,8 +483,8 @@ read_options (void)
   opt.auto_sign_attach = val == NULL || *val != '1' ? 0 : 1;
   xfree (val); val = NULL;
   
-  load_extension_value ("saveDecryptedAttachments", &val);
-  opt.save_decrypted_attach = val == NULL || *val != '1'? 0 : 1;
+  load_extension_value ("smimeDefault", &val);
+  opt.smime_default = val == NULL || *val != '1'? 0 : 1;
   xfree (val); val = NULL;
 
   load_extension_value ("encryptDefault", &val);
@@ -566,9 +566,9 @@ write_options (void)
     int  value;
     char *s_val;
   } table[] = {
+    {"smimeDefault",             0, opt.smime_default},
     {"encryptDefault",           0, opt.encrypt_default},
     {"signDefault",              0, opt.sign_default},
-    {"saveDecryptedAttachments", 0, opt.save_decrypted_attach},
     {"autoSignAttachments",      0, opt.auto_sign_attach},
     {"previewDecrypt",           0, opt.preview_decrypt},
     {"storePasswdTime",          1, opt.passwd_ttl},
index 0640368..22b4f09 100644 (file)
@@ -272,12 +272,16 @@ GpgolMessageEvents::OnWriteComplete (LPEXCHEXTCALLBACK eecb, ULONG flags)
   HRESULT hr = eecb->GetObject (&pMDB, (LPMAPIPROP *)&msg);
   if (SUCCEEDED (hr))
     {
+      protocol_t proto = (m_pExchExt->m_gpgSelectSmime
+                          ? PROTOCOL_SMIME
+                          : PROTOCOL_OPENPGP);
+      
       if (m_pExchExt->m_gpgEncrypt && m_pExchExt->m_gpgSign)
-        rc = message_sign_encrypt (msg, hWnd);
+        rc = message_sign_encrypt (msg, proto, hWnd);
       else if (m_pExchExt->m_gpgEncrypt && !m_pExchExt->m_gpgSign)
-        rc = message_encrypt (msg, hWnd);
+        rc = message_encrypt (msg, proto, hWnd);
       else if (!m_pExchExt->m_gpgEncrypt && m_pExchExt->m_gpgSign)
-        rc = message_sign (msg, hWnd);
+        rc = message_sign (msg, proto, hWnd);
       else
         rc = 0;
       
index 6e0ecb5..f491f04 100644 (file)
@@ -741,7 +741,7 @@ release_recipient_array (char **recipients)
 
 
 static int
-sign_encrypt (LPMESSAGE message, HWND hwnd, int signflag)
+sign_encrypt (LPMESSAGE message, protocol_t protocol, HWND hwnd, int signflag)
 {
   gpg_error_t err;
   char **recipients;
@@ -757,9 +757,9 @@ sign_encrypt (LPMESSAGE message, HWND hwnd, int signflag)
   else
     {
       if (signflag)
-        err = mime_sign_encrypt (message, PROTOCOL_OPENPGP, recipients);
+        err = mime_sign_encrypt (message, protocol, recipients);
       else
-        err = mime_encrypt (message, PROTOCOL_OPENPGP, recipients);
+        err = mime_encrypt (message, protocol, recipients);
       if (err)
         {
           char buf[200];
@@ -776,11 +776,11 @@ sign_encrypt (LPMESSAGE message, HWND hwnd, int signflag)
 
 /* Sign the MESSAGE.  */
 int 
-message_sign (LPMESSAGE message, HWND hwnd)
+message_sign (LPMESSAGE message, protocol_t protocol, HWND hwnd)
 {
   gpg_error_t err;
 
-  err = mime_sign (message, PROTOCOL_OPENPGP);
+  err = mime_sign (message, protocol);
   if (err)
     {
       char buf[200];
@@ -796,17 +796,17 @@ message_sign (LPMESSAGE message, HWND hwnd)
 
 /* Encrypt the MESSAGE.  */
 int 
-message_encrypt (LPMESSAGE message, HWND hwnd)
+message_encrypt (LPMESSAGE message, protocol_t protocol, HWND hwnd)
 {
-  return sign_encrypt (message, hwnd, 0);
+  return sign_encrypt (message, protocol, hwnd, 0);
 }
 
 
 /* Sign+Encrypt the MESSAGE.  */
 int 
-message_sign_encrypt (LPMESSAGE message, HWND hwnd)
+message_sign_encrypt (LPMESSAGE message, protocol_t protocol, HWND hwnd)
 {
-  return sign_encrypt (message, hwnd, 1);
+  return sign_encrypt (message, protocol, hwnd, 1);
 }
 
 
index d7ff8a8..01fd13d 100644 (file)
@@ -31,9 +31,9 @@ void message_show_info (LPMESSAGE message, HWND hwnd);
 int message_verify (LPMESSAGE message, msgtype_t msgtype, int force);
 int message_decrypt (LPMESSAGE message, msgtype_t msgtype, int force);
 
-int message_sign (LPMESSAGE message, HWND hwnd);
-int message_encrypt (LPMESSAGE message, HWND hwnd);
-int message_sign_encrypt (LPMESSAGE message, HWND hwnd);
+int message_sign (LPMESSAGE message, protocol_t protocol, HWND hwnd);
+int message_encrypt (LPMESSAGE message, protocol_t protocol, HWND hwnd);
+int message_sign_encrypt (LPMESSAGE message, protocol_t protocol, HWND hwnd);
 
 
 #endif /*MESSAGE_H*/
index b3b0b5c..c651cab 100644 (file)
@@ -117,7 +117,7 @@ GPGOptionsDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
            case IDC_ENCRYPT_WITH_STANDARD_KEY:
            case IDC_PREFER_HTML:
            case IDC_SIGN_DEFAULT:
-           case IDC_SAVE_DECRYPTED:
+           case IDC_SMIME_DEFAULT:
            case IDC_PREVIEW_DECRYPT:
            case IDC_SIGN_ATTACHMENTS:
              SendMessage (GetParent (hDlg), PSM_CHANGED, (WPARAM)hDlg, 0L);
@@ -159,8 +159,8 @@ GPGOptionsDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
                                !!opt.sign_default, 0L);
            SendDlgItemMessage (hDlg, IDC_ENCRYPT_WITH_STANDARD_KEY,
                                 BM_SETCHECK, opt.enable_default_key, 0L);
-           SendDlgItemMessage (hDlg, IDC_SAVE_DECRYPTED, BM_SETCHECK, 
-                               !!opt.save_decrypted_attach, 0L);
+           SendDlgItemMessage (hDlg, IDC_SMIME_DEFAULT, BM_SETCHECK, 
+                               !!opt.smime_default, 0L);
            SendDlgItemMessage (hDlg, IDC_SIGN_ATTACHMENTS, BM_SETCHECK,
                                !!opt.auto_sign_attach, 0L);
            SendDlgItemMessage (hDlg, IDC_PREVIEW_DECRYPT, BM_SETCHECK,
@@ -198,8 +198,8 @@ GPGOptionsDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
               (hDlg, IDC_ENCRYPT_DEFAULT, BM_GETCHECK, 0, 0L);
            opt.sign_default = !!SendDlgItemMessage 
               (hDlg, IDC_SIGN_DEFAULT, BM_GETCHECK, 0, 0L);
-           opt.save_decrypted_attach = !!SendDlgItemMessage
-              (hDlg, IDC_SAVE_DECRYPTED, BM_GETCHECK, 0, 0L);
+           opt.smime_default = !!SendDlgItemMessage
+              (hDlg, IDC_SMIME_DEFAULT, BM_GETCHECK, 0, 0L);
             opt.auto_sign_attach = !!SendDlgItemMessage
               (hDlg, IDC_SIGN_ATTACHMENTS, BM_GETCHECK, 0, 0L);
             opt.preview_decrypt = !!SendDlgItemMessage
index d88ee0f..f76bd10 100644 (file)
@@ -16,7 +16,7 @@
 #define IDB_ADD_KEYS                    4003
 #define IDC_ENCRYPT_WITH_STANDARD_KEY   4003
 #define IDB_KEY_MANAGER                 4004
-#define IDC_SAVE_DECRYPTED              4004
+#define IDC_SMIME_DEFAULT               4004
 #define IDC_GPG_OPTIONS                 4006
 #define IDC_BITMAP                      4007
 #define IDB_BANNER                      4009
@@ -27,5 +27,6 @@
 #define IDD_GPG_OPTIONS_DE              4012
 #define IDC_PREVIEW_DECRYPT             4013
 #define IDC_PREFER_HTML                 4014
+#define IDB_SELECT_SMIME                4015
 
 #endif /*OLFLANGE_IDS_H*/
index 52fe683..31e4f60 100644 (file)
@@ -63,8 +63,8 @@ BEGIN
     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,
+    CONTROL         "S/MIME per Voreinstellung verwenden",
+                    IDC_SMIME_DEFAULT,"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
@@ -141,8 +141,8 @@ BEGIN
                     "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,
+    CONTROL         "Use S/MIME by default",
+                    IDC_SMIME_DEFAULT,"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
index 712112b..fda8c56 100644 (file)
@@ -290,6 +290,7 @@ GpgolExt::GpgolExt (void)
   m_lRef = 1;
   m_lContext = 0;
   m_hWndExchange = 0;
+  m_gpgSelectSmime = FALSE;
   m_gpgEncrypt = FALSE;
   m_gpgSign = FALSE;
   msgtype = MSGTYPE_UNKNOWN;
index 09b0f48..6ee1436 100644 (file)
@@ -41,6 +41,7 @@ public:
   HWND m_hWndExchange;  /* Handle of the exchange window. */
 
   /* Parameters for sending mails.  */
+  BOOL  m_gpgSelectSmime;
   BOOL  m_gpgEncrypt;
   BOOL  m_gpgSign;