123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355 |
- <?php
- /**
- * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
- * SPDX-FileCopyrightText: 2016 ownCloud, Inc.
- * SPDX-License-Identifier: AGPL-3.0-or-later
- */
- namespace Test;
- use OC_Util;
- /**
- * Class UtilTest
- *
- * @package Test
- * @group DB
- */
- class UtilTest extends \Test\TestCase {
- public function testGetVersion(): void {
- $version = \OCP\Util::getVersion();
- $this->assertTrue(is_array($version));
- foreach ($version as $num) {
- $this->assertTrue(is_int($num));
- }
- }
- public function testSanitizeHTML(): void {
- $badArray = [
- 'While it is unusual to pass an array',
- 'this function actually <blink>supports</blink> it.',
- 'And therefore there needs to be a <script>alert("Unit"+\'test\')</script> for it!',
- [
- 'And It Even May <strong>Nest</strong>',
- ],
- ];
- $goodArray = [
- 'While it is unusual to pass an array',
- 'this function actually <blink>supports</blink> it.',
- 'And therefore there needs to be a <script>alert("Unit"+'test')</script> for it!',
- [
- 'And It Even May <strong>Nest</strong>'
- ],
- ];
- $result = OC_Util::sanitizeHTML($badArray);
- $this->assertEquals($goodArray, $result);
- $badString = '<img onload="alert(1)" />';
- $result = OC_Util::sanitizeHTML($badString);
- $this->assertEquals('<img onload="alert(1)" />', $result);
- $badString = "<script>alert('Hacked!');</script>";
- $result = OC_Util::sanitizeHTML($badString);
- $this->assertEquals('<script>alert('Hacked!');</script>', $result);
- $goodString = 'This is a good string without HTML.';
- $result = OC_Util::sanitizeHTML($goodString);
- $this->assertEquals('This is a good string without HTML.', $result);
- }
- public function testEncodePath(): void {
- $component = '/§#@test%&^ä/-child';
- $result = OC_Util::encodePath($component);
- $this->assertEquals('/%C2%A7%23%40test%25%26%5E%C3%A4/-child', $result);
- }
- public function testIsNonUTF8Locale(): void {
- // OC_Util::isNonUTF8Locale() assumes escapeshellcmd('§') returns '' with non-UTF-8 locale.
- $locale = setlocale(LC_CTYPE, 0);
- setlocale(LC_CTYPE, 'C');
- $this->assertEquals('', escapeshellcmd('§'));
- $this->assertEquals('\'\'', escapeshellarg('§'));
- setlocale(LC_CTYPE, 'C.UTF-8');
- $this->assertEquals('§', escapeshellcmd('§'));
- $this->assertEquals('\'§\'', escapeshellarg('§'));
- setlocale(LC_CTYPE, $locale);
- }
- public function testFileInfoLoaded(): void {
- $expected = function_exists('finfo_open');
- $this->assertEquals($expected, \OC_Util::fileInfoLoaded());
- }
- /**
- * Host is "localhost" this is a valid for emails,
- * but not for default strict email verification that requires a top level domain.
- * So we check that with strict email verification we fallback to the default
- */
- public function testGetDefaultEmailAddressStrict(): void {
- $email = \OCP\Util::getDefaultEmailAddress('no-reply');
- $this->assertEquals('no-reply@localhost.localdomain', $email);
- }
- /**
- * If no strict email check is enabled "localhost" should validate as a valid email domain
- */
- public function testGetDefaultEmailAddress(): void {
- $config = \OC::$server->getConfig();
- $config->setAppValue('core', 'enforce_strict_email_check', 'no');
- $email = \OCP\Util::getDefaultEmailAddress('no-reply');
- $this->assertEquals('no-reply@localhost', $email);
- $config->deleteAppValue('core', 'enforce_strict_email_check');
- }
- public function testGetDefaultEmailAddressFromConfig(): void {
- $config = \OC::$server->getConfig();
- $config->setSystemValue('mail_domain', 'example.com');
- $email = \OCP\Util::getDefaultEmailAddress('no-reply');
- $this->assertEquals('no-reply@example.com', $email);
- $config->deleteSystemValue('mail_domain');
- }
- public function testGetConfiguredEmailAddressFromConfig(): void {
- $config = \OC::$server->getConfig();
- $config->setSystemValue('mail_domain', 'example.com');
- $config->setSystemValue('mail_from_address', 'owncloud');
- $email = \OCP\Util::getDefaultEmailAddress('no-reply');
- $this->assertEquals('owncloud@example.com', $email);
- $config->deleteSystemValue('mail_domain');
- $config->deleteSystemValue('mail_from_address');
- }
- public function testGetInstanceIdGeneratesValidId(): void {
- \OC::$server->getConfig()->deleteSystemValue('instanceid');
- $instanceId = OC_Util::getInstanceId();
- $this->assertStringStartsWith('oc', $instanceId);
- $matchesRegex = preg_match('/^[a-z0-9]+$/', $instanceId);
- $this->assertSame(1, $matchesRegex);
- }
- /**
- * Test needUpgrade() when the core version is increased
- */
- public function testNeedUpgradeCore(): void {
- $config = \OC::$server->getConfig();
- $oldConfigVersion = $config->getSystemValue('version', '0.0.0');
- $oldSessionVersion = \OC::$server->getSession()->get('OC_Version');
- $this->assertFalse(\OCP\Util::needUpgrade());
- $config->setSystemValue('version', '7.0.0.0');
- \OC::$server->getSession()->set('OC_Version', [7, 0, 0, 1]);
- self::invokePrivate(new \OCP\Util, 'needUpgradeCache', [null]);
- $this->assertTrue(\OCP\Util::needUpgrade());
- $config->setSystemValue('version', $oldConfigVersion);
- \OC::$server->getSession()->set('OC_Version', $oldSessionVersion);
- self::invokePrivate(new \OCP\Util, 'needUpgradeCache', [null]);
- $this->assertFalse(\OCP\Util::needUpgrade());
- }
- public function testCheckDataDirectoryValidity(): void {
- $dataDir = \OC::$server->getTempManager()->getTemporaryFolder();
- touch($dataDir . '/.ncdata');
- $errors = \OC_Util::checkDataDirectoryValidity($dataDir);
- $this->assertEmpty($errors);
- \OCP\Files::rmdirr($dataDir);
- $dataDir = \OC::$server->getTempManager()->getTemporaryFolder();
- // no touch
- $errors = \OC_Util::checkDataDirectoryValidity($dataDir);
- $this->assertNotEmpty($errors);
- \OCP\Files::rmdirr($dataDir);
- $errors = \OC_Util::checkDataDirectoryValidity('relative/path');
- $this->assertNotEmpty($errors);
- }
- protected function setUp(): void {
- parent::setUp();
- \OC_Util::$scripts = [];
- \OC_Util::$styles = [];
- self::invokePrivate(\OCP\Util::class, 'scripts', [[]]);
- self::invokePrivate(\OCP\Util::class, 'scriptDeps', [[]]);
- }
- protected function tearDown(): void {
- parent::tearDown();
- \OC_Util::$scripts = [];
- \OC_Util::$styles = [];
- self::invokePrivate(\OCP\Util::class, 'scripts', [[]]);
- self::invokePrivate(\OCP\Util::class, 'scriptDeps', [[]]);
- }
- public function testAddScript(): void {
- \OCP\Util::addScript('first', 'myFirstJSFile');
- \OCP\Util::addScript('core', 'myFancyJSFile1');
- \OCP\Util::addScript('files', 'myFancyJSFile2', 'core');
- \OCP\Util::addScript('myApp5', 'myApp5JSFile', 'myApp2');
- \OCP\Util::addScript('myApp', 'myFancyJSFile3');
- \OCP\Util::addScript('core', 'myFancyJSFile4');
- // after itself
- \OCP\Util::addScript('core', 'myFancyJSFile5', 'core');
- // add duplicate
- \OCP\Util::addScript('core', 'myFancyJSFile1');
- // dependency chain
- \OCP\Util::addScript('myApp4', 'myApp4JSFile', 'myApp3');
- \OCP\Util::addScript('myApp3', 'myApp3JSFile', 'myApp2');
- \OCP\Util::addScript('myApp2', 'myApp2JSFile', 'myApp');
- \OCP\Util::addScript('core', 'common');
- \OCP\Util::addScript('core', 'main');
- $scripts = \OCP\Util::getScripts();
- // Core should appear first
- $this->assertEquals(
- 0,
- array_search('core/js/common', $scripts, true)
- );
- $this->assertEquals(
- 1,
- array_search('core/js/main', $scripts, true)
- );
- $this->assertEquals(
- 2,
- array_search('core/js/myFancyJSFile1', $scripts, true)
- );
- $this->assertEquals(
- 3,
- array_search('core/js/myFancyJSFile4', $scripts, true)
- );
- // Dependencies should appear before their children
- $this->assertLessThan(
- array_search('files/js/myFancyJSFile2', $scripts, true),
- array_search('core/js/myFancyJSFile3', $scripts, true)
- );
- $this->assertLessThan(
- array_search('myApp2/js/myApp2JSFile', $scripts, true),
- array_search('myApp/js/myFancyJSFile3', $scripts, true)
- );
- $this->assertLessThan(
- array_search('myApp3/js/myApp3JSFile', $scripts, true),
- array_search('myApp2/js/myApp2JSFile', $scripts, true)
- );
- $this->assertLessThan(
- array_search('myApp4/js/myApp4JSFile', $scripts, true),
- array_search('myApp3/js/myApp3JSFile', $scripts, true)
- );
- $this->assertLessThan(
- array_search('myApp5/js/myApp5JSFile', $scripts, true),
- array_search('myApp2/js/myApp2JSFile', $scripts, true)
- );
- // No duplicates
- $this->assertEquals(
- $scripts,
- array_unique($scripts)
- );
- // All scripts still there
- $scripts = [
- 'core/js/common',
- 'core/js/main',
- 'core/js/myFancyJSFile1',
- 'core/js/myFancyJSFile4',
- 'core/js/myFancyJSFile5',
- 'first/l10n/en',
- 'first/js/myFirstJSFile',
- 'files/l10n/en',
- 'files/js/myFancyJSFile2',
- 'myApp/l10n/en',
- 'myApp/js/myFancyJSFile3',
- 'myApp2/l10n/en',
- 'myApp2/js/myApp2JSFile',
- 'myApp5/l10n/en',
- 'myApp5/js/myApp5JSFile',
- 'myApp3/l10n/en',
- 'myApp3/js/myApp3JSFile',
- 'myApp4/l10n/en',
- 'myApp4/js/myApp4JSFile',
- ];
- foreach ($scripts as $script) {
- $this->assertContains($script, $scripts);
- }
- }
- public function testAddScriptCircularDependency(): void {
- \OCP\Util::addScript('circular', 'file1', 'dependency');
- \OCP\Util::addScript('dependency', 'file2', 'circular');
- $scripts = \OCP\Util::getScripts();
- $this->assertContains('circular/js/file1', $scripts);
- $this->assertContains('dependency/js/file2', $scripts);
- }
- public function testAddVendorScript(): void {
- \OC_Util::addVendorScript('core', 'myFancyJSFile1');
- \OC_Util::addVendorScript('myApp', 'myFancyJSFile2');
- \OC_Util::addVendorScript('core', 'myFancyJSFile0', true);
- \OC_Util::addVendorScript('core', 'myFancyJSFile10', true);
- // add duplicate
- \OC_Util::addVendorScript('core', 'myFancyJSFile1');
- $this->assertEquals([
- 'core/vendor/myFancyJSFile10',
- 'core/vendor/myFancyJSFile0',
- 'core/vendor/myFancyJSFile1',
- 'myApp/vendor/myFancyJSFile2',
- ], \OC_Util::$scripts);
- $this->assertEquals([], \OC_Util::$styles);
- }
- public function testAddTranslations(): void {
- \OC_Util::addTranslations('appId', 'de');
- $this->assertEquals([
- 'appId/l10n/de'
- ], \OC_Util::$scripts);
- $this->assertEquals([], \OC_Util::$styles);
- }
- public function testAddStyle(): void {
- \OC_Util::addStyle('core', 'myFancyCSSFile1');
- \OC_Util::addStyle('myApp', 'myFancyCSSFile2');
- \OC_Util::addStyle('core', 'myFancyCSSFile0', true);
- \OC_Util::addStyle('core', 'myFancyCSSFile10', true);
- // add duplicate
- \OC_Util::addStyle('core', 'myFancyCSSFile1');
- $this->assertEquals([], \OC_Util::$scripts);
- $this->assertEquals([
- 'core/css/myFancyCSSFile10',
- 'core/css/myFancyCSSFile0',
- 'core/css/myFancyCSSFile1',
- 'myApp/css/myFancyCSSFile2',
- ], \OC_Util::$styles);
- }
- public function testAddVendorStyle(): void {
- \OC_Util::addVendorStyle('core', 'myFancyCSSFile1');
- \OC_Util::addVendorStyle('myApp', 'myFancyCSSFile2');
- \OC_Util::addVendorStyle('core', 'myFancyCSSFile0', true);
- \OC_Util::addVendorStyle('core', 'myFancyCSSFile10', true);
- // add duplicate
- \OC_Util::addVendorStyle('core', 'myFancyCSSFile1');
- $this->assertEquals([], \OC_Util::$scripts);
- $this->assertEquals([
- 'core/vendor/myFancyCSSFile10',
- 'core/vendor/myFancyCSSFile0',
- 'core/vendor/myFancyCSSFile1',
- 'myApp/vendor/myFancyCSSFile2',
- ], \OC_Util::$styles);
- }
- public function testShortenMultibyteString(): void {
- $this->assertEquals('Short nuff', \OCP\Util::shortenMultibyteString('Short nuff', 255));
- $this->assertEquals('ABC', \OCP\Util::shortenMultibyteString('ABCDEF', 3));
- // each of the characters is 12 bytes
- $this->assertEquals('🙈', \OCP\Util::shortenMultibyteString('🙈🙊🙉', 16, 2));
- }
- }
|