Ejemplo n.º 1
0
 /**
  *
  * 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.
  *
  * Installs an app
  * @param array $data with all information
  * @throws \Exception
  * @return integer
  */
 public static function installApp($data = array())
 {
     $l = \OC::$server->getL10N('lib');
     list($extractDir, $path) = self::downloadApp($data);
     $info = self::checkAppsIntegrity($data, $extractDir, $path);
     $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 (!empty($data['pretent'])) {
         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)));
     }
     $extractDir .= '/' . $info['id'];
     if (!file_exists($extractDir)) {
         OC_Helper::rmdirr($basedir);
         throw new \Exception($l->t("Archive does not contain a directory named %s", $info['id']));
     }
     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'];
 }
Ejemplo n.º 2
0
 /**
  * update the database for the app and call the update script
  *
  * @param string $appId
  * @return bool
  */
 public static function updateApp($appId)
 {
     if (file_exists(self::getAppPath($appId) . '/appinfo/database.xml')) {
         OC_DB::updateDbFromStructure(self::getAppPath($appId) . '/appinfo/database.xml');
     }
     if (!self::isEnabled($appId)) {
         return false;
     }
     if (file_exists(self::getAppPath($appId) . '/appinfo/update.php')) {
         self::loadApp($appId, false);
         include self::getAppPath($appId) . '/appinfo/update.php';
     }
     //set remote/public handlers
     $appData = self::getAppInfo($appId);
     if (array_key_exists('ocsid', $appData)) {
         OC_Appconfig::setValue($appId, 'ocsid', $appData['ocsid']);
     }
     foreach ($appData['remote'] as $name => $path) {
         OCP\CONFIG::setAppValue('core', 'remote_' . $name, $appId . '/' . $path);
     }
     foreach ($appData['public'] as $name => $path) {
         OCP\CONFIG::setAppValue('core', 'public_' . $name, $appId . '/' . $path);
     }
     self::setAppTypes($appId);
     $version = \OC_App::getAppVersion($appId);
     \OC_Appconfig::setValue($appId, 'installed_version', $version);
     return true;
 }
Ejemplo n.º 3
0
 protected function doCoreUpgrade()
 {
     $this->emit('\\OC\\Updater', 'dbUpgradeBefore');
     // do the real upgrade
     \OC_DB::updateDbFromStructure(\OC::$SERVERROOT . '/db_structure.xml');
     $this->emit('\\OC\\Updater', 'dbUpgrade');
 }
Ejemplo n.º 4
0
 public function doTestSchemaChanging()
 {
     OC_DB::updateDbFromStructure($this->schema_file2);
     $this->assertTableExist($this->table2);
 }
Ejemplo n.º 5
0
 /**
  * update the database for the app and call the update script
  *
  * @param string $appId
  * @return bool
  */
 public static function updateApp($appId)
 {
     $appPath = self::getAppPath($appId);
     if ($appPath === false) {
         return false;
     }
     if (file_exists($appPath . '/appinfo/database.xml')) {
         OC_DB::updateDbFromStructure($appPath . '/appinfo/database.xml');
     }
     unset(self::$appVersion[$appId]);
     // run upgrade code
     if (file_exists($appPath . '/appinfo/update.php')) {
         self::loadApp($appId, false);
         include $appPath . '/appinfo/update.php';
     }
     //set remote/public handlers
     $appData = self::getAppInfo($appId);
     if (array_key_exists('ocsid', $appData)) {
         \OC::$server->getConfig()->setAppValue($appId, 'ocsid', $appData['ocsid']);
     } elseif (\OC::$server->getConfig()->getAppValue($appId, 'ocsid', null) !== null) {
         \OC::$server->getConfig()->deleteAppValue($appId, 'ocsid');
     }
     foreach ($appData['remote'] as $name => $path) {
         \OC::$server->getConfig()->setAppValue('core', 'remote_' . $name, $appId . '/' . $path);
     }
     foreach ($appData['public'] as $name => $path) {
         \OC::$server->getConfig()->setAppValue('core', 'public_' . $name, $appId . '/' . $path);
     }
     self::setAppTypes($appId);
     $version = \OC_App::getAppVersion($appId);
     \OC::$server->getAppConfig()->setValue($appId, 'installed_version', $version);
     return true;
 }
