From 16c9f1f9a54c49d243d3beda2949570f9c5c2dfb Mon Sep 17 00:00:00 2001
From: Tim van Dijen <tvdijen@gmail.com>
Date: Wed, 24 Nov 2021 22:21:56 +0100
Subject: [PATCH] Fix several coding style issues; make phpcs/psalter mandatory
 to pass

---
 .github/workflows/php.yml                     |  4 +-
 lib/SimpleSAML/Locale/Localization.php        |  2 +-
 phpcs.xml                                     |  5 +
 .../XHTML/TemplateTranslationTest.php         | 94 +++++++++++++------
 tests/modules/saml/lib/IdP/SAML2Test.php      | 66 +++++++++----
 5 files changed, 121 insertions(+), 50 deletions(-)

diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml
index 3a855ad06..dcf6388c8 100644
--- a/.github/workflows/php.yml
+++ b/.github/workflows/php.yml
@@ -194,7 +194,7 @@ jobs:
         uses: codecov/codecov-action@v1
 
       - name: PHP Code Sniffer
-        continue-on-error: true
+        continue-on-error: false
         run: php vendor/bin/phpcs
 
       - name: Psalm
@@ -202,5 +202,5 @@ jobs:
         run: php vendor/bin/psalm --show-info=true
 
       - name: Psalter
-        continue-on-error: true
+        continue-on-error: false
         run: php vendor/bin/psalter --issues=UnnecessaryVarAnnotation --dry-run
diff --git a/lib/SimpleSAML/Locale/Localization.php b/lib/SimpleSAML/Locale/Localization.php
index 06b4ccff4..d88127b04 100644
--- a/lib/SimpleSAML/Locale/Localization.php
+++ b/lib/SimpleSAML/Locale/Localization.php
@@ -269,7 +269,7 @@ class Localization
         $this->addDomain($this->localeDir, 'attributes');
 
         list($theme,) = explode(':', $this->configuration->getString('theme.use', 'default'));
-        if($theme !== 'default') {
+        if ($theme !== 'default') {
             $this->addModuleDomain($theme, null, 'attributes');
         }
     }
diff --git a/phpcs.xml b/phpcs.xml
index 328ad8127..5f39d24af 100644
--- a/phpcs.xml
+++ b/phpcs.xml
@@ -14,7 +14,12 @@
     <file>src</file>
     <file>tests</file>
     <file>www</file>
