Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions lib/private/App/DependencyAnalyzer.php
Original file line number Diff line number Diff line change
Expand Up @@ -227,6 +227,9 @@ private function analyzeLibraries(array $dependencies) {
if (!is_array($libs)) {
$libs = array($libs);
}
if (isset($libs['@value'])) {
$libs = [$libs];
}
foreach ($libs as $lib) {
$libName = $this->getValue($lib);
$libVersion = $this->platform->getLibraryVersion($libName);
Expand Down
39 changes: 28 additions & 11 deletions lib/private/legacy/app.php
Original file line number Diff line number Diff line change
Expand Up @@ -334,9 +334,16 @@ public static function isEnabled($app) {
* This function set an app as enabled in appconfig.
*/
public static function enable($app, $groups = null) {
self::$enabledAppsCache = array(); // flush
self::$enabledAppsCache = []; // flush
if (!Installer::isInstalled($app)) {
$app = self::installApp($app);
} else {
// check for required dependencies
$config = \OC::$server->getConfig();
$l = \OC::$server->getL10N('core');
$info = self::getAppInfo($app);

self::checkAppDependencies($config, $l, $info);
}

$appManager = \OC::$server->getAppManager();
Expand Down Expand Up @@ -1186,16 +1193,7 @@ public static function installApp($app) {
}

// check for required dependencies
$dependencyAnalyzer = new DependencyAnalyzer(new Platform($config), $l);
$missing = $dependencyAnalyzer->analyze($info);
if (!empty($missing)) {
$missingMsg = join(PHP_EOL, $missing);
throw new \Exception(
$l->t('App "%s" cannot be installed because the following dependencies are not fulfilled: %s',
array($info['name'], $missingMsg)
)
);
}
self::checkAppDependencies($config, $l, $info);

$config->setAppValue($app, 'enabled', 'yes');
if (isset($appData['id'])) {
Expand Down Expand Up @@ -1438,4 +1436,23 @@ public static function parseAppInfo(array $data, $lang = null) {

return $data;
}

/**
* @param $config
* @param $l
* @param $info
* @throws Exception
*/
protected static function checkAppDependencies($config, $l, $info) {
$dependencyAnalyzer = new DependencyAnalyzer(new Platform($config), $l);
$missing = $dependencyAnalyzer->analyze($info);
if (!empty($missing)) {
$missingMsg = join(PHP_EOL, $missing);
throw new \Exception(
$l->t('App "%s" cannot be installed because the following dependencies are not fulfilled: %s',
[$info['name'], $missingMsg]
)
);
}
}
}
56 changes: 30 additions & 26 deletions tests/lib/App/DependencyAnalyzerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

namespace Test\App;

use OC;
use OC\App\DependencyAnalyzer;
use OC\App\Platform;
use OCP\IL10N;
use Test\TestCase;
Expand All @@ -22,11 +22,11 @@ class DependencyAnalyzerTest extends TestCase {
/** @var IL10N */
private $l10nMock;

/** @var \OC\App\DependencyAnalyzer */
/** @var DependencyAnalyzer */
private $analyser;

public function setUp() {
$this->platformMock = $this->getMockBuilder('\OC\App\Platform')
$this->platformMock = $this->getMockBuilder(Platform::class)
->disableOriginalConstructor()
->getMock();
$this->platformMock->expects($this->any())
Expand Down Expand Up @@ -67,7 +67,7 @@ public function setUp() {
return vsprintf($text, $parameters);
}));

$this->analyser = new \OC\App\DependencyAnalyzer($this->platformMock, $this->l10nMock);
$this->analyser = new DependencyAnalyzer($this->platformMock, $this->l10nMock);
}

/**
Expand Down Expand Up @@ -101,12 +101,14 @@ public function testPhpVersion($expectedMissing, $minVersion, $maxVersion, $intS

/**
* @dataProvider providesDatabases
* @param $expectedMissing
* @param $databases
*/
public function testDatabases($expectedMissing, $databases) {
$app = array(
'dependencies' => array(
)
);
$app = [
'dependencies' => [
]
];
if (!is_null($databases)) {
$app['dependencies']['database'] = $databases;
}
Expand Down Expand Up @@ -228,28 +230,30 @@ function providesOS() {
* @return array
*/
function providesLibs() {
return array(
return [
// we expect curl to exist
array(array(), 'curl'),
[[], 'curl'],
// we expect abcde to exist
array(array('The library abcde is not available.'), array('abcde')),
[['The library abcde is not available.'], ['abcde']],
// curl in version 100.0 does not exist
array(array('Library curl with a version higher than 100.0 is required - available version 2.3.4.'),
array(array('@attributes' => array('min-version' => '100.0'), '@value' => 'curl'))),
[['Library curl with a version higher than 100.0 is required - available version 2.3.4.'],
[['@attributes' => ['min-version' => '100.0'], '@value' => 'curl']]],
// curl in version 100.0 does not exist
array(array('Library curl with a version lower than 1.0.0 is required - available version 2.3.4.'),
array(array('@attributes' => array('max-version' => '1.0.0'), '@value' => 'curl'))),
array(array('Library curl with a version lower than 2.3.3 is required - available version 2.3.4.'),
array(array('@attributes' => array('max-version' => '2.3.3'), '@value' => 'curl'))),
array(array('Library curl with a version higher than 2.3.5 is required - available version 2.3.4.'),
array(array('@attributes' => array('min-version' => '2.3.5'), '@value' => 'curl'))),
array(array(),
array(array('@attributes' => array('min-version' => '2.3.4', 'max-version' => '2.3.4'), '@value' => 'curl'))),
array(array(),
array(array('@attributes' => array('min-version' => '2.3', 'max-version' => '2.3'), '@value' => 'curl'))),
array(array(),
array(array('@attributes' => array('min-version' => '2', 'max-version' => '2'), '@value' => 'curl'))),
);
[['Library curl with a version lower than 1.0.0 is required - available version 2.3.4.'],
[['@attributes' => ['max-version' => '1.0.0'], '@value' => 'curl']]],
[['Library curl with a version lower than 2.3.3 is required - available version 2.3.4.'],
[['@attributes' => ['max-version' => '2.3.3'], '@value' => 'curl']]],
[['Library curl with a version higher than 2.3.5 is required - available version 2.3.4.'],
[['@attributes' => ['min-version' => '2.3.5'], '@value' => 'curl']]],
[[],
[['@attributes' => ['min-version' => '2.3.4', 'max-version' => '2.3.4'], '@value' => 'curl']]],
[[],
[['@attributes' => ['min-version' => '2.3', 'max-version' => '2.3'], '@value' => 'curl']]],
[[],
[['@attributes' => ['min-version' => '2', 'max-version' => '2'], '@value' => 'curl']]],
[[],
['@attributes' => ['min-version' => '2', 'max-version' => '2'], '@value' => 'curl']],
];
}

/**
Expand Down