diff options
author | hiro <hiro@ee746299-78ed-0310-b773-934348b2243d> | 2006-08-17 08:30:10 +0000 |
---|---|---|
committer | hiro <hiro@ee746299-78ed-0310-b773-934348b2243d> | 2006-08-17 08:30:10 +0000 |
commit | 830583f24a6753bea7aae2704c41303ff6b0ad03 (patch) | |
tree | 78bbd60d973daa50284e506468fe73423eaf3374 /src/rfc2015.c | |
parent | 2bec9e15edfdc196dd9bc9999d1c29046764c63d (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/rfc2015.c')
-rw-r--r-- | src/rfc2015.c | 51 |
1 files changed, 45 insertions, 6 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"); |