From 3db8f620a48ffcbee654178dc19e2e0447089916 Mon Sep 17 00:00:00 2001
From: Alex Pott <alex.a.pott@googlemail.com>
Date: Sat, 8 Jan 2022 11:07:24 +0000
Subject: [PATCH] Issue #3128982 by davidwbarratt, Spokje, andypost, Barryvdh,
 larowlan, catch, alexpott: Upgrade asm89/stack-cors to ^2.0 to fix
 cacheability

---
 composer.lock                                 | 30 ++++++-------
 .../Metapackage/CoreRecommended/composer.json |  2 +-
 core/composer.json                            |  2 +-
 .../HttpKernel/CorsIntegrationTest.php        | 42 ++++++++++++++++---
 4 files changed, 53 insertions(+), 23 deletions(-)

diff --git a/composer.lock b/composer.lock
index ca0806a233f2..e6f41f52dc3d 100644
--- a/composer.lock
+++ b/composer.lock
@@ -8,36 +8,36 @@
     "packages": [
         {
             "name": "asm89/stack-cors",
-            "version": "1.3.0",
+            "version": "v2.0.5",
             "source": {
                 "type": "git",
                 "url": "https://github.com/asm89/stack-cors.git",
-                "reference": "b9c31def6a83f84b4d4a40d35996d375755f0e08"
+                "reference": "7a198ec737e926eab15d29368fc6fff66772b0e2"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/asm89/stack-cors/zipball/b9c31def6a83f84b4d4a40d35996d375755f0e08",
-                "reference": "b9c31def6a83f84b4d4a40d35996d375755f0e08",
+                "url": "https://api.github.com/repos/asm89/stack-cors/zipball/7a198ec737e926eab15d29368fc6fff66772b0e2",
+                "reference": "7a198ec737e926eab15d29368fc6fff66772b0e2",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.5.9",
-                "symfony/http-foundation": "~2.7|~3.0|~4.0|~5.0",
-                "symfony/http-kernel": "~2.7|~3.0|~4.0|~5.0"
+                "php": "^7.0|^8.0",
+                "symfony/http-foundation": "~2.7|~3.0|~4.0|~5.0|~6.0",
+                "symfony/http-kernel": "~2.7|~3.0|~4.0|~5.0|~6.0"
             },
             "require-dev": {
-                "phpunit/phpunit": "^5.0 || ^4.8.10",
-                "squizlabs/php_codesniffer": "^2.3"
+                "phpunit/phpunit": "^6|^7|^8|^9",
+                "squizlabs/php_codesniffer": "^3.5"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.2-dev"
+                    "dev-master": "2.0-dev"
                 }
             },
             "autoload": {
                 "psr-4": {
-                    "Asm89\\Stack\\": "src/Asm89/Stack/"
+                    "Asm89\\Stack\\": "src/"
                 }
             },
             "notification-url": "https://packagist.org/downloads/",
@@ -58,9 +58,9 @@
             ],
             "support": {
                 "issues": "https://github.com/asm89/stack-cors/issues",
-                "source": "https://github.com/asm89/stack-cors/tree/1.3.0"
+                "source": "https://github.com/asm89/stack-cors/tree/v2.0.5"
             },
