From bfe0bf4b3eac4d0ece9ec6093690d362bfc3b514 Mon Sep 17 00:00:00 2001 From: "ducarroz%netscape.com" Date: Wed, 21 Aug 2002 22:00:34 +0000 Subject: [PATCH] Fix for bug 90728. Replace mailto parameter force-plain-text by html-body. Also, when a mailto url contains an html body, we run the body into the HTML sanitizer to prevent security breach. R=varada, SR=sspitzer git-svn-id: svn://10.0.0.236/trunk@127797 18797224-902f-48f8-a5cc-f745e15eee43 --- .../mailnews/compose/public/nsISmtpUrl.idl | 2 +- .../compose/src/nsMsgComposeService.cpp | 87 +++++++++++++++---- mozilla/mailnews/compose/src/nsSmtpUrl.cpp | 12 +-- mozilla/mailnews/compose/src/nsSmtpUrl.h | 2 +- 4 files changed, 79 insertions(+), 24 deletions(-) diff --git a/mozilla/mailnews/compose/public/nsISmtpUrl.idl b/mozilla/mailnews/compose/public/nsISmtpUrl.idl index 03d618b019d..d06d400646e 100644 --- a/mozilla/mailnews/compose/public/nsISmtpUrl.idl +++ b/mozilla/mailnews/compose/public/nsISmtpUrl.idl @@ -101,6 +101,6 @@ interface nsIMailtoUrl : nsISupports { out string aFromPart, out string aFollowUpToPart, out string aOrganizationPart, out string aReplyToPart, out string aSubjectPart, out string aBodyPart, out string aHtmlPart, out string aReferencePart, out string aAttachmentPart, out string aPriorityPart, - out string aNewsgroupPart, out string aNewsHostPart, out boolean aforcePlainText); + out string aNewsgroupPart, out string aNewsHostPart, out boolean aHTMLBody); }; diff --git a/mozilla/mailnews/compose/src/nsMsgComposeService.cpp b/mozilla/mailnews/compose/src/nsMsgComposeService.cpp index 4c0f37d97a9..8ffe09d4d28 100644 --- a/mozilla/mailnews/compose/src/nsMsgComposeService.cpp +++ b/mozilla/mailnews/compose/src/nsMsgComposeService.cpp @@ -85,8 +85,18 @@ #include "nsMsgUtils.h" #endif +// +#include "nsIParser.h" +#include "nsParserCIID.h" +#include "nsIContentSink.h" +#include "mozISanitizingSerializer.h" + +static NS_DEFINE_CID(kParserCID, NS_PARSER_CID); +static NS_DEFINE_CID(kNavDTDCID, NS_CNAVDTD_CID); +// + #ifdef NS_DEBUG -static PRBool _just_to_be_sure_we_create_only_on_compose_service_ = PR_FALSE; +static PRBool _just_to_be_sure_we_create_only_one_compose_service_ = PR_FALSE; #endif #define DEFAULT_CHROME "chrome://messenger/content/messengercompose/messengercompose.xul" @@ -122,8 +132,8 @@ static PRUint32 GetMessageSizeFromURI(const char * originalMsgURI) nsMsgComposeService::nsMsgComposeService() { #ifdef NS_DEBUG - NS_ASSERTION(!_just_to_be_sure_we_create_only_on_compose_service_, "You cannot create several message compose service!"); - _just_to_be_sure_we_create_only_on_compose_service_ = PR_TRUE; + NS_ASSERTION(!_just_to_be_sure_we_create_only_one_compose_service_, "You cannot create several message compose service!"); + _just_to_be_sure_we_create_only_one_compose_service_ = PR_TRUE; #endif NS_INIT_REFCNT(); @@ -156,8 +166,8 @@ nsMsgComposeService::~nsMsgComposeService() nsresult nsMsgComposeService::Init() { nsresult rv = NS_OK; - nsCOMPtr prefs = do_GetService(NS_PREF_CONTRACTID); - if (!prefs) + nsCOMPtr prefService = do_GetService(NS_PREF_CONTRACTID); + if (!prefService) return NS_ERROR_FAILURE; // Register observers @@ -171,11 +181,11 @@ nsresult nsMsgComposeService::Init() } // Register some pref observer - nsCOMPtr prefBranch; - rv = prefs->GetBranch(nsnull, getter_AddRefs(prefBranch)); + nsCOMPtr prefs; + rv = prefService->GetBranch(nsnull, getter_AddRefs(prefs)); if (NS_SUCCEEDED(rv)) { - nsCOMPtr pbi = do_QueryInterface(prefBranch, &rv); + nsCOMPtr pbi = do_QueryInterface(prefs, &rv); if (NS_SUCCEEDED(rv)) rv = pbi->AddObserver(PREF_MAIL_COMPOSE_MAXRECYCLEDWINDOWS, this, PR_TRUE); } @@ -199,8 +209,12 @@ void nsMsgComposeService::Reset() mMaxRecycledWindows = 0; } - nsCOMPtr prefs = do_GetService(NS_PREF_CONTRACTID); - if (!prefs) + nsCOMPtr prefService = do_GetService(NS_PREF_CONTRACTID); + if (!prefService) + return; + nsCOMPtr prefs; + rv = prefService->GetBranch(nsnull, getter_AddRefs(prefs)); + if (NS_FAILED(rv)) return; rv = prefs->GetIntPref(PREF_MAIL_COMPOSE_MAXRECYCLEDWINDOWS, &mMaxRecycledWindows); @@ -482,7 +496,7 @@ NS_IMETHODIMP nsMsgComposeService::OpenComposeWindowWithURI(const char * aMsgCom rv = aURI->QueryInterface(NS_GET_IID(nsIMailtoUrl), getter_AddRefs(aMailtoUrl)); if (NS_SUCCEEDED(rv)) { - PRBool aPlainText = PR_FALSE; + PRBool aHTMLBody = PR_FALSE; nsXPIDLCString aToPart; nsXPIDLCString aCcPart; nsXPIDLCString aBccPart; @@ -497,11 +511,52 @@ NS_IMETHODIMP nsMsgComposeService::OpenComposeWindowWithURI(const char * aMsgCom getter_Copies(aBodyPart), nsnull /* html part */, nsnull /* a ref part */, nsnull /* attachment part */, nsnull /* priority */, getter_Copies(aNewsgroup), nsnull /* host */, - &aPlainText); + &aHTMLBody); - MSG_ComposeFormat format = nsIMsgCompFormat::Default; - if (aPlainText) - format = nsIMsgCompFormat::PlainText; + nsString rawBody = NS_ConvertUTF8toUCS2(aBodyPart); + nsString sanitizedBody; + + MSG_ComposeFormat format = nsIMsgCompFormat::PlainText; + if (aHTMLBody) + { + //For security reason, we must sanitize the message body before accepting any html... + + // Create a parser + nsCOMPtr parser = do_CreateInstance(kParserCID); + + // Create the appropriate output sink + nsCOMPtr sink = do_CreateInstance(MOZ_SANITIZINGHTMLSERIALIZER_CONTRACTID); + + nsXPIDLCString allowedTags; + nsCOMPtr prefService = do_GetService(NS_PREF_CONTRACTID); + if (prefService) + { + nsCOMPtr prefs; + rv = prefService->GetBranch(MAILNEWS_ROOT_PREF, getter_AddRefs(prefs)); + if (NS_SUCCEEDED(rv)) + prefs->GetCharPref("display.html_sanitizer.allowed_tags", getter_Copies(allowedTags)); + } + + if (parser && sink) + { + nsCOMPtr sanSink(do_QueryInterface(sink)); + if (sanSink) + { + sanSink->Initialize(&sanitizedBody, 0, NS_ConvertASCIItoUCS2(allowedTags.get())); + + parser->SetContentSink(sink); + nsCOMPtr dtd = do_CreateInstance(kNavDTDCID); + if (dtd) + { + parser->RegisterDTD(dtd); + + rv = parser->Parse(rawBody, 0, NS_LITERAL_CSTRING("text/html"), PR_FALSE, PR_TRUE); + if (NS_SUCCEEDED(rv)) + format = nsIMsgCompFormat::HTML; + } + } + } + } nsCOMPtr pMsgComposeParams (do_CreateInstance(NS_MSGCOMPOSEPARAMS_CONTRACTID, &rv)); if (NS_SUCCEEDED(rv) && pMsgComposeParams) @@ -519,7 +574,7 @@ NS_IMETHODIMP nsMsgComposeService::OpenComposeWindowWithURI(const char * aMsgCom pMsgCompFields->SetBcc(NS_ConvertUTF8toUCS2(aBccPart).get()); pMsgCompFields->SetNewsgroups(aNewsgroup); pMsgCompFields->SetSubject(NS_ConvertUTF8toUCS2(aSubjectPart).get()); - pMsgCompFields->SetBody(NS_ConvertUTF8toUCS2(aBodyPart).get()); + pMsgCompFields->SetBody(format == nsIMsgCompFormat::HTML ? sanitizedBody.get() : rawBody.get()); pMsgComposeParams->SetComposeFields(pMsgCompFields); diff --git a/mozilla/mailnews/compose/src/nsSmtpUrl.cpp b/mozilla/mailnews/compose/src/nsSmtpUrl.cpp index 6a7f99530b9..37abf500ada 100644 --- a/mozilla/mailnews/compose/src/nsSmtpUrl.cpp +++ b/mozilla/mailnews/compose/src/nsSmtpUrl.cpp @@ -56,7 +56,7 @@ static NS_DEFINE_CID(kCMimeConverterCID, NS_MIME_CONVERTER_CID); nsMailtoUrl::nsMailtoUrl() { NS_INIT_ISUPPORTS(); - m_forcePlainText = PR_FALSE; + m_htmlBody = PR_FALSE; nsComponentManager::CreateInstance(kSimpleURICID, nsnull, NS_GET_IID(nsIURI), (void **) getter_AddRefs(m_baseURL)); @@ -140,12 +140,12 @@ nsresult nsMailtoUrl::ParseMailtoUrl(char * searchPart) m_followUpToPart = value; else if (!nsCRT::strcasecmp (token, "from")) m_fromPart = value; - else if (!nsCRT::strcasecmp (token, "force-plain-text")) - m_forcePlainText = PR_TRUE; break; case 'H': if (!nsCRT::strcasecmp(token, "html-part")) m_htmlPart = value; + else if (!nsCRT::strcasecmp (token, "html-body")) + m_htmlBody = PR_TRUE; break; case 'N': if (!nsCRT::strcasecmp (token, "newsgroups")) @@ -318,7 +318,7 @@ NS_IMETHODIMP nsMailtoUrl::GetMessageContents(char ** aToPart, char ** aCcPart, char ** aFromPart, char ** aFollowUpToPart, char ** aOrganizationPart, char ** aReplyToPart, char ** aSubjectPart, char ** aBodyPart, char ** aHtmlPart, char ** aReferencePart, char ** aAttachmentPart, char ** aPriorityPart, - char ** aNewsgroupPart, char ** aNewsHostPart, PRBool * aForcePlainText) + char ** aNewsgroupPart, char ** aNewsHostPart, PRBool * aHTMLBody) { if (aToPart) *aToPart = ToNewCString(m_toPart); @@ -350,8 +350,8 @@ NS_IMETHODIMP nsMailtoUrl::GetMessageContents(char ** aToPart, char ** aCcPart, *aNewsgroupPart = ToNewCString(m_newsgroupPart); if (aNewsHostPart) *aNewsHostPart = ToNewCString(m_newsHostPart); - if (aForcePlainText) - *aForcePlainText = m_forcePlainText; + if (aHTMLBody) + *aHTMLBody = m_htmlBody; return NS_OK; } diff --git a/mozilla/mailnews/compose/src/nsSmtpUrl.h b/mozilla/mailnews/compose/src/nsSmtpUrl.h index 4121f139368..2aaa1046457 100644 --- a/mozilla/mailnews/compose/src/nsSmtpUrl.h +++ b/mozilla/mailnews/compose/src/nsSmtpUrl.h @@ -83,7 +83,7 @@ protected: nsCString m_replyToPart; nsCString m_priorityPart; - PRBool m_forcePlainText; + PRBool m_htmlBody; }; class nsSmtpUrl : public nsISmtpUrl, public nsMsgMailNewsUrl