Ejemplo n.º 6
0
 /**
  * update the database for the app and call the update script
  * @param string $appid
  */
 public static function updateApp($appid)
 {
     if (file_exists(self::getAppPath($appid) . '/appinfo/preupdate.php')) {
         self::loadApp($appid);
         include self::getAppPath($appid) . '/appinfo/preupdate.php';
     }
     if (file_exists(self::getAppPath($appid) . '/appinfo/database.xml')) {
         OC_DB::updateDbFromStructure(self::getAppPath($appid) . '/appinfo/database.xml');
     }
     if (!self::isEnabled($appid)) {
         return;
     }
     if (file_exists(self::getAppPath($appid) . '/appinfo/update.php')) {
         self::loadApp($appid);
         include self::getAppPath($appid) . '/appinfo/update.php';
     }
     //set remote/public handlers
     $appData = self::getAppInfo($appid);
     foreach ($appData['remote'] as $name => $path) {
         OCP\CONFIG::setAppValue('core', 'remote_' . $name, $appid . '/' . $path);
     }
     foreach ($appData['public'] as $name => $path) {
         OCP\CONFIG::setAppValue('core', 'public_' . $name, $appid . '/' . $path);
     }
     self::setAppTypes($appid);
 }
Ejemplo n.º 7
0
 public static function checkUpgrade()
 {
     if (OC_Config::getValue('installed', false)) {
         $installedVersion = OC_Config::getValue('version', '0.0.0');
         $currentVersion = implode('.', OC_Util::getVersion());
         if (version_compare($currentVersion, $installedVersion, '>')) {
             OC_Log::write('core', 'starting upgrade from ' . $installedVersion . ' to ' . $currentVersion, OC_Log::DEBUG);
             $result = OC_DB::updateDbFromStructure(OC::$SERVERROOT . '/db_structure.xml');
             if (!$result) {
                 echo 'Error while upgrading the database';
                 die;
             }
             if (file_exists(OC::$SERVERROOT . "/config/config.php") and !is_writable(OC::$SERVERROOT . "/config/config.php")) {
                 $tmpl = new OC_Template('', 'error', 'guest');
                 $tmpl->assign('errors', array(1 => array('error' => "Can't write into config directory 'config'", 'hint' => "You can usually fix this by giving the webserver user write access to the config directory in owncloud")));
                 $tmpl->printPage();
                 exit;
             }
             $minimizerCSS = new OC_Minimizer_CSS();
             $minimizerCSS->clearCache();
             $minimizerJS = new OC_Minimizer_JS();
             $minimizerJS->clearCache();
             OC_Config::setValue('version', implode('.', OC_Util::getVersion()));
             OC_App::checkAppsRequirements();
             // load all apps to also upgrade enabled apps
             OC_App::loadApps();
         }
     }
 }
Ejemplo n.º 8
0
$RUNTIME_NOAPPS = true;
require_once '../../lib/base.php';
if (OC::checkUpgrade(false)) {
    \OC_DB::enableCaching(false);
    // initialize the event source before we enter maintenance mode because CSRF protection can terminate the script
    $updateEventSource = new OC_EventSource();
    OC_Config::setValue('maintenance', true);
    $installedVersion = OC_Config::getValue('version', '0.0.0');
    $currentVersion = implode('.', OC_Util::getVersion());
    OC_Log::write('core', 'starting upgrade from ' . $installedVersion . ' to ' . $currentVersion, OC_Log::WARN);
    $watcher = new UpdateWatcher($updateEventSource);
    OC_Hook::connect('update', 'success', $watcher, 'success');
    OC_Hook::connect('update', 'failure', $watcher, 'failure');
    $watcher->success('Turned on maintenance mode');
    try {
        $result = OC_DB::updateDbFromStructure(OC::$SERVERROOT . '/db_structure.xml');
        $watcher->success('Updated database');
        // do a file cache upgrade for users with files
        // this can take loooooooooooooooooooooooong
        __doFileCacheUpgrade($watcher);
    } catch (Exception $exception) {
        $watcher->failure($exception->getMessage());
    }
    OC_Config::setValue('version', implode('.', OC_Util::getVersion()));
    OC_App::checkAppsRequirements();
    // load all apps to also upgrade enabled apps
    OC_App::loadApps();
    OC_Config::setValue('maintenance', false);
    $watcher->success('Turned off maintenance mode');
    $watcher->done();
}
Ejemplo n.º 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'];
 }