+
     <exclude-pattern>modules/adfs/*</exclude-pattern>
+    <exclude-pattern>www/assets/css/stylesheet.css</exclude-pattern>
+    <exclude-pattern>www/assets/js/bundle.js</exclude-pattern>
+    <exclude-pattern>www/assets/js/logout.js</exclude-pattern>
+    <exclude-pattern>www/assets/js/stylesheet.js</exclude-pattern>
 
     <!-- This is the rule we inherit from. If you want to exlude some specific rules, see the docs on how to do that -->
     <rule ref="PSR12"/>
diff --git a/tests/lib/SimpleSAML/XHTML/TemplateTranslationTest.php b/tests/lib/SimpleSAML/XHTML/TemplateTranslationTest.php
index d4c2db9e2..d94ef5626 100644
--- a/tests/lib/SimpleSAML/XHTML/TemplateTranslationTest.php
+++ b/tests/lib/SimpleSAML/XHTML/TemplateTranslationTest.php
@@ -13,6 +13,9 @@ use SimpleSAML\XHTML\Template;
 use Symfony\Bridge\Twig\Extension\TranslationExtension;
 use Symfony\Component\Finder\Finder;
 use Symfony\Component\Finder\SplFileInfo;
+use Twig\Environment;
+use Twig\Extra\Intl\IntlExtension;
+use Twig\Loader\FilesystemLoader;
 use Twig\TwigFilter;
 use Twig\TwigFunction;
 
@@ -21,7 +24,8 @@ use Twig\TwigFunction;
  */
 class TemplateTranslationTest extends TestCase
 {
-    public function testCoreCardinalityErrorTemplate(): void {
+    public function testCoreCardinalityErrorTemplate(): void
+    {
         $c = Configuration::loadFromArray([], '', 'simplesaml');
         $t = new Template($c, 'core:cardinality_error.twig');
 
@@ -30,18 +34,18 @@ class TemplateTranslationTest extends TestCase
             'test 2' => [1, 2],
         ];
 
-        $getContent = function() {
-            /** @var Template $this */
+        $getContent = function () {
+            /** @var \SimpleSAML\XHTML\Template $this */
             return $this->getContents();
         };
         $html = $getContent->call($t);
 
         $this->assertStringContainsString('got 0 values, want 1', $html);
         $this->assertStringContainsString('got 1 values, want 2', $html);
-
     }
 
-    public function testCoreLoginUserPassTemplate(): void {
+    public function testCoreLoginUserPassTemplate(): void
+    {
         $c = Configuration::loadFromArray([], '', 'simplesaml');
         $t = new Template($c, 'core:loginuserpass.twig');
 
@@ -53,8 +57,8 @@ class TemplateTranslationTest extends TestCase
         $t->data['rememberMeEnabled'] = false;
         $t->data['stateparams'] = [];
 
-        $getContent = function() {
-            /** @var Template $this */
+        $getContent = function () {
+            /** @var \SimpleSAML\XHTML\Template $this */
             return $this->getContents();
         };
         $html = $getContent->call($t);
@@ -62,7 +66,8 @@ class TemplateTranslationTest extends TestCase
         $this->assertStringContainsString('value="h.c oersted"', $html);
     }
 
-    public function testCoreLogoutIframeTemplate(): void {
+    public function testCoreLogoutIframeTemplate(): void
+    {
         $c = Configuration::loadFromArray([], '', 'simplesaml');
         $t = new Template($c, 'core:logout-iframe.twig');
 
@@ -86,8 +91,8 @@ class TemplateTranslationTest extends TestCase
             ],
         ];
 
-        $getContent = function() {
-            /** @var Template $this */
+        $getContent = function () {
+            /** @var \SimpleSAML\XHTML\Template $this */
             return $this->getContents();
         };
         $html = $getContent->call($t);
@@ -96,7 +101,8 @@ class TemplateTranslationTest extends TestCase
         $this->assertStringContainsString('ze missing service', $html);
     }
 
-    public function testAuthStatusTemplate(): void {
+    public function testAuthStatusTemplate(): void
+    {
         $c = Configuration::loadFromArray([], '', 'simplesaml');
         $t = new Template($c, 'auth_status.twig');
 
@@ -106,44 +112,78 @@ class TemplateTranslationTest extends TestCase
         $t->data['trackid'] = '';
         $t->data['authData'] = false;
 
-        $getContent = function() {
-            /** @var Template $this */
+        $getContent = function () {
+            /** @var \SimpleSAML\XHTML\Template $this */
             return $this->getContents();
         };
         $html = $getContent->call($t);
 
-        $this->assertStringContainsString('Your session is valid for ' . $t->data['remaining'] . ' seconds from now.', $html);
+        $this->assertStringContainsString(
+            'Your session is valid for ' . $t->data['remaining'] . ' seconds from now.',
+            $html
+        );
     }
 
-    public function testValidateTwigFiles()
+    public function testValidateTwigFiles(): void
     {
         $root = dirname(dirname((dirname(dirname(__DIR__)))));
 
         // Setup basic twig environment
-        $loader = new \Twig\Loader\FilesystemLoader(['templates', 'modules'], $root);
-        $twig = new \Twig\Environment($loader, ['cache' => false]);
+        $loader = new FilesystemLoader(['templates', 'modules'], $root);
+        $twig = new Environment($loader, ['cache' => false]);
 
         $twigTranslator = new TwigTranslator([Translate::class, 'translateSingularGettext']);
         $twig->addExtension(new TranslationExtension($twigTranslator));
-        $twig->addExtension(new \Twig\Extra\Intl\IntlExtension());
+        $twig->addExtension(new IntlExtension());
 
         // Fake functions
-        $twig->addFunction(new TwigFunction('asset', function() { return ''; }));
-        $twig->addFunction(new TwigFunction('moduleURL', function() { return ''; }));
+        $twig->addFunction(
+            new TwigFunction(
+                'asset',
+                function () {
+                    return '';
+                }
+            )
+        );
+        $twig->addFunction(
+            new TwigFunction(
+                'moduleURL',
+                function () {
+                    return '';
+                }
+            )
+        );
 
         // Fake filters
-        $twig->addFilter(new TwigFilter('translateFromArray', function() { return ''; }, ['needs_context' => true]));
-        $twig->addFilter(new TwigFilter('entityDisplayName', function() { return ''; }));
+        $twig->addFilter(
+            new TwigFilter(
+                'translateFromArray',
+                function () {
+                    return '';
+                },
+                ['needs_context' => true]
+            )
+        );
+        $twig->addFilter(
+            new TwigFilter(
+                'entityDisplayName',
+                function () {
+                    return '';
+                }
+            )
+        );
 
         $files = Finder::create()
             ->name('*.twig')
-            ->in([
-                $root . '/templates',
-                $root . '/modules'
-            ]);
+            ->in(
+                [
+                    $root . '/templates',
+                    $root . '/modules'
+                ]
+            );
 
         foreach ($files as $file) {
-            /** @var SplFileInfo $file */
+            /** @var \Symfony\Component\Finder\SplFileInfo $file */
             $twig->load($file->getRelativePathname());
         }
 
diff --git a/tests/modules/saml/lib/IdP/SAML2Test.php b/tests/modules/saml/lib/IdP/SAML2Test.php
index 1b017fe58..bc4aa2979 100644
--- a/tests/modules/saml/lib/IdP/SAML2Test.php
+++ b/tests/modules/saml/lib/IdP/SAML2Test.php
@@ -5,6 +5,7 @@ declare(strict_types=1);
 namespace SimpleSAML\Test\Module\saml\IdP;
 
 use InvalidArgumentException;
+use SAML2\XML\Chunk;
 use SimpleSAML\Configuration;
 use SimpleSAML\Error\Exception;
 use SimpleSAML\IdP;
@@ -288,8 +289,13 @@ EOT;
         $this->assertArrayHasKey('SingleLogoutService', $hostedMd);
         $this->assertIsArray($hostedMd['SingleLogoutService']);
         $this->assertCount(1, $hostedMd['SingleLogoutService']);
-        $this->assertEquals(['Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect', 
-            'Location' => 'http://localhost/simplesaml/saml2/idp/SingleLogoutService.php'], $hostedMd['SingleLogoutService'][0]);
+        $this->assertEquals(
+            [
+                'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect',
+                'Location' => 'http://localhost/simplesaml/saml2/idp/SingleLogoutService.php'
+            ],
+            $hostedMd['SingleLogoutService'][0]
+        );
 
         $this->assertArrayHasKey('keys', $hostedMd);
         $this->assertIsArray($hostedMd['keys']);
@@ -349,8 +355,14 @@ EOT;
         $this->assertArrayHasKey('ArtifactResolutionService', $hostedMd);
         $this->assertIsArray($hostedMd['ArtifactResolutionService']);
         $this->assertCount(1, $hostedMd['ArtifactResolutionService']);
-        $this->assertEquals(['Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:SOAP', 'index' => 0,
-           'Location' => 'http://localhost/simplesaml/saml2/idp/ArtifactResolutionService.php'], $hostedMd['ArtifactResolutionService'][0]);
+        $this->assertEquals(
+            [
+                'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:SOAP',
+                'index' => 0,
+                'Location' => 'http://localhost/simplesaml/saml2/idp/ArtifactResolutionService.php'
+            ],
+            $hostedMd['ArtifactResolutionService'][0]
+        );
     }
 
     public function testIdPGetHostedMetadataHolderOfKey(): void
@@ -361,9 +373,14 @@ EOT;
         $this->assertArrayHasKey('SingleSignOnService', $hostedMd);
         $this->assertIsArray($hostedMd['SingleSignOnService']);
         $this->assertCount(2, $hostedMd['SingleSignOnService']);
-        $this->assertEquals(['Binding' => 'urn:oasis:names:tc:SAML:2.0:profiles:holder-of-key:SSO:browser',
-            'Location' => 'http://localhost/simplesaml/saml2/idp/SSOService.php',
-            'hoksso:ProtocolBinding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect'], $hostedMd['SingleSignOnService'][0]);
+        $this->assertEquals(
+            [
+                'Binding' => 'urn:oasis:names:tc:SAML:2.0:profiles:holder-of-key:SSO:browser',
+                'Location' => 'http://localhost/simplesaml/saml2/idp/SSOService.php',
+                'hoksso:ProtocolBinding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect'
+            ],
+            $hostedMd['SingleSignOnService'][0]
+        );
         $this->assertEquals(['Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect',
            'Location' => 'http://localhost/simplesaml/saml2/idp/SSOService.php'], $hostedMd['SingleSignOnService'][1]);
     }
@@ -527,19 +544,26 @@ EOT;
     {
         $dom = \SAML2\DOMDocumentFactory::create();
         $republishRequest = $dom->createElementNS('http://eduid.cz/schema/metadata/1.0', 'eduidmd:RepublishRequest');
-        $republishTarget = $dom->createElementNS('http://eduid.cz/schema/metadata/1.0', 'eduidmd:RepublishTarget', 'http://edugain.org/');
+        $republishTarget = $dom->createElementNS(
+            'http://eduid.cz/schema/metadata/1.0',
+            'eduidmd:RepublishTarget',
+            'http://edugain.org/'
+        );
         $republishRequest->appendChild($republishTarget);
-        $ext = [new \SAML2\XML\Chunk($republishRequest)];
+        $ext = [new Chunk($republishRequest)];
 
         $config = [
             'saml:Extensions' => $ext,
-            ];
+        ];
         $md = $this->idpMetadataHandlerHelper($config);
 
         $this->assertArrayHasKey('saml:Extensions', $md);
         $this->assertCount(1, $md['saml:Extensions']);
-        $this->assertInstanceOf(\SAML2\XML\Chunk::class, $md['saml:Extensions'][0]);
-        $this->assertEquals('http://edugain.org/', $md['saml:Extensions'][0]->getXML()->firstChild->firstChild->textContent);
+        $this->assertInstanceOf(Chunk::class, $md['saml:Extensions'][0]);
+        $this->assertEquals(
+            'http://edugain.org/',
+            $md['saml:Extensions'][0]->getXML()->firstChild->firstChild->textContent
+        );
     }
 
     /**
@@ -723,15 +747,17 @@ EOT;
         $globalConfig = [
             'technicalcontact_email' => 'na@example.org',
             'technicalcontact_name' => 'Someone von Somewhere',
-	];
+        ];
 
-        $config = ['contacts' => [
-            [
-               'contactType'       => 'technical',
-               'emailAddress'      => 'j.doe@example.edu',
-               'surName'           => 'Doe',
-            ],
-        ]];
+        $config = [
+            'contacts' => [
+                [
+                    'contactType'       => 'technical',
+                    'emailAddress'      => 'j.doe@example.edu',
+                    'surName'           => 'Doe',
+                ],
+            ]
+        ];
         $md = $this->idpMetadataHandlerHelper($config, $globalConfig);
 
         $this->assertCount(1, $md['contacts']);
-- 
GitLab