Send SENDER command also for encryption.
authorWerner Koch <wk@gnupg.org>
Thu, 26 Feb 2009 09:47:01 +0000 (09:47 +0000)
committerWerner Koch <wk@gnupg.org>
Thu, 26 Feb 2009 09:47:01 +0000 (09:47 +0000)
src/ChangeLog
src/engine-assuan.c
src/engine-assuan.h
src/engine.c
src/engine.h
src/mimemaker.c

index a518715..ae7dff3 100644 (file)
@@ -1,3 +1,11 @@
+2009-02-26  Werner Koch  <wk@g10code.com>
+
+       * engine.c (engine_encrypt_prepare): Add arg SENDER.
+       * engine-assuan.c (op_assuan_encrypt): Ditto.
+       * mimemaker.c (do_mime_sign): Free sender string.
+       (mime_encrypt): Pass the sender address to the engine.
+       (mime_sign_encrypt): Ditto.
+
 2009-02-25  Werner Koch  <wk@g10code.com>
 
        * mapihelp.cpp (get_gpgoldraftinfo_tag): New.
index a44c37c..d9f0e33 100644 (file)
@@ -1563,12 +1563,15 @@ encrypt_closure (closure_data_t cld)
    this function returns success, the data objects may only be
    destroyed after an engine_wait or engine_cancel.  On success the
    function returns a poiunter to the encryption state and thus
