From 9ab142536c6c0b33b2b3e5b208f763ebcf1c922d Mon Sep 17 00:00:00 2001 From: "darin%meer.net" Date: Thu, 17 Feb 2005 20:02:37 +0000 Subject: [PATCH] fixes bug 282270 (and bug 282520) "always show punycode by default" r=dbaron sr=dveditz a=dbaron git-svn-id: svn://10.0.0.236/trunk@169323 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/modules/libpref/src/init/all.js | 5 +++ mozilla/netwerk/dns/src/nsIDNService.cpp | 57 +++++++++++++++--------- mozilla/netwerk/dns/src/nsIDNService.h | 4 ++ 3 files changed, 45 insertions(+), 21 deletions(-) diff --git a/mozilla/modules/libpref/src/init/all.js b/mozilla/modules/libpref/src/init/all.js index 95513e6435e..c0629e253f6 100644 --- a/mozilla/modules/libpref/src/init/all.js +++ b/mozilla/modules/libpref/src/init/all.js @@ -553,6 +553,11 @@ pref("network.http.pipelining.maxrequests" , 4); // are handled. IDN requires a nsIIDNService implementation. pref("network.enableIDN", true); +// This preference, if true, causes all UTF-8 domain names to be normalized to +// punycode. The intention is to allow UTF-8 domain names as input, but never +// generate them from punycode. +pref("network.IDN_show_punycode", true); + // This preference specifies a list of domains for which DNS lookups will be // IPv4 only. Works around broken DNS servers which can't handle IPv6 lookups // and/or allows the user to disable IPv6 on a per-domain basis. See bug 68796. diff --git a/mozilla/netwerk/dns/src/nsIDNService.cpp b/mozilla/netwerk/dns/src/nsIDNService.cpp index 3929e265b16..7c47e35ad87 100644 --- a/mozilla/netwerk/dns/src/nsIDNService.cpp +++ b/mozilla/netwerk/dns/src/nsIDNService.cpp @@ -54,8 +54,9 @@ 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_IDNTESTBED "network.IDN_testbed" +#define NS_NET_PREF_IDNPREFIX "network.IDN_prefix" +#define NS_NET_PREF_IDNSHOWPUNYCODE "network.IDN_show_punycode" //----------------------------------------------------------------------------- // nsIDNService @@ -73,8 +74,9 @@ nsresult nsIDNService::Init() 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_IDNSHOWPUNYCODE, this, PR_TRUE); + prefsChanged(prefInternal, nsnull); } - return NS_OK; } @@ -84,26 +86,32 @@ NS_IMETHODIMP nsIDNService::Observe(nsISupports *aSubject, { if (!strcmp(aTopic, NS_PREFBRANCH_PREFCHANGE_TOPIC_ID)) { nsCOMPtr prefBranch( do_QueryInterface(aSubject) ); - if (prefBranch) { - // to support test environment which is a temporary testing environment - // until IDN is actually deployed - if (NS_LITERAL_STRING(NS_NET_PREF_IDNTESTBED).Equals(aData)) { - PRBool val; - if (NS_SUCCEEDED(prefBranch->GetBoolPref(NS_NET_PREF_IDNTESTBED, &val))) - mMultilingualTestBed = val; - } - else if (NS_LITERAL_STRING(NS_NET_PREF_IDNPREFIX).Equals(aData)) { - nsXPIDLCString prefix; - nsresult rv = prefBranch->GetCharPref(NS_NET_PREF_IDNPREFIX, getter_Copies(prefix)); - if (NS_SUCCEEDED(rv) && prefix.Length() <= kACEPrefixLen) - PL_strncpyz(nsIDNService::mACEPrefix, prefix.get(), kACEPrefixLen + 1); - } - } + if (prefBranch) + prefsChanged(prefBranch, aData); } - return NS_OK; } +void nsIDNService::prefsChanged(nsIPrefBranch *prefBranch, const PRUnichar *pref) +{ + if (!pref || NS_LITERAL_STRING(NS_NET_PREF_IDNTESTBED).Equals(pref)) { + PRBool val; + if (NS_SUCCEEDED(prefBranch->GetBoolPref(NS_NET_PREF_IDNTESTBED, &val))) + mMultilingualTestBed = val; + } + if (!pref || NS_LITERAL_STRING(NS_NET_PREF_IDNPREFIX).Equals(pref)) { + nsXPIDLCString prefix; + nsresult rv = prefBranch->GetCharPref(NS_NET_PREF_IDNPREFIX, getter_Copies(prefix)); + if (NS_SUCCEEDED(rv) && prefix.Length() <= kACEPrefixLen) + PL_strncpyz(nsIDNService::mACEPrefix, prefix.get(), kACEPrefixLen + 1); + } + if (!pref || NS_LITERAL_STRING(NS_NET_PREF_IDNSHOWPUNYCODE).Equals(pref)) { + PRBool val; + if (NS_SUCCEEDED(prefBranch->GetBoolPref(NS_NET_PREF_IDNSHOWPUNYCODE, &val))) + mShowPunycode = val; + } +} + nsIDNService::nsIDNService() { nsresult rv; @@ -113,6 +121,7 @@ nsIDNService::nsIDNService() strcpy(mACEPrefix, kIDNSPrefix); mMultilingualTestBed = PR_FALSE; + mShowPunycode = PR_FALSE; if (idn_success != idn_nameprep_create(NULL, &mNamePrepHandle)) mNamePrepHandle = nsnull; @@ -183,7 +192,7 @@ NS_IMETHODIMP nsIDNService::ConvertACEtoUTF8(const nsACString & input, nsACStrin // ToUnicode never fails. If any step fails, then the original input // sequence is returned immediately in that step. - if (!IsASCII(input)) { + if (mShowPunycode || !IsASCII(input)) { _retval.Assign(input); return NS_OK; } @@ -246,8 +255,14 @@ NS_IMETHODIMP nsIDNService::Normalize(const nsACString & input, nsACString & out // protect against bogus input NS_ENSURE_TRUE(IsUTF8(input), NS_ERROR_UNEXPECTED); + if (mShowPunycode) + return ConvertUTF8toACE(input, output); + + NS_ConvertUTF8toUTF16 inUTF16(input); + normalizeFullStops(inUTF16); + nsAutoString outUTF16; - nsresult rv = stringPrep(NS_ConvertUTF8toUTF16(input), outUTF16); + nsresult rv = stringPrep(inUTF16, outUTF16); if (NS_SUCCEEDED(rv)) CopyUTF16toUTF8(outUTF16, output); return rv; diff --git a/mozilla/netwerk/dns/src/nsIDNService.h b/mozilla/netwerk/dns/src/nsIDNService.h index 31861b912fc..ddad79ef2d7 100644 --- a/mozilla/netwerk/dns/src/nsIDNService.h +++ b/mozilla/netwerk/dns/src/nsIDNService.h @@ -46,6 +46,8 @@ #include "nsIUnicodeNormalizer.h" #include "nsIDNKitInterface.h" +class nsIPrefBranch; + //----------------------------------------------------------------------------- // nsIDNService //----------------------------------------------------------------------------- @@ -72,8 +74,10 @@ private: nsresult encodeToACE(const nsAString& in, nsACString& out); nsresult stringPrep(const nsAString& in, nsAString& out); nsresult decodeACE(const nsACString& in, nsACString& out); + void prefsChanged(nsIPrefBranch *prefBranch, const PRUnichar *pref); PRBool mMultilingualTestBed; // if true generates extra node for mulitlingual testbed + PRBool mShowPunycode; idn_nameprep_t mNamePrepHandle; nsCOMPtr mNormalizer; char mACEPrefix[kACEPrefixLen+1];