Merge pull request #12821 from nextcloud/feature/12767/add-setup-check-for-php-module

Add setup check for recommended PHP modules (i.e. Imagick, intl)
This commit is contained in:
Morris Jobke 2018-12-05 00:34:04 +01:00 committed by GitHub
commit faa988c099
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 76 additions and 21 deletions

View File

@ -324,6 +324,19 @@
type: OC.SetupChecks.MESSAGE_TYPE_INFO type: OC.SetupChecks.MESSAGE_TYPE_INFO
}) })
} }
if (data.recommendedPHPModules.length > 0) {
var listOfRecommendedPHPModules = "";
data.recommendedPHPModules.forEach(function(element){
listOfRecommendedPHPModules += "<li>" + element + "</li>";
});
messages.push({
msg: t(
'core',
'This instance is missing some recommended PHP modules. For improved performance and better compatibility it is highly recommended to install them.'
) + "<ul><code>" + listOfRecommendedPHPModules + "</code></ul>",
type: OC.SetupChecks.MESSAGE_TYPE_INFO
})
}
if (data.isSqliteUsed) { if (data.isSqliteUsed) {
messages.push({ messages.push({
msg: t( msg: t(
@ -340,7 +353,7 @@
type: OC.SetupChecks.MESSAGE_TYPE_WARNING type: OC.SetupChecks.MESSAGE_TYPE_WARNING
}) })
} }
if (data.isPhpMailerUsed) { if (data.isPHPMailerUsed) {
messages.push({ messages.push({
msg: t( msg: t(
'core', 'core',

View File

@ -210,7 +210,8 @@ describe('OC.SetupChecks tests', function() {
diffInSeconds: 0 diffInSeconds: 0
}, },
isMemoryLimitSufficient: true, isMemoryLimitSufficient: true,
appDirsWithDifferentOwner: [] appDirsWithDifferentOwner: [],
recommendedPHPModules: []
}) })
); );
@ -259,7 +260,8 @@ describe('OC.SetupChecks tests', function() {
diffInSeconds: 0 diffInSeconds: 0
}, },
isMemoryLimitSufficient: true, isMemoryLimitSufficient: true,
appDirsWithDifferentOwner: [] appDirsWithDifferentOwner: [],
recommendedPHPModules: []
}) })
); );
@ -309,7 +311,8 @@ describe('OC.SetupChecks tests', function() {
diffInSeconds: 0 diffInSeconds: 0
}, },
isMemoryLimitSufficient: true, isMemoryLimitSufficient: true,
appDirsWithDifferentOwner: [] appDirsWithDifferentOwner: [],
recommendedPHPModules: []
}) })
); );
@ -357,7 +360,8 @@ describe('OC.SetupChecks tests', function() {
diffInSeconds: 0 diffInSeconds: 0
}, },
isMemoryLimitSufficient: true, isMemoryLimitSufficient: true,
appDirsWithDifferentOwner: [] appDirsWithDifferentOwner: [],
recommendedPHPModules: []
}) })
); );
@ -403,7 +407,8 @@ describe('OC.SetupChecks tests', function() {
diffInSeconds: 0 diffInSeconds: 0
}, },
isMemoryLimitSufficient: true, isMemoryLimitSufficient: true,
appDirsWithDifferentOwner: [] appDirsWithDifferentOwner: [],
recommendedPHPModules: []
}) })
); );
@ -451,7 +456,8 @@ describe('OC.SetupChecks tests', function() {
isMemoryLimitSufficient: true, isMemoryLimitSufficient: true,
appDirsWithDifferentOwner: [ appDirsWithDifferentOwner: [
'/some/path' '/some/path'
] ],
recommendedPHPModules: []
}) })
); );
@ -497,7 +503,8 @@ describe('OC.SetupChecks tests', function() {
diffInSeconds: 0 diffInSeconds: 0
}, },
isMemoryLimitSufficient: true, isMemoryLimitSufficient: true,
appDirsWithDifferentOwner: [] appDirsWithDifferentOwner: [],
recommendedPHPModules: []
}) })
); );
@ -543,7 +550,8 @@ describe('OC.SetupChecks tests', function() {
diffInSeconds: 0 diffInSeconds: 0
}, },
isMemoryLimitSufficient: true, isMemoryLimitSufficient: true,
appDirsWithDifferentOwner: [] appDirsWithDifferentOwner: [],
recommendedPHPModules: []
}) })
); );
@ -589,6 +597,7 @@ describe('OC.SetupChecks tests', function() {
diffInSeconds: 0 diffInSeconds: 0
}, },
appDirsWithDifferentOwner: [], appDirsWithDifferentOwner: [],
recommendedPHPModules: [],
isMemoryLimitSufficient: false isMemoryLimitSufficient: false
}) })
); );
@ -656,7 +665,8 @@ describe('OC.SetupChecks tests', function() {
diffInSeconds: 0 diffInSeconds: 0
}, },
isMemoryLimitSufficient: true, isMemoryLimitSufficient: true,
appDirsWithDifferentOwner: [] appDirsWithDifferentOwner: [],
recommendedPHPModules: []
}) })
); );
@ -703,7 +713,8 @@ describe('OC.SetupChecks tests', function() {
diffInSeconds: 0 diffInSeconds: 0
}, },
isMemoryLimitSufficient: true, isMemoryLimitSufficient: true,
appDirsWithDifferentOwner: [] appDirsWithDifferentOwner: [],
recommendedPHPModules: []
}) })
); );
@ -750,7 +761,8 @@ describe('OC.SetupChecks tests', function() {
diffInSeconds: 0 diffInSeconds: 0
}, },
isMemoryLimitSufficient: true, isMemoryLimitSufficient: true,
appDirsWithDifferentOwner: [] appDirsWithDifferentOwner: [],
recommendedPHPModules: []
}) })
); );
@ -797,7 +809,8 @@ describe('OC.SetupChecks tests', function() {
diffInSeconds: 0 diffInSeconds: 0
}, },
isMemoryLimitSufficient: true, isMemoryLimitSufficient: true,
appDirsWithDifferentOwner: [] appDirsWithDifferentOwner: [],
recommendedPHPModules: []
}) })
); );

