@@ -318,6 +318,11 @@ return array( | |||
'OC\\AppFramework\\Utility\\TimeFactory' => $baseDir . '/lib/private/AppFramework/Utility/TimeFactory.php', | |||
'OC\\AppHelper' => $baseDir . '/lib/private/AppHelper.php', | |||
'OC\\App\\AppManager' => $baseDir . '/lib/private/App/AppManager.php', | |||
'OC\\App\\AppStore\\Bundles\\Bundle' => $baseDir . '/lib/private/App/AppStore/Bundles/Bundle.php', | |||
'OC\\App\\AppStore\\Bundles\\BundleFetcher' => $baseDir . '/lib/private/App/AppStore/Bundles/BundleFetcher.php', | |||
'OC\\App\\AppStore\\Bundles\\CoreBundle' => $baseDir . '/lib/private/App/AppStore/Bundles/CoreBundle.php', | |||
'OC\\App\\AppStore\\Bundles\\EnterpriseBundle' => $baseDir . '/lib/private/App/AppStore/Bundles/EnterpriseBundle.php', | |||
'OC\\App\\AppStore\\Bundles\\GroupwareBundle' => $baseDir . '/lib/private/App/AppStore/Bundles/GroupwareBundle.php', | |||
'OC\\App\\AppStore\\Fetcher\\AppFetcher' => $baseDir . '/lib/private/App/AppStore/Fetcher/AppFetcher.php', | |||
'OC\\App\\AppStore\\Fetcher\\CategoryFetcher' => $baseDir . '/lib/private/App/AppStore/Fetcher/CategoryFetcher.php', | |||
'OC\\App\\AppStore\\Fetcher\\Fetcher' => $baseDir . '/lib/private/App/AppStore/Fetcher/Fetcher.php', | |||
@@ -727,6 +732,7 @@ return array( | |||
'OC\\Repair\\NC11\\FixMountStorages' => $baseDir . '/lib/private/Repair/NC11/FixMountStorages.php', | |||
'OC\\Repair\\NC11\\MoveAvatars' => $baseDir . '/lib/private/Repair/NC11/MoveAvatars.php', | |||
'OC\\Repair\\NC11\\MoveAvatarsBackgroundJob' => $baseDir . '/lib/private/Repair/NC11/MoveAvatarsBackgroundJob.php', | |||
'OC\\Repair\\NC12\\InstallCoreBundle' => $baseDir . '/lib/private/Repair/NC12/InstallCoreBundle.php', | |||
'OC\\Repair\\NC12\\UpdateLanguageCodes' => $baseDir . '/lib/private/Repair/NC12/UpdateLanguageCodes.php', | |||
'OC\\Repair\\OldGroupMembershipShares' => $baseDir . '/lib/private/Repair/OldGroupMembershipShares.php', | |||
'OC\\Repair\\RemoveRootShares' => $baseDir . '/lib/private/Repair/RemoveRootShares.php', |
@@ -348,6 +348,11 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c | |||
'OC\\AppFramework\\Utility\\TimeFactory' => __DIR__ . '/../../..' . '/lib/private/AppFramework/Utility/TimeFactory.php', | |||
'OC\\AppHelper' => __DIR__ . '/../../..' . '/lib/private/AppHelper.php', | |||
'OC\\App\\AppManager' => __DIR__ . '/../../..' . '/lib/private/App/AppManager.php', | |||
'OC\\App\\AppStore\\Bundles\\Bundle' => __DIR__ . '/../../..' . '/lib/private/App/AppStore/Bundles/Bundle.php', | |||
'OC\\App\\AppStore\\Bundles\\BundleFetcher' => __DIR__ . '/../../..' . '/lib/private/App/AppStore/Bundles/BundleFetcher.php', | |||
'OC\\App\\AppStore\\Bundles\\CoreBundle' => __DIR__ . '/../../..' . '/lib/private/App/AppStore/Bundles/CoreBundle.php', | |||
'OC\\App\\AppStore\\Bundles\\EnterpriseBundle' => __DIR__ . '/../../..' . '/lib/private/App/AppStore/Bundles/EnterpriseBundle.php', | |||
'OC\\App\\AppStore\\Bundles\\GroupwareBundle' => __DIR__ . '/../../..' . '/lib/private/App/AppStore/Bundles/GroupwareBundle.php', | |||
'OC\\App\\AppStore\\Fetcher\\AppFetcher' => __DIR__ . '/../../..' . '/lib/private/App/AppStore/Fetcher/AppFetcher.php', | |||
'OC\\App\\AppStore\\Fetcher\\CategoryFetcher' => __DIR__ . '/../../..' . '/lib/private/App/AppStore/Fetcher/CategoryFetcher.php', | |||
'OC\\App\\AppStore\\Fetcher\\Fetcher' => __DIR__ . '/../../..' . '/lib/private/App/AppStore/Fetcher/Fetcher.php', | |||
@@ -757,6 +762,7 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c | |||
'OC\\Repair\\NC11\\FixMountStorages' => __DIR__ . '/../../..' . '/lib/private/Repair/NC11/FixMountStorages.php', | |||
'OC\\Repair\\NC11\\MoveAvatars' => __DIR__ . '/../../..' . '/lib/private/Repair/NC11/MoveAvatars.php', | |||
'OC\\Repair\\NC11\\MoveAvatarsBackgroundJob' => __DIR__ . '/../../..' . '/lib/private/Repair/NC11/MoveAvatarsBackgroundJob.php', | |||
'OC\\Repair\\NC12\\InstallCoreBundle' => __DIR__ . '/../../..' . '/lib/private/Repair/NC12/InstallCoreBundle.php', | |||
'OC\\Repair\\NC12\\UpdateLanguageCodes' => __DIR__ . '/../../..' . '/lib/private/Repair/NC12/UpdateLanguageCodes.php', | |||
'OC\\Repair\\OldGroupMembershipShares' => __DIR__ . '/../../..' . '/lib/private/Repair/OldGroupMembershipShares.php', | |||
'OC\\Repair\\RemoveRootShares' => __DIR__ . '/../../..' . '/lib/private/Repair/RemoveRootShares.php', |
@@ -0,0 +1,66 @@ | |||
<?php | |||
/** | |||
* @copyright Copyright (c) 2017 Lukas Reschke <lukas@statuscode.ch> | |||
* | |||
* @license GNU AGPL version 3 or any later version | |||
* | |||
* This program is free software: you can redistribute it and/or modify | |||
* it under the terms of the GNU Affero General Public License as | |||
* published by the Free Software Foundation, either version 3 of the | |||
* License, or (at your option) any later version. | |||
* | |||
* This program is distributed in the hope that it will be useful, | |||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
* GNU Affero General Public License for more details. | |||
* | |||
* You should have received a copy of the GNU Affero General Public License | |||
* along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
* | |||
*/ | |||
namespace OC\App\AppStore\Bundles; | |||
use OCP\IL10N; | |||
abstract class Bundle { | |||
/** @var IL10N */ | |||
protected $l10n; | |||
/** | |||
* @param IL10N $l10n | |||
*/ | |||
public function __construct(IL10N $l10n) { | |||
$this->l10n = $l10n; | |||
} | |||
/** | |||
* Get the identifier of the bundle | |||
* | |||
* @return string | |||
*/ | |||
public final function getIdentifier() { | |||
return substr(strrchr(get_class($this), '\\'), 1); | |||
} | |||
/** | |||
* Get the name of the bundle | |||
* | |||
* @return string | |||
*/ | |||
public abstract function getName(); | |||
/** | |||
* Get the description of the bundle | |||
* | |||
* @return string | |||
*/ | |||
public abstract function getDescription(); | |||
/** | |||
* Get the list of app identifiers in the bundle | |||
* | |||
* @return array | |||
*/ | |||
public abstract function getAppIdentifiers(); | |||
} |
@@ -0,0 +1,79 @@ | |||
<?php | |||
/** | |||
* @copyright Copyright (c) 2017 Lukas Reschke <lukas@statuscode.ch> | |||
* | |||
* @license GNU AGPL version 3 or any later version | |||
* | |||
* This program is free software: you can redistribute it and/or modify | |||
* it under the terms of the GNU Affero General Public License as | |||
* published by the Free Software Foundation, either version 3 of the | |||
* License, or (at your option) any later version. | |||
* | |||
* This program is distributed in the hope that it will be useful, | |||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
* GNU Affero General Public License for more details. | |||
* | |||
* You should have received a copy of the GNU Affero General Public License | |||
* along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
* | |||
*/ | |||
namespace OC\App\AppStore\Bundles; | |||
use OCP\IL10N; | |||
class BundleFetcher { | |||
/** @var IL10N */ | |||
private $l10n; | |||
/** | |||
* @param IL10N $l10n | |||
*/ | |||
public function __construct(IL10N $l10n) { | |||
$this->l10n = $l10n; | |||
} | |||
/** | |||
* @return Bundle[] | |||
*/ | |||
public function getBundles() { | |||
return [ | |||
new EnterpriseBundle($this->l10n), | |||
new GroupwareBundle($this->l10n), | |||
]; | |||
} | |||
/** | |||
* Bundles that should be installed by default after installation | |||
* | |||
* @return Bundle[] | |||
*/ | |||
public function getDefaultInstallationBundle() { | |||
return [ | |||
new CoreBundle($this->l10n), | |||
]; | |||
} | |||
/** | |||
* Get the bundle with the specified identifier | |||
* | |||
* @param string $identifier | |||
* @return Bundle | |||
* @throws \BadMethodCallException If the bundle does not exist | |||
*/ | |||
public function getBundleByIdentifier($identifier) { | |||
/** @var Bundle[] $bundles */ | |||
$bundles = array_merge( | |||
$this->getBundles(), | |||
$this->getDefaultInstallationBundle() | |||
); | |||
foreach($bundles as $bundle) { | |||
if($bundle->getIdentifier() === $identifier) { | |||
return $bundle; | |||
} | |||
} | |||
throw new \BadMethodCallException('Bundle with specified identifier does not exist'); | |||
} | |||
} |
@@ -0,0 +1,49 @@ | |||
<?php | |||
/** | |||
* @copyright Copyright (c) 2017 Lukas Reschke <lukas@statuscode.ch> | |||
* | |||
* @license GNU AGPL version 3 or any later version | |||
* | |||
* This program is free software: you can redistribute it and/or modify | |||
* it under the terms of the GNU Affero General Public License as | |||
* published by the Free Software Foundation, either version 3 of the | |||
* License, or (at your option) any later version. | |||
* | |||
* This program is distributed in the hope that it will be useful, | |||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
* GNU Affero General Public License for more details. | |||
* | |||
* You should have received a copy of the GNU Affero General Public License | |||
* along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
* | |||
*/ | |||
namespace OC\App\AppStore\Bundles; | |||
class CoreBundle extends Bundle { | |||
/** | |||
* {@inheritDoc} | |||
*/ | |||
public function getName() { | |||
return (string)$this->l10n->t('Core bundle'); | |||
} | |||
/** | |||
* {@inheritDoc} | |||
*/ | |||
public function getDescription() { | |||
return (string)$this->l10n->t('Default apps required by Nextcloud'); | |||
} | |||
/** | |||
* {@inheritDoc} | |||
*/ | |||
public function getAppIdentifiers() { | |||
return [ | |||
'bruteforcesettings', | |||
]; | |||
} | |||
} |
@@ -0,0 +1,54 @@ | |||
<?php | |||
/** | |||
* @copyright Copyright (c) 2017 Lukas Reschke <lukas@statuscode.ch> | |||
* | |||
* @license GNU AGPL version 3 or any later version | |||
* | |||
* This program is free software: you can redistribute it and/or modify | |||
* it under the terms of the GNU Affero General Public License as | |||
* published by the Free Software Foundation, either version 3 of the | |||
* License, or (at your option) any later version. | |||
* | |||
* This program is distributed in the hope that it will be useful, | |||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
* GNU Affero General Public License for more details. | |||
* | |||
* You should have received a copy of the GNU Affero General Public License | |||
* along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
* | |||
*/ | |||
namespace OC\App\AppStore\Bundles; | |||
class EnterpriseBundle extends Bundle { | |||
/** | |||
* {@inheritDoc} | |||
*/ | |||
public function getName() { | |||
return (string)$this->l10n->t('Enterprise bundle'); | |||
} | |||
/** | |||
* {@inheritDoc} | |||
*/ | |||
public function getDescription() { | |||
return (string)$this->l10n->t('Apps for the Enterprise.'); | |||
} | |||
/** | |||
* {@inheritDoc} | |||
*/ | |||
public function getAppIdentifiers() { | |||
return [ | |||
'admin_audit', | |||
'user_ldap', | |||
'files_retention', | |||
'files_automatedtagging', | |||
'user_saml', | |||
'files_accesscontrol', | |||
]; | |||
} | |||
} |
@@ -0,0 +1,50 @@ | |||
<?php | |||
/** | |||
* @copyright Copyright (c) 2017 Lukas Reschke <lukas@statuscode.ch> | |||
* | |||
* @license GNU AGPL version 3 or any later version | |||
* | |||
* This program is free software: you can redistribute it and/or modify | |||
* it under the terms of the GNU Affero General Public License as | |||
* published by the Free Software Foundation, either version 3 of the | |||
* License, or (at your option) any later version. | |||
* | |||
* This program is distributed in the hope that it will be useful, | |||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
* GNU Affero General Public License for more details. | |||
* | |||
* You should have received a copy of the GNU Affero General Public License | |||
* along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
* | |||
*/ | |||
namespace OC\App\AppStore\Bundles; | |||
class GroupwareBundle extends Bundle { | |||
/** | |||
* {@inheritDoc} | |||
*/ | |||
public function getName() { | |||
return (string)$this->l10n->t('Groupware bundle'); | |||
} | |||
/** | |||
* {@inheritDoc} | |||
*/ | |||
public function getDescription() { | |||
return (string)$this->l10n->t('Apps for groupware functionalities.'); | |||
} | |||
/** | |||
* {@inheritDoc} | |||
*/ | |||
public function getAppIdentifiers() { | |||
return [ | |||
'calendar', | |||
'contacts', | |||
]; | |||
} | |||
} |
@@ -42,6 +42,8 @@ | |||
namespace OC; | |||
use Doctrine\DBAL\Exception\TableExistsException; | |||
use OC\App\AppManager; | |||
use OC\App\AppStore\Bundles\Bundle; | |||
use OC\App\AppStore\Fetcher\AppFetcher; | |||
use OC\App\CodeChecker\CodeChecker; | |||
use OC\App\CodeChecker\EmptyCheck; | |||
@@ -50,7 +52,9 @@ use OC\Archive\TAR; | |||
use OC_App; | |||
use OC_DB; | |||
use OC_Helper; | |||
use OCP\App\IAppManager; | |||
use OCP\Http\Client\IClientService; | |||
use OCP\IConfig; | |||
use OCP\ILogger; | |||
use OCP\ITempManager; | |||
use phpseclib\File\X509; | |||
@@ -67,21 +71,26 @@ class Installer { | |||
private $tempManager; | |||
/** @var ILogger */ | |||
private $logger; | |||
/** @var IConfig */ | |||
private $config; | |||
/** | |||
* @param AppFetcher $appFetcher | |||
* @param IClientService $clientService | |||
* @param ITempManager $tempManager | |||
* @param ILogger $logger | |||
* @param IConfig $config | |||
*/ | |||
public function __construct(AppFetcher $appFetcher, | |||
IClientService $clientService, | |||
ITempManager $tempManager, | |||
ILogger $logger) { | |||
ILogger $logger, | |||
IConfig $config) { | |||
$this->appFetcher = $appFetcher; | |||
$this->clientService = $clientService; | |||
$this->tempManager = $tempManager; | |||
$this->logger = $logger; | |||
$this->config = $config; | |||
} | |||
/** | |||
@@ -109,6 +118,7 @@ class Installer { | |||
} | |||
} | |||
\OC_App::registerAutoloading($appId, $basedir); | |||
\OC_App::setupBackgroundJobs($info['background-jobs']); | |||
//run appinfo/install.php | |||
@@ -419,6 +429,27 @@ class Installer { | |||
} | |||
/** | |||
* Installs the app within the bundle and marks the bundle as installed | |||
* | |||
* @param Bundle $bundle | |||
* @throws \Exception If app could not get installed | |||
*/ | |||
public function installAppBundle(Bundle $bundle) { | |||
$appIds = $bundle->getAppIdentifiers(); | |||
foreach($appIds as $appId) { | |||
if(!$this->isDownloaded($appId)) { | |||
$this->downloadApp($appId); | |||
} | |||
$this->installApp($appId); | |||
$app = new OC_App(); | |||
$app->enable($appId); | |||
} | |||
$bundles = json_decode($this->config->getAppValue('core', 'installed.bundles', json_encode([])), true); | |||
$bundles[] = $bundle->getIdentifier(); | |||
$this->config->setAppValue('core', 'installed.bundles', json_encode($bundles)); | |||
} | |||
/** | |||
* Installs shipped apps | |||
* |
@@ -30,12 +30,14 @@ | |||
namespace OC; | |||
use OC\App\AppStore\Bundles\BundleFetcher; | |||
use OC\Repair\CleanTags; | |||
use OC\Repair\Collation; | |||
use OC\Repair\MoveUpdaterStepFile; | |||
use OC\Repair\NC11\CleanPreviews; | |||
use OC\Repair\NC11\FixMountStorages; | |||
use OC\Repair\NC11\MoveAvatars; | |||
use OC\Repair\NC12\InstallCoreBundle; | |||
use OC\Repair\NC12\UpdateLanguageCodes; | |||
use OC\Repair\OldGroupMembershipShares; | |||
use OC\Repair\RemoveRootShares; | |||
@@ -136,6 +138,11 @@ class Repair implements IOutput{ | |||
), | |||
new FixMountStorages(\OC::$server->getDatabaseConnection()), | |||
new UpdateLanguageCodes(\OC::$server->getDatabaseConnection(), \OC::$server->getConfig()), | |||
new InstallCoreBundle( | |||
\OC::$server->query(BundleFetcher::class), | |||
\OC::$server->getConfig(), | |||
\OC::$server->query(Installer::class) | |||
) | |||
]; | |||
} | |||
@@ -0,0 +1,78 @@ | |||
<?php | |||
/** | |||
* @copyright Copyright (c) 2017 Lukas Reschke <lukas@statuscode.ch> | |||
* | |||
* @license GNU AGPL version 3 or any later version | |||
* | |||
* This program is free software: you can redistribute it and/or modify | |||
* it under the terms of the GNU Affero General Public License as | |||
* published by the Free Software Foundation, either version 3 of the | |||
* License, or (at your option) any later version. | |||
* | |||
* This program is distributed in the hope that it will be useful, | |||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
* GNU Affero General Public License for more details. | |||
* | |||
* You should have received a copy of the GNU Affero General Public License | |||
* along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
* | |||
*/ | |||
namespace OC\Repair\NC12; | |||
use OC\App\AppStore\Bundles\BundleFetcher; | |||
use OC\Installer; | |||
use OCP\IConfig; | |||
use OCP\Migration\IOutput; | |||
use OCP\Migration\IRepairStep; | |||
class InstallCoreBundle implements IRepairStep { | |||
/** @var BundleFetcher */ | |||
private $bundleFetcher; | |||
/** @var IConfig */ | |||
private $config; | |||
/** @var Installer */ | |||
private $installer; | |||
/** | |||
* @param BundleFetcher $bundleFetcher | |||
* @param IConfig $config | |||
* @param Installer $installer | |||
*/ | |||
public function __construct(BundleFetcher $bundleFetcher, | |||
IConfig $config, | |||
Installer $installer) { | |||
$this->bundleFetcher = $bundleFetcher; | |||
$this->config = $config; | |||
$this->installer = $installer; | |||
} | |||
/** | |||
* {@inheritdoc} | |||
*/ | |||
public function getName() { | |||
return 'Install new core bundle components'; | |||
} | |||
/** | |||
* {@inheritdoc} | |||
*/ | |||
public function run(IOutput $output) { | |||
$versionFromBeforeUpdate = $this->config->getSystemValue('version', '0.0.0'); | |||
if (version_compare($versionFromBeforeUpdate, '12.0.0.14', '>')) { | |||
return; | |||
} | |||
$defaultBundle = $this->bundleFetcher->getDefaultInstallationBundle(); | |||
foreach($defaultBundle as $bundle) { | |||
try { | |||
$this->installer->installAppBundle($bundle); | |||
$output->info('Successfully installed core app bundle.'); | |||
} catch (\Exception $e) { | |||
$output->warning('Could not install core app bundle:' . $e->getMessage()); | |||
} | |||
} | |||
} | |||
} |
@@ -43,6 +43,7 @@ namespace OC; | |||
use bantu\IniGetWrapper\IniGetWrapper; | |||
use OC\App\AppManager; | |||
use OC\App\AppStore\Bundles\BundleFetcher; | |||
use OC\App\AppStore\Fetcher\AppFetcher; | |||
use OC\App\AppStore\Fetcher\CategoryFetcher; | |||
use OC\AppFramework\Http\Request; | |||
@@ -816,7 +817,12 @@ class Server extends ServerContainer implements IServerContainer { | |||
); | |||
}); | |||
$this->registerAlias('MimeTypeLoader', \OCP\Files\IMimeTypeLoader::class); | |||
$this->registerService(BundleFetcher::class, function () { | |||
return new BundleFetcher($this->getL10N('lib')); | |||
}); | |||
$this->registerService(AppFetcher::class, function() { | |||
return $this->getAppFetcher(); | |||
}); | |||
$this->registerService(\OCP\Notification\IManager::class, function (Server $c) { | |||
return new Manager( | |||
$c->query(IValidator::class) |
@@ -41,6 +41,7 @@ namespace OC; | |||
use bantu\IniGetWrapper\IniGetWrapper; | |||
use Exception; | |||
use OC\App\AppStore\Bundles\BundleFetcher; | |||
use OCP\Defaults; | |||
use OCP\IL10N; | |||
use OCP\ILogger; | |||
@@ -63,11 +64,12 @@ class Setup { | |||
/** | |||
* @param SystemConfig $config | |||
* @param IniGetWrapper $iniWrapper | |||
* @param IL10N $l10n | |||
* @param Defaults $defaults | |||
* @param ILogger $logger | |||
* @param ISecureRandom $random | |||
*/ | |||
function __construct(SystemConfig $config, | |||
public function __construct(SystemConfig $config, | |||
IniGetWrapper $iniWrapper, | |||
IL10N $l10n, | |||
Defaults $defaults, | |||
@@ -364,8 +366,22 @@ class Setup { | |||
$group =\OC::$server->getGroupManager()->createGroup('admin'); | |||
$group->addUser($user); | |||
//guess what this does | |||
// Install shipped apps and specified app bundles | |||
Installer::installShippedApps(); | |||
$installer = new Installer( | |||
\OC::$server->getAppFetcher(), | |||
\OC::$server->getHTTPClientService(), | |||
\OC::$server->getTempManager(), | |||
\OC::$server->getLogger(), | |||
\OC::$server->getConfig() | |||
); | |||
$bundleFetcher = new BundleFetcher(\OC::$server->getL10N('lib')); | |||
$defaultInstallationBundles = $bundleFetcher->getDefaultInstallationBundle(); | |||
foreach($defaultInstallationBundles as $bundle) { | |||
try { | |||
$installer->installAppBundle($bundle); | |||
} catch (Exception $e) {} | |||
} | |||
// create empty file in data dir, so we can later find | |||
// out that this is indeed an ownCloud data directory |
@@ -243,11 +243,11 @@ class Updater extends BasicEmitter { | |||
} | |||
// update all shipped apps | |||
$disabledApps = $this->checkAppsRequirements(); | |||
$this->checkAppsRequirements(); | |||
$this->doAppUpgrade(); | |||
// upgrade appstore apps | |||
$this->upgradeAppStoreApps($disabledApps); | |||
$this->upgradeAppStoreApps(\OC::$server->getAppManager()->getInstalledApps()); | |||
// install new shipped apps on upgrade | |||
OC_App::loadApps('authentication'); | |||
@@ -441,7 +441,8 @@ class Updater extends BasicEmitter { | |||
\OC::$server->getAppFetcher(), | |||
\OC::$server->getHTTPClientService(), | |||
\OC::$server->getTempManager(), | |||
$this->log | |||
$this->log, | |||
\OC::$server->getConfig() | |||
); | |||
if (Installer::isUpdateAvailable($app, \OC::$server->getAppFetcher())) { | |||
$this->emit('\OC\Updater', 'upgradeAppStoreApp', [$app]); |
@@ -365,7 +365,8 @@ class OC_App { | |||
\OC::$server->getAppFetcher(), | |||
\OC::$server->getHTTPClientService(), | |||
\OC::$server->getTempManager(), | |||
\OC::$server->getLogger() | |||
\OC::$server->getLogger(), | |||
\OC::$server->getConfig() | |||
); | |||
$isDownloaded = $installer->isDownloaded($appId); | |||
@@ -427,7 +428,8 @@ class OC_App { | |||
\OC::$server->getAppFetcher(), | |||
\OC::$server->getHTTPClientService(), | |||
\OC::$server->getTempManager(), | |||
\OC::$server->getLogger() | |||
\OC::$server->getLogger(), | |||
\OC::$server->getConfig() | |||
); | |||
return $installer->removeApp($app); | |||
} |
@@ -27,6 +27,7 @@ | |||
namespace OC\Settings\Controller; | |||
use OC\App\AppStore\Bundles\BundleFetcher; | |||
use OC\App\AppStore\Fetcher\AppFetcher; | |||
use OC\App\AppStore\Fetcher\CategoryFetcher; | |||
use OC\App\AppStore\Version\VersionParser; | |||
@@ -50,6 +51,7 @@ class AppSettingsController extends Controller { | |||
const CAT_ENABLED = 0; | |||
const CAT_DISABLED = 1; | |||
const CAT_ALL_INSTALLED = 2; | |||
const CAT_APP_BUNDLES = 3; | |||
/** @var \OCP\IL10N */ | |||
private $l10n; | |||
@@ -65,6 +67,8 @@ class AppSettingsController extends Controller { | |||
private $appFetcher; | |||
/** @var IFactory */ | |||
private $l10nFactory; | |||
/** @var BundleFetcher */ | |||
private $bundleFetcher; | |||
/** | |||
* @param string $appName | |||
@@ -76,6 +80,7 @@ class AppSettingsController extends Controller { | |||
* @param CategoryFetcher $categoryFetcher | |||
* @param AppFetcher $appFetcher | |||
* @param IFactory $l10nFactory | |||
* @param BundleFetcher $bundleFetcher | |||
*/ | |||
public function __construct($appName, | |||
IRequest $request, | |||
@@ -85,7 +90,8 @@ class AppSettingsController extends Controller { | |||
IAppManager $appManager, | |||
CategoryFetcher $categoryFetcher, | |||
AppFetcher $appFetcher, | |||
IFactory $l10nFactory) { | |||
IFactory $l10nFactory, | |||
BundleFetcher $bundleFetcher) { | |||
parent::__construct($appName, $request); | |||
$this->l10n = $l10n; | |||
$this->config = $config; | |||
@@ -94,6 +100,7 @@ class AppSettingsController extends Controller { | |||
$this->categoryFetcher = $categoryFetcher; | |||
$this->appFetcher = $appFetcher; | |||
$this->l10nFactory = $l10nFactory; | |||
$this->bundleFetcher = $bundleFetcher; | |||
} | |||
/** | |||
@@ -131,6 +138,7 @@ class AppSettingsController extends Controller { | |||
$formattedCategories = [ | |||
['id' => self::CAT_ALL_INSTALLED, 'ident' => 'installed', 'displayName' => (string)$this->l10n->t('Your apps')], | |||
['id' => self::CAT_ENABLED, 'ident' => 'enabled', 'displayName' => (string)$this->l10n->t('Enabled apps')], | |||
['id' => self::CAT_APP_BUNDLES, 'ident' => 'app-bundles', 'displayName' => (string)$this->l10n->t('App bundles')], | |||
['id' => self::CAT_DISABLED, 'ident' => 'disabled', 'displayName' => (string)$this->l10n->t('Disabled apps')], | |||
]; | |||
$categories = $this->categoryFetcher->get(); | |||
@@ -334,6 +342,23 @@ class AppSettingsController extends Controller { | |||
return ($a < $b) ? -1 : 1; | |||
}); | |||
break; | |||
case 'app-bundles': | |||
$bundles = $this->bundleFetcher->getBundles(); | |||
$apps = []; | |||
foreach($bundles as $bundle) { | |||
$apps[] = [ | |||
'id' => $bundle->getIdentifier(), | |||
'author' => 'Nextcloud', | |||
'name' => $bundle->getName() . ' (' . $bundle->getDescription() .')', | |||
'description' => '', | |||
'internal' => true, | |||
'active' => false, | |||
'removable' => false, | |||
'groups' => [], | |||
'apps' => $bundle->getAppIdentifiers(), | |||
]; | |||
} | |||
break; | |||
default: | |||
$apps = $this->getAppsForCategory($category); | |||
@@ -36,13 +36,20 @@ if ($lastConfirm < (time() - 30 * 60 + 15)) { // allow 15 seconds delay | |||
} | |||
$groups = isset($_POST['groups']) ? (array)$_POST['groups'] : null; | |||
$appIds = isset($_POST['appIds']) ? (array)$_POST['appIds'] : []; | |||
try { | |||
$app = new OC_App(); | |||
$appId = (string)$_POST['appid']; | |||
$appId = OC_App::cleanAppId($appId); | |||
$app->enable($appId, $groups); | |||
OC_JSON::success(['data' => ['update_required' => \OC_App::shouldUpgrade($appId)]]); | |||
$updateRequired = false; | |||
foreach($appIds as $appId) { | |||
$app = new OC_App(); | |||
$appId = OC_App::cleanAppId($appId); | |||
$app->enable($appId, $groups); | |||
if(\OC_App::shouldUpgrade($appId)) { | |||
$updateRequired = true; | |||
} | |||
} | |||
OC_JSON::success(['data' => ['update_required' => $updateRequired]]); | |||
} catch (Exception $e) { | |||
\OCP\Util::writeLog('core', $e->getMessage(), \OCP\Util::ERROR); | |||
OC_JSON::error(array("data" => array("message" => $e->getMessage()) )); |
@@ -44,7 +44,8 @@ try { | |||
\OC::$server->getAppFetcher(), | |||
\OC::$server->getHTTPClientService(), | |||
\OC::$server->getTempManager(), | |||
\OC::$server->getLogger() | |||
\OC::$server->getLogger(), | |||
\OC::$server->getConfig() | |||
); | |||
$result = $installer->updateAppstoreApp($appId); | |||
$config->setSystemValue('maintenance', false); |
@@ -29,6 +29,7 @@ OC.Settings.Apps = OC.Settings.Apps || { | |||
State: { | |||
currentCategory: null, | |||
currentCategoryElements: null, | |||
apps: null, | |||
$updateNotification: null, | |||
availableUpdates: 0 | |||
@@ -90,14 +91,15 @@ OC.Settings.Apps = OC.Settings.Apps || { | |||
}), { | |||
type:'GET', | |||
success: function (apps) { | |||
OC.Settings.Apps.State.currentCategoryElements = apps.apps; | |||
var appListWithIndex = _.indexBy(apps.apps, 'id'); | |||
OC.Settings.Apps.State.apps = appListWithIndex; | |||
var appList = _.map(appListWithIndex, function(app) { | |||
// default values for missing fields | |||
return _.extend({level: 0}, app); | |||
}); | |||
var source | |||
if (categoryId === 'enabled' || categoryId === 'disabled' || categoryId === 'installed') { | |||
var source; | |||
if (categoryId === 'enabled' || categoryId === 'disabled' || categoryId === 'installed' || categoryId === 'app-bundles') { | |||
source = $("#app-template-installed").html(); | |||
$('#apps-list').addClass('installed'); | |||
} else { | |||
@@ -303,6 +305,20 @@ OC.Settings.Apps = OC.Settings.Apps || { | |||
return $.get(OC.generateUrl('apps/files')); | |||
}, | |||
enableAppBundle:function(bundleId, active, element, groups) { | |||
if (OC.PasswordConfirmation.requiresPasswordConfirmation()) { | |||
OC.PasswordConfirmation.requirePasswordConfirmation(_.bind(this.enableAppBundle, this, bundleId, active, element, groups)); | |||
return; | |||
} | |||
var bundles = OC.Settings.Apps.State.currentCategoryElements; | |||
bundles.forEach(function(bundle) { | |||
if(bundle['id'] === bundleId) { | |||
OC.Settings.Apps.enableApp(bundle['apps'], active, element, groups); | |||
} | |||
}); | |||
}, | |||
enableApp:function(appId, active, element, groups) { | |||
if (OC.PasswordConfirmation.requiresPasswordConfirmation()) { | |||
OC.PasswordConfirmation.requirePasswordConfirmation(_.bind(this.enableApp, this, appId, active, element, groups)); | |||
@@ -342,7 +358,14 @@ OC.Settings.Apps = OC.Settings.Apps || { | |||
// TODO: display message to admin to not refresh the page! | |||
// TODO: lock UI to prevent further operations | |||
element.val(t('settings','Enabling app …')); | |||
$.post(OC.filePath('settings','ajax','enableapp.php'),{appid: appId, groups: groups},function(result) { | |||
var appIdArray = []; | |||
if( typeof appId === 'string' ) { | |||
appIdArray = [appId]; | |||
} else { | |||
appIdArray = appId; | |||
} | |||
$.post(OC.filePath('settings','ajax','enableapp.php'),{appIds: appIdArray, groups: groups},function(result) { | |||
if(!result || result.status !== 'success') { | |||
if (result.data && result.data.message) { | |||
OC.Settings.Apps.showErrorMessage(appId, result.data.message); | |||
@@ -777,7 +800,12 @@ OC.Settings.Apps = OC.Settings.Apps || { | |||
var element = $(this); | |||
var active = $(this).data('active'); | |||
OC.Settings.Apps.enableApp(appId, active, element); | |||
var category = $('#app-navigation').attr('data-category'); | |||
if(category === 'app-bundles') { | |||
OC.Settings.Apps.enableAppBundle(appId, active, element); | |||
} else { | |||
OC.Settings.Apps.enableApp(appId, active, element); | |||
} | |||
}); | |||
$(document).on('click', '#apps-list input.uninstall', function () { |
@@ -26,7 +26,7 @@ | |||
// between betas, final and RCs. This is _not_ the public version number. Reset minor/patchlevel | |||
// when updating major/minor version number. | |||
$OC_Version = array(12, 0, 0, 14); | |||
$OC_Version = array(12, 0, 0, 15); | |||
// The human readable string | |||
$OC_VersionString = '12.0 alpha'; |