Ejemplo n.º 10
0
 /**
  * runs the update actions in maintenance mode, does not upgrade the source files
  * except the main .htaccess file
  *
  * @param string $currentVersion current version to upgrade to
  * @param string $installedVersion previous version from which to upgrade from
  *
  * @return bool true if the operation succeeded, false otherwise
  */
 private function doUpgrade($currentVersion, $installedVersion)
 {
     // Update htaccess files for apache hosts
     if (isset($_SERVER['SERVER_SOFTWARE']) && strstr($_SERVER['SERVER_SOFTWARE'], 'Apache')) {
         \OC_Setup::updateHtaccess();
     }
     // create empty file in data dir, so we can later find
     // out that this is indeed an ownCloud data directory
     // (in case it didn't exist before)
     file_put_contents(\OC_Config::getValue('datadirectory', \OC::$SERVERROOT . '/data') . '/.ocdata', '');
     /*
      * START CONFIG CHANGES FOR OLDER VERSIONS
      */
     if (!\OC::$CLI && version_compare($installedVersion, '6.90.1', '<')) {
         // Add the trusted_domains config if it is not existant
         // This is added to prevent host header poisoning
         \OC_Config::setValue('trusted_domains', \OC_Config::getValue('trusted_domains', array(\OC_Request::serverHost())));
     }
     /*
      * STOP CONFIG CHANGES FOR OLDER VERSIONS
      */
     // pre-upgrade repairs
     $repair = new \OC\Repair(\OC\Repair::getBeforeUpgradeRepairSteps());
     $repair->run();
     // simulate DB upgrade
     if ($this->simulateStepEnabled) {
         // simulate core DB upgrade
         \OC_DB::simulateUpdateDbFromStructure(\OC::$SERVERROOT . '/db_structure.xml');
         // simulate apps DB upgrade
         $version = \OC_Util::getVersion();
         $apps = \OC_App::getEnabledApps();
         foreach ($apps as $appId) {
             $info = \OC_App::getAppInfo($appId);
             if (\OC_App::isAppCompatible($version, $info) && \OC_App::shouldUpgrade($appId)) {
                 if (file_exists(\OC_App::getAppPath($appId) . '/appinfo/database.xml')) {
                     \OC_DB::simulateUpdateDbFromStructure(\OC_App::getAppPath($appId) . '/appinfo/database.xml');
                 }
             }
         }
         $this->emit('\\OC\\Updater', 'dbSimulateUpgrade');
     }
     // upgrade from OC6 to OC7
     // TODO removed it again for OC8
     $sharePolicy = \OC_Appconfig::getValue('core', 'shareapi_share_policy', 'global');
     if ($sharePolicy === 'groups_only') {
         \OC_Appconfig::setValue('core', 'shareapi_only_share_with_group_members', 'yes');
     }
     if ($this->updateStepEnabled) {
         // do the real upgrade
         \OC_DB::updateDbFromStructure(\OC::$SERVERROOT . '/db_structure.xml');
         $this->emit('\\OC\\Updater', 'dbUpgrade');
         // TODO: why not do this at the end ?
         \OC_Config::setValue('version', implode('.', \OC_Util::getVersion()));
         $disabledApps = \OC_App::checkAppsRequirements();
         if (!empty($disabledApps)) {
             $this->emit('\\OC\\Updater', 'disabledApps', array($disabledApps));
         }
         // load all apps to also upgrade enabled apps
         \OC_App::loadApps();
         // post-upgrade repairs
         $repair = new \OC\Repair(\OC\Repair::getRepairSteps());
         $repair->run();
         //Invalidate update feed
         \OC_Appconfig::setValue('core', 'lastupdatedat', 0);
     }
 }
