diff --git a/lib/Froxlor/Api/Commands/DirOptions.php b/lib/Froxlor/Api/Commands/DirOptions.php
index c39507ec40..96a892658a 100644
--- a/lib/Froxlor/Api/Commands/DirOptions.php
+++ b/lib/Froxlor/Api/Commands/DirOptions.php
@@ -157,16 +157,15 @@ public function add()
* this functions validates a given value as ErrorDocument
* refs #267
*
- * @param
- * string error-document-string
+ * @param string $errdoc
* @param bool $throw_exception
*
* @return string error-document-string
*
*/
- private function correctErrorDocument($errdoc = null, $throw_exception = false)
+ private function correctErrorDocument(string $errdoc, $throw_exception = false)
{
- if ($errdoc !== null && $errdoc != '') {
+ if (trim($errdoc) != '') {
// not a URL
if ((strtoupper(substr($errdoc, 0, 5)) != 'HTTP:' && strtoupper(substr($errdoc, 0, 6)) != 'HTTPS:') || !Validate::validateUrl($errdoc)) {
// a file
@@ -176,14 +175,14 @@ private function correctErrorDocument($errdoc = null, $throw_exception = false)
if (!substr($errdoc, 0, 1) == '/') {
$errdoc = '/' . $errdoc;
}
- } else {
+ } elseif (preg_match('/^"([^\r\n\t\f\0"]+)"$/', $errdoc)) {
// a string (check for ending ")
// string won't work for lighty
if (Settings::Get('system.webserver') == 'lighttpd') {
Response::standardError('stringerrordocumentnotvalidforlighty', '', $throw_exception);
- } elseif (substr($errdoc, -1) != '"') {
- $errdoc .= '"';
}
+ } else {
+ Response::standardError('invaliderrordocumentvalue', '', $throw_exception);
}
} else {
if (Settings::Get('system.webserver') == 'lighttpd') {
@@ -191,7 +190,7 @@ private function correctErrorDocument($errdoc = null, $throw_exception = false)
}
}
}
- return $errdoc;
+ return trim($errdoc);
}
/**
diff --git a/lib/Froxlor/FileDir.php b/lib/Froxlor/FileDir.php
index 49c649c1bb..37f2af2c9e 100644
--- a/lib/Froxlor/FileDir.php
+++ b/lib/Froxlor/FileDir.php
@@ -147,9 +147,9 @@ public static function makeCorrectDir($dir)
*/
public static function makeSecurePath($path)
{
- // check for bad characters, some are allowed with escaping
+ // check for bad characters, some are allowed with escaping,
// but we generally don't want them in our directory-names,
- // thx to aaronmueller for this snipped
+ // thx to aaronmueller for this snippet
$badchars = [
':',
';',
@@ -161,7 +161,11 @@ public static function makeSecurePath($path)
'$',
'~',
'?',
- "\0"
+ "\0",
+ "\n",
+ "\r",
+ "\t",
+ "\f"
];
foreach ($badchars as $bc) {
$path = str_replace($bc, "", $path);
@@ -606,7 +610,7 @@ public static function removeImmutable(string $filename)
}
/**
- *
+ *
* @return array|false
*/
public static function getFilesystemQuota()
diff --git a/lng/de.lng.php b/lng/de.lng.php
index f5ebea66b9..5e5a0a61ba 100644
--- a/lng/de.lng.php
+++ b/lng/de.lng.php
@@ -837,6 +837,7 @@
'notrequiredpasswordcomplexity' => 'Die vorgegebene Passwort-Komplexität wurde nicht erfüllt.
Bitte kontaktieren Sie Ihren Administrator, wenn Sie Fragen zur Komplexitäts-Vorgabe haben.',
'stringerrordocumentnotvalidforlighty' => 'Ein Text als Fehlerdokument funktioniert leider in LigHTTPd nicht, bitte geben Sie einen Pfad zu einer Datei an',
'urlerrordocumentnotvalidforlighty' => 'Eine URL als Fehlerdokument funktioniert leider in LigHTTPd nicht, bitte geben Sie einen Pfad zu einer Datei an',
+ 'invaliderrordocumentvalue' => 'Der angegebene Wert für das Fehlederdokument ist keine gültige Datei, URL oder Text-Zeile.',
'intvaluetoolow' => 'Die angegebene Zahl ist zu klein (Feld "%s")',
'intvaluetoohigh' => 'Die angegebene Zahl ist zu groß (Feld "%s")',
'phpfpmstillenabled' => 'PHP-FPM ist derzeit aktiviert. Bitte deaktivieren Sie es, um FCGID zu aktivieren',
diff --git a/lng/en.lng.php b/lng/en.lng.php
index 69cdf753f4..400da4b52d 100644
--- a/lng/en.lng.php
+++ b/lng/en.lng.php
@@ -905,6 +905,7 @@
'notrequiredpasswordcomplexity' => 'The specified password-complexity was not satisfied.
Please contact your administrator if you have any questions about the complexity-specification',
'stringerrordocumentnotvalidforlighty' => 'A string as ErrorDocument does not work in lighttpd, please specify a path to a file',
'urlerrordocumentnotvalidforlighty' => 'An URL as ErrorDocument does not work in lighttpd, please specify a path to a file',
+ 'invaliderrordocumentvalue' => 'The value given as ErrorDocument does not seem to be a valid file, URL or string.',
'intvaluetoolow' => 'The given number is too low (field %s)',
'intvaluetoohigh' => 'The given number is too high (field %s)',
'phpfpmstillenabled' => 'PHP-FPM is currently active. Please deactivate it before activating FCGID',
diff --git a/tests/Extras/DirOptionsTest.php b/tests/Extras/DirOptionsTest.php
index ec2a3f0b38..a33c9b8e64 100644
--- a/tests/Extras/DirOptionsTest.php
+++ b/tests/Extras/DirOptionsTest.php
@@ -191,4 +191,49 @@ public function testCustomerDirOptionsDelete()
$this->expectExceptionMessage("Directory option with id #1 could not be found");
DirOptions::getLocal($admin_userdata, $data)->get();
}
+
+ public function testCustomerDirOptionsAddMalformed()
+ {
+ global $admin_userdata;
+
+ // get customer
+ $json_result = Customers::getLocal($admin_userdata, array(
+ 'loginname' => 'test1'
+ ))->get();
+ $customer_userdata = json_decode($json_result, true)['data'];
+
+ $data = [
+ 'path' => '/testmalformed',
+ 'error404path' => '/"'.PHP_EOL.'something/../../../../weird 404.html'.PHP_EOL.'#'
+ ];
+ $json_result = DirOptions::getLocal($customer_userdata, $data)->add();
+ $result = json_decode($json_result, true)['data'];
+ $expected = '/"something/././././weird\ 404.html#';
+ $this->assertEquals($expected, $result['error404path']);
+ }
+
+ public function testCustomerDirOptionsAddMalformedInvalid()
+ {
+ global $admin_userdata;
+
+ // get customer
+ $json_result = Customers::getLocal($admin_userdata, array(
+ 'loginname' => 'test1'
+ ))->get();
+ $customer_userdata = json_decode($json_result, true)['data'];
+
+ $data = [
+ 'path' => '/testmalformed',
+ 'error404path' => '"'.PHP_EOL.'IncludeOptional /something/else/'.PHP_EOL.'#'
+ ];
+ $this->expectExceptionMessage("The value given as ErrorDocument does not seem to be a valid file, URL or string.");
+ DirOptions::getLocal($customer_userdata, $data)->add();
+
+ $data = [
+ 'path' => '/testmalformed',
+ 'error404path' => '"something"oh no a quote within the string"'
+ ];
+ $this->expectExceptionMessage("The value given as ErrorDocument does not seem to be a valid file, URL or string.");
+ DirOptions::getLocal($customer_userdata, $data)->add();
+ }
}