예제 #1
0
파일: archive.php 프로젝트: evanjt/core
 public function testRecursive()
 {
     $dir = OC::$SERVERROOT . '/tests/data';
     $this->instance = $this->getNew();
     $this->instance->addRecursive('/dir', $dir);
     $this->assertTrue($this->instance->fileExists('/dir/lorem.txt'));
     $this->assertTrue($this->instance->fileExists('/dir/data.zip'));
     $this->assertTrue($this->instance->fileExists('/dir/data.tar.gz'));
 }
예제 #2
0
 public static function getPackage($url, $version)
 {
     self::$package = App::getBackupBase() . $version;
     if (preg_match('/\\.zip$/i', $url)) {
         $type = '.zip';
     } elseif (preg_match('/(\\.tgz|\\.tar\\.gz)$/i', $url)) {
         $type = '.tgz';
     } elseif (preg_match('/\\.tar\\.bz2$/i', $url)) {
         $type = '.tar.bz2';
     } else {
         throw new \Exception('Unable to extract package ' . $url . ': unknown format');
     }
     self::$package = self::$package . $type;
     try {
         // Reuse already downloaded package
         if (!file_exists(self::$package)) {
             if (self::fetch($url) === false) {
                 throw new \Exception("Error storing package content");
             }
             App::log('Downloaded ' . filesize(self::$package) . ' bytes.', \OCP\Util::DEBUG);
         } else {
             App::log('Use already downloaded package ' . self::$package . '. Size is ' . filesize(self::$package) . ' bytes.', \OCP\Util::DEBUG);
         }
         $extractDir = self::getPackageDir($version);
         Helper::mkdir($extractDir, true);
         $archive = \OC_Archive::open(self::$package);
         if (!$archive || !$archive->extract($extractDir)) {
             throw new \Exception(self::$package . " extraction error");
         }
     } catch (\Exception $e) {
         App::log('Retrieving ' . $url);
         self::cleanUp($version);
         throw $e;
     }
     //  Prepare extracted data
     //  to have '3rdparty', 'apps' and 'core' subdirectories
     $baseDir = $extractDir . '/' . self::PACKAGE_ROOT;
     if (!file_exists($baseDir)) {
         App::log('Expected fresh sources in ' . $baseDir . '. Nothing is found. Something is wrong with OC_Archive.');
         App::log($extractDir . ' content: ' . implode(' ', scandir($extractDir)));
         if ($type === '.zip' && !extension_loaded('zip')) {
             $hint = App::$l10n->t('Please ask your server administrator to enable PHP zip extension.');
         }
         throw new \Exception(self::$package . " extraction error. " . $hint);
     }
     include $baseDir . '/version.php';
     Helper::checkVersion($OC_Version, $OC_VersionString);
     $sources = Helper::getSources($version);
     rename($baseDir . '/' . Helper::THIRDPARTY_DIRNAME, $sources[Helper::THIRDPARTY_DIRNAME]);
     rename($baseDir . '/' . Helper::APP_DIRNAME, $sources[Helper::APP_DIRNAME]);
     rename($baseDir, $sources[Helper::CORE_DIRNAME]);
 }
