diff options
Diffstat (limited to 'lib/private')
-rw-r--r-- | lib/private/Installer.php | 45 | ||||
-rw-r--r-- | lib/private/legacy/OC_Helper.php | 108 |
2 files changed, 47 insertions, 106 deletions
diff --git a/lib/private/Installer.php b/lib/private/Installer.php index a1d27c9255b..f32b0e5919a 100644 --- a/lib/private/Installer.php +++ b/lib/private/Installer.php @@ -16,8 +16,8 @@ use OC\AppFramework\Bootstrap\Coordinator; use OC\Archive\TAR; use OC\DB\Connection; use OC\DB\MigrationService; +use OC\Files\FilenameValidator; use OC_App; -use OC_Helper; use OCP\App\IAppManager; use OCP\Files; use OCP\HintException; @@ -25,6 +25,7 @@ use OCP\Http\Client\IClientService; use OCP\IConfig; use OCP\ITempManager; use OCP\Migration\IOutput; +use OCP\Server; use phpseclib\File\X509; use Psr\Log\LoggerInterface; @@ -242,6 +243,10 @@ class Installer { // Download the release $tempFile = $this->tempManager->getTemporaryFile('.tar.gz'); + if ($tempFile === false) { + throw new \RuntimeException('Could not create temporary file for downloading app archive.'); + } + $timeout = $this->isCLI ? 0 : 120; $client = $this->clientService->newClient(); $client->get($app['releases'][0]['download'], ['sink' => $tempFile, 'timeout' => $timeout]); @@ -253,8 +258,11 @@ class Installer { if ($verified === true) { // Seems to match, let's proceed $extractDir = $this->tempManager->getTemporaryFolder(); - $archive = new TAR($tempFile); + if ($extractDir === false) { + throw new \RuntimeException('Could not create temporary directory for unpacking app.'); + } + $archive = new TAR($tempFile); if (!$archive->extract($extractDir)) { $errorMessage = 'Could not extract app ' . $appId; @@ -329,9 +337,9 @@ class Installer { // Move to app folder if (@mkdir($baseDir)) { $extractDir .= '/' . $folders[0]; - OC_Helper::copyr($extractDir, $baseDir); } - OC_Helper::copyr($extractDir, $baseDir); + // otherwise we just copy the outer directory + $this->copyRecursive($extractDir, $baseDir); Files::rmdirr($extractDir); return; } @@ -588,4 +596,33 @@ class Installer { include $script; } } + + /** + * Recursive copying of local folders. + * + * @param string $src source folder + * @param string $dest target folder + */ + private function copyRecursive(string $src, string $dest): void { + if (!file_exists($src)) { + return; + } + + if (is_dir($src)) { + if (!is_dir($dest)) { + mkdir($dest); + } + $files = scandir($src); + foreach ($files as $file) { + if ($file != '.' && $file != '..') { + $this->copyRecursive("$src/$file", "$dest/$file"); + } + } + } else { + $validator = Server::get(FilenameValidator::class); + if (!$validator->isForbidden($src)) { + copy($src, $dest); + } + } + } } diff --git a/lib/private/legacy/OC_Helper.php b/lib/private/legacy/OC_Helper.php index 3717dc75cbc..a06b15573cb 100644 --- a/lib/private/legacy/OC_Helper.php +++ b/lib/private/legacy/OC_Helper.php @@ -12,6 +12,7 @@ use OCP\Files\Mount\IMountPoint; use OCP\IBinaryFinder; use OCP\ICacheFactory; use OCP\IUser; +use OCP\Server; use OCP\Util; use Psr\Log\LoggerInterface; @@ -36,36 +37,11 @@ class OC_Helper { private static ?bool $quotaIncludeExternalStorage = null; /** - * Make a human file size - * @param int|float $bytes file size in bytes - * @return string a human readable file size - * @deprecated 4.0.0 replaced with \OCP\Util::humanFileSize - * - * Makes 2048 to 2 kB. - */ - public static function humanFileSize(int|float $bytes): string { - return \OCP\Util::humanFileSize($bytes); - } - - /** - * Make a computer file size - * @param string $str file size in human readable format - * @return false|int|float a file size in bytes - * @deprecated 4.0.0 Use \OCP\Util::computerFileSize - * - * Makes 2kB to 2048. - * - * Inspired by: https://www.php.net/manual/en/function.filesize.php#92418 - */ - public static function computerFileSize(string $str): false|int|float { - return \OCP\Util::computerFileSize($str); - } - - /** * Recursive copying of folders * @param string $src source folder * @param string $dest target folder * @return void + * @deprecated 32.0.0 - use \OCP\Files\Folder::copy */ public static function copyr($src, $dest) { if (!file_exists($src)) { @@ -91,17 +67,6 @@ class OC_Helper { } /** - * Recursive deletion of folders - * @param string $dir path to the folder - * @param bool $deleteSelf if set to false only the content of the folder will be deleted - * @return bool - * @deprecated 5.0.0 use \OCP\Files::rmdirr instead - */ - public static function rmdirr($dir, $deleteSelf = true) { - return \OCP\Files::rmdirr($dir, $deleteSelf); - } - - /** * @deprecated 18.0.0 * @return \OC\Files\Type\TemplateManager */ @@ -131,7 +96,7 @@ class OC_Helper { $exts = ['']; $check_fn = 'is_executable'; // Default check will be done with $path directories : - $dirs = explode(PATH_SEPARATOR, $path); + $dirs = explode(PATH_SEPARATOR, (string)$path); // WARNING : We have to check if open_basedir is enabled : $obd = OC::$server->get(IniGetWrapper::class)->getString('open_basedir'); if ($obd != 'none') { @@ -224,73 +189,12 @@ class OC_Helper { } /** - * Returns an array with all keys from input lowercased or uppercased. Numbered indices are left as is. - * Based on https://www.php.net/manual/en/function.array-change-key-case.php#107715 - * - * @param array $input The array to work on - * @param int $case Either MB_CASE_UPPER or MB_CASE_LOWER (default) - * @param string $encoding The encoding parameter is the character encoding. Defaults to UTF-8 - * @return array - * @deprecated 4.5.0 use \OCP\Util::mb_array_change_key_case instead - */ - public static function mb_array_change_key_case($input, $case = MB_CASE_LOWER, $encoding = 'UTF-8') { - return \OCP\Util::mb_array_change_key_case($input, $case, $encoding); - } - - /** - * Performs a search in a nested array. - * Taken from https://www.php.net/manual/en/function.array-search.php#97645 - * - * @param array $haystack the array to be searched - * @param string $needle the search string - * @param mixed $index optional, only search this key name - * @return mixed the key of the matching field, otherwise false - * @deprecated 4.5.0 - use \OCP\Util::recursiveArraySearch - */ - public static function recursiveArraySearch($haystack, $needle, $index = null) { - return \OCP\Util::recursiveArraySearch($haystack, $needle, $index); - } - - /** - * calculates the maximum upload size respecting system settings, free space and user quota - * - * @param string $dir the current folder where the user currently operates - * @param int|float $freeSpace the number of bytes free on the storage holding $dir, if not set this will be received from the storage directly - * @return int|float number of bytes representing - * @deprecated 5.0.0 - use \OCP\Util::maxUploadFilesize - */ - public static function maxUploadFilesize($dir, $freeSpace = null) { - return \OCP\Util::maxUploadFilesize($dir, $freeSpace); - } - - /** - * Calculate free space left within user quota - * - * @param string $dir the current folder where the user currently operates - * @return int|float number of bytes representing - * @deprecated 7.0.0 - use \OCP\Util::freeSpace - */ - public static function freeSpace($dir) { - return \OCP\Util::freeSpace($dir); - } - - /** - * Calculate PHP upload limit - * - * @return int|float PHP upload file size limit - * @deprecated 7.0.0 - use \OCP\Util::uploadLimit - */ - public static function uploadLimit() { - return \OCP\Util::uploadLimit(); - } - - /** * Checks if a function is available * * @deprecated 25.0.0 use \OCP\Util::isFunctionEnabled instead */ public static function is_function_enabled(string $function_name): bool { - return \OCP\Util::isFunctionEnabled($function_name); + return Util::isFunctionEnabled($function_name); } /** @@ -298,7 +202,7 @@ class OC_Helper { * @deprecated 25.0.0 Use \OC\BinaryFinder directly */ public static function findBinaryPath(string $program): ?string { - $result = \OCP\Server::get(IBinaryFinder::class)->findBinaryPath($program); + $result = Server::get(IBinaryFinder::class)->findBinaryPath($program); return $result !== false ? $result : null; } @@ -318,7 +222,7 @@ class OC_Helper { */ public static function getStorageInfo($path, $rootInfo = null, $includeMountPoints = true, $useCache = true) { if (!self::$cacheFactory) { - self::$cacheFactory = \OC::$server->get(ICacheFactory::class); + self::$cacheFactory = Server::get(ICacheFactory::class); } $memcache = self::$cacheFactory->createLocal('storage_info'); |