aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorhiro <hiro@ee746299-78ed-0310-b773-934348b2243d>2006-08-17 08:30:10 +0000
committerhiro <hiro@ee746299-78ed-0310-b773-934348b2243d>2006-08-17 08:30:10 +0000
commit830583f24a6753bea7aae2704c41303ff6b0ad03 (patch)
tree78bbd60d973daa50284e506468fe73423eaf3374 /src
parent2bec9e15edfdc196dd9bc9999d1c29046764c63d (diff)
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
Diffstat (limited to 'src')
-rw-r--r--src/rfc2015.c51
-rw-r--r--src/textview.c72
2 files changed, 97 insertions, 26 deletions
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;