-   requires that op_assuan_encrypt_bottom will be run later. */
+   requires that op_assuan_encrypt_bottom will be run later. 
+   SENDER is the sender's mailbox or NULL; this information may be
+   used by the UI-server for role selection.  */
 int
 op_assuan_encrypt (protocol_t protocol, 
                    gpgme_data_t indata, gpgme_data_t outdata,
                    engine_filter_t filter, void *hwnd,
-                   char **recipients, protocol_t *r_used_protocol,
+                   const char *sender, char **recipients,
+                   protocol_t *r_used_protocol,
                    struct engine_assuan_encstate_s **r_encstate)
 {
   gpg_error_t err;
@@ -1608,6 +1611,17 @@ op_assuan_encrypt (protocol_t protocol,
   if (err)
     goto leave;
   send_session_info (ctx, filter);
+
+  /* If a sender has been supplied, tell the server about it.  We
+     don't care about error because servers may not implement SENDER
+     in an encryption context.  */
+  if (sender && *sender)
+    {
+      snprintf (line, sizeof line, "SENDER --info -- %s", sender);
+      assuan_transact (ctx, line, NULL, NULL, NULL, NULL, NULL, NULL);
+    }
+
+  /* Send the recipients to the server.  */
   for (i=0; recipients && recipients[i]; i++)
     {
       snprintf (line, sizeof line, "RECIPIENT %s", recipients[i]);
index 702f50f..c3bf06f 100644 (file)
@@ -40,7 +40,8 @@ void engine_assuan_cancel (void *cancel_data);
 int op_assuan_encrypt (protocol_t protocol, 
                        gpgme_data_t indata, gpgme_data_t outdata,
                        engine_filter_t notify_data, void *hwnd,
-                       char **recipients, protocol_t *r_used_protocol,
+                       const char *sender, char **recipients,
+                       protocol_t *r_used_protocol,
                        struct engine_assuan_encstate_s **r_encstate);
 int op_assuan_encrypt_bottom (struct engine_assuan_encstate_s *encstate,
                               int cancel);
index cb8cd67..d80320d 100644 (file)
@@ -835,10 +835,15 @@ engine_cancel (engine_filter_t filter)
    R_PROTOCOL.  This is a two part fucntion.  engine_encrypt_prepare
    needs to be called first followed by engine_encrypt_start.  The
    latter command has just one argument CANCEL which can be set to
-   true to cancel the prepared command.  */
+   true to cancel the prepared command. 
+
+   SENDER is the sender's mailbox or NULL; this information may be
+   used by the UI-server for role selection.
+ */
 int
 engine_encrypt_prepare (engine_filter_t filter, HWND hwnd,
-                        protocol_t req_protocol, char **recipients,
+                        protocol_t req_protocol, 
+                        const char *sender, char **recipients,
                         protocol_t *r_protocol)
 {
   gpg_error_t err;
@@ -848,8 +853,8 @@ engine_encrypt_prepare (engine_filter_t filter, HWND hwnd,
   if (filter->use_assuan)
     {
       err = op_assuan_encrypt (req_protocol, filter->indata, filter->outdata,
-                               filter, hwnd, recipients, &used_protocol,
-                               &filter->encstate);
+                               filter, hwnd, sender, recipients,
+                               &used_protocol, &filter->encstate);
       if (!err)
         *r_protocol = used_protocol;
     }
index d6fe336..7e77530 100644 (file)
@@ -72,7 +72,8 @@ int engine_wait (engine_filter_t filter);
 void engine_cancel (engine_filter_t filter);
 
 int engine_encrypt_prepare (engine_filter_t filter, HWND hwnd,
-                            protocol_t req_protocol, char **recipients,
+                            protocol_t req_protocol, 
+                            const char *sender, char **recipients,
                             protocol_t *r_protocol);
 int engine_encrypt_start (engine_filter_t filter, int cancel);
 int engine_sign_start (engine_filter_t filter, HWND hwnd, protocol_t protocol,
index e0c5f81..eea70a5 100644 (file)
@@ -1170,6 +1170,7 @@ do_mime_sign (LPMESSAGE message, HWND hwnd, protocol_t protocol,
   char top_header[BOUNDARYSIZE+200];
   engine_filter_t filter = NULL;
   struct databuf_s sigbuffer;
+  char *sender = NULL;
 
   *r_att_table = NULL;
 
@@ -1219,8 +1220,8 @@ do_mime_sign (LPMESSAGE message, HWND hwnd, protocol_t protocol,
       }
     }
 
-  if (engine_sign_start (filter, hwnd, protocol, 
-                         mapi_get_sender (message), &protocol))
+  sender = mapi_get_sender (message);
+  if (engine_sign_start (filter, hwnd, protocol, sender, &protocol))
     goto failure;
 
   protocol = check_protocol (protocol);
@@ -1386,6 +1387,7 @@ do_mime_sign (LPMESSAGE message, HWND hwnd, protocol_t protocol,
   else
     *r_att_table = att_table;
   xfree (sigbuffer.buf);
+  xfree (sender);
   return result;
 }
 
@@ -1602,6 +1604,7 @@ mime_encrypt (LPMESSAGE message, HWND hwnd,
   char *body = NULL;
   int n_att_usable;
   engine_filter_t filter = NULL;
+  char *sender = NULL;
 
   memset (sink, 0, sizeof *sink);
   memset (encsink, 0, sizeof *encsink);
@@ -1644,7 +1647,9 @@ mime_encrypt (LPMESSAGE message, HWND hwnd,
     xfree (tmp);
   }
 
-  if (engine_encrypt_prepare (filter, hwnd, protocol, recipients, &protocol))
+  sender = mapi_get_sender (message);
+  if (engine_encrypt_prepare (filter, hwnd, protocol, 
+                              sender, recipients, &protocol))
     goto failure;
   if (engine_encrypt_start (filter, 0))
     goto failure;
@@ -1723,6 +1728,7 @@ mime_encrypt (LPMESSAGE message, HWND hwnd,
   cancel_mapi_attachment (&attach, sink);
   xfree (body);
   mapi_release_attach_table (att_table);
+  xfree (sender);
   return result;
 }
 
@@ -1749,6 +1755,7 @@ mime_sign_encrypt (LPMESSAGE message, HWND hwnd,
   mapi_attach_item_t *att_table = NULL;
   engine_filter_t filter = NULL;
   unsigned int session_number;
+  char *sender = NULL;
 
   memset (sink, 0, sizeof *sink);
   memset (encsink, 0, sizeof *encsink);
@@ -1820,8 +1827,9 @@ mime_sign_encrypt (LPMESSAGE message, HWND hwnd,
     xfree (tmp);
   }
 
+  sender = mapi_get_sender (message);
   if ((rc=engine_encrypt_prepare (filter, hwnd, 
-                                  protocol, recipients, &protocol)))
+                                  protocol, sender, recipients, &protocol)))
     goto failure;
 
   protocol = check_protocol (protocol);
@@ -1934,5 +1942,6 @@ mime_sign_encrypt (LPMESSAGE message, HWND hwnd,
   if (tmpstream)
     IStream_Release (tmpstream);
   mapi_release_attach_table (att_table);
+  xfree (sender);
   return result;
 }