From 830583f24a6753bea7aae2704c41303ff6b0ad03 Mon Sep 17 00:00:00 2001 From: hiro Date: Thu, 17 Aug 2006 08:30:10 +0000 Subject: supported verification of encrypted and signed messages with combined method. git-svn-id: svn://sylpheed.sraoss.jp/sylpheed/trunk@1127 ee746299-78ed-0310-b773-934348b2243d --- src/rfc2015.c | 51 ++++++++++++++++++++++++++++++++++++----- src/textview.c | 72 ++++++++++++++++++++++++++++++++++++++++++---------------- 2 files changed, 97 insertions(+), 26 deletions(-) (limited to 'src') diff --git a/src/rfc2015.c b/src/rfc2015.c index 35fff7b2..bffc3259 100644 --- a/src/rfc2015.c +++ b/src/rfc2015.c @@ -142,12 +142,13 @@ static void sig_status_for_key(GString *str, gpgme_ctx_t ctx, g_string_sprintfa (str, "Key fingerprint: %s\n", sig->fpr); g_string_append(str, _("Cannot find user ID for this key.")); + g_string_append(str, "\n"); return; } user = key->uids; g_string_sprintfa (str, gpgmegtk_sig_status_to_string (sig, TRUE), user->uid); - g_string_append (str, "\n"); + g_string_append(str, "\n"); user = user->next; while (user) { @@ -367,6 +368,8 @@ static gpgme_data_t pgp_decrypt(MimeInfo *partinfo, FILE *fp) gpgme_error_t err; gpgme_data_t cipher = NULL, plain = NULL; struct passphrase_cb_info_s info; + gpgme_verify_result_t verifyresult = NULL; + const gchar *result = NULL; memset(&info, 0, sizeof info); @@ -395,18 +398,38 @@ static gpgme_data_t pgp_decrypt(MimeInfo *partinfo, FILE *fp) gpgme_set_passphrase_cb(ctx, gpgmegtk_passphrase_cb, &info); } - err = gpgme_op_decrypt(ctx, cipher, plain); + err = gpgme_op_decrypt_verify(ctx, cipher, plain); -leave: - gpgme_data_release(cipher); if (err) { gpgmegtk_free_passphrase(); debug_print("decryption failed: %s\n", gpgme_strerror(err)); gpgme_data_release(plain); plain = NULL; - } else - debug_print("** decryption succeeded\n"); + goto leave; + } + + debug_print("** decryption succeeded\n"); + + verifyresult = gpgme_op_verify_result(ctx); + if (verifyresult && verifyresult->signatures) { + g_free(partinfo->sigstatus_full); + partinfo->sigstatus_full = sig_status_full(ctx, verifyresult); + result = gpgmegtk_sig_status_to_string(verifyresult->signatures, + FALSE); + g_free(partinfo->sigstatus); + partinfo->sigstatus = g_strdup(result); + debug_print("full status: %s\n", partinfo->sigstatus_full); + debug_print("verification status: %s\n", result); + if (prefs_common.gpg_signature_popup) { + GpgmegtkSigStatus statuswindow; + statuswindow = gpgmegtk_sig_status_create(); + gpgmegtk_sig_status_update(statuswindow, ctx); + gpgmegtk_sig_status_destroy(statuswindow); + } + } +leave: + gpgme_data_release(cipher); gpgme_release(ctx); return plain; } @@ -685,6 +708,11 @@ void rfc2015_decrypt_message(MsgInfo *msginfo, MimeInfo *mimeinfo, FILE *fp) gpgme_strerror(gpgme_error_from_errno(errno))); } + if (partinfo->sigstatus) { + mimeinfo->sigstatus = g_strdup(partinfo->sigstatus); + mimeinfo->sigstatus_full = g_strdup(partinfo->sigstatus_full); + } + fclose(dstfp); procmime_mimeinfo_free_all(tmpinfo); @@ -724,8 +752,17 @@ FILE *rfc2015_open_message_decrypted(MsgInfo *msginfo, MimeInfo **mimeinfo) rfc2015_decrypt_message(msginfo, mimeinfo_, fp); if (msginfo->plaintext_file && !msginfo->decryption_failed) { + gchar *sigstatus = NULL, *sigstatus_full = NULL; + fclose(fp); + if (mimeinfo_->sigstatus) { + sigstatus = mimeinfo_->sigstatus; + mimeinfo_->sigstatus = NULL; + sigstatus_full = mimeinfo_->sigstatus_full; + mimeinfo_->sigstatus_full = NULL; + } procmime_mimeinfo_free_all(mimeinfo_); + if ((fp = procmsg_open_message(msginfo)) == NULL) return NULL; mimeinfo_ = procmime_scan_mime_header(fp); @@ -733,6 +770,8 @@ FILE *rfc2015_open_message_decrypted(MsgInfo *msginfo, MimeInfo **mimeinfo) fclose(fp); return NULL; } + mimeinfo_->sigstatus = sigstatus; + mimeinfo_->sigstatus_full = sigstatus_full; } else { if (fseek(fp, fpos, SEEK_SET) < 0) perror("fseek"); diff --git a/src/textview.c b/src/textview.c index 02114915..8437c7d1 100644 --- a/src/textview.c +++ b/src/textview.c @@ -147,6 +147,10 @@ static GdkCursor *regular_cursor = NULL; static void textview_add_part (TextView *textview, MimeInfo *mimeinfo, FILE *fp); +#if USE_GPGME +static void textview_add_sig_part (TextView *textview, + MimeInfo *mimeinfo); +#endif static void textview_add_parts (TextView *textview, MimeInfo *mimeinfo, FILE *fp); @@ -473,6 +477,10 @@ void textview_show_message(TextView *textview, MimeInfo *mimeinfo, } textview_add_parts(textview, mimeinfo, fp); +#if USE_GPGME + if (mimeinfo->sigstatus) + textview_add_sig_part(textview, mimeinfo); +#endif fclose(fp); @@ -639,11 +647,12 @@ static void textview_add_part(TextView *textview, MimeInfo *mimeinfo, FILE *fp) } #if USE_GPGME - if (mimeinfo->sigstatus) - g_snprintf(buf, sizeof(buf), "\n[%s (%s)]\n", - mimeinfo->content_type, mimeinfo->sigstatus); - else + if (mimeinfo->parent && mimeinfo->sigstatus) { + textview_add_sig_part(textview, mimeinfo); + return; + } #endif + if (mimeinfo->filename || mimeinfo->name) g_snprintf(buf, sizeof(buf), "\n[%s %s (%s)]\n", mimeinfo->filename ? mimeinfo->filename : @@ -655,22 +664,6 @@ static void textview_add_part(TextView *textview, MimeInfo *mimeinfo, FILE *fp) mimeinfo->content_type, to_human_readable(mimeinfo->content_size)); -#if USE_GPGME - if (mimeinfo->sigstatus) { - const gchar *color; - if (!strcmp(mimeinfo->sigstatus, _("Good signature"))) - color = "good-signature"; - else if (!strcmp(mimeinfo->sigstatus, _("Valid signature (untrusted key)"))) - color = "untrusted-signature"; - else if (!strcmp(mimeinfo->sigstatus, _("BAD signature"))) - color = "bad-signature"; - else - color = "nocheck-signature"; - gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, buf, -1, - color, "mimepart", - NULL); - } else -#endif if (mimeinfo->mime_type != MIME_TEXT && mimeinfo->mime_type != MIME_TEXT_HTML) { gtk_text_buffer_insert_with_tags_by_name @@ -739,6 +732,45 @@ static void textview_add_part(TextView *textview, MimeInfo *mimeinfo, FILE *fp) } } +#if USE_GPGME +static void textview_add_sig_part(TextView *textview, MimeInfo *mimeinfo) +{ + GtkTextView *text = GTK_TEXT_VIEW(textview->text); + GtkTextBuffer *buffer; + GtkTextIter iter; + gchar buf[BUFFSIZE]; + const gchar *color; + + if (!mimeinfo->sigstatus) + return; + + if (mimeinfo->parent) + g_snprintf(buf, sizeof(buf), "\n[%s (%s)]\n", + mimeinfo->content_type, mimeinfo->sigstatus); + else + g_snprintf(buf, sizeof(buf), "\n[%s (%s)]\n", + "signature", mimeinfo->sigstatus); + + if (!strcmp(mimeinfo->sigstatus, _("Good signature"))) + color = "good-signature"; + else if (!strcmp(mimeinfo->sigstatus, _("Valid signature (untrusted key)"))) + color = "untrusted-signature"; + else if (!strcmp(mimeinfo->sigstatus, _("BAD signature"))) + color = "bad-signature"; + else + color = "nocheck-signature"; + + buffer = gtk_text_view_get_buffer(text); + gtk_text_buffer_get_end_iter(buffer, &iter); + gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, buf, -1, + color, "mimepart", NULL); + if (mimeinfo->sigstatus_full) + gtk_text_buffer_insert_with_tags_by_name + (buffer, &iter, mimeinfo->sigstatus_full, -1, + "mimepart", NULL); +} +#endif + static void textview_add_parts(TextView *textview, MimeInfo *mimeinfo, FILE *fp) { gint level; -- cgit v1.2.3