Ejemplo n.º 11
0
 /**
  * runs the update actions in maintenance mode, does not upgrade the source files
  */
 public function upgrade()
 {
     \OC_DB::enableCaching(false);
     \OC_Config::setValue('maintenance', true);
     $installedVersion = \OC_Config::getValue('version', '0.0.0');
     $currentVersion = implode('.', \OC_Util::getVersion());
     if ($this->log) {
         $this->log->debug('starting upgrade from ' . $installedVersion . ' to ' . $currentVersion, array('app' => 'core'));
     }
     $this->emit('\\OC\\Updater', 'maintenanceStart');
     // create empty file in data dir, so we can later find
     // out that this is indeed an ownCloud data directory
     // (in case it didn't exist before)
     file_put_contents(\OC_Config::getValue('datadirectory', \OC::$SERVERROOT . '/data') . '/.ocdata', '');
     /*
      * START CONFIG CHANGES FOR OLDER VERSIONS
      */
     if (!\OC::$CLI && version_compare($installedVersion, '6.00.4', '<')) {
         // Add the trusted_domains config if it is not existant
         // This is added to prevent host header poisoning
         \OC_Config::setValue('trusted_domains', \OC_Config::getValue('trusted_domains', array(\OC_Request::serverHost())));
     }
     /*
      * STOP CONFIG CHANGES FOR OLDER VERSIONS
      */
     try {
         \OC_DB::updateDbFromStructure(\OC::$SERVERROOT . '/db_structure.xml');
         $this->emit('\\OC\\Updater', 'dbUpgrade');
         // do a file cache upgrade for users with files
         // this can take loooooooooooooooooooooooong
         $this->upgradeFileCache();
     } catch (\Exception $exception) {
         $this->emit('\\OC\\Updater', 'failure', array($exception->getMessage()));
     }
     \OC_Config::setValue('version', implode('.', \OC_Util::getVersion()));
     \OC_App::checkAppsRequirements();
     // load all apps to also upgrade enabled apps
     \OC_App::loadApps();
     $repair = new Repair();
     $repair->run();
     //Invalidate update feed
     \OC_Appconfig::setValue('core', 'lastupdatedat', 0);
     \OC_Config::setValue('maintenance', false);
     $this->emit('\\OC\\Updater', 'maintenanceEnd');
 }
Ejemplo n.º 12
0
 /**
  * runs the update actions in maintenance mode, does not upgrade the source files
  */
 public function upgrade()
 {
     \OC_DB::enableCaching(false);
     \OC_Config::setValue('maintenance', true);
     $installedVersion = \OC_Config::getValue('version', '0.0.0');
     $currentVersion = implode('.', \OC_Util::getVersion());
     if ($this->log) {
         $this->log->debug('starting upgrade from ' . $installedVersion . ' to ' . $currentVersion, array('app' => 'core'));
     }
     $this->emit('\\OC\\Updater', 'maintenanceStart');
     try {
         \OC_DB::updateDbFromStructure(\OC::$SERVERROOT . '/db_structure.xml');
         $this->emit('\\OC\\Updater', 'dbUpgrade');
         // do a file cache upgrade for users with files
         // this can take loooooooooooooooooooooooong
         $this->upgradeFileCache();
     } catch (\Exception $exception) {
         $this->emit('\\OC\\Updater', 'failure', array($exception->getMessage()));
     }
     \OC_Config::setValue('version', implode('.', \OC_Util::getVersion()));
     \OC_App::checkAppsRequirements();
     // load all apps to also upgrade enabled apps
     \OC_App::loadApps();
     $repair = new Repair();
     $repair->run();
     \OC_Config::setValue('maintenance', false);
     $this->emit('\\OC\\Updater', 'maintenanceEnd');
 }