View File

@ -527,7 +527,7 @@ Raw output
return []; return [];
} }
protected function isPhpMailerUsed(): bool { protected function isPHPMailerUsed(): bool {
return $this->config->getSystemValue('mail_smtpmode', 'smtp') === 'php'; return $this->config->getSystemValue('mail_smtpmode', 'smtp') === 'php';
} }
@ -582,6 +582,27 @@ Raw output
return $appDirsWithDifferentOwner; return $appDirsWithDifferentOwner;
} }
/**
* Checks for potential PHP modules that would improve the instance
*
* @return string[] A list of PHP modules that is recommended
*/
protected function hasRecommendedPHPModules(): array {
$recommendedPHPModules = [];
if (!function_exists('grapheme_strlen')) {
$recommendedPHPModules[] = 'intl';
}
if ($this->config->getAppValue('theming', 'enabled', 'no') === 'yes') {
if (!extension_loaded('imagick')) {
$recommendedPHPModules[] = 'imagick';
}
}
return $recommendedPHPModules;
}
/** /**
* @return DataResponse * @return DataResponse
*/ */
@ -617,10 +638,11 @@ Raw output
'missingIndexes' => $this->hasMissingIndexes(), 'missingIndexes' => $this->hasMissingIndexes(),
'isSqliteUsed' => $this->isSqliteUsed(), 'isSqliteUsed' => $this->isSqliteUsed(),
'databaseConversionDocumentation' => $this->urlGenerator->linkToDocs('admin-db-conversion'), 'databaseConversionDocumentation' => $this->urlGenerator->linkToDocs('admin-db-conversion'),
'isPhpMailerUsed' => $this->isPhpMailerUsed(), 'isPHPMailerUsed' => $this->isPHPMailerUsed(),
'mailSettingsDocumentation' => $this->urlGenerator->getAbsoluteURL('index.php/settings/admin'), 'mailSettingsDocumentation' => $this->urlGenerator->getAbsoluteURL('index.php/settings/admin'),
'isMemoryLimitSufficient' => $this->memoryInfo->isMemoryLimitSufficient(), 'isMemoryLimitSufficient' => $this->memoryInfo->isMemoryLimitSufficient(),
'appDirsWithDifferentOwner' => $this->getAppDirsWithDifferentOwner(), 'appDirsWithDifferentOwner' => $this->getAppDirsWithDifferentOwner(),
'recommendedPHPModules' => $this->hasRecommendedPHPModules(),
] ]
); );
} }