예제 #3
0
 public static function getPackage($url, $version)
 {
     self::$package = \OC_Helper::tmpFile();
     if (!self::$package) {
         throw new \Exception('Unable to create a temporary file');
     }
     try {
         if (file_put_contents(self::$package, self::fetch($url)) === false) {
             throw new \Exception("Error storing package content");
         }
         if (preg_match('/\\.zip$/i', $url)) {
             rename(self::$package, self::$package . '.zip');
             self::$package .= '.zip';
         } elseif (preg_match('/(\\.tgz|\\.tar\\.gz)$/i', $url)) {
             rename(self::$package, self::$package . '.tgz');
             self::$package .= '.tgz';
         } elseif (preg_match('/\\.tar\\.bz2$/i', $url)) {
             rename(self::$package, self::$package . '.tar.bz2');
             self::$package .= '.tar.bz2';
         } else {
             throw new \Exception('Unable to extract package');
         }
         $extractDir = self::getPackageDir($version);
         Helper::mkdir($extractDir, true);
         $archive = \OC_Archive::open(self::$package);
         if (!$archive || !$archive->extract($extractDir)) {
             throw new \Exception(self::$package . " extraction error");
         }
     } catch (\Exception $e) {
         App::log('Retrieving ' . $url);
         self::cleanUp($version);
         throw $e;
     }
     Helper::removeIfExists(self::$package);
     //  Prepare extracted data
     //  to have '3rdparty', 'apps' and 'core' subdirectories
     $sources = Helper::getSources($version);
     $baseDir = $extractDir . '/' . self::PACKAGE_ROOT;
     @rename($baseDir . '/' . Helper::THIRDPARTY_DIRNAME, $sources[Helper::THIRDPARTY_DIRNAME]);
     @rename($baseDir . '/' . Helper::APP_DIRNAME, $sources[Helper::APP_DIRNAME]);
     @rename($baseDir, $sources[Helper::CORE_DIRNAME]);
 }
예제 #4
0
 public static function getPackage($url, $version)
 {
     self::$package = \OC_Helper::tmpFile();
     try {
         if (!copy($url, self::$package)) {
             throw new \Exception("Failed to download {$url} package");
         }
         if (preg_match('/\\.zip$/i', $url)) {
             rename(self::$package, self::$package . '.zip');
             self::$package .= '.zip';
         } elseif (preg_match('/(\\.tgz|\\.tar\\.gz)$/i', $url)) {
             rename(self::$package, self::$package . '.tgz');
             self::$package .= '.tgz';
         } elseif (preg_match('/\\.tar\\.bz2$/i', $url)) {
             rename(self::$package, self::$package . '.tar.bz2');
             self::$package .= '.tar.bz2';
         } else {
             throw new \Exception('Unable to extract package');
         }
         $extractDir = self::getPackageDir($version);
         Helper::mkdir($extractDir, true);
         $archive = \OC_Archive::open(self::$package);
         if ($archive) {
             $archive->extract($extractDir);
         } else {
             throw new \Exception(self::$package . " extraction error");
         }
     } catch (\Exception $e) {
         self::cleanUp($version);
         throw $e;
     }
     Helper::removeIfExists(self::$package);
     //  Prepare extracted data
     //  to have '3rdparty', 'apps' and 'core' subdirectories
     $sources = Helper::getSources($version);
     $baseDir = $extractDir . '/' . self::PACKAGE_ROOT;
     @rename($baseDir . '/' . Helper::THIRDPARTY_DIRNAME, $sources[Helper::THIRDPARTY_DIRNAME]);
     @rename($baseDir . '/' . Helper::APP_DIRNAME, $sources[Helper::APP_DIRNAME]);
     @rename($baseDir, $sources[Helper::CORE_DIRNAME]);
 }
예제 #5
0
 public static function getPackage($url, $version)
 {
     $path = \OC_Helper::tmpFile();
     if (!copy($url, $path)) {
         \OC_Log::write(App::APP_ID, "Failed to download {$url} package to {$path}", \OC_Log::ERROR);
         return false;
     }
     //Mimetype bug workaround
     $mime = rtrim(\OC_Helper::getMimeType($path), ';');
     if ($mime == 'application/zip') {
         rename($path, $path . '.zip');
         $path .= '.zip';
     } elseif ($mime == 'application/x-gzip') {
         rename($path, $path . '.tgz');
         $path .= '.tgz';
     } elseif ($mime == 'application/x-bzip2') {
         rename($path, $path . '.tar.bz2');
         $path .= '.tar.bz2';
     } else {
         \OC_Log::write(App::APP_ID, 'Archives of type ' . $mime . ' are not supported', \OC_Log::ERROR);
         return false;
     }
     $extractDir = self::getPackageDir($version);
     if (!mkdir($extractDir, 0777, true)) {
         \OC_Log::write(App::APP_ID, 'Unable to create temporary directory', \OC_Log::ERROR);
         return false;
     }
     $archive = \OC_Archive::open($path);
     if ($archive) {
         $archive->extract($extractDir);
     } else {
         \OC_Log::write(App::APP_ID, "Failed to open package {$path}", \OC_Log::ERROR);
         \OC_Helper::rmdirr($extractDir);
         @unlink($path);
         return false;
     }
     return $extractDir . DIRECTORY_SEPARATOR . self::PACKAGE_ROOT;
 }
