mirror of
https://github.com/processwire/processwire.git
synced 2025-08-08 15:57:01 +02:00
Fix issue processwire/processwire-issues#2015
This commit is contained in:
@@ -992,7 +992,14 @@ class Sanitizer extends Wire {
|
|||||||
$_value = $value;
|
$_value = $value;
|
||||||
$parts = explode('__', $_value);
|
$parts = explode('__', $_value);
|
||||||
foreach($parts as $n => $part) {
|
foreach($parts as $n => $part) {
|
||||||
$parts[$n] = $this->punyDecodeName($part);
|
if(strpos($part, "xn-=") === 0) $part = substr($part, 3);
|
||||||
|
if(strpos($part, '=') === 0) {
|
||||||
|
// equals at beginning means keep this part as-is
|
||||||
|
$part = $this->name(substr($part, 1));
|
||||||
|
} else {
|
||||||
|
$part = $this->punyDecodeName($part);
|
||||||
|
}
|
||||||
|
$parts[$n] = $part;
|
||||||
}
|
}
|
||||||
$value = implode('', $parts);
|
$value = implode('', $parts);
|
||||||
return $value;
|
return $value;
|
||||||
@@ -1003,7 +1010,7 @@ class Sanitizer extends Wire {
|
|||||||
if(strpos($value, 'xn--') !== 0) $value = 'xn--' . substr($value, 3);
|
if(strpos($value, 'xn--') !== 0) $value = 'xn--' . substr($value, 3);
|
||||||
if(function_exists('idn_to_utf8')) {
|
if(function_exists('idn_to_utf8')) {
|
||||||
// use native php function if available
|
// use native php function if available
|
||||||
$value = @idn_to_utf8($value);
|
$value = idn_to_utf8($value, 32); // 32=IDNA_NONTRANSITIONAL_TO_UNICODE
|
||||||
} else {
|
} else {
|
||||||
// otherwise use Punycode class
|
// otherwise use Punycode class
|
||||||
$pc = new Punycode();
|
$pc = new Punycode();
|
||||||
@@ -1037,9 +1044,18 @@ class Sanitizer extends Wire {
|
|||||||
while(strlen($_value)) {
|
while(strlen($_value)) {
|
||||||
$part = $tt->substr($_value, 0, 12);
|
$part = $tt->substr($_value, 0, 12);
|
||||||
$_value = $tt->substr($_value, 12);
|
$_value = $tt->substr($_value, 12);
|
||||||
$parts[] = $this->punyEncodeName($part);
|
$part = $this->punyEncodeName($part);
|
||||||
|
if(strpos($part, 'xn-') !== 0) {
|
||||||
|
// if encoding didn't result in an xn- string then
|
||||||
|
// prefix an equals to indicate this part should be taken literally
|
||||||
|
$part = "=$part";
|
||||||
|
}
|
||||||
|
$parts[] = $part;
|
||||||
}
|
}
|
||||||
$value = implode('__', $parts);
|
$value = implode('__', $parts);
|
||||||
|
if(strpos($value, 'xn--') !== false && strpos($value, 'xn-') !== 0) {
|
||||||
|
$value = "xn-$value";
|
||||||
|
}
|
||||||
return $value;
|
return $value;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1047,7 +1063,7 @@ class Sanitizer extends Wire {
|
|||||||
|
|
||||||
if(function_exists("idn_to_ascii")) {
|
if(function_exists("idn_to_ascii")) {
|
||||||
// use native php function if available
|
// use native php function if available
|
||||||
$value = substr(@idn_to_ascii($value), 3);
|
$value = substr(idn_to_ascii($value, 16), 3); // 16=IDNA_NONTRANSITIONAL_TO_ASCII
|
||||||
} else {
|
} else {
|
||||||
// otherwise use Punycode class
|
// otherwise use Punycode class
|
||||||
$pc = new Punycode();
|
$pc = new Punycode();
|
||||||
@@ -1064,6 +1080,10 @@ class Sanitizer extends Wire {
|
|||||||
}
|
}
|
||||||
return $value;
|
return $value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function punycode() {
|
||||||
|
return new Punycode();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Format required by ProcessWire user names
|
* Format required by ProcessWire user names
|
||||||
@@ -2382,7 +2402,7 @@ class Sanitizer extends Wire {
|
|||||||
|
|
||||||
} else {
|
} else {
|
||||||
// domain contains utf8
|
// domain contains utf8
|
||||||
$pc = function_exists("idn_to_ascii") ? false : new Punycode();
|
$pc = function_exists("idn_to_ascii") ? false : $this->punycode();
|
||||||
$domain = $pc ? $pc->encode($domain) : @idn_to_ascii($domain);
|
$domain = $pc ? $pc->encode($domain) : @idn_to_ascii($domain);
|
||||||
if($domain === false || !strlen($domain)) return '';
|
if($domain === false || !strlen($domain)) return '';
|
||||||
$url = $scheme . $domain . $rest;
|
$url = $scheme . $domain . $rest;
|
||||||
|
Reference in New Issue
Block a user