WebReponse: Use values altered in 'WebResponseSetCookie' hook
authorBrad Jorsch <bjorsch@wikimedia.org>
Sun, 8 Jul 2018 19:25:18 +0000 (15:25 -0400)
committerBrad Jorsch <bjorsch@wikimedia.org>
Mon, 9 Jul 2018 15:01:05 +0000 (11:01 -0400)
The 'WebResponseSetCookie' hook is allowed to alter the data for the
cookie being set. We need to actually use those altered values, rather
than setting $cookie and $data earlier in the function.

Bug: T198525
Change-Id: Ia817e3dc5ce17fdcf5057ee5fcb6980baa1333d6

includes/WebResponse.php

index 0e5999d..3a4faf0 100644 (file)
@@ -151,21 +151,19 @@ class WebResponse {
                        $expire = time() + $wgCookieExpiration;
                }
 
-               $cookie = $options['prefix'] . $name;
-               $data = [
-                       'name' => (string)$cookie,
-                       'value' => (string)$value,
-                       'expire' => (int)$expire,
-                       'path' => (string)$options['path'],
-                       'domain' => (string)$options['domain'],
-                       'secure' => (bool)$options['secure'],
-                       'httpOnly' => (bool)$options['httpOnly'],
-               ];
-
                if ( self::$disableForPostSend ) {
+                       $cookie = $options['prefix'] . $name;
                        wfDebugLog( 'cookie', 'ignored post-send cookie {cookie}', 'all', [
                                'cookie' => $cookie,
-                               'data' => $data,
+                               'data' => [
+                                       'name' => (string)$cookie,
+                                       'value' => (string)$value,
+                                       'expire' => (int)$expire,
+                                       'path' => (string)$options['path'],
+                                       'domain' => (string)$options['domain'],
+                                       'secure' => (bool)$options['secure'],
+                                       'httpOnly' => (bool)$options['httpOnly'],
+                               ],
                                'exception' => new RuntimeException( 'Ignored post-send cookie' ),
                        ] );
                        return;
@@ -174,6 +172,19 @@ class WebResponse {
                $func = $options['raw'] ? 'setrawcookie' : 'setcookie';
 
                if ( Hooks::run( 'WebResponseSetCookie', [ &$name, &$value, &$expire, &$options ] ) ) {
+                       // Note: Don't try to move this earlier to reuse it for self::$disableForPostSend,
+                       // we need to use the altered values from the hook here. (T198525)
+                       $cookie = $options['prefix'] . $name;
+                       $data = [
+                               'name' => (string)$cookie,
+                               'value' => (string)$value,
+                               'expire' => (int)$expire,
+                               'path' => (string)$options['path'],
+                               'domain' => (string)$options['domain'],
+                               'secure' => (bool)$options['secure'],
+                               'httpOnly' => (bool)$options['httpOnly'],
+                       ];
+
                        // Per RFC 6265, key is name + domain + path
                        $key = "{$data['name']}\n{$data['domain']}\n{$data['path']}";