예제 #6
0
 /**
  * @param array $data
  * @return array
  * @throws Exception
  */
 public static function downloadApp($data = array())
 {
     $l = \OC::$server->getL10N('lib');
     if (!isset($data['source'])) {
         throw new \Exception($l->t("No source specified when installing app"));
     }
     //download the file if necessary
     if ($data['source'] == 'http') {
         $pathInfo = pathinfo($data['href']);
         $path = OC_Helper::tmpFile('.' . $pathInfo['extension']);
         if (!isset($data['href'])) {
             throw new \Exception($l->t("No href specified when installing app from http"));
         }
         copy($data['href'], $path);
     } else {
         if (!isset($data['path'])) {
             throw new \Exception($l->t("No path specified when installing app from local file"));
         }
         $path = $data['path'];
     }
     //detect the archive type
     $mime = OC_Helper::getMimeType($path);
     if ($mime !== 'application/zip' && $mime !== 'application/x-gzip') {
         throw new \Exception($l->t("Archives of type %s are not supported", array($mime)));
     }
     //extract the archive in a temporary folder
     $extractDir = OC_Helper::tmpFolder();
     OC_Helper::rmdirr($extractDir);
     mkdir($extractDir);
     if ($archive = OC_Archive::open($path)) {
         $archive->extract($extractDir);
     } else {
         OC_Helper::rmdirr($extractDir);
         if ($data['source'] == 'http') {
             unlink($path);
         }
         throw new \Exception($l->t("Failed to open archive when installing app"));
     }
     return array($extractDir, $path);
 }
예제 #7
0
파일: storage.php 프로젝트: anolisti/apps
 public function rename($path1, $path2)
 {
     return $this->archive->rename($path1, $path2);
 }
