diff --git a/lib/Froxlor/Api/Commands/Domains.php b/lib/Froxlor/Api/Commands/Domains.php index a65c29a6..a0e5efde 100644 --- a/lib/Froxlor/Api/Commands/Domains.php +++ b/lib/Froxlor/Api/Commands/Domains.php @@ -595,12 +595,20 @@ class Domains extends ApiCommand implements ResourceEntity $ssl_redirect = 2; } - if (!preg_match('/^https?\:\/\//', $documentroot)) { - if (strstr($documentroot, ":") !== false) { + // Check if given documentroot is either a valid URL or a valid path + if (preg_match('/^https?\:\/\//', $documentroot)) { + $encoded = $idna_convert->encode($documentroot); + if (!Validate::validateUrl($encoded, true)) { + Response::standardError('invaliddocumentrooturl', '', true); + } + $documentroot = $encoded; + } else { + if (strpos($documentroot, ':') !== false) { Response::standardError('pathmaynotcontaincolon', '', true); } else { $documentroot = FileDir::makeCorrectDir($documentroot); } + $documentroot = FileDir::makeCorrectDir($documentroot); } $domain_check_stmt = Database::prepare(" @@ -1414,8 +1422,18 @@ class Domains extends ApiCommand implements ResourceEntity } } - if (!preg_match('/^https?\:\/\//', $documentroot) && strstr($documentroot, ":") !== false) { - Response::standardError('pathmaynotcontaincolon', '', true); + $idna_convert = new IdnaWrapper(); + if (preg_match('/^https?\:\/\//', $documentroot)) { + $encoded = $idna_convert->encode($documentroot); + if (!Validate::validateUrl($encoded, true)) { + Response::standardError('invaliddocumentrooturl', '', true); + } + $documentroot = $encoded; + } else { + if (strpos($documentroot, ':') !== false) { + Response::standardError('pathmaynotcontaincolon', '', true); + } + $documentroot = FileDir::makeCorrectDir($documentroot); } if ($this->getUserDetail('change_serversettings') == '1') { @@ -2099,7 +2117,6 @@ class Domains extends ApiCommand implements ResourceEntity } } - $idna_convert = new IdnaWrapper(); $this->logger()->logAction(FroxlorLogger::ADM_ACTION, LOG_WARNING, "[API] updated domain '" . $idna_convert->decode($result['domain']) . "'"); $result = $this->apiCall('Domains.get', [ 'domainname' => $result['domain'] diff --git a/lib/Froxlor/Api/Commands/SubDomains.php b/lib/Froxlor/Api/Commands/SubDomains.php index 76342d2a..518085fb 100644 --- a/lib/Froxlor/Api/Commands/SubDomains.php +++ b/lib/Froxlor/Api/Commands/SubDomains.php @@ -549,32 +549,33 @@ class SubDomains extends ApiCommand implements ResourceEntity */ private function validateDomainDocumentRoot($path = null, $url = null, $customer = null, $completedomain = null, &$_doredirect = false) { - // check whether an URL was specified $_doredirect = false; - if (!empty($url) && Validate::validateUrl($url, true)) { - $path = $url; + $idna = new IdnaWrapper(); + + // url mode: either $url or $path begins with http:// or https:// + $maybeUrl = !empty($url) ? $url : (preg_match('/^https?\:\/\//', $path) ? $path : ''); + if ($maybeUrl !== '') { + $encoded = $idna->encode($maybeUrl); + if (!Validate::validateUrl($encoded, true)) { + Response::standardError('invaliddocumentrooturl', '', true); + } $_doredirect = true; - } else { - $path = Validate::validate($path, 'path', '', '', [], true); + return $encoded; } - // check whether path is a real path - if (!preg_match('/^https?\:\/\//', $path) || !Validate::validateUrl($path, true)) { - if (strstr($path, ":") !== false) { - Response::standardError('pathmaynotcontaincolon', '', true); - } - // If path is empty or '/' and 'Use domain name as default value for DocumentRoot path' is enabled in settings, - // set default path to subdomain or domain name - if ((($path == '') || ($path == '/')) && Settings::Get('system.documentroot_use_default_value') == 1) { - $path = FileDir::makeCorrectDir($customer['documentroot'] . '/' . $completedomain, $customer['documentroot']); - } else { - $path = FileDir::makeCorrectDir($customer['documentroot'] . '/' . $path, $customer['documentroot']); - } - } else { - // no it's not, create a redirect - $_doredirect = true; + // path mode: regular directory path + $path = Validate::validate($path, 'path', Validate::REGEX_DIR, '', [], true); + + // default path if empty and setting active + if (($path === '' || $path === '/') && Settings::Get('system.documentroot_use_default_value') == 1) { + return FileDir::makeCorrectDir($customer['documentroot'] . '/' . $completedomain, $customer['documentroot']); } - return $path; + // check if path does not contain a colon + if (strpos($path, ':') !== false) { + Response::standardError('pathmaynotcontaincolon', '', true); + } + + return FileDir::makeCorrectDir($customer['documentroot'] . '/' . $path, $customer['documentroot']); } /** diff --git a/lng/de.lng.php b/lng/de.lng.php index d1bc4f98..55306156 100644 --- a/lng/de.lng.php +++ b/lng/de.lng.php @@ -878,6 +878,7 @@ return [ 'plausibilitychecknotunderstood' => 'Die Antwort des Plausibilitätschecks wurde nicht verstanden', 'errorwhensaving' => 'Bei dem Speichern des Feldes "%s" trat ein Fehler auf', 'pathmaynotcontaincolon' => 'Der eingegebene Pfad sollte keinen Doppelpunkt (":") enthalten. Bitte geben Sie einen korrekten Wert für den Pfad ein.', + 'invaliddocumentrooturl' => 'Die URL, die Sie für den Pfad eingegeben haben, ist ungültig. Bitte geben Sie eine korrekte URL oder einen Unix-Pfad ein.', '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', diff --git a/lng/en.lng.php b/lng/en.lng.php index 96513d0f..e79abef9 100644 --- a/lng/en.lng.php +++ b/lng/en.lng.php @@ -951,6 +951,7 @@ return [ 'notrequiredpasswordlength' => 'The given password is too short. Please enter at least %s characters.', 'overviewsettingoptionisnotavalidfield' => 'Whoops, a field that should be displayed as an option in the settings-overview is not an excepted type. You can blame the developers for this. This should not happen!', 'pathmaynotcontaincolon' => 'The path you have entered should not contain a colon (":"). Please enter a correct path value.', + 'invaliddocumentrooturl' => 'The URL you have entered for the documentroot is not valid. Please enter a correct URL or a unix-path.', 'exception' => '%s', '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',