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(); + } }