예제 #8
0
 /**
  * @brief Installs an app
  * @param $data array with all information
  * @returns integer
  *
  * This function installs an app. All information needed are passed in the
  * associative array $data.
  * The following keys are required:
  *   - source: string, can be "path" or "http"
  *
  * One of the following keys is required:
  *   - path: path to the file containing the app
  *   - href: link to the downloadable file containing the app
  *
  * The following keys are optional:
  *   - pretend: boolean, if set true the system won't do anything
  *   - noinstall: boolean, if true appinfo/install.php won't be loaded
  *   - inactive: boolean, if set true the appconfig/app.sample.php won't be
  *     renamed
  *
  * This function works as follows
  *   -# fetching the file
  *   -# unzipping it
  *   -# check the code
  *   -# installing the database at appinfo/database.xml
  *   -# including appinfo/install.php
  *   -# setting the installed version
  *
  * It is the task of oc_app_install to create the tables and do whatever is
  * needed to get the app working.
  */
 public static function installApp($data = array())
 {
     if (!isset($data['source'])) {
         OC_Log::write('core', 'No source specified when installing app', OC_Log::ERROR);
         return false;
     }
     //download the file if necesary
     if ($data['source'] == 'http') {
         $path = OC_Helper::tmpFile();
         if (!isset($data['href'])) {
             OC_Log::write('core', 'No href specified when installing app from http', OC_Log::ERROR);
             return false;
         }
         copy($data['href'], $path);
     } else {
         if (!isset($data['path'])) {
             OC_Log::write('core', 'No path specified when installing app from local file', OC_Log::ERROR);
             return false;
         }
         $path = $data['path'];
     }
     //detect the archive type
     $mime = OC_Helper::getMimeType($path);
     if ($mime == 'application/zip') {
         rename($path, $path . '.zip');
         $path .= '.zip';
     } elseif ($mime == 'application/x-gzip') {
         rename($path, $path . '.tgz');
         $path .= '.tgz';
     } else {
         OC_Log::write('core', 'Archives of type ' . $mime . ' are not supported', OC_Log::ERROR);
         return false;
     }
     //extract the archive in a temporary folder
     $extractDir = OC_Helper::tmpFolder();
     OC_Helper::rmdirr($extractDir);
     mkdir($extractDir);
     if ($archive = OC_Archive::open($path)) {
         $archive->extract($extractDir);
     } else {
         OC_Log::write('core', 'Failed to open archive when installing app', OC_Log::ERROR);
         OC_Helper::rmdirr($extractDir);
         if ($data['source'] == 'http') {
             unlink($path);
         }
         return false;
     }
     //load the info.xml file of the app
     if (!is_file($extractDir . '/appinfo/info.xml')) {
         //try to find it in a subdir
         $dh = opendir($extractDir);
         while ($folder = readdir($dh)) {
             if (substr($folder, 0, 1) != '.' and is_dir($extractDir . '/' . $folder)) {
                 if (is_file($extractDir . '/' . $folder . '/appinfo/info.xml')) {
                     $extractDir .= '/' . $folder;
                 }
             }
         }
     }
     if (!is_file($extractDir . '/appinfo/info.xml')) {
         OC_Log::write('core', 'App does not provide an info.xml file', OC_Log::ERROR);
         OC_Helper::rmdirr($extractDir);
         if ($data['source'] == 'http') {
             unlink($path);
         }
         return false;
     }
     $info = OC_App::getAppInfo($extractDir . '/appinfo/info.xml', true);
     $basedir = OC::$APPSROOT . '/apps/' . $info['id'];
     // check the code for not allowed calls
     if (!OC_Installer::checkCode($info['id'], $extractDir)) {
         OC_Log::write('core', 'App can\'t be installed because of not allowed code in the App', OC_Log::ERROR);
         OC_Helper::rmdirr($extractDir);
         return false;
     }
     // check if the app is compatible with this version of ownCloud
     $version = OC_Util::getVersion();
     if (!isset($info['require']) or $version[0] > $info['require']) {
         OC_Log::write('core', 'App can\'t be installed because it is not compatible with this version of ownCloud', OC_Log::ERROR);
         OC_Helper::rmdirr($extractDir);
         return false;
     }
     //check if an app with the same id is already installed
     if (self::isInstalled($info['id'])) {
         OC_Log::write('core', 'App already installed', OC_Log::WARN);
         OC_Helper::rmdirr($extractDir);
         if ($data['source'] == 'http') {
             unlink($path);
         }
         return false;
     }
     //check if the destination directory already exists
     if (is_dir($basedir)) {
         OC_Log::write('core', 'App directory already exists', OC_Log::WARN);
         OC_Helper::rmdirr($extractDir);
         if ($data['source'] == 'http') {
             unlink($path);
         }
         return false;
     }
     if (isset($data['pretent']) and $data['pretent'] == true) {
         return false;
     }
     //copy the app to the correct place
     if (@(!mkdir($basedir))) {
         OC_Log::write('core', 'Can\'t create app folder. Please fix permissions. (' . $basedir . ')', OC_Log::ERROR);
         OC_Helper::rmdirr($extractDir);
         if ($data['source'] == 'http') {
             unlink($path);
         }
         return false;
     }
     OC_Helper::copyr($extractDir, $basedir);
     //remove temporary files
     OC_Helper::rmdirr($extractDir);
     //install the database
     if (is_file($basedir . '/appinfo/database.xml')) {
         OC_DB::createDbFromStructure($basedir . '/appinfo/database.xml');
     }
     //run appinfo/install.php
     if ((!isset($data['noinstall']) or $data['noinstall'] == false) and file_exists($basedir . '/appinfo/install.php')) {
         include $basedir . '/appinfo/install.php';
     }
     //set the installed version
     OC_Appconfig::setValue($info['id'], 'installed_version', OC_App::getAppVersion($info['id']));
     OC_Appconfig::setValue($info['id'], 'enabled', 'no');
     //set remote/public handelers
     foreach ($info['remote'] as $name => $path) {
         OCP\CONFIG::setAppValue('core', 'remote_' . $name, '/apps/' . $info['id'] . '/' . $path);
     }
     foreach ($info['public'] as $name => $path) {
         OCP\CONFIG::setAppValue('core', 'public_' . $name, '/apps/' . $info['id'] . '/' . $path);
     }
     OC_App::setAppTypes($info['id']);
     return $info['id'];
 }
