diff options
Diffstat (limited to 'lib/private')
-rw-r--r-- | lib/private/App/InfoParser.php | 12 | ||||
-rw-r--r-- | lib/private/Installer.php (renamed from lib/private/legacy/installer.php) | 86 | ||||
-rw-r--r-- | lib/private/Log.php | 2 | ||||
-rw-r--r-- | lib/private/Repair.php | 11 | ||||
-rw-r--r-- | lib/private/Session/CryptoSessionData.php | 12 | ||||
-rw-r--r-- | lib/private/Session/Internal.php | 17 | ||||
-rw-r--r-- | lib/private/Session/Memory.php | 18 | ||||
-rw-r--r-- | lib/private/Setup.php | 2 | ||||
-rw-r--r-- | lib/private/Updater.php | 7 | ||||
-rw-r--r-- | lib/private/legacy/app.php | 27 | ||||
-rw-r--r-- | lib/private/user/manager.php | 17 |
11 files changed, 126 insertions, 85 deletions
diff --git a/lib/private/App/InfoParser.php b/lib/private/App/InfoParser.php index b7540c04248..21422d40603 100644 --- a/lib/private/App/InfoParser.php +++ b/lib/private/App/InfoParser.php @@ -74,6 +74,9 @@ class InfoParser { if (!array_key_exists('repair-steps', $array)) { $array['repair-steps'] = []; } + if (!array_key_exists('install', $array['repair-steps'])) { + $array['repair-steps']['install'] = []; + } if (!array_key_exists('pre-migration', $array['repair-steps'])) { $array['repair-steps']['pre-migration'] = []; } @@ -83,6 +86,9 @@ class InfoParser { if (!array_key_exists('live-migration', $array['repair-steps'])) { $array['repair-steps']['live-migration'] = []; } + if (!array_key_exists('uninstall', $array['repair-steps'])) { + $array['repair-steps']['uninstall'] = []; + } if (array_key_exists('documentation', $array) && is_array($array['documentation'])) { foreach ($array['documentation'] as $key => $url) { @@ -107,6 +113,9 @@ class InfoParser { $array['types'] = []; } } + if (isset($array['repair-steps']['install']['step']) && is_array($array['repair-steps']['install']['step'])) { + $array['repair-steps']['install'] = $array['repair-steps']['install']['step']; + } if (isset($array['repair-steps']['pre-migration']['step']) && is_array($array['repair-steps']['pre-migration']['step'])) { $array['repair-steps']['pre-migration'] = $array['repair-steps']['pre-migration']['step']; } @@ -116,6 +125,9 @@ class InfoParser { if (isset($array['repair-steps']['live-migration']['step']) && is_array($array['repair-steps']['live-migration']['step'])) { $array['repair-steps']['live-migration'] = $array['repair-steps']['live-migration']['step']; } + if (isset($array['repair-steps']['uninstall']['step']) && is_array($array['repair-steps']['uninstall']['step'])) { + $array['repair-steps']['uninstall'] = $array['repair-steps']['uninstall']['step']; + } return $array; } diff --git a/lib/private/legacy/installer.php b/lib/private/Installer.php index 24c79b2dd8c..643590ae22e 100644 --- a/lib/private/legacy/installer.php +++ b/lib/private/Installer.php @@ -37,15 +37,19 @@ * */ +namespace OC; + use OC\App\CodeChecker\CodeChecker; use OC\App\CodeChecker\EmptyCheck; use OC\App\CodeChecker\PrivateCheck; -use OC\OCSClient; +use OC_App; +use OC_DB; +use OC_Helper; /** * This class provides the functionality needed to install, update and remove plugins/apps */ -class OC_Installer{ +class Installer { /** * @@ -134,16 +138,19 @@ class OC_Installer{ self::includeAppScript($basedir . '/appinfo/install.php'); } + $appData = OC_App::getAppInfo($appId); + OC_App::executeRepairSteps($appId, $appData['repair-steps']['install']); + //set the installed version - \OC::$server->getAppConfig()->setValue($info['id'], 'installed_version', OC_App::getAppVersion($info['id'])); - \OC::$server->getAppConfig()->setValue($info['id'], 'enabled', 'no'); + \OC::$server->getConfig()->setAppValue($info['id'], 'installed_version', OC_App::getAppVersion($info['id'])); + \OC::$server->getConfig()->setAppValue($info['id'], 'enabled', 'no'); - //set remote/public handelers + //set remote/public handlers foreach($info['remote'] as $name=>$path) { - OCP\CONFIG::setAppValue('core', 'remote_'.$name, $info['id'].'/'.$path); + \OC::$server->getConfig()->setAppValue('core', 'remote_'.$name, $info['id'].'/'.$path); } foreach($info['public'] as $name=>$path) { - OCP\CONFIG::setAppValue('core', 'public_'.$name, $info['id'].'/'.$path); + \OC::$server->getConfig()->setAppValue('core', 'public_'.$name, $info['id'].'/'.$path); } OC_App::setAppTypes($info['id']); @@ -158,15 +165,15 @@ class OC_Installer{ * * Checks whether or not an app is installed, i.e. registered in apps table. */ - public static function isInstalled( $app ) { - return (\OC::$server->getAppConfig()->getValue($app, "installed_version") !== null); + public static function isInstalled( $app ) { + return (\OC::$server->getConfig()->getAppValue($app, "installed_version", null) !== null); } /** * @brief Update an application * @param array $info * @param bool $isShipped - * @throws Exception + * @throws \Exception * @return bool * * This function could work like described below, but currently it disables and then @@ -229,7 +236,7 @@ class OC_Installer{ * * @param integer $ocsId * @return bool - * @throws Exception + * @throws \Exception */ public static function updateAppByOCSId($ocsId) { $ocsClient = new OCSClient( @@ -257,7 +264,7 @@ class OC_Installer{ /** * @param array $data * @return array - * @throws Exception + * @throws \Exception */ public static function downloadApp($data = array()) { $l = \OC::$server->getL10N('lib'); @@ -293,7 +300,7 @@ class OC_Installer{ $extractDir = \OC::$server->getTempManager()->getTemporaryFolder(); OC_Helper::rmdirr($extractDir); mkdir($extractDir); - if($archive=OC_Archive::open($path)) { + if($archive=\OC_Archive::open($path)) { $archive->extract($extractDir); } else { OC_Helper::rmdirr($extractDir); @@ -375,7 +382,7 @@ class OC_Installer{ } // check the code for not allowed calls - if(!$isShipped && !OC_Installer::checkCode($extractDir)) { + if(!$isShipped && !Installer::checkCode($extractDir)) { OC_Helper::rmdirr($extractDir); throw new \Exception($l->t("App can't be installed because of not allowed code in the App")); } @@ -457,7 +464,7 @@ class OC_Installer{ * The function will check if the app is already downloaded in the apps repository */ public static function isDownloaded( $name ) { - foreach(OC::$APPSROOTS as $dir) { + foreach(\OC::$APPSROOTS as $dir) { $dirToTest = $dir['path']; $dirToTest .= '/'; $dirToTest .= $name; @@ -474,52 +481,25 @@ class OC_Installer{ /** * Removes an app * @param string $name name of the application to remove - * @param array $options options * @return boolean * - * This function removes an app. $options is an associative array. The - * following keys are optional:ja - * - keeppreferences: boolean, if true the user preferences won't be deleted - * - keepappconfig: boolean, if true the config will be kept - * - keeptables: boolean, if true the database will be kept - * - keepfiles: boolean, if true the user files will be kept * * This function works as follows - * -# including appinfo/remove.php + * -# call uninstall repair steps * -# removing the files * * The function will not delete preferences, tables and the configuration, * this has to be done by the function oc_app_uninstall(). */ - public static function removeApp( $name, $options = array()) { + public static function removeApp($appId) { - if(isset($options['keeppreferences']) and $options['keeppreferences']==false ) { - // todo - // remove preferences - } - - if(isset($options['keepappconfig']) and $options['keepappconfig']==false ) { - // todo - // remove app config - } - - if(isset($options['keeptables']) and $options['keeptables']==false ) { - // todo - // remove app database tables - } - - if(isset($options['keepfiles']) and $options['keepfiles']==false ) { - // todo - // remove user files - } - - if(OC_Installer::isDownloaded( $name )) { - $appdir=OC_App::getInstallPath().'/'.$name; - OC_Helper::rmdirr($appdir); + if(Installer::isDownloaded( $appId )) { + $appDir=OC_App::getInstallPath() . '/' . $appId; + OC_Helper::rmdirr($appDir); return true; }else{ - \OCP\Util::writeLog('core', 'can\'t remove app '.$name.'. It is not installed.', \OCP\Util::ERROR); + \OCP\Util::writeLog('core', 'can\'t remove app '.$appId.'. It is not installed.', \OCP\Util::ERROR); return false; } @@ -536,25 +516,25 @@ class OC_Installer{ */ public static function installShippedApps($softErrors = false) { $errors = []; - foreach(OC::$APPSROOTS as $app_dir) { + foreach(\OC::$APPSROOTS as $app_dir) { if($dir = opendir( $app_dir['path'] )) { while( false !== ( $filename = readdir( $dir ))) { if( substr( $filename, 0, 1 ) != '.' and is_dir($app_dir['path']."/$filename") ) { if( file_exists( $app_dir['path']."/$filename/appinfo/info.xml" )) { - if(!OC_Installer::isInstalled($filename)) { + if(!Installer::isInstalled($filename)) { $info=OC_App::getAppInfo($filename); $enabled = isset($info['default_enable']); if (($enabled || in_array($filename, \OC::$server->getAppManager()->getAlwaysEnabledApps())) && \OC::$server->getConfig()->getAppValue($filename, 'enabled') !== 'no') { if ($softErrors) { try { - OC_Installer::installShippedApp($filename); + Installer::installShippedApp($filename); } catch (\Doctrine\DBAL\Exception\TableExistsException $e) { $errors[$filename] = $e; continue; } } else { - OC_Installer::installShippedApp($filename); + Installer::installShippedApp($filename); } \OC::$server->getConfig()->setAppValue($filename, 'enabled', 'yes'); } @@ -590,6 +570,8 @@ class OC_Installer{ return false; } + OC_App::executeRepairSteps($app, $info['repair-steps']['install']); + $config = \OC::$server->getConfig(); $config->setAppValue($app, 'installed_version', OC_App::getAppVersion($app)); diff --git a/lib/private/Log.php b/lib/private/Log.php index bbdad9cf166..d82346bbcf0 100644 --- a/lib/private/Log.php +++ b/lib/private/Log.php @@ -284,7 +284,7 @@ class Log implements ILogger { 'File' => $exception->getFile(), 'Line' => $exception->getLine(), ); - $exception['Trace'] = preg_replace('!(login|checkPassword|updatePrivateKeyPassword)\(.*\)!', '$1(*** username and password replaced ***)', $exception['Trace']); + $exception['Trace'] = preg_replace('!(login|checkPassword|updatePrivateKeyPassword|validateUserPass)\(.*\)!', '$1(*** username and password replaced ***)', $exception['Trace']); $msg = isset($context['message']) ? $context['message'] : 'Exception'; $msg .= ': ' . json_encode($exception); $this->error($msg, $context); diff --git a/lib/private/Repair.php b/lib/private/Repair.php index 590b0bee721..5d10cd582f0 100644 --- a/lib/private/Repair.php +++ b/lib/private/Repair.php @@ -73,7 +73,6 @@ class Repair implements IOutput{ * Run a series of repair steps for common problems */ public function run() { - $self = $this; if (count($this->repairSteps) === 0) { $this->emit('\OC\Repair', 'info', array('No repair steps available')); return; @@ -82,16 +81,6 @@ class Repair implements IOutput{ foreach ($this->repairSteps as $step) { $this->currentStep = $step->getName(); $this->emit('\OC\Repair', 'step', [$this->currentStep]); - - if ($step instanceof Emitter) { - $step->listen('\OC\Repair', 'warning', function ($description) use ($self) { - $self->emit('\OC\Repair', 'warning', array($description)); - }); - $step->listen('\OC\Repair', 'info', function ($description) use ($self) { - $self->emit('\OC\Repair', 'info', array($description)); - }); - } - $step->run($this); } } diff --git a/lib/private/Session/CryptoSessionData.php b/lib/private/Session/CryptoSessionData.php index f6c585c1611..629e6af5412 100644 --- a/lib/private/Session/CryptoSessionData.php +++ b/lib/private/Session/CryptoSessionData.php @@ -24,6 +24,7 @@ namespace OC\Session; use OCP\ISession; use OCP\Security\ICrypto; +use OCP\Session\Exceptions\SessionNotAvailableException; /** * Class CryptoSessionData @@ -142,6 +143,17 @@ class CryptoSessionData implements \ArrayAccess, ISession { } /** + * Wrapper around session_id + * + * @return string + * @throws SessionNotAvailableException + * @since 9.1.0 + */ + public function getId() { + return $this->session->getId(); + } + + /** * Close the session and release the lock, also writes all changed data in batch */ public function close() { diff --git a/lib/private/Session/Internal.php b/lib/private/Session/Internal.php index 09175bf1f2f..a24aec55222 100644 --- a/lib/private/Session/Internal.php +++ b/lib/private/Session/Internal.php @@ -26,6 +26,8 @@ namespace OC\Session; +use OCP\Session\Exceptions\SessionNotAvailableException; + /** * Class Internal * @@ -112,6 +114,21 @@ class Internal extends Session { } /** + * Wrapper around session_id + * + * @return string + * @throws SessionNotAvailableException + * @since 9.1.0 + */ + public function getId() { + $id = @session_id(); + if ($id === '') { + throw new SessionNotAvailableException(); + } + return $id; + } + + /** * @throws \Exception */ public function reopen() { diff --git a/lib/private/Session/Memory.php b/lib/private/Session/Memory.php index 777458a9aa5..bcb1f1d950c 100644 --- a/lib/private/Session/Memory.php +++ b/lib/private/Session/Memory.php @@ -26,6 +26,9 @@ namespace OC\Session; +use Exception; +use OCP\Session\Exceptions\SessionNotAvailableException; + /** * Class Internal * @@ -89,6 +92,17 @@ class Memory extends Session { public function regenerateId($deleteOldSession = true) {} /** + * Wrapper around session_id + * + * @return string + * @throws SessionNotAvailableException + * @since 9.1.0 + */ + public function getId() { + throw new SessionNotAvailableException('Memory session does not have an ID'); + } + + /** * Helper function for PHPUnit execution - don't use in non-test code */ public function reopen() { @@ -98,11 +112,11 @@ class Memory extends Session { /** * In case the session has already been locked an exception will be thrown * - * @throws \Exception + * @throws Exception */ private function validateSession() { if ($this->sessionClosed) { - throw new \Exception('Session has been closed - no further changes to the session are allowed'); + throw new Exception('Session has been closed - no further changes to the session are allowed'); } } } diff --git a/lib/private/Setup.php b/lib/private/Setup.php index 196ae8a8bce..23c66f98b7c 100644 --- a/lib/private/Setup.php +++ b/lib/private/Setup.php @@ -367,7 +367,7 @@ class Setup { \OC_User::login($username, $password); //guess what this does - \OC_Installer::installShippedApps(); + Installer::installShippedApps(); // create empty file in data dir, so we can later find // out that this is indeed an ownCloud data directory diff --git a/lib/private/Updater.php b/lib/private/Updater.php index 093ebebbbe4..7ca3cd09362 100644 --- a/lib/private/Updater.php +++ b/lib/private/Updater.php @@ -36,7 +36,6 @@ namespace OC; use OC\Hooks\BasicEmitter; use OC\IntegrityCheck\Checker; use OC_App; -use OC_Installer; use OCP\IConfig; use OC\Setup; use OCP\ILogger; @@ -251,7 +250,7 @@ class Updater extends BasicEmitter { // install new shipped apps on upgrade OC_App::loadApps('authentication'); - $errors = OC_Installer::installShippedApps(true); + $errors = Installer::installShippedApps(true); foreach ($errors as $appId => $exception) { /** @var \Exception $exception */ $this->log->logException($exception, ['app' => $appId]); @@ -443,11 +442,11 @@ class Updater extends BasicEmitter { private function upgradeAppStoreApps(array $disabledApps) { foreach($disabledApps as $app) { try { - if (OC_Installer::isUpdateAvailable($app)) { + if (Installer::isUpdateAvailable($app)) { $ocsId = \OC::$server->getConfig()->getAppValue($app, 'ocsid', ''); $this->emit('\OC\Updater', 'upgradeAppStoreApp', array($app)); - OC_Installer::updateAppByOCSId($ocsId); + Installer::updateAppByOCSId($ocsId); } } catch (\Exception $ex) { $this->log->logException($ex, ['app' => 'core']); diff --git a/lib/private/legacy/app.php b/lib/private/legacy/app.php index 246bf97ee91..41b1b79e4f6 100644 --- a/lib/private/legacy/app.php +++ b/lib/private/legacy/app.php @@ -46,6 +46,7 @@ */ use OC\App\DependencyAnalyzer; use OC\App\Platform; +use OC\Installer; use OC\OCSClient; use OC\Repair; @@ -304,7 +305,7 @@ class OC_App { */ public static function enable($app, $groups = null) { self::$enabledAppsCache = array(); // flush - if (!OC_Installer::isInstalled($app)) { + if (!Installer::isInstalled($app)) { $app = self::installApp($app); } @@ -340,7 +341,7 @@ class OC_App { // Replace spaces in download link without encoding entire URL $download['downloadlink'] = str_replace(' ', '%20', $download['downloadlink']); $info = array('source' => 'http', 'href' => $download['downloadlink'], 'appdata' => $appData); - $app = OC_Installer::installApp($info); + $app = Installer::installApp($info); } return $app; } @@ -354,7 +355,7 @@ class OC_App { return false; } - return OC_Installer::removeApp($app); + return Installer::removeApp($app); } /** @@ -369,9 +370,19 @@ class OC_App { $app = self::getInternalAppIdByOcs($app); } - self::$enabledAppsCache = array(); // flush - // check if app is a shipped app or not. if not delete + // flush + self::$enabledAppsCache = array(); + + // run uninstall steps + $appData = OC_App::getAppInfo($app); + if (!is_null($appData)) { + OC_App::executeRepairSteps($app, $appData['repair-steps']['uninstall']); + } + + // emit disable hook - needed anymore ? \OC_Hook::emit('OC_App', 'pre_disable', array('app' => $app)); + + // finally disable it $appManager = \OC::$server->getAppManager(); $appManager->disableApp($app); } @@ -827,7 +838,7 @@ class OC_App { $info['removable'] = true; } - $info['update'] = ($includeUpdateInfo) ? OC_Installer::isUpdateAvailable($app) : null; + $info['update'] = ($includeUpdateInfo) ? Installer::isUpdateAvailable($app) : null; $appPath = self::getAppPath($app); if($appPath !== false) { @@ -1073,7 +1084,7 @@ class OC_App { if ($appData && version_compare($shippedVersion, $appData['version'], '<')) { $app = self::downloadApp($app); } else { - $app = OC_Installer::installShippedApp($app); + $app = Installer::installShippedApp($app); } } else { // Maybe the app is already installed - compare the version in this @@ -1187,7 +1198,7 @@ class OC_App { * @param string[] $steps * @throws \OC\NeedsUpdateException */ - private static function executeRepairSteps($appId, array $steps) { + public static function executeRepairSteps($appId, array $steps) { if (empty($steps)) { return; } diff --git a/lib/private/user/manager.php b/lib/private/user/manager.php index 7967f877024..4371be134aa 100644 --- a/lib/private/user/manager.php +++ b/lib/private/user/manager.php @@ -147,14 +147,19 @@ class Manager extends PublicEmitter implements IUserManager { * * @param string $uid * @param \OCP\UserInterface $backend + * @param bool $cacheUser If false the newly created user object will not be cached * @return \OC\User\User */ - protected function getUserObject($uid, $backend) { + protected function getUserObject($uid, $backend, $cacheUser = true) { if (isset($this->cachedUsers[$uid])) { return $this->cachedUsers[$uid]; } - $this->cachedUsers[$uid] = new User($uid, $backend, $this, $this->config); - return $this->cachedUsers[$uid]; + + $user = new User($uid, $backend, $this, $this->config); + if ($cacheUser) { + $this->cachedUsers[$uid] = $user; + } + return $user; } /** @@ -335,11 +340,11 @@ class Manager extends PublicEmitter implements IUserManager { $offset = 0; do { $users = $backend->getUsers($search, $limit, $offset); - foreach ($users as $user) { - $user = $this->get($user); - if (is_null($user)) { + foreach ($users as $uid) { + if (!$backend->userExists($uid)) { continue; } + $user = $this->getUserObject($uid, $backend, false); $return = $callback($user); if ($return === false) { break; |