-            "time": "2019-12-24T22:41:47+00:00"
+            "time": "2022-01-03T15:27:13+00:00"
         },
         {
             "name": "composer/installers",
@@ -452,10 +452,10 @@
             "dist": {
                 "type": "path",
                 "url": "core",
-                "reference": "7963aa1162a3808d6d854bbba38a125121839b66"
+                "reference": "0c0d32e4674b75c965916f8ec909674a0b9dd3e9"
             },
             "require": {
-                "asm89/stack-cors": "^1.1",
+                "asm89/stack-cors": "^2.0.2",
                 "composer/semver": "^3.0",
                 "doctrine/annotations": "^1.12",
                 "egulias/email-validator": "^2.1.22|^3.0",
diff --git a/composer/Metapackage/CoreRecommended/composer.json b/composer/Metapackage/CoreRecommended/composer.json
index 96e100bfb060..88b05f6b2183 100644
--- a/composer/Metapackage/CoreRecommended/composer.json
+++ b/composer/Metapackage/CoreRecommended/composer.json
@@ -8,7 +8,7 @@
     },
     "require": {
         "drupal/core": "10.0.x-dev",
-        "asm89/stack-cors": "1.3.0",
+        "asm89/stack-cors": "v2.0.5",
         "composer/semver": "3.2.6",
         "doctrine/annotations": "1.13.2",
         "doctrine/lexer": "1.2.1",
diff --git a/core/composer.json b/core/composer.json
index 4c320a030ce9..1e3a3ab50771 100644
--- a/core/composer.json
+++ b/core/composer.json
@@ -42,7 +42,7 @@
         "masterminds/html5": "^2.1",
         "symfony/psr-http-message-bridge": "^2.0",
         "composer/semver": "^3.0",
-        "asm89/stack-cors": "^1.1",
+        "asm89/stack-cors": "^2.0.2",
         "pear/archive_tar": "^1.4.14",
         "psr/log": "^1.0"
     },
diff --git a/core/tests/Drupal/FunctionalTests/HttpKernel/CorsIntegrationTest.php b/core/tests/Drupal/FunctionalTests/HttpKernel/CorsIntegrationTest.php
index be644750a83c..ac21766b0d2d 100644
--- a/core/tests/Drupal/FunctionalTests/HttpKernel/CorsIntegrationTest.php
+++ b/core/tests/Drupal/FunctionalTests/HttpKernel/CorsIntegrationTest.php
@@ -48,21 +48,24 @@ public function testCrossSiteRequest() {
     $this->drupalGet('/test-page', [], ['Origin' => 'http://example.com']);
     $this->assertSession()->statusCodeEquals(200);
     $this->assertSession()->responseHeaderEquals('X-Drupal-Cache', 'MISS');
-    $this->assertSession()->responseHeaderEquals('Access-Control-Allow-Origin', 'http://example.com');
+    $this->assertSession()->responseHeaderEquals('Access-Control-Allow-Origin', '*');
+    $this->assertSession()->responseHeaderNotContains('Vary', 'Origin');
 
     // Fire the same exact request. This time it should be cached.
     $this->drupalGet('/test-page', [], ['Origin' => 'http://example.com']);
     $this->assertSession()->statusCodeEquals(200);
     $this->assertSession()->responseHeaderEquals('X-Drupal-Cache', 'HIT');
-    $this->assertSession()->responseHeaderEquals('Access-Control-Allow-Origin', 'http://example.com');
+    $this->assertSession()->responseHeaderEquals('Access-Control-Allow-Origin', '*');
+    $this->assertSession()->responseHeaderNotContains('Vary', 'Origin');
 
     // Fire a request for a different origin. Verify the CORS header.
     $this->drupalGet('/test-page', [], ['Origin' => 'http://example.org']);
     $this->assertSession()->statusCodeEquals(200);
     $this->assertSession()->responseHeaderEquals('X-Drupal-Cache', 'HIT');
-    $this->assertSession()->responseHeaderEquals('Access-Control-Allow-Origin', 'http://example.org');
+    $this->assertSession()->responseHeaderEquals('Access-Control-Allow-Origin', '*');
+    $this->assertSession()->responseHeaderNotContains('Vary', 'Origin');
 
-    // Configure the CORS stack to allow a specific set of origins.
+    // Configure the CORS stack to allow a specific origin.
     $cors_config['allowedOrigins'] = ['http://example.com'];
 
     $this->setContainerParameter('cors.config', $cors_config);
@@ -71,13 +74,40 @@ public function testCrossSiteRequest() {
     // Fire a request from an origin that isn't allowed.
     /** @var \Symfony\Component\HttpFoundation\Response $response */
     $this->drupalGet('/test-page', [], ['Origin' => 'http://non-valid.com']);
-    $this->assertSession()->statusCodeEquals(403);
-    $this->assertSession()->pageTextContains('Not allowed.');
+    $this->assertSession()->statusCodeEquals(200);
+    $this->assertSession()->responseHeaderEquals('Access-Control-Allow-Origin', 'http://example.com');
+    $this->assertSession()->responseHeaderNotContains('Vary', 'Origin');
 
     // Specify a valid origin.
     $this->drupalGet('/test-page', [], ['Origin' => 'http://example.com']);
     $this->assertSession()->statusCodeEquals(200);
     $this->assertSession()->responseHeaderEquals('Access-Control-Allow-Origin', 'http://example.com');
+    $this->assertSession()->responseHeaderNotContains('Vary', 'Origin');
+
+    // Configure the CORS stack to allow a specific set of origins.
+    $cors_config['allowedOrigins'] = ['http://example.com', 'https://drupal.org'];
+
+    $this->setContainerParameter('cors.config', $cors_config);
+    $this->rebuildContainer();
+
+    // Fire a request from an origin that isn't allowed.
+    /** @var \Symfony\Component\HttpFoundation\Response $response */
+    $this->drupalGet('/test-page', [], ['Origin' => 'http://non-valid.com']);
+    $this->assertSession()->statusCodeEquals(200);
+    $this->assertSession()->responseHeaderEquals('Access-Control-Allow-Origin', NULL);
+    $this->assertSession()->responseHeaderContains('Vary', 'Origin');
+
+    // Specify a valid origin.
+    $this->drupalGet('/test-page', [], ['Origin' => 'http://example.com']);
+    $this->assertSession()->statusCodeEquals(200);
+    $this->assertSession()->responseHeaderEquals('Access-Control-Allow-Origin', 'http://example.com');
+    $this->assertSession()->responseHeaderContains('Vary', 'Origin');
+
+    // Specify a valid origin.
+    $this->drupalGet('/test-page', [], ['Origin' => 'https://drupal.org']);
+    $this->assertSession()->statusCodeEquals(200);
+    $this->assertSession()->responseHeaderEquals('Access-Control-Allow-Origin', 'https://drupal.org');
+    $this->assertSession()->responseHeaderContains('Vary', 'Origin');
 
     // Verify POST still functions with 'Origin' header set to site's domain.
     $origin = \Drupal::request()->getSchemeAndHttpHost();
-- 
GitLab