Bläddra i källkod

ensure PHP opcache gets invalidated, when storing data in file parsed via PHP require

El RIDO 9 månader sedan
förälder
incheckning
6054e99849
3 ändrade filer med 7 tillägg och 10 borttagningar
  1. 1 0
      CHANGELOG.md
  2. 2 0
      lib/Data/Filesystem.php
  3. 4 10
      lib/Persistence/TrafficLimiter.php

+ 1 - 0
CHANGELOG.md

@@ -9,6 +9,7 @@
 * FIXED: Allow pasting a password for decrypting a paste (#1620)
 * FIXED: Allow pasting a password for decrypting a paste (#1620)
 * FIXED: Allow copying the shortened link after using a URL shortener (#1624)
 * FIXED: Allow copying the shortened link after using a URL shortener (#1624)
 * FIXED: URL extraction fails when frame-ancestors is set in CSP (#1644)
 * FIXED: URL extraction fails when frame-ancestors is set in CSP (#1644)
+* FIXED: traffic limiter not working when using Filesystem storage and PHP opcache
 
 
 ## 2.0.0 (2025-07-28)
 ## 2.0.0 (2025-07-28)
 * ADDED: Error logging in database and filesystem backend (#1554)
 * ADDED: Error logging in database and filesystem backend (#1554)

+ 2 - 0
lib/Data/Filesystem.php

@@ -269,6 +269,7 @@ class Filesystem extends AbstractData
     {
     {
         switch ($namespace) {
         switch ($namespace) {
             case 'purge_limiter':
             case 'purge_limiter':
+                opcache_invalidate($this->_path . DIRECTORY_SEPARATOR . 'purge_limiter.php');
                 return $this->_storeString(
                 return $this->_storeString(
                     $this->_path . DIRECTORY_SEPARATOR . 'purge_limiter.php',
                     $this->_path . DIRECTORY_SEPARATOR . 'purge_limiter.php',
                     '<?php' . PHP_EOL . '$GLOBALS[\'purge_limiter\'] = ' . var_export($value, true) . ';'
                     '<?php' . PHP_EOL . '$GLOBALS[\'purge_limiter\'] = ' . var_export($value, true) . ';'
@@ -280,6 +281,7 @@ class Filesystem extends AbstractData
                 );
                 );
             case 'traffic_limiter':
             case 'traffic_limiter':
                 $this->_last_cache[$key] = $value;
                 $this->_last_cache[$key] = $value;
+                opcache_invalidate($this->_path . DIRECTORY_SEPARATOR . 'traffic_limiter.php');
                 return $this->_storeString(
                 return $this->_storeString(
                     $this->_path . DIRECTORY_SEPARATOR . 'traffic_limiter.php',
                     $this->_path . DIRECTORY_SEPARATOR . 'traffic_limiter.php',
                     '<?php' . PHP_EOL . '$GLOBALS[\'traffic_limiter\'] = ' . var_export($this->_last_cache, true) . ';'
                     '<?php' . PHP_EOL . '$GLOBALS[\'traffic_limiter\'] = ' . var_export($this->_last_cache, true) . ';'

+ 4 - 10
lib/Persistence/TrafficLimiter.php

@@ -204,16 +204,10 @@ class TrafficLimiter extends AbstractPersistence
         $now  = time();
         $now  = time();
         $tl   = (int) self::$_store->getValue('traffic_limiter', $hash);
         $tl   = (int) self::$_store->getValue('traffic_limiter', $hash);
         self::$_store->purgeValues('traffic_limiter', $now - self::$_limit);
         self::$_store->purgeValues('traffic_limiter', $now - self::$_limit);
-        if ($tl > 0 && ($tl + self::$_limit >= $now)) {
-            $result = false;
-        } else {
-            $tl     = time();
-            $result = true;
-        }
-        if (!self::$_store->setValue((string) $tl, 'traffic_limiter', $hash)) {
-            error_log('failed to store the traffic limiter, it probably contains outdated information');
-        }
-        if ($result) {
+        if ($tl === 0 || ($tl + self::$_limit) < $now) {
+            if (!self::$_store->setValue((string) $now, 'traffic_limiter', $hash)) {
+                error_log('failed to store the traffic limiter, it probably contains outdated information');
+            }
             return true;
             return true;
         }
         }
         throw new Exception(I18n::_(
         throw new Exception(I18n::_(