예제 #9
0
 /**
  * @brief Installs an app
  * @param $data array with all information
  * @throws \Exception
  * @returns integer
  *
  * This function installs an app. All information needed are passed in the
  * associative array $data.
  * The following keys are required:
  *   - source: string, can be "path" or "http"
  *
  * One of the following keys is required:
  *   - path: path to the file containing the app
  *   - href: link to the downloadable file containing the app
  *
  * The following keys are optional:
  *   - pretend: boolean, if set true the system won't do anything
  *   - noinstall: boolean, if true appinfo/install.php won't be loaded
  *   - inactive: boolean, if set true the appconfig/app.sample.php won't be
  *     renamed
  *
  * This function works as follows
  *   -# fetching the file
  *   -# unzipping it
  *   -# check the code
  *   -# installing the database at appinfo/database.xml
  *   -# including appinfo/install.php
  *   -# setting the installed version
  *
  * It is the task of oc_app_install to create the tables and do whatever is
  * needed to get the app working.
  */
 public static function installApp($data = array())
 {
     $l = \OC_L10N::get('lib');
     if (!isset($data['source'])) {
         throw new \Exception($l->t("No source specified when installing app"));
     }
     //download the file if necessary
     if ($data['source'] == 'http') {
         $pathInfo = pathinfo($data['href']);
         $path = OC_Helper::tmpFile('.' . $pathInfo['extension']);
         if (!isset($data['href'])) {
             throw new \Exception($l->t("No href specified when installing app from http"));
         }
         copy($data['href'], $path);
     } else {
         if (!isset($data['path'])) {
             throw new \Exception($l->t("No path specified when installing app from local file"));
         }
         $path = $data['path'];
     }
     //detect the archive type
     $mime = OC_Helper::getMimeType($path);
     if ($mime !== 'application/zip' && $mime !== 'application/x-gzip') {
         throw new \Exception($l->t("Archives of type %s are not supported", array($mime)));
     }
     //extract the archive in a temporary folder
     $extractDir = OC_Helper::tmpFolder();
     OC_Helper::rmdirr($extractDir);
     mkdir($extractDir);
     if ($archive = OC_Archive::open($path)) {
         $archive->extract($extractDir);
     } else {
         OC_Helper::rmdirr($extractDir);
         if ($data['source'] == 'http') {
             unlink($path);
         }
         throw new \Exception($l->t("Failed to open archive when installing app"));
     }
     //load the info.xml file of the app
     if (!is_file($extractDir . '/appinfo/info.xml')) {
         //try to find it in a subdir
         $dh = opendir($extractDir);
         if (is_resource($dh)) {
             while (($folder = readdir($dh)) !== false) {
                 if ($folder[0] != '.' and is_dir($extractDir . '/' . $folder)) {
                     if (is_file($extractDir . '/' . $folder . '/appinfo/info.xml')) {
                         $extractDir .= '/' . $folder;
                     }
                 }
             }
         }
     }
     if (!is_file($extractDir . '/appinfo/info.xml')) {
         OC_Helper::rmdirr($extractDir);
         if ($data['source'] == 'http') {
             unlink($path);
         }
         throw new \Exception($l->t("App does not provide an info.xml file"));
     }
     $info = OC_App::getAppInfo($extractDir . '/appinfo/info.xml', true);
     // check the code for not allowed calls
     if (!OC_Installer::checkCode($info['id'], $extractDir)) {
         OC_Helper::rmdirr($extractDir);
         throw new \Exception($l->t("App can't be installed because of not allowed code in the App"));
     }
     // check if the app is compatible with this version of ownCloud
     if (!isset($info['require']) or !OC_App::isAppVersionCompatible(OC_Util::getVersion(), $info['require'])) {
         OC_Helper::rmdirr($extractDir);
         throw new \Exception($l->t("App can't be installed because it is not compatible with this version of ownCloud"));
     }
     // check if shipped tag is set which is only allowed for apps that are shipped with ownCloud
     if (isset($info['shipped']) and $info['shipped'] == 'true') {
         OC_Helper::rmdirr($extractDir);
         throw new \Exception($l->t("App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps"));
     }
     // check if the ocs version is the same as the version in info.xml/version
     $versionFile = $extractDir . '/appinfo/version';
     if (is_file($versionFile)) {
         $version = trim(file_get_contents($versionFile));
     } else {
         $version = trim($info['version']);
     }
     if ($version != trim($data['appdata']['version'])) {
         OC_Helper::rmdirr($extractDir);
         throw new \Exception($l->t("App can't be installed because the version in info.xml/version is not the same as the version reported from the app store"));
     }
     $basedir = OC_App::getInstallPath() . '/' . $info['id'];
     //check if the destination directory already exists
     if (is_dir($basedir)) {
         OC_Helper::rmdirr($extractDir);
         if ($data['source'] == 'http') {
             unlink($path);
         }
         throw new \Exception($l->t("App directory already exists"));
     }
     if (isset($data['pretent']) and $data['pretent'] == true) {
         return false;
     }
     //copy the app to the correct place
     if (@(!mkdir($basedir))) {
         OC_Helper::rmdirr($extractDir);
         if ($data['source'] == 'http') {
             unlink($path);
         }
         throw new \Exception($l->t("Can't create app folder. Please fix permissions. %s", array($basedir)));
     }
     OC_Helper::copyr($extractDir, $basedir);
     //remove temporary files
     OC_Helper::rmdirr($extractDir);
     //install the database
     if (is_file($basedir . '/appinfo/database.xml')) {
         if (OC_Appconfig::getValue($info['id'], 'installed_version') === null) {
             OC_DB::createDbFromStructure($basedir . '/appinfo/database.xml');
         } else {
             OC_DB::updateDbFromStructure($basedir . '/appinfo/database.xml');
         }
     }
     //run appinfo/install.php
     if ((!isset($data['noinstall']) or $data['noinstall'] == false) and file_exists($basedir . '/appinfo/install.php')) {
         include $basedir . '/appinfo/install.php';
     }
     //set the installed version
     OC_Appconfig::setValue($info['id'], 'installed_version', OC_App::getAppVersion($info['id']));
     OC_Appconfig::setValue($info['id'], 'enabled', 'no');
     //set remote/public handelers
     foreach ($info['remote'] as $name => $path) {
         OCP\CONFIG::setAppValue('core', 'remote_' . $name, $info['id'] . '/' . $path);
     }
     foreach ($info['public'] as $name => $path) {
         OCP\CONFIG::setAppValue('core', 'public_' . $name, $info['id'] . '/' . $path);
     }
     OC_App::setAppTypes($info['id']);
     return $info['id'];
 }