// Qt includes
#include <qapplication.h>
@@ -277,6 +278,9 @@ void KResolverResults::virtual_hook( int
///////////////////////
// class KResolver
+QStringList *KResolver::idnDomains = 0;
+
+
// default constructor
KResolver::KResolver(QObject *parent, const char *name)
: QObject(parent, name), d(new KResolverPrivate(this))
@@ -864,10 +868,21 @@ QStrList KResolver::serviceName(int port
static QStringList splitLabels(const QString& unicodeDomain);
static QCString ToASCII(const QString& label);
static QString ToUnicode(const QString& label);
-
+
+static QStringList *KResolver_initIdnDomains()
+{
+ const char *kde_use_idn = getenv("KDE_USE_IDN");
+ if (!kde_use_idn)
+ kde_use_idn = "at:ch:cn:de:dk:kr:jp:li:no:se:tw";
+ return new QStringList(QStringList::split(':', QString::fromLatin1(kde_use_idn).lower()));
+}
+
// implement the ToAscii function, as described by IDN documents
QCString KResolver::domainToAscii(const QString& unicodeDomain)
{
+ if (!idnDomains)
+ idnDomains = KResolver_initIdnDomains();
+
QCString retval;
// RFC 3490, section 4 describes the operation:
// 1) this is a query, so don't allow unassigned
@@ -876,6 +891,10 @@ QCString KResolver::domainToAscii(const
// separators.
QStringList input = splitLabels(unicodeDomain);
+ // Do we allow IDN names for this TLD?
+ if (input.count() && !idnDomains->contains(input[input.count()-1].lower()))
+ return unicodeDomain.lower().latin1(); // No IDN allowed for this TLD
+
// 3) decide whether to enforce the STD3 rules for chars < 0x7F
// we don't enforce
@@ -907,6 +926,8 @@ QString KResolver::domainToUnicode(const
{
if (asciiDomain.isEmpty())
return asciiDomain;
+ if (!idnDomains)
+ idnDomains = KResolver_initIdnDomains();
+ // Do we allow IDN names for this TLD?
+ if (input.count() && !idnDomains->contains(input[input.count()-1].lower()))
+ return asciiDomain.lower(); // No TLDs allowed
+
// 3) decide whether to enforce the STD3 rules for chars < 0x7F
// we don't enforce