diff options
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | ChangeLog.ja | 8 | ||||
-rw-r--r-- | src/main.c | 3 | ||||
-rw-r--r-- | src/mimeview.c | 6 | ||||
-rw-r--r-- | src/rfc2015.c | 36 | ||||
-rw-r--r-- | src/rfc2015.h | 3 |
6 files changed, 57 insertions, 7 deletions
@@ -1,3 +1,11 @@ +2005-09-27 + + * src/mimeview.c + src/rfc2015.c: verify PKCS#7 (S/MIME) signature (thanks to Thomas + White). + * src/main.c: null-check engineInfo->version when displaying debug + information of GPGME. + 2005-09-26 * libsylph/html.c: convert character entity references to UTF-8, diff --git a/ChangeLog.ja b/ChangeLog.ja index 9cf7cc91..9930ea63 100644 --- a/ChangeLog.ja +++ b/ChangeLog.ja @@ -1,3 +1,11 @@ +2005-09-27 + + * src/mimeview.c + src/rfc2015.c: PKCS#7 (S/MIME) 署名を検証するようにした(Thomas White + さん thanks)。 + * src/main.c: GPGME のデバッグ情報を表示するとき engineInfo->version + の null チェックを行うようにした。 + 2005-09-26 * libsylph/html.c: 文字実体参照を US-ASCII でなく UTF-8 に変換する @@ -559,7 +559,8 @@ static void check_gpg(void) debug_print("GpgME Protocol: %s\n Version: %s\n", gpgme_get_protocol_name (engineInfo->protocol), - engineInfo->version); + engineInfo->version ? + engineInfo->version : "(unknown)"); engineInfo = engineInfo->next; } } diff --git a/src/mimeview.c b/src/mimeview.c index 1e3014d2..5a365f76 100644 --- a/src/mimeview.c +++ b/src/mimeview.c @@ -786,8 +786,7 @@ static void mimeview_selection_changed(GtkTreeSelection *selection, default: mimeview_change_view_type(mimeview, MIMEVIEW_TEXT); #if USE_GPGME - if (g_ascii_strcasecmp(partinfo->content_type, - "application/pgp-signature") == 0) + if (rfc2015_is_signature_part(partinfo)) mimeview_show_signature_part(mimeview, partinfo); else #endif @@ -1185,8 +1184,7 @@ static void mimeview_update_signature_info(MimeView *mimeview) partinfo = mimeview_get_selected_part(mimeview); if (!partinfo) return; - if (g_ascii_strcasecmp(partinfo->content_type, - "application/pgp-signature") == 0) { + if (rfc2015_is_signature_part(partinfo)) { mimeview_change_view_type(mimeview, MIMEVIEW_TEXT); mimeview_show_signature_part(mimeview, partinfo); } diff --git a/src/rfc2015.c b/src/rfc2015.c index 8708dc81..a71f5333 100644 --- a/src/rfc2015.c +++ b/src/rfc2015.c @@ -202,6 +202,11 @@ static void check_signature(MimeInfo *mimeinfo, MimeInfo *partinfo, FILE *fp) goto leave; } + if (rfc2015_is_pkcs7_signature_part(partinfo)) { + debug_print("pkcs7 signature detected\n"); + gpgme_set_protocol(ctx, GPGME_PROTOCOL_CMS); + } + /* don't include the last empty line. It does not belong to the signed text */ if (mimeinfo->children->size > 0) { @@ -412,8 +417,7 @@ MimeInfo **rfc2015_find_signature(MimeInfo *mimeinfo) /* check that we have at least 2 parts of the correct type */ for (partinfo = mimeinfo->children; partinfo != NULL; partinfo = partinfo->next) { - if (++n > 1 && !g_ascii_strcasecmp(partinfo->content_type, - "application/pgp-signature")) + if (++n > 1 && rfc2015_is_signature_part(partinfo)) break; } @@ -451,6 +455,34 @@ void rfc2015_check_signature(MimeInfo *mimeinfo, FILE *fp) g_free(signedinfo); } +gboolean rfc2015_is_pgp_signature_part(MimeInfo *mimeinfo) +{ + if (!mimeinfo || !mimeinfo->content_type) + return FALSE; + + return !g_ascii_strcasecmp(mimeinfo->content_type, + "application/pgp-signature"); +} + +gboolean rfc2015_is_pkcs7_signature_part(MimeInfo *mimeinfo) +{ + const gchar *c_type; + + if (!mimeinfo || !mimeinfo->content_type) + return FALSE; + + c_type = mimeinfo->content_type; + + return (!g_ascii_strcasecmp(c_type, "application/pkcs7-signature") || + !g_ascii_strcasecmp(c_type, "application/x-pkcs7-signature")); +} + +gboolean rfc2015_is_signature_part(MimeInfo *mimeinfo) +{ + return (rfc2015_is_pgp_signature_part(mimeinfo) || + rfc2015_is_pkcs7_signature_part(mimeinfo)); +} + gint rfc2015_is_encrypted(MimeInfo *mimeinfo) { if (!mimeinfo || mimeinfo->mime_type != MIME_MULTIPART) diff --git a/src/rfc2015.h b/src/rfc2015.h index e70605e1..7c6a638a 100644 --- a/src/rfc2015.h +++ b/src/rfc2015.h @@ -32,6 +32,9 @@ MimeInfo **rfc2015_find_signature (MimeInfo *mimeinfo); gboolean rfc2015_has_signature (MimeInfo *mimeinfo); void rfc2015_check_signature (MimeInfo *mimeinfo, FILE *fp); +gboolean rfc2015_is_pgp_signature_part (MimeInfo *mimeinfo); +gboolean rfc2015_is_pkcs7_signature_part(MimeInfo *mimeinfo); +gboolean rfc2015_is_signature_part (MimeInfo *mimeinfo); gint rfc2015_is_encrypted (MimeInfo *mimeinfo); gboolean rfc2015_msg_is_encrypted (const gchar *file); |