From f29afac4e61153c7304d4d1c92064c968dda32a3 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 2 Jun 2001 21:07:44 +0000 Subject: If user is trying to sign his/her message, try first to use the key that 2001-06-01 Jeffrey Stedfast * e-msg-composer.c (build_message): If user is trying to sign his/her message, try first to use the key that they might have provided in their account settings. If that was never set, default to their email address. Also respect their config option to encrypt-to-self. svn path=/trunk/; revision=10103 --- composer/e-msg-composer.c | 107 +++++++++++++++++++++++++++++++++------------- 1 file changed, 78 insertions(+), 29 deletions(-) (limited to 'composer/e-msg-composer.c') diff --git a/composer/e-msg-composer.c b/composer/e-msg-composer.c index 4011dd316e..ec867c8da2 100644 --- a/composer/e-msg-composer.c +++ b/composer/e-msg-composer.c @@ -268,10 +268,10 @@ build_message (EMsgComposer *composer) CamelMimePart *part; CamelException ex; int i; - + if (composer->persist_stream_interface == CORBA_OBJECT_NIL) return NULL; - + new = camel_mime_message_new (); e_msg_composer_hdrs_to_message (hdrs, new); for (i = 0; i < composer->extra_hdr_names->len; i++) { @@ -279,7 +279,7 @@ build_message (EMsgComposer *composer) composer->extra_hdr_names->pdata[i], composer->extra_hdr_values->pdata[i]); } - + data = get_text (composer->persist_stream_interface, "text/plain"); if (!data) { /* The component has probably died */ @@ -296,7 +296,7 @@ build_message (EMsgComposer *composer) camel_object_unref (CAMEL_OBJECT (stream)); camel_data_wrapper_set_mime_type_field (plain, type); header_content_type_unref (type); - + if (composer->send_html) { data = get_text (composer->persist_stream_interface, "text/html"); if (!data) { @@ -310,45 +310,45 @@ build_message (EMsgComposer *composer) camel_data_wrapper_construct_from_stream (html, stream); camel_object_unref (CAMEL_OBJECT (stream)); camel_data_wrapper_set_mime_type (html, "text/html; charset=utf-8"); - + /* Build the multipart/alternative */ body = camel_multipart_new (); camel_data_wrapper_set_mime_type (CAMEL_DATA_WRAPPER (body), "multipart/alternative"); camel_multipart_set_boundary (body, NULL); - + part = camel_mime_part_new (); camel_medium_set_content_object (CAMEL_MEDIUM (part), plain); camel_object_unref (CAMEL_OBJECT (plain)); camel_mime_part_set_encoding (part, plain_encoding); camel_multipart_add_part (body, part); camel_object_unref (CAMEL_OBJECT (part)); - + part = camel_mime_part_new (); camel_medium_set_content_object (CAMEL_MEDIUM (part), html); camel_object_unref (CAMEL_OBJECT (html)); camel_multipart_add_part (body, part); camel_object_unref (CAMEL_OBJECT (part)); - + /* If there are inlined images, construct a * multipart/related containing the * multipart/alternative and the images. */ if (g_hash_table_size (composer->inline_images)) { CamelMultipart *html_with_images; - + html_with_images = camel_multipart_new (); camel_data_wrapper_set_mime_type ( CAMEL_DATA_WRAPPER (html_with_images), "multipart/related; type=\"multipart/alternative\""); camel_multipart_set_boundary (html_with_images, NULL); - + part = camel_mime_part_new (); camel_medium_set_content_object (CAMEL_MEDIUM (part), CAMEL_DATA_WRAPPER (body)); camel_object_unref (CAMEL_OBJECT (body)); camel_multipart_add_part (html_with_images, part); camel_object_unref (CAMEL_OBJECT (part)); - + add_inlined_images (composer, html_with_images); current = CAMEL_DATA_WRAPPER (html_with_images); } else @@ -358,10 +358,10 @@ build_message (EMsgComposer *composer) if (e_msg_composer_attachment_bar_get_num_attachments (attachment_bar)) { CamelMultipart *multipart = camel_multipart_new (); - + /* Generate a random boundary. */ camel_multipart_set_boundary (multipart, NULL); - + part = camel_mime_part_new (); camel_medium_set_content_object (CAMEL_MEDIUM (part), current); if (current == plain) @@ -369,9 +369,9 @@ build_message (EMsgComposer *composer) camel_object_unref (CAMEL_OBJECT (current)); camel_multipart_add_part (multipart, part); camel_object_unref (CAMEL_OBJECT (part)); - + e_msg_composer_attachment_bar_to_multipart (attachment_bar, multipart); - + current = CAMEL_DATA_WRAPPER (multipart); } @@ -383,15 +383,24 @@ build_message (EMsgComposer *composer) camel_object_unref (CAMEL_OBJECT (current)); if (composer->pgp_sign) { - /* FIXME: should use the PGP key id rather than email address */ + CamelInternetAddress *from = NULL; const char *pgpid; - CamelInternetAddress *from; camel_exception_init (&ex); - from = e_msg_composer_hdrs_get_from (E_MSG_COMPOSER_HDRS (composer->hdrs)); - camel_internet_address_get (from, 0, NULL, &pgpid); + + if (hdrs->account && hdrs->account->pgp_key) { + pgpid = hdrs->account->pgp_key; + } else { + /* time for plan b */ + from = e_msg_composer_hdrs_get_from (hdrs); + camel_internet_address_get (from, 0, NULL, &pgpid); + } + mail_crypto_pgp_mime_part_sign (&part, pgpid, CAMEL_CIPHER_HASH_SHA1, &ex); - camel_object_unref (CAMEL_OBJECT (from)); + + if (from) + camel_object_unref (CAMEL_OBJECT (from)); + if (camel_exception_is_set (&ex)) goto exception; } @@ -406,6 +415,24 @@ build_message (EMsgComposer *composer) camel_exception_init (&ex); recipients = g_ptr_array_new (); + /* check to see if we should encrypt to self */ + if (hdrs->account && hdrs->account->pgp_encrypt_to_self) { + CamelInternetAddress *from = NULL; + + if (hdrs->account->pgp_key) { + address = hdrs->account->pgp_key; + } else { + /* time for plan b */ + from = e_msg_composer_hdrs_get_from (hdrs); + camel_internet_address_get (from, 0, NULL, &address); + } + + g_ptr_array_add (recipients, g_strdup (address)); + + if (from) + camel_object_unref (CAMEL_OBJECT (from)); + } + addr = camel_mime_message_get_recipients (new, CAMEL_RECIPIENT_TYPE_TO); len = camel_address_length (CAMEL_ADDRESS (addr)); for (i = 0; i < len; i++) { @@ -447,18 +474,24 @@ build_message (EMsgComposer *composer) #ifdef HAVE_NSS if (composer->smime_sign) { - /* FIXME: should use the S/MIME signature certificate email address */ + CamelInternetAddress *from = NULL; CamelMimeMessage *smime_mesg; - CamelInternetAddress *from; - const char *address; + const char *certname; camel_exception_init (&ex); - from = e_msg_composer_hdrs_get_from (E_MSG_COMPOSER_HDRS (composer->hdrs)); - camel_internet_address_get (from, 0, NULL, &address); - smime_mesg = mail_crypto_smime_sign (new, address, TRUE, TRUE, &ex); + if (hdrs->account && hdrs->account->smime_key) { + certname = hdrs->account->smime_key; + } else { + /* time for plan b */ + from = e_msg_composer_hdrs_get_from (hdrs); + camel_internet_address_get (from, 0, NULL, &certname); + } - camel_object_unref (CAMEL_OBJECT (from)); + smime_mesg = mail_crypto_smime_sign (new, certname, TRUE, TRUE, &ex); + + if (from) + camel_object_unref (CAMEL_OBJECT (from)); if (camel_exception_is_set (&ex)) goto exception; @@ -469,8 +502,8 @@ build_message (EMsgComposer *composer) if (composer->smime_encrypt) { /* FIXME: we should try to get the preferred cert "nickname" for each recipient */ - const CamelInternetAddress *addr; - CamelInternetAddress *from; + const CamelInternetAddress *addr = NULL; + CamelInternetAddress *from = NULL; CamelMimeMessage *smime_mesg; const char *address; GPtrArray *recipients; @@ -479,6 +512,22 @@ build_message (EMsgComposer *composer) camel_exception_init (&ex); recipients = g_ptr_array_new (); + /* check to see if we should encrypt to self */ + if (hdrs->account && hdrs->account->smime_encrypt_to_self) { + if (hdrs->account->smime_key) { + address = hdrs->account->smime_key; + } else { + /* time for plan b */ + from = e_msg_composer_hdrs_get_from (hdrs); + camel_internet_address_get (from, 0, NULL, &address); + } + + g_ptr_array_add (recipients, g_strdup (address)); + + if (from) + camel_object_unref (CAMEL_OBJECT (addr)); + } + addr = camel_mime_message_get_recipients (new, CAMEL_RECIPIENT_TYPE_TO); len = camel_address_length (CAMEL_ADDRESS (addr)); for (i = 0; i < len; i++) { -- cgit