PluginProbe
404 Solution / trunk
404 Solution vtrunk
4.3.5 4.3.4 4.3.3 4.3.2 4.3.1 4.3.0 4.2.0 4.1.19 4.1.18 4.1.17 4.1.16 4.1.15 4.1.13 4.1.12 4.1.11 4.1.10 4.1.9 4.1.8 4.1.7 4.1.6 4.1.5 4.1.4 4.1.3 trunk 2.30.0 All 109 releases
404-solution / includes / services / PreviousRequestCookieTracker.php

PreviousRequestCookieTracker.php in 404 Solution trunk, at includes/services/PreviousRequestCookieTracker.php

74 lines 2.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 if (!defined('ABSPATH')) {
4 exit;
5 }
6
7 /**
8 * Tracks the prior frontend request used by redirect loop prevention.
9 */
10 class ABJ_404_Solution_PreviousRequestCookieTracker {
11
12 /** @var ABJ_404_Solution_Logging */
13 private $logger;
14
15 /**
16 * @param ABJ_404_Solution_Logging|null $logging
17 */
18 function __construct($logging = null) {
19 $this->logger = $logging !== null ? $logging : abj_service('logging');
20 }
21
22 /** @return string */
23 function readCookieWithPreviousRqeuestShort(): string {
24 $cookieName = ABJ404_PP . '_REQUEST_URI';
25 $cookieNameShort = $cookieName . '_SHORT';
26
27 if (array_key_exists($cookieNameShort, $_COOKIE) &&
28 array_key_exists($cookieName, $_COOKIE) &&
29 is_scalar($_COOKIE[$cookieName])) {
30 return (string)$_COOKIE[$cookieName];
31 }
32
33 return '';
34 }
35
36 /** @return void */
37 function setCookieWithPreviousRequest(): void {
38 $requestUri = isset($_SERVER['REQUEST_URI']) && is_string($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : '';
39 $requestedUrlRaw = abj_service('sanitizer')->normalizeUrlString($requestUri);
40 $requestedUrlCleaned = preg_replace('/\?.*$/', '', $requestedUrlRaw);
41 $requestedUrl = is_string($requestedUrlCleaned) ? $requestedUrlCleaned : $requestedUrlRaw;
42
43 $cookieName = ABJ404_PP . '_REQUEST_URI';
44 $cookieNameShort = $cookieName . '_SHORT';
45 try {
46 setcookie($cookieName, $requestedUrl, abj_clock()->now() + (60 * 4), "/");
47 setcookie($cookieNameShort, $requestedUrl, abj_clock()->now() + (5), "/");
48
49 if (!isset($_COOKIE[$cookieName . '_UPDATE_URL']) ||
50 empty($_COOKIE[$cookieName . '_UPDATE_URL'])) {
51 $updateUrlRaw = abj_service('sanitizer')->normalizeUrlString($requestUri);
52 $updateUrlCleaned = preg_replace('/\?.*$/', '', $updateUrlRaw);
53 $updateUrl = is_string($updateUrlCleaned) ? $updateUrlCleaned : $updateUrlRaw;
54 setcookie($cookieName . '_UPDATE_URL', $updateUrl, abj_clock()->now() + (60 * 4), "/");
55 }
56
57 } catch (Exception $e) {
58 $this->logger->debugMessage("There was an issue setting a cookie: " . $e->getMessage());
59 $expireTime = date("D, d M Y H:i:s T", abj_clock()->now() + (60 * 4));
60 $template = ABJ_404_Solution_FileSystemService::readFileContents(
61 dirname(__DIR__) . '/html/previousRequestCookieFallbackScript.html',
62 false
63 );
64 echo "\n" . str_replace(
65 array('{cookie_name}', '{requested_url}', '{expires}'),
66 array(esc_js($cookieName), esc_js($requestedUrl), esc_js($expireTime)),
67 $template
68 ) . "\n";
69 }
70
71 abj_service('request_context')->requested_url = $requestedUrl;
72 }
73 }
74