From 129df380ee91a7cc555d204dcc367be00e86f3a6 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Fri, 25 Sep 2009 21:01:05 +0000 Subject: [PATCH] See ChangeLog Monotone-Parent: fd4fbe52ae1095a87a517a53675370212526e1fc Monotone-Revision: 7c4c9bea35b92f37ca95185837c77033a40c7cc6 Monotone-Author: ludovic@Sophos.ca Monotone-Date: 2009-09-25T21:01:05 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 3 + UI/MailPartViewers/UIxMailPartSignedViewer.h | 6 +- UI/MailPartViewers/UIxMailPartSignedViewer.m | 91 +++++++++++++++++-- .../UIxMailPartSignedViewer.wox | 2 +- UI/WebServerResources/MailerUI.js | 2 +- 5 files changed, 89 insertions(+), 15 deletions(-) diff --git a/ChangeLog b/ChangeLog index 321cf02ea..52dce888d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -13,6 +13,9 @@ * SoObjects/SOGo/LDAPSource.m We trim the bind field value prior to adding it to our LDAP search filter. + * UI/MailPartViewers/UIxMailPartSignedViewer.m and friends: + We now show more information on the S/MIME encoded messages. + We also handle correctly multipart/alternative messages. 2009-09-24 Cyril Robert diff --git a/UI/MailPartViewers/UIxMailPartSignedViewer.h b/UI/MailPartViewers/UIxMailPartSignedViewer.h index 08d390760..9d91755cb 100644 --- a/UI/MailPartViewers/UIxMailPartSignedViewer.h +++ b/UI/MailPartViewers/UIxMailPartSignedViewer.h @@ -25,7 +25,7 @@ #import "UIxMailPartViewer.h" -@class NSString; +@class NSMutableString; @class NGPart; @interface UIxMailPartSignedViewer : UIxMailPartViewer @@ -34,13 +34,13 @@ NGPart *messagePart; BOOL validSignature; - NSString *validationError; + NSMutableString *validationMessage; } - (NSString *) flatContentAsString; - (BOOL) validSignature; -- (NSString *) validationError; +- (NSString *) validationMessage; @end diff --git a/UI/MailPartViewers/UIxMailPartSignedViewer.m b/UI/MailPartViewers/UIxMailPartSignedViewer.m index 98726070e..1343c1721 100644 --- a/UI/MailPartViewers/UIxMailPartSignedViewer.m +++ b/UI/MailPartViewers/UIxMailPartSignedViewer.m @@ -3,6 +3,7 @@ * Copyright (C) 2009 Inverse inc. * * Author: Wolfgang Sourdeau + * Ludovic Marcotte * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -153,6 +154,29 @@ content = [[body stringByDetectingURLs] stringByConvertingCRLNToHTML]; } + else if ([mimeType isEqualToString: @"multipart/alternative"]) + { + NSArray *parts; + int i; + + parts = [(NGMimeMultipartBody *)[messagePart body] parts]; + + for (i = 0; i < [parts count]; i++) + { + mimeType = [[parts objectAtIndex: i] contentType]; + + if ([mimeType isEqualToString: @"text/plain"]) + { + body = [[[parts objectAtIndex: i] body] stringByEscapingHTMLString]; + content = [[body stringByDetectingURLs] + stringByConvertingCRLNToHTML]; + break; + } + else + content = nil; + } + + } else { NSLog (@"unhandled mime type in multipart/signed: '%@'", mimeType); @@ -201,12 +225,16 @@ - (void) _processMessage { - BIO *msgBio, *inData; - X509_STORE *x509Store; - PKCS7 *p7; - int err; + NSString *issuer, *subject; NSData *signedData; + + STACK_OF(X509) *certs; + X509_STORE *x509Store; + BIO *msgBio, *inData; char sslError[1024]; + PKCS7 *p7; + int err, i; + *sslError = 0; @@ -216,7 +244,41 @@ msgBio = BIO_new_mem_buf ((void *) [signedData bytes], [signedData length]); inData = NULL; - p7 = SMIME_read_PKCS7 (msgBio, &inData); + p7 = SMIME_read_PKCS7(msgBio, &inData); + + subject = nil; + issuer = nil; + certs = NULL; + + i = OBJ_obj2nid(p7->type); + + if (i == NID_pkcs7_signed) + { + X509 *x; + + certs=p7->d.sign->cert; + + if (sk_X509_num(certs) > 0) + { + BIO *buf; + char p[256]; + + memset(p, 0, 256); + x = sk_X509_value(certs,0); + buf = BIO_new(BIO_s_mem()); + X509_NAME_print_ex(buf, X509_get_subject_name(x), 0, XN_FLAG_FN_SN); + BIO_gets(buf, p, 256); + subject = [NSString stringWithUTF8String: p]; + + memset(p, 0, 256); + X509_NAME_print_ex(buf, X509_get_issuer_name(x), 0, XN_FLAG_FN_SN); + BIO_gets(buf, p, 256); + issuer = [NSString stringWithUTF8String: p]; + + BIO_free(buf); + } + } + err = ERR_get_error(); if (err) { @@ -231,7 +293,7 @@ err = ERR_get_error(); if (err) - ERR_error_string_n (err, sslError, 1023); + ERR_error_string_n(err, sslError, 1023); if (x509Store) X509_STORE_free (x509Store); @@ -241,9 +303,18 @@ if (inData) BIO_free (inData); - if (!validSignature) - validationError = [NSString stringWithFormat: @"%s", sslError]; + validationMessage = [NSMutableString string]; + if (!validSignature) + [validationMessage appendString: [self labelForKey: @"Digital signature is not valid"]]; + else + [validationMessage appendString: [self labelForKey: @"Message is signed"]]; + + if (issuer && subject) + [validationMessage appendFormat: @"\n%@: %@\n%@: %@", + [self labelForKey: @"Subject"], subject, + [self labelForKey: @"Issuer"], issuer]; + processed = YES; } @@ -255,12 +326,12 @@ return validSignature; } -- (NSString *) validationError +- (NSString *) validationMessage { if (!processed) [self _processMessage]; - return validationError; + return validationMessage; } @end diff --git a/UI/Templates/MailPartViewers/UIxMailPartSignedViewer.wox b/UI/Templates/MailPartViewers/UIxMailPartSignedViewer.wox index 38ec3a742..e6903d679 100644 --- a/UI/Templates/MailPartViewers/UIxMailPartSignedViewer.wox +++ b/UI/Templates/MailPartViewers/UIxMailPartSignedViewer.wox @@ -8,6 +8,6 @@ class="mailer_plaincontent signed" const:id="signedMessage" var:valid="validSignature" - var:error="validationError" + var:error="validationMessage" > diff --git a/UI/WebServerResources/MailerUI.js b/UI/WebServerResources/MailerUI.js index 7d97fd47f..f6be7bd20 100644 --- a/UI/WebServerResources/MailerUI.js +++ b/UI/WebServerResources/MailerUI.js @@ -992,7 +992,7 @@ function configureSignatureFlagImage() { var msgDiv = $("signatureFlagMessage"); if (msgDiv && error) { - var formattedMessage = error.replace("\n", "
"); + var formattedMessage = error.replace(/\n/g, "
"); msgDiv.innerHTML = "
" + formattedMessage + "
"; newImg.observe("mouseover", showSignatureMessage); newImg.observe("mouseout", hideSignatureMessage);