View File

@ -155,9 +155,10 @@ class CheckSetupControllerTest extends TestCase {
'hasFreeTypeSupport', 'hasFreeTypeSupport',
'hasMissingIndexes', 'hasMissingIndexes',
'isSqliteUsed', 'isSqliteUsed',
'isPhpMailerUsed', 'isPHPMailerUsed',
'hasOpcacheLoaded', 'hasOpcacheLoaded',
'getAppDirsWithDifferentOwner', 'getAppDirsWithDifferentOwner',
'hasRecommendedPHPModules',
])->getMock(); ])->getMock();
} }
@ -472,7 +473,7 @@ class CheckSetupControllerTest extends TestCase {
]); ]);
$this->checkSetupController $this->checkSetupController
->expects($this->once()) ->expects($this->once())
->method('isPhpMailerUsed') ->method('isPHPMailerUsed')
->willReturn(false); ->willReturn(false);
$this->checker $this->checker
->expects($this->once()) ->expects($this->once())
@ -487,6 +488,11 @@ class CheckSetupControllerTest extends TestCase {
->method('getAppDirsWithDifferentOwner') ->method('getAppDirsWithDifferentOwner')
->willReturn([]); ->willReturn([]);
$this->checkSetupController
->expects($this->once())
->method('hasRecommendedPHPModules')
->willReturn([]);
$expected = new DataResponse( $expected = new DataResponse(
[ [
'isGetenvServerWorking' => true, 'isGetenvServerWorking' => true,
@ -525,16 +531,17 @@ class CheckSetupControllerTest extends TestCase {
'isSqliteUsed' => false, 'isSqliteUsed' => false,
'databaseConversionDocumentation' => 'http://docs.example.org/server/go.php?to=admin-db-conversion', 'databaseConversionDocumentation' => 'http://docs.example.org/server/go.php?to=admin-db-conversion',
'missingIndexes' => [], 'missingIndexes' => [],
'isPhpMailerUsed' => false, 'isPHPMailerUsed' => false,
'mailSettingsDocumentation' => 'https://server/index.php/settings/admin', 'mailSettingsDocumentation' => 'https://server/index.php/settings/admin',
'isMemoryLimitSufficient' => true, 'isMemoryLimitSufficient' => true,
'appDirsWithDifferentOwner' => [], 'appDirsWithDifferentOwner' => [],
'recommendedPHPModules' => [],
] ]
); );
$this->assertEquals($expected, $this->checkSetupController->check()); $this->assertEquals($expected, $this->checkSetupController->check());
} }
public function testIsPhpMailerUsed() { public function testIsPHPMailerUsed() {
$checkSetupController = $this->getMockBuilder('\OC\Settings\Controller\CheckSetupController') $checkSetupController = $this->getMockBuilder('\OC\Settings\Controller\CheckSetupController')
->setConstructorArgs([ ->setConstructorArgs([
'settings', 'settings',
@ -564,8 +571,8 @@ class CheckSetupControllerTest extends TestCase {
->with('mail_smtpmode', 'smtp') ->with('mail_smtpmode', 'smtp')
->will($this->returnValue('not-php')); ->will($this->returnValue('not-php'));
$this->assertTrue($this->invokePrivate($checkSetupController, 'isPhpMailerUsed')); $this->assertTrue($this->invokePrivate($checkSetupController, 'isPHPMailerUsed'));
$this->assertFalse($this->invokePrivate($checkSetupController, 'isPhpMailerUsed')); $this->assertFalse($this->invokePrivate($checkSetupController, 'isPHPMailerUsed'));
} }
public function testGetCurlVersion() { public function testGetCurlVersion() {