Merge pull request #1665 from nextcloud/speed-up-is-subdirectory-test

Simplify isSubDirectory check
This commit is contained in:
Morris Jobke 2016-10-09 23:36:42 +02:00 committed by GitHub
commit 38104241a2
3 changed files with 26 additions and 43 deletions

View file

@ -2,6 +2,7 @@
/**
* @copyright Copyright (c) 2016, ownCloud, Inc.
* @copyright 2016 Roeland Jago Douma <roeland@famdouma.nl>
* @copyright 2016 Lukas Reschke <lukas@statuscode.ch>
*
* @author Bart Visscher <bartv@thisnet.nl>
* @author Joas Schilling <coding@schilljs.com>
@ -287,6 +288,27 @@ class Factory implements IFactory {
return $requestLanguage;
}
/**
* Checks if $sub is a subdirectory of $parent
*
* @param string $sub
* @param string $parent
* @return bool
*/
private function isSubDirectory($sub, $parent) {
// Check whether $sub contains no ".."
if(strpos($sub, '..') !== false) {
return false;
}
// Check whether $sub is a subdirectory of $parent
if (strpos($sub, $parent) === 0) {
return true;
}
return false;
}
/**
* Get a list of language files that should be loaded
*
@ -302,10 +324,10 @@ class Factory implements IFactory {
$i18nDir = $this->findL10nDir($app);
$transFile = strip_tags($i18nDir) . strip_tags($lang) . '.json';
if ((\OC_Helper::isSubDirectory($transFile, $this->serverRoot . '/core/l10n/')
|| \OC_Helper::isSubDirectory($transFile, $this->serverRoot . '/lib/l10n/')
|| \OC_Helper::isSubDirectory($transFile, $this->serverRoot . '/settings/l10n/')
|| \OC_Helper::isSubDirectory($transFile, \OC_App::getAppPath($app) . '/l10n/')
if (($this->isSubDirectory($transFile, $this->serverRoot . '/core/l10n/')
|| $this->isSubDirectory($transFile, $this->serverRoot . '/lib/l10n/')
|| $this->isSubDirectory($transFile, $this->serverRoot . '/settings/l10n/')
|| $this->isSubDirectory($transFile, \OC_App::getAppPath($app) . '/l10n/')
)
&& file_exists($transFile)) {
// load the translations file

View file

@ -377,32 +377,6 @@ class OC_Helper {
return $newpath;
}
/**
* Checks if $sub is a subdirectory of $parent
*
* @param string $sub
* @param string $parent
* @return bool
*/
public static function isSubDirectory($sub, $parent) {
$realpathSub = realpath($sub);
$realpathParent = realpath($parent);
// realpath() may return false in case the directory does not exist
// since we can not be sure how different PHP versions may behave here
// we do an additional check whether realpath returned false
if($realpathSub === false || $realpathParent === false) {
return false;
}
// Check whether $sub is a subdirectory of $parent
if (strpos($realpathSub, $realpathParent) === 0) {
return true;
}
return false;
}
/**
* Returns an array with all keys from input lowercased or uppercased. Numbered indices are left as is.
*

View file

@ -76,19 +76,6 @@ class LegacyHelperTest extends \Test\TestCase {
];
}
function testIsSubDirectory() {
$result = OC_Helper::isSubDirectory("./data/", "/anotherDirectory/");
$this->assertFalse($result);
$result = OC_Helper::isSubDirectory("./data/", "./data/");
$this->assertTrue($result);
mkdir("data/TestSubdirectory", 0777);
$result = OC_Helper::isSubDirectory("data/TestSubdirectory/", "data");
rmdir("data/TestSubdirectory");
$this->assertTrue($result);
}
function testMb_array_change_key_case() {
$arrayStart = array(
"Foo" => "bar",