diff options
Diffstat (limited to 'www/firefox36/files/patch-ff-479413')
-rw-r--r-- | www/firefox36/files/patch-ff-479413 | 1184 |
1 files changed, 0 insertions, 1184 deletions
diff --git a/www/firefox36/files/patch-ff-479413 b/www/firefox36/files/patch-ff-479413 deleted file mode 100644 index 7f5e606e6401..000000000000 --- a/www/firefox36/files/patch-ff-479413 +++ /dev/null @@ -1,1184 +0,0 @@ -Index: netwerk/base/src/nsStandardURL.cpp -=================================================================== -RCS file: /cvsroot/mozilla/netwerk/base/src/nsStandardURL.cpp,v -retrieving revision 1.82.4.12 -diff -u -9 -p -r1.82.4.12 nsStandardURL.cpp ---- netwerk/base/src/nsStandardURL.cpp 7 Aug 2008 21:24:18 -0000 1.82.4.12 -+++ netwerk/base/src/nsStandardURL.cpp 3 Jun 2009 09:48:29 -0000 -@@ -52,25 +52,23 @@ - #include "nsIPrefBranch2.h" - #include "nsIIDNService.h" - #include "nsNetUtil.h" - #include "prlog.h" - #include "nsAutoPtr.h" - - static NS_DEFINE_CID(kThisImplCID, NS_THIS_STANDARDURL_IMPL_CID); - static NS_DEFINE_CID(kStandardURLCID, NS_STANDARDURL_CID); - --nsIIDNService *nsStandardURL::gIDN = nsnull; -+nsIIDNService_MOZILLA_1_8_BRANCH *nsStandardURL::gIDN = nsnull; - nsICharsetConverterManager *nsStandardURL::gCharsetMgr = nsnull; - PRBool nsStandardURL::gInitialized = PR_FALSE; - PRBool nsStandardURL::gEscapeUTF8 = PR_TRUE; - PRBool nsStandardURL::gAlwaysEncodeInUTF8 = PR_TRUE; --PRBool nsStandardURL::gShowPunycode = PR_FALSE; --nsIPrefBranch *nsStandardURL::gIDNWhitelistPrefBranch = nsnull; - - #if defined(PR_LOGGING) - // - // setenv NSPR_LOG_MODULES nsStandardURL:5 - // - static PRLogModuleInfo *gStandardURLLog; - #endif - #define LOG(args) PR_LOG(gStandardURLLog, PR_LOG_DEBUG, args) - #define LOG_ENABLED() PR_LOG_TEST(gStandardURLLog, PR_LOG_DEBUG) -@@ -131,20 +129,18 @@ end: - } - - //---------------------------------------------------------------------------- - // nsStandardURL::nsPrefObserver - //---------------------------------------------------------------------------- - - #define NS_NET_PREF_ESCAPEUTF8 "network.standard-url.escape-utf8" - #define NS_NET_PREF_ENABLEIDN "network.enableIDN" - #define NS_NET_PREF_ALWAYSENCODEINUTF8 "network.standard-url.encode-utf8" --#define NS_NET_PREF_SHOWPUNYCODE "network.IDN_show_punycode" --#define NS_NET_PREF_IDNWHITELIST "network.IDN.whitelist." - - NS_IMPL_ISUPPORTS1(nsStandardURL::nsPrefObserver, nsIObserver) - - NS_IMETHODIMP nsStandardURL:: - nsPrefObserver::Observe(nsISupports *subject, - const char *topic, - const PRUnichar *data) - { - if (!strcmp(topic, NS_PREFBRANCH_PREFCHANGE_TOPIC_ID)) { -@@ -298,38 +294,28 @@ nsStandardURL::~nsStandardURL() - void - nsStandardURL::InitGlobalObjects() - { - nsCOMPtr<nsIPrefBranch2> prefBranch( do_GetService(NS_PREFSERVICE_CONTRACTID) ); - if (prefBranch) { - nsCOMPtr<nsIObserver> obs( new nsPrefObserver() ); - prefBranch->AddObserver(NS_NET_PREF_ESCAPEUTF8, obs.get(), PR_FALSE); - prefBranch->AddObserver(NS_NET_PREF_ALWAYSENCODEINUTF8, obs.get(), PR_FALSE); - prefBranch->AddObserver(NS_NET_PREF_ENABLEIDN, obs.get(), PR_FALSE); -- prefBranch->AddObserver(NS_NET_PREF_SHOWPUNYCODE, obs.get(), PR_FALSE); - - PrefsChanged(prefBranch, nsnull); -- -- nsCOMPtr<nsIPrefService> prefs = do_QueryInterface(prefBranch); -- if (prefs) { -- nsCOMPtr<nsIPrefBranch> branch; -- if (NS_SUCCEEDED(prefs->GetBranch( NS_NET_PREF_IDNWHITELIST, -- getter_AddRefs(branch) ))) -- NS_ADDREF(gIDNWhitelistPrefBranch = branch); -- } - } - } - - void - nsStandardURL::ShutdownGlobalObjects() - { - NS_IF_RELEASE(gIDN); - NS_IF_RELEASE(gCharsetMgr); -- NS_IF_RELEASE(gIDNWhitelistPrefBranch); - } - - //---------------------------------------------------------------------------- - // nsStandardURL <private> - //---------------------------------------------------------------------------- - - void - nsStandardURL::Clear() - { -@@ -378,45 +364,35 @@ nsStandardURL::EscapeIPv6(const char *ho - return PR_FALSE; - } - - PRBool - nsStandardURL::NormalizeIDN(const nsCSubstring &host, nsCString &result) - { - // If host is ACE, then convert to UTF-8. Else, if host is already UTF-8, - // then make sure it is normalized per IDN. - -- // this function returns PR_TRUE iff it writes something to |result|. -+ // this function returns PR_TRUE if normalization succeeds. - - // NOTE: As a side-effect this function sets mHostEncoding. While it would - // be nice to avoid side-effects in this function, the implementation of - // this function is already somewhat bound to the behavior of the - // callsites. Anyways, this function exists to avoid code duplication, so - // side-effects abound :-/ - - NS_ASSERTION(mHostEncoding == eEncoding_ASCII, "unexpected default encoding"); - -- if (IsASCII(host)) { -- PRBool isACE; -- if (gIDN && -- NS_SUCCEEDED(gIDN->IsACE(host, &isACE)) && isACE && -- NS_SUCCEEDED(ACEtoDisplayIDN(host, result))) { -+ PRBool isASCII; -+ if (gIDN && -+ NS_SUCCEEDED(gIDN->ConvertToDisplayIDN(host, &isASCII, result))) { -+ if (!isASCII) - mHostEncoding = eEncoding_UTF8; -- return PR_TRUE; -- } -- } -- else { -- mHostEncoding = eEncoding_UTF8; -- if (gIDN && NS_SUCCEEDED(UTF8toDisplayIDN(host, result))) { -- // normalization could result in an ASCII only hostname -- if (IsASCII(result)) -- mHostEncoding = eEncoding_ASCII; -- return PR_TRUE; -- } -+ -+ return PR_TRUE; - } - - result.Truncate(); - return PR_FALSE; - } - - void - nsStandardURL::CoalescePath(netCoalesceFlags coalesceFlag, char *path) - { -@@ -819,98 +795,40 @@ nsStandardURL::PrefsChanged(nsIPrefBranc - LOG(("nsStandardURL::PrefsChanged [pref=%s]\n", pref)); - - #define PREF_CHANGED(p) ((pref == nsnull) || !strcmp(pref, p)) - #define GOT_PREF(p, b) (NS_SUCCEEDED(prefs->GetBoolPref(p, &b))) - - if (PREF_CHANGED(NS_NET_PREF_ENABLEIDN)) { - NS_IF_RELEASE(gIDN); - if (GOT_PREF(NS_NET_PREF_ENABLEIDN, val) && val) { - // initialize IDN -- nsCOMPtr<nsIIDNService> serv(do_GetService(NS_IDNSERVICE_CONTRACTID)); -+ nsCOMPtr<nsIIDNService_MOZILLA_1_8_BRANCH> -+ serv(do_GetService(NS_IDNSERVICE_CONTRACTID)); - if (serv) - NS_ADDREF(gIDN = serv.get()); - } - LOG(("IDN support %s\n", gIDN ? "enabled" : "disabled")); - } - - if (PREF_CHANGED(NS_NET_PREF_ESCAPEUTF8)) { - if (GOT_PREF(NS_NET_PREF_ESCAPEUTF8, val)) - gEscapeUTF8 = val; - LOG(("escape UTF-8 %s\n", gEscapeUTF8 ? "enabled" : "disabled")); - } - - if (PREF_CHANGED(NS_NET_PREF_ALWAYSENCODEINUTF8)) { - if (GOT_PREF(NS_NET_PREF_ALWAYSENCODEINUTF8, val)) - gAlwaysEncodeInUTF8 = val; - LOG(("encode in UTF-8 %s\n", gAlwaysEncodeInUTF8 ? "enabled" : "disabled")); - } -- -- if (PREF_CHANGED(NS_NET_PREF_SHOWPUNYCODE)) { -- if (GOT_PREF(NS_NET_PREF_SHOWPUNYCODE, val)) -- gShowPunycode = val; -- LOG(("show punycode %s\n", gShowPunycode ? "enabled" : "disabled")); -- } - #undef PREF_CHANGED - #undef GOT_PREF - } -- --/* static */ nsresult --nsStandardURL::ACEtoDisplayIDN(const nsCSubstring &host, nsCString &result) --{ -- if (gShowPunycode || !IsInWhitelist(host)) { -- result = host; -- return NS_OK; -- } -- -- return gIDN->ConvertACEtoUTF8(host, result); --} -- --/* static */ nsresult --nsStandardURL::UTF8toDisplayIDN(const nsCSubstring &host, nsCString &result) --{ -- // We have to normalize the hostname before testing against the domain -- // whitelist. See bug 315411. -- -- nsCAutoString temp; -- if (gShowPunycode || NS_FAILED(gIDN->Normalize(host, temp))) -- return gIDN->ConvertUTF8toACE(host, result); -- -- PRBool isACE = PR_FALSE; -- gIDN->IsACE(temp, &isACE); -- -- // If host is converted to ACE by the normalizer, then the host may contain -- // unsafe characters. See bug 283016, bug 301694, and bug 309311. -- -- if (!isACE && !IsInWhitelist(temp)) -- return gIDN->ConvertUTF8toACE(temp, result); -- -- result = temp; -- return NS_OK; --} -- --/* static */ PRBool --nsStandardURL::IsInWhitelist(const nsCSubstring &host) --{ -- PRInt32 pos; -- PRBool safe; -- -- // XXX This code uses strings inefficiently. -- -- if (gIDNWhitelistPrefBranch && -- (pos = nsCAutoString(host).RFind(".")) != kNotFound && -- NS_SUCCEEDED(gIDNWhitelistPrefBranch-> -- GetBoolPref(nsCAutoString(Substring(host, pos + 1)).get(), -- &safe))) -- return safe; -- -- return PR_FALSE; --} -- - //---------------------------------------------------------------------------- - // nsStandardURL::nsISupports - //---------------------------------------------------------------------------- - - NS_IMPL_ADDREF(nsStandardURL) - NS_IMPL_RELEASE(nsStandardURL) - - NS_INTERFACE_MAP_BEGIN(nsStandardURL) - NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIStandardURL) -Index: netwerk/base/src/nsStandardURL.h -=================================================================== -RCS file: /cvsroot/mozilla/netwerk/base/src/nsStandardURL.h,v -retrieving revision 1.28.4.1 -diff -u -9 -p -r1.28.4.1 nsStandardURL.h ---- netwerk/base/src/nsStandardURL.h 13 Sep 2005 18:23:14 -0000 1.28.4.1 -+++ netwerk/base/src/nsStandardURL.h 3 Jun 2009 09:48:29 -0000 -@@ -49,19 +49,19 @@ - #include "nsIURLParser.h" - #include "nsIUnicodeEncoder.h" - #include "nsIObserver.h" - #include "nsIIOService.h" - #include "nsCOMPtr.h" - #include "nsURLHelper.h" - - class nsIBinaryInputStream; - class nsIBinaryOutputStream; --class nsIIDNService; -+class nsIIDNService_MOZILLA_1_8_BRANCH; - class nsICharsetConverterManager; - class nsIPrefBranch; - - //----------------------------------------------------------------------------- - // standard URL implementation - //----------------------------------------------------------------------------- - - class nsStandardURL : public nsIFileURL - , public nsIStandardURL -@@ -213,23 +213,18 @@ private: - void ShiftFromQuery(PRInt32 diff) { mQuery.mPos += diff; ShiftFromRef(diff); } - void ShiftFromRef(PRInt32 diff) { mRef.mPos += diff; } - - // fastload helper functions - nsresult ReadSegment(nsIBinaryInputStream *, URLSegment &); - nsresult WriteSegment(nsIBinaryOutputStream *, const URLSegment &); - - static void PrefsChanged(nsIPrefBranch *prefs, const char *pref); - -- // IDN routines -- static nsresult ACEtoDisplayIDN(const nsCSubstring &in, nsCString &out); -- static nsresult UTF8toDisplayIDN(const nsCSubstring &in, nsCString &out); -- static PRBool IsInWhitelist(const nsCSubstring &host); -- - // mSpec contains the normalized version of the URL spec (UTF-8 encoded). - nsCString mSpec; - PRInt32 mDefaultPort; - PRInt32 mPort; - - // url parts (relative to mSpec) - URLSegment mScheme; - URLSegment mAuthority; - URLSegment mUsername; -@@ -262,25 +257,23 @@ private: - - PRUint32 mHostEncoding : 2; // eEncoding_xxx - PRUint32 mSpecEncoding : 2; // eEncoding_xxx - PRUint32 mURLType : 2; // nsIStandardURL::URLTYPE_xxx - PRUint32 mMutable : 1; // nsIStandardURL::mutable - PRUint32 mSupportsFileURL : 1; // QI to nsIFileURL? - - // global objects. don't use COMPtr as its destructor will cause a - // coredump if we leak it. -- static nsIIDNService *gIDN; -+ static nsIIDNService_MOZILLA_1_8_BRANCH *gIDN; - static nsICharsetConverterManager *gCharsetMgr; - static PRBool gInitialized; - static PRBool gEscapeUTF8; - static PRBool gAlwaysEncodeInUTF8; -- static PRBool gShowPunycode; -- static nsIPrefBranch *gIDNWhitelistPrefBranch; - }; - - #define NS_THIS_STANDARDURL_IMPL_CID \ - { /* b8e3e97b-1ccd-4b45-af5a-79596770f5d7 */ \ - 0xb8e3e97b, \ - 0x1ccd, \ - 0x4b45, \ - {0xaf, 0x5a, 0x79, 0x59, 0x67, 0x70, 0xf5, 0xd7} \ - } -Index: netwerk/dns/public/nsIIDNService.idl -=================================================================== -RCS file: /cvsroot/mozilla/netwerk/dns/public/nsIIDNService.idl,v -retrieving revision 1.4 -diff -u -9 -p -r1.4 nsIIDNService.idl ---- netwerk/dns/public/nsIIDNService.idl 3 Apr 2004 07:32:18 -0000 1.4 -+++ netwerk/dns/public/nsIIDNService.idl 3 Jun 2009 09:48:29 -0000 -@@ -18,19 +18,21 @@ - * Portions created by the Initial Developer are Copyright (C) 2001 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): bobj@netscape.com, - * brendan@mozilla.org, - * darin@netscape.com, - * ftang@netscape.com, - * gagan@netscape.com, - * nhotta@netscape.com, -- * william.tan@i-dns.net -+ * william.tan@i-dns.net, -+ * dwitte@stanford.edu, -+ * smontagu@smontagu.org - * - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your -@@ -83,9 +85,21 @@ interface nsIIDNService : nsISupports - */ - boolean isACE(in ACString input); - - /** - * Performs the unicode normalization needed for hostnames in IDN, - * for callers that want early normalization. - */ - AUTF8String normalize(in AUTF8String input); - }; -+ -+[scriptable, uuid(7be196fc-82fd-40d8-9d8c-6421faddeee9)] -+interface nsIIDNService_MOZILLA_1_8_BRANCH : nsIIDNService -+{ -+ /** -+ * Normalizes and converts a host to UTF-8 if the host is in the IDN -+ * whitelist, otherwise converts it to ACE. This is useful for display -+ * purposes and to ensure an encoding consistent with nsIURI::GetHost(). -+ * If the result is ASCII or ACE encoded, |isASCII| will be true. -+ */ -+ AUTF8String convertToDisplayIDN(in AUTF8String input, out boolean isASCII); -+}; -\ No newline at end of file -Index: netwerk/dns/src/nsIDNService.cpp -=================================================================== -RCS file: /cvsroot/mozilla/netwerk/dns/src/nsIDNService.cpp,v -retrieving revision 1.28.2.1 -diff -u -9 -p -r1.28.2.1 nsIDNService.cpp ---- netwerk/dns/src/nsIDNService.cpp 27 Aug 2008 07:36:26 -0000 1.28.2.1 -+++ netwerk/dns/src/nsIDNService.cpp 3 Jun 2009 09:48:29 -0000 -@@ -1,10 +1,10 @@ --/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ - /* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, -@@ -51,43 +51,50 @@ - //----------------------------------------------------------------------------- - // RFC 1034 - 3.1. Name space specifications and terminology - static const PRUint32 kMaxDNSNodeLen = 63; - - //----------------------------------------------------------------------------- - - #define NS_NET_PREF_IDNTESTBED "network.IDN_testbed" - #define NS_NET_PREF_IDNPREFIX "network.IDN_prefix" - #define NS_NET_PREF_IDNBLACKLIST "network.IDN.blacklist_chars" -+#define NS_NET_PREF_SHOWPUNYCODE "network.IDN_show_punycode" -+#define NS_NET_PREF_IDNWHITELIST "network.IDN.whitelist." - - inline PRBool isOnlySafeChars(const nsAFlatString& in, - const nsAFlatString& blacklist) - { - return (blacklist.IsEmpty() || - in.FindCharInSet(blacklist) == kNotFound); - } - - //----------------------------------------------------------------------------- - // nsIDNService - //----------------------------------------------------------------------------- - - /* Implementation file */ - NS_IMPL_THREADSAFE_ISUPPORTS3(nsIDNService, -- nsIIDNService, -+ nsIIDNService_MOZILLA_1_8_BRANCH, - nsIObserver, - nsISupportsWeakReference) - - nsresult nsIDNService::Init() - { -- nsCOMPtr<nsIPrefBranch2> prefInternal(do_GetService(NS_PREFSERVICE_CONTRACTID)); -+ nsCOMPtr<nsIPrefService> prefs(do_GetService(NS_PREFSERVICE_CONTRACTID)); -+ if (prefs) -+ prefs->GetBranch(NS_NET_PREF_IDNWHITELIST, getter_AddRefs(mIDNWhitelistPrefBranch)); -+ -+ nsCOMPtr<nsIPrefBranch2> prefInternal(do_QueryInterface(prefs)); - if (prefInternal) { - prefInternal->AddObserver(NS_NET_PREF_IDNTESTBED, this, PR_TRUE); - prefInternal->AddObserver(NS_NET_PREF_IDNPREFIX, this, PR_TRUE); - prefInternal->AddObserver(NS_NET_PREF_IDNBLACKLIST, this, PR_TRUE); -+ prefInternal->AddObserver(NS_NET_PREF_SHOWPUNYCODE, this, PR_TRUE); - prefsChanged(prefInternal, nsnull); - } - return NS_OK; - } - - NS_IMETHODIMP nsIDNService::Observe(nsISupports *aSubject, - const char *aTopic, - const PRUnichar *aData) - { -@@ -116,18 +123,23 @@ void nsIDNService::prefsChanged(nsIPrefB - nsCOMPtr<nsISupportsString> blacklist; - nsresult rv = prefBranch->GetComplexValue(NS_NET_PREF_IDNBLACKLIST, - NS_GET_IID(nsISupportsString), - getter_AddRefs(blacklist)); - if (NS_SUCCEEDED(rv)) - blacklist->ToString(getter_Copies(mIDNBlacklist)); - else - mIDNBlacklist.Truncate(); - } -+ if (!pref || NS_LITERAL_STRING(NS_NET_PREF_SHOWPUNYCODE).Equals(pref)) { -+ PRBool val; -+ if (NS_SUCCEEDED(prefBranch->GetBoolPref(NS_NET_PREF_SHOWPUNYCODE, &val))) -+ mShowPunycode = val; -+ } - } - - nsIDNService::nsIDNService() - { - nsresult rv; - - // initialize to the official prefix (RFC 3490 "5. ACE prefix") - const char kIDNSPrefix[] = "xn--"; - strcpy(mACEPrefix, kIDNSPrefix); -@@ -148,18 +160,23 @@ nsIDNService::~nsIDNService() - idn_nameprep_destroy(mNamePrepHandle); - } - - /* ACString ConvertUTF8toACE (in AUTF8String input); */ - NS_IMETHODIMP nsIDNService::ConvertUTF8toACE(const nsACString & input, nsACString & ace) - { - // protect against bogus input - NS_ENSURE_TRUE(IsUTF8(input), NS_ERROR_UNEXPECTED); - -+ return UTF8toACE(input, ace, PR_TRUE); -+} -+ -+nsresult nsIDNService::UTF8toACE(const nsACString & input, nsACString & ace, PRBool allowUnassigned) -+{ - nsresult rv; - NS_ConvertUTF8toUCS2 ustr(input); - - // map ideographic period to ASCII period etc. - normalizeFullStops(ustr); - - - PRUint32 len, offset; - len = 0; -@@ -169,45 +186,53 @@ NS_IMETHODIMP nsIDNService::ConvertUTF8t - nsAString::const_iterator start, end; - ustr.BeginReading(start); - ustr.EndReading(end); - ace.Truncate(); - - // encode nodes if non ASCII - while (start != end) { - len++; - if (*start++ == (PRUnichar)'.') { -- rv = stringPrepAndACE(Substring(ustr, offset, len - 1), encodedBuf); -+ rv = stringPrepAndACE(Substring(ustr, offset, len - 1), encodedBuf, -+ allowUnassigned); - NS_ENSURE_SUCCESS(rv, rv); - - ace.Append(encodedBuf); - ace.Append('.'); - offset += len; - len = 0; - } - } - - // add extra node for multilingual test bed - if (mMultilingualTestBed) - ace.AppendLiteral("mltbd."); - // encode the last node if non ASCII - if (len) { -- rv = stringPrepAndACE(Substring(ustr, offset, len), encodedBuf); -+ rv = stringPrepAndACE(Substring(ustr, offset, len), encodedBuf, -+ allowUnassigned); - NS_ENSURE_SUCCESS(rv, rv); - - ace.Append(encodedBuf); - } - - return NS_OK; - } - - /* [noscript] string ConvertACEtoUTF8 (in string input); */ - NS_IMETHODIMP nsIDNService::ConvertACEtoUTF8(const nsACString & input, nsACString & _retval) - { -+ return ACEtoUTF8(input, _retval, PR_TRUE); -+} -+ -+nsresult nsIDNService::ACEtoUTF8(const nsACString & input, nsACString & _retval, -+ PRBool allowUnassigned) -+{ - // RFC 3490 - 4.2 ToUnicode - // ToUnicode never fails. If any step fails, then the original input - // sequence is returned immediately in that step. - - if (!IsASCII(input)) { - _retval.Assign(input); - return NS_OK; - } - -@@ -217,32 +242,34 @@ NS_IMETHODIMP nsIDNService::ConvertACEto - nsACString::const_iterator start, end; - input.BeginReading(start); - input.EndReading(end); - _retval.Truncate(); - - // loop and decode nodes - while (start != end) { - len++; - if (*start++ == '.') { -- if (NS_FAILED(decodeACE(Substring(input, offset, len - 1), decodedBuf))) { -+ if (NS_FAILED(decodeACE(Substring(input, offset, len - 1), decodedBuf, -+ allowUnassigned))) { - _retval.Assign(input); - return NS_OK; - } - - _retval.Append(decodedBuf); - _retval.Append('.'); - offset += len; - len = 0; - } - } - // decode the last node - if (len) { -- if (NS_FAILED(decodeACE(Substring(input, offset, len), decodedBuf))) -+ if (NS_FAILED(decodeACE(Substring(input, offset, len), decodedBuf, -+ allowUnassigned))) - _retval.Assign(input); - else - _retval.Append(decodedBuf); - } - - return NS_OK; - } - - /* boolean encodedInACE (in ACString input); */ -@@ -266,30 +293,100 @@ NS_IMETHODIMP nsIDNService::IsACE(const - - NS_IMETHODIMP nsIDNService::Normalize(const nsACString & input, nsACString & output) - { - // protect against bogus input - NS_ENSURE_TRUE(IsUTF8(input), NS_ERROR_UNEXPECTED); - - NS_ConvertUTF8toUTF16 inUTF16(input); - normalizeFullStops(inUTF16); - -- nsAutoString outUTF16; -- nsresult rv = stringPrep(inUTF16, outUTF16); -- if (NS_FAILED(rv)) -- return rv; -+ // pass the domain name to stringprep label by label -+ nsAutoString outUTF16, outLabel; -+ -+ PRUint32 len = 0, offset = 0; -+ nsresult rv; -+ nsAString::const_iterator start, end; -+ inUTF16.BeginReading(start); -+ inUTF16.EndReading(end); -+ -+ while (start != end) { -+ len++; -+ if (*start++ == PRUnichar('.')) { -+ rv = stringPrep(Substring(inUTF16, offset, len - 1), outLabel, PR_TRUE); -+ NS_ENSURE_SUCCESS(rv, rv); -+ -+ outUTF16.Append(outLabel); -+ outUTF16.Append(PRUnichar('.')); -+ offset += len; -+ len = 0; -+ } -+ } -+ if (len) { -+ rv = stringPrep(Substring(inUTF16, offset, len), outLabel, PR_TRUE); -+ NS_ENSURE_SUCCESS(rv, rv); -+ -+ outUTF16.Append(outLabel); -+ } - - CopyUTF16toUTF8(outUTF16, output); - if (!isOnlySafeChars(outUTF16, mIDNBlacklist)) - return ConvertUTF8toACE(output, output); - - return NS_OK; - } - -+NS_IMETHODIMP nsIDNService::ConvertToDisplayIDN(const nsACString & input, PRBool * _isASCII, nsACString & _retval) -+{ -+ // If host is ACE, then convert to UTF-8 if the host is in the IDN whitelist. -+ // Else, if host is already UTF-8, then make sure it is normalized per IDN. -+ -+ nsresult rv; -+ -+ if (IsASCII(input)) { -+ // first, canonicalize the host to lowercase, for whitelist lookup -+ _retval = input; -+ ToLowerCase(_retval); -+ -+ PRBool isACE; -+ IsACE(_retval, &isACE); -+ -+ if (isACE && !mShowPunycode && isInWhitelist(_retval)) { -+ // ACEtoUTF8() can't fail, but might return the original ACE string -+ nsCAutoString temp(_retval); -+ ACEtoUTF8(temp, _retval, PR_FALSE); -+ *_isASCII = IsASCII(_retval); -+ } else { -+ *_isASCII = PR_TRUE; -+ } -+ } else { -+ if (mShowPunycode && NS_SUCCEEDED(ConvertUTF8toACE(input, _retval))) { -+ *_isASCII = PR_TRUE; -+ return NS_OK; -+ } -+ -+ // We have to normalize the hostname before testing against the domain -+ // whitelist. See bug 315411. -+ rv = Normalize(input, _retval); -+ if (NS_FAILED(rv)) return rv; -+ -+ // normalization could result in an ASCII-only hostname. alternatively, if -+ // the host is converted to ACE by the normalizer, then the host may contain -+ // unsafe characters, so leave it ACE encoded. see bug 283016, bug 301694, and bug 309311. -+ *_isASCII = IsASCII(_retval); -+ if (!*_isASCII && !isInWhitelist(_retval)) { -+ *_isASCII = PR_TRUE; -+ return ConvertUTF8toACE(_retval, _retval); -+ } -+ } -+ -+ return NS_OK; -+} -+ - //----------------------------------------------------------------------------- - - static void utf16ToUcs4(const nsAString& in, PRUint32 *out, PRUint32 outBufLen, PRUint32 *outLen) - { - PRUint32 i = 0; - nsAString::const_iterator start, end; - in.BeginReading(start); - in.EndReading(end); - -@@ -404,19 +501,24 @@ static nsresult encodeToRACE(const char* - // 3) Prohibit -- Check for any characters that are not allowed in the - // output. If any are found, return an error. This is described in section - // 5. - // - // 4) Check bidi -- Possibly check for right-to-left characters, and if any - // are found, make sure that the whole string satisfies the requirements - // for bidirectional strings. If the string does not satisfy the requirements - // for bidirectional strings, return an error. This is described in section 6. - // --nsresult nsIDNService::stringPrep(const nsAString& in, nsAString& out) -+// 5) Check unassigned code points -- If allowUnassigned is false, check for -+// any unassigned Unicode points and if any are found return an error. -+// This is described in section 7. -+// -+nsresult nsIDNService::stringPrep(const nsAString& in, nsAString& out, -+ PRBool allowUnassigned) - { - if (!mNamePrepHandle || !mNormalizer) - return NS_ERROR_FAILURE; - - nsresult rv = NS_OK; - PRUint32 ucs4Buf[kMaxDNSNodeLen + 1]; - PRUint32 ucs4Len; - utf16ToUcs4(in, ucs4Buf, kMaxDNSNodeLen, &ucs4Len); - -@@ -446,50 +548,59 @@ nsresult nsIDNService::stringPrep(const - if (idn_err != idn_success || found) - return NS_ERROR_FAILURE; - - // check bidi - idn_err = idn_nameprep_isvalidbidi(mNamePrepHandle, - (const PRUint32 *) ucs4Buf, &found); - if (idn_err != idn_success || found) - return NS_ERROR_FAILURE; - -+ if (!allowUnassigned) { -+ // check unassigned code points -+ idn_err = idn_nameprep_isunassigned(mNamePrepHandle, -+ (const PRUint32 *) ucs4Buf, &found); -+ if (idn_err != idn_success || found) -+ return NS_ERROR_FAILURE; -+ } -+ - // set the result string - out.Assign(normlizedStr); - - return rv; - } - - nsresult nsIDNService::encodeToACE(const nsAString& in, nsACString& out) - { - // RACE encode is supported for existing testing environment - if (!strcmp("bq--", mACEPrefix)) - return encodeToRACE(mACEPrefix, in, out); - - // use punycoce - return punycode(mACEPrefix, in, out); - } - --nsresult nsIDNService::stringPrepAndACE(const nsAString& in, nsACString& out) -+nsresult nsIDNService::stringPrepAndACE(const nsAString& in, nsACString& out, -+ PRBool allowUnassigned) - { - nsresult rv = NS_OK; - - out.Truncate(); - - if (in.Length() > kMaxDNSNodeLen) { - NS_ERROR("IDN node too large"); - return NS_ERROR_FAILURE; - } - - if (IsASCII(in)) - CopyUCS2toASCII(in, out); - else { - nsAutoString strPrep; -- rv = stringPrep(in, strPrep); -+ rv = stringPrep(in, strPrep, allowUnassigned); - if (NS_SUCCEEDED(rv)) { - if (IsASCII(strPrep)) - CopyUCS2toASCII(strPrep, out); - else - rv = encodeToACE(strPrep, out); - } - } - - if (out.Length() > kMaxDNSNodeLen) { -@@ -522,19 +633,20 @@ void nsIDNService::normalizeFullStops(ns - break; - default: - break; - } - start++; - index++; - } - } - --nsresult nsIDNService::decodeACE(const nsACString& in, nsACString& out) -+nsresult nsIDNService::decodeACE(const nsACString& in, nsACString& out, -+ PRBool allowUnassigned) - { - PRBool isAce; - IsACE(in, &isAce); - if (!isAce) { - out.Assign(in); - return NS_OK; - } - - // RFC 3490 - 4.2 ToUnicode -@@ -558,17 +670,39 @@ nsresult nsIDNService::decodeACE(const n - nsAutoString utf16; - ucs4toUtf16(output, utf16); - delete [] output; - if (!isOnlySafeChars(utf16, mIDNBlacklist)) - return NS_ERROR_FAILURE; - CopyUTF16toUTF8(utf16, out); - - // Validation: encode back to ACE and compare the strings - nsCAutoString ace; -- nsresult rv = ConvertUTF8toACE(out, ace); -+ nsresult rv = UTF8toACE(out, ace, allowUnassigned); - NS_ENSURE_SUCCESS(rv, rv); - - if (!ace.Equals(in, nsCaseInsensitiveCStringComparator())) - return NS_ERROR_FAILURE; - - return NS_OK; - } -+ -+PRBool nsIDNService::isInWhitelist(const nsACString &host) -+{ -+ if (mIDNWhitelistPrefBranch) { -+ nsCAutoString tld(host); -+ // make sure the host is ACE for lookup and check that there are no -+ // unassigned codepoints -+ if (!IsASCII(tld) && NS_FAILED(UTF8toACE(tld, tld, PR_FALSE))) { -+ return PR_FALSE; -+ } -+ -+ tld.Trim("."); -+ PRInt32 pos = tld.RFind("."); -+ -+ PRBool safe; -+ if (pos != kNotFound && -+ NS_SUCCEEDED(mIDNWhitelistPrefBranch->GetBoolPref(tld.get() + pos + 1, &safe))) -+ return safe; -+ } -+ -+ return PR_FALSE; -+} -Index: netwerk/dns/src/nsIDNService.h -=================================================================== -RCS file: /cvsroot/mozilla/netwerk/dns/src/nsIDNService.h,v -retrieving revision 1.8 -diff -u -9 -p -r1.8 nsIDNService.h ---- netwerk/dns/src/nsIDNService.h 22 Jul 2005 15:07:33 -0000 1.8 -+++ netwerk/dns/src/nsIDNService.h 3 Jun 2009 09:48:30 -0000 -@@ -1,10 +1,10 @@ --/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ - /* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, -@@ -49,39 +49,50 @@ - - class nsIPrefBranch; - - //----------------------------------------------------------------------------- - // nsIDNService - //----------------------------------------------------------------------------- - - #define kACEPrefixLen 4 - --class nsIDNService : public nsIIDNService, -+class nsIDNService : public nsIIDNService_MOZILLA_1_8_BRANCH, - public nsIObserver, - public nsSupportsWeakReference - { - public: - NS_DECL_ISUPPORTS - NS_DECL_NSIIDNSERVICE -+ NS_DECL_NSIIDNSERVICE_MOZILLA_1_8_BRANCH - NS_DECL_NSIOBSERVER - - nsIDNService(); - virtual ~nsIDNService(); - - nsresult Init(); - - private: - void normalizeFullStops(nsAString& s); -- nsresult stringPrepAndACE(const nsAString& in, nsACString& out); -+ nsresult stringPrepAndACE(const nsAString& in, nsACString& out, -+ PRBool allowUnassigned); - nsresult encodeToACE(const nsAString& in, nsACString& out); -- nsresult stringPrep(const nsAString& in, nsAString& out); -- nsresult decodeACE(const nsACString& in, nsACString& out); -+ nsresult stringPrep(const nsAString& in, nsAString& out, -+ PRBool allowUnassigned); -+ nsresult decodeACE(const nsACString& in, nsACString& out, -+ PRBool allowUnassigned); -+ nsresult UTF8toACE(const nsACString& in, nsACString& out, -+ PRBool allowUnassigned); -+ nsresult ACEtoUTF8(const nsACString& in, nsACString& out, -+ PRBool allowUnassigned); -+ PRBool isInWhitelist(const nsACString &host); - void prefsChanged(nsIPrefBranch *prefBranch, const PRUnichar *pref); - -- PRBool mMultilingualTestBed; // if true generates extra node for mulitlingual testbed -+ PRBool mMultilingualTestBed; // if true generates extra node for multilingual testbed - idn_nameprep_t mNamePrepHandle; - nsCOMPtr<nsIUnicodeNormalizer> mNormalizer; - char mACEPrefix[kACEPrefixLen+1]; - nsXPIDLString mIDNBlacklist; -+ PRBool mShowPunycode; -+ nsCOMPtr<nsIPrefBranch> mIDNWhitelistPrefBranch; - }; - - #endif // nsIDNService_h__ -Index: netwerk/test/Makefile.in -=================================================================== -RCS file: /cvsroot/mozilla/netwerk/test/Makefile.in,v -retrieving revision 1.85.2.7 -diff -u -9 -p -r1.85.2.7 Makefile.in ---- netwerk/test/Makefile.in 27 Jun 2006 20:27:29 -0000 1.85.2.7 -+++ netwerk/test/Makefile.in 3 Jun 2009 09:48:31 -0000 -@@ -97,20 +97,23 @@ _UNIT_FILES = unit/test_all.sh \ - unit/head.js \ - unit/head_http_server.js \ - unit/tail.js \ - unit/test_protocolproxyservice.js \ - unit/test_http_headers.js \ - unit/test_cookie_header.js \ - unit/test_parse_content_type.js \ - unit/test_event_sink.js \ - unit/test_content_sniffer.js \ -+ unit/test_idnservice.js \ - unit/test_bug331825.js \ - unit/test_bug336501.js \ -+ unit/test_bug427957.js \ -+ unit/test_bug479413.js \ - $(NULL) - libs:: $(_UNIT_FILES) - $(INSTALL) $^ $(DIST)/bin/necko_unit_tests - - check:: - $(RUN_TEST_PROGRAM) $(DIST)/bin/necko_unit_tests/test_all.sh - - _RES_FILES = urlparse.dat \ - urlparse_unx.dat \ -Index: netwerk/test/unit/test_bug427957.js -=================================================================== -RCS file: netwerk/test/unit/test_bug427957.js -diff -N netwerk/test/unit/test_bug427957.js ---- /dev/null 1 Jan 1970 00:00:00 -0000 -+++ netwerk/test/unit/test_bug427957.js 3 Jun 2009 09:48:31 -0000 -@@ -0,0 +1,100 @@ -+/** -+ * Test for Bidi restrictions on IDNs from RFC 3454 -+ */ -+ -+var Cc = Components.classes; -+var Ci = Components.interfaces; -+var idnService; -+ -+function expected_pass(inputIDN) -+{ -+ var isASCII = {}; -+ var displayIDN = idnService.convertToDisplayIDN(inputIDN, isASCII); -+ do_check_eq(displayIDN, inputIDN); -+} -+ -+function expected_fail(inputIDN) -+{ -+ var isASCII = {}; -+ var displayIDN = ""; -+ -+ try { -+ displayIDN = idnService.convertToDisplayIDN(inputIDN, isASCII); -+ } -+ catch(e) {} -+ -+ do_check_neq(displayIDN, inputIDN); -+} -+ -+function run_test() { -+ // add an IDN whitelist pref -+ var pbi = Cc["@mozilla.org/preferences-service;1"] -+ .getService(Ci.nsIPrefBranch2); -+ pbi.setBoolPref("network.IDN.whitelist.com", true); -+ -+ idnService = Cc["@mozilla.org/network/idn-service;1"] -+ .getService(Ci.nsIIDNService_MOZILLA_1_8_BRANCH); -+ /* -+ * In any profile that specifies bidirectional character handling, all -+ * three of the following requirements MUST be met: -+ * -+ * 1) The characters in section 5.8 MUST be prohibited. -+ */ -+ -+ // 0340; COMBINING GRAVE TONE MARK -+ expected_fail("foo\u0340bar.com"); -+ // 0341; COMBINING ACUTE TONE MARK -+ expected_fail("foo\u0341bar.com"); -+ // 200E; LEFT-TO-RIGHT MARK -+ expected_fail("foo\200ebar.com"); -+ // 200F; RIGHT-TO-LEFT MARK -+ // Note: this is an RTL IDN so that it doesn't fail test 2) below -+ expected_fail("\u200f\u0645\u062B\u0627\u0644.\u0622\u0632\u0645\u0627\u06CC\u0634\u06CC"); -+ // 202A; LEFT-TO-RIGHT EMBEDDING -+ expected_fail("foo\u202abar.com"); -+ // 202B; RIGHT-TO-LEFT EMBEDDING -+ expected_fail("foo\u202bbar.com"); -+ // 202C; POP DIRECTIONAL FORMATTING -+ expected_fail("foo\u202cbar.com"); -+ // 202D; LEFT-TO-RIGHT OVERRIDE -+ expected_fail("foo\u202dbar.com"); -+ // 202E; RIGHT-TO-LEFT OVERRIDE -+ expected_fail("foo\u202ebar.com"); -+ // 206A; INHIBIT SYMMETRIC SWAPPING -+ expected_fail("foo\u206abar.com"); -+ // 206B; ACTIVATE SYMMETRIC SWAPPING -+ expected_fail("foo\u206bbar.com"); -+ // 206C; INHIBIT ARABIC FORM SHAPING -+ expected_fail("foo\u206cbar.com"); -+ // 206D; ACTIVATE ARABIC FORM SHAPING -+ expected_fail("foo\u206dbar.com"); -+ // 206E; NATIONAL DIGIT SHAPES -+ expected_fail("foo\u206ebar.com"); -+ // 206F; NOMINAL DIGIT SHAPES -+ expected_fail("foo\u206fbar.com"); -+ -+ /* -+ * 2) If a string contains any RandALCat character, the string MUST NOT -+ * contain any LCat character. -+ */ -+ -+ // www.מיץpetel.com is invalid -+ expected_fail("www.\u05DE\u05D9\u05E5petel.com"); -+ // But www.מיץפטל.com is fine because the ltr and rtl characters are in -+ // different labels -+ expected_pass("www.\u05DE\u05D9\u05E5\u05E4\u05D8\u05DC.com"); -+ -+ /* -+ * 3) If a string contains any RandALCat character, a RandALCat -+ * character MUST be the first character of the string, and a -+ * RandALCat character MUST be the last character of the string. -+ */ -+ -+ // www.1מיץ.com is invalid -+ expected_fail("www.1\u05DE\u05D9\u05E5.com"); -+ // www.מיץ1.com is invalid -+ expected_fail("www.\u05DE\u05D9\u05E51.com"); -+ // But www.מיץ1פטל.com is fine -+ expected_pass("www.\u05DE\u05D9\u05E51\u05E4\u05D8\u05DC.com"); -+} -+ -Index: netwerk/test/unit/test_bug479413.js -=================================================================== -RCS file: netwerk/test/unit/test_bug479413.js -diff -N netwerk/test/unit/test_bug479413.js ---- /dev/null 1 Jan 1970 00:00:00 -0000 -+++ netwerk/test/unit/test_bug479413.js 3 Jun 2009 09:48:31 -0000 -@@ -0,0 +1,60 @@ -+/** -+ * Test for unassigned code points in IDNs (RFC 3454 section 7) -+ */ -+ -+const Cc = Components.classes; -+const Ci = Components.interfaces; -+var idnService; -+ -+function expected_pass(inputIDN) -+{ -+ var isASCII = {}; -+ var displayIDN = idnService.convertToDisplayIDN(inputIDN, isASCII); -+ do_check_eq(displayIDN, inputIDN); -+} -+ -+function expected_fail(inputIDN) -+{ -+ var isASCII = {}; -+ var displayIDN = ""; -+ -+ try { -+ displayIDN = idnService.convertToDisplayIDN(inputIDN, isASCII); -+ } -+ catch(e) {} -+ -+ do_check_neq(displayIDN, inputIDN); -+} -+ -+function run_test() { -+ // add an IDN whitelist pref -+ var pbi = Cc["@mozilla.org/preferences-service;1"] -+ .getService(Ci.nsIPrefBranch2); -+ var whitelistPref = "network.IDN.whitelist.com"; -+ -+ pbi.setBoolPref(whitelistPref, true); -+ -+ idnService = Cc["@mozilla.org/network/idn-service;1"] -+ .getService(Ci.nsIIDNService_MOZILLA_1_8_BRANCH); -+ -+ // assigned code point -+ expected_pass("foo\u0101bar.com"); -+ -+ // assigned code point in punycode. Should *fail* because the URL will be -+ // converted to Unicode for display -+ expected_fail("xn--foobar-5za.com"); -+ -+ // unassigned code point -+ expected_fail("foo\u3040bar.com"); -+ -+ // unassigned code point in punycode. Should *pass* because the URL will not -+ // be converted to Unicode -+ expected_pass("xn--foobar-533e.com"); -+ -+ // code point assigned since Unicode 3.0 -+ // XXX This test will unexpectedly pass when we update to IDNAbis -+ expected_fail("foo\u0370bar.com"); -+ -+ // reset the pref -+ pbi.clearUserPref(whitelistPref); -+} -Index: netwerk/test/unit/test_idnservice.js -=================================================================== -RCS file: netwerk/test/unit/test_idnservice.js -diff -N netwerk/test/unit/test_idnservice.js ---- /dev/null 1 Jan 1970 00:00:00 -0000 -+++ netwerk/test/unit/test_idnservice.js 3 Jun 2009 09:48:31 -0000 -@@ -0,0 +1,48 @@ -+// Tests nsIIDNService -+ -+var reference = [ -+ // The 3rd element indicates whether the second element -+ // is ACE-encoded -+ ["asciihost", "asciihost", false], -+ ["b\u00FCcher", "xn--bcher-kva", true] -+ ]; -+ -+function run_test() { -+ var idnService = Components.classes["@mozilla.org/network/idn-service;1"] -+ .getService(Components.interfaces.nsIIDNService_MOZILLA_1_8_BRANCH); -+ -+ for (var i = 0; i < reference.length; ++i) { -+ dump("Testing " + reference[i] + "\n"); -+ // We test the following: -+ // - Converting UTF-8 to ACE and back gives us the expected answer -+ // - Converting the ASCII string UTF-8 -> ACE leaves the string unchanged -+ // - isACE returns true when we expect it to (third array elem true) -+ do_check_eq(idnService.convertUTF8toACE(reference[i][0]), reference[i][1]); -+ do_check_eq(idnService.convertUTF8toACE(reference[i][1]), reference[i][1]); -+ do_check_eq(idnService.convertACEtoUTF8(reference[i][1]), reference[i][0]); -+ do_check_eq(idnService.isACE(reference[i][1]), reference[i][2]); -+ } -+ -+ // add an IDN whitelist pref -+ var pbi = Components.classes["@mozilla.org/preferences-service;1"] -+ .getService(Components.interfaces.nsIPrefBranch2); -+ pbi.setBoolPref("network.IDN.whitelist.es", true); -+ -+ // check convertToDisplayIDN against the whitelist -+ var isASCII = {}; -+ do_check_eq(idnService.convertToDisplayIDN("b\u00FCcher.es", isASCII), "b\u00FCcher.es"); -+ do_check_eq(isASCII.value, false); -+ do_check_eq(idnService.convertToDisplayIDN("xn--bcher-kva.es", isASCII), "b\u00FCcher.es"); -+ do_check_eq(isASCII.value, false); -+ do_check_eq(idnService.convertToDisplayIDN("b\u00FCcher.uk", isASCII), "xn--bcher-kva.uk"); -+ do_check_eq(isASCII.value, true); -+ do_check_eq(idnService.convertToDisplayIDN("xn--bcher-kva.uk", isASCII), "xn--bcher-kva.uk"); -+ do_check_eq(isASCII.value, true); -+ -+ // check ACE TLD's are handled by the whitelist -+ pbi.setBoolPref("network.IDN.whitelist.xn--k-dha", true); -+ do_check_eq(idnService.convertToDisplayIDN("test.\u00FCk", isASCII), "test.\u00FCk"); -+ do_check_eq(isASCII.value, false); -+ do_check_eq(idnService.convertToDisplayIDN("test.xn--k-dha", isASCII), "test.\u00FCk"); -+ do_check_eq(isASCII.value, false); -+} |