Below is a differential between the unpatched vulnerable code and the patched update, for reference.
--- a/popup-by-supsystic/classes/Twig/Compiler.php
+++ b/popup-by-supsystic/classes/Twig/Compiler.php
@@ -213,6 +213,7 @@
// when mbstring.func_overload is set to 2
// mb_substr_count() replaces substr_count()
// but they have different signatures!
+ // phpcs:ignore PHPCompatibility.IniDirectives.RemovedIniDirectives.mbstring_func_overloadDeprecated -- ini_get() on a removed directive just returns false on PHP 8+, so this correctly falls through to the substr_count() branch below.
if (((int) ini_get('mbstring.func_overload')) & 2) {
// this is much slower than the "right" version
$this->sourceLine += mb_substr_count(mb_substr($this->source, $this->sourceOffset), "n");
--- a/popup-by-supsystic/classes/Twig/Environment.php
+++ b/popup-by-supsystic/classes/Twig/Environment.php
@@ -81,7 +81,7 @@
* @param Twig_LoaderInterface $loader A Twig_LoaderInterface instance
* @param array $options An array of options
*/
- public function __construct(Twig_LoaderInterface $loader = null, $options = [])
+ public function __construct(?Twig_LoaderInterface $loader = null, $options = [])
{
if (null !== $loader) {
$this->setLoader($loader);
--- a/popup-by-supsystic/classes/Twig/Error.php
+++ b/popup-by-supsystic/classes/Twig/Error.php
@@ -55,7 +55,7 @@
* @param string $filename The template file name where the error occurred
* @param Exception $previous The previous exception
*/
- public function __construct($message, $lineno = -1, $filename = null, Exception $previous = null)
+ public function __construct($message, $lineno = -1, $filename = null, ?Exception $previous = null)
{
if (version_compare(PHP_VERSION, '5.3.0', '<')) {
$this->previous = $previous;
--- a/popup-by-supsystic/classes/Twig/Error/Loader.php
+++ b/popup-by-supsystic/classes/Twig/Error/Loader.php
@@ -24,7 +24,7 @@
*/
class Twig_Error_Loader extends Twig_Error
{
- public function __construct($message, $lineno = -1, $filename = null, Exception $previous = null)
+ public function __construct($message, $lineno = -1, $filename = null, ?Exception $previous = null)
{
parent::__construct($message, false, false, $previous);
}
--- a/popup-by-supsystic/classes/Twig/Extension/Debug.php
+++ b/popup-by-supsystic/classes/Twig/Extension/Debug.php
@@ -61,6 +61,7 @@
var_dump($vars);
} else {
for ($i = 2; $i < $count; $i++) {
+ // phpcs:ignore PHPCompatibility.FunctionUse.ArgumentFunctionsReportCurrentValue.NeedsInspection -- $env (arg 0) is only read (method call), never reassigned, and this loop starts at index 2.
var_dump(func_get_arg($i));
}
}
--- a/popup-by-supsystic/classes/Twig/Lexer.php
+++ b/popup-by-supsystic/classes/Twig/Lexer.php
@@ -89,6 +89,7 @@
*/
public function tokenize($code, $filename = null)
{
+ // phpcs:ignore PHPCompatibility.IniDirectives.RemovedIniDirectives.mbstring_func_overloadDeprecated -- ini_get() on a removed directive just returns false on PHP 8+, so this correctly falls through to the else branch below.
if (function_exists('mb_internal_encoding') && ((int) ini_get('mbstring.func_overload')) & 2) {
$mbEncoding = mb_internal_encoding();
mb_internal_encoding('ASCII');
--- a/popup-by-supsystic/classes/Twig/Markup.php
+++ b/popup-by-supsystic/classes/Twig/Markup.php
@@ -30,7 +30,7 @@
return $this->content;
}
- public function count()
+ public function count(): int
{
return function_exists('mb_get_info') ? mb_strlen($this->content, $this->charset) : strlen($this->content);
}
--- a/popup-by-supsystic/classes/Twig/Node/Embed.php
+++ b/popup-by-supsystic/classes/Twig/Node/Embed.php
@@ -17,7 +17,7 @@
class Twig_Node_Embed extends Twig_Node_Include
{
// we don't inject the module to avoid node visitors to traverse it twice (as it will be already visited in the main module)
- public function __construct($filename, $index, Twig_Node_Expression $variables = null, $only = false, $ignoreMissing = false, $lineno, $tag = null)
+ public function __construct($filename, $index, ?Twig_Node_Expression $variables = null, $only = false, $ignoreMissing = false, $lineno = 0, $tag = null)
{
parent::__construct(new Twig_Node_Expression_Constant('not_used', $lineno), $variables, $only, $ignoreMissing, $lineno, $tag);
--- a/popup-by-supsystic/classes/Twig/Node/Expression/Array.php
+++ b/popup-by-supsystic/classes/Twig/Node/Expression/Array.php
@@ -51,7 +51,7 @@
return false;
}
- public function addElement(Twig_Node_Expression $value, Twig_Node_Expression $key = null)
+ public function addElement(Twig_Node_Expression $value, ?Twig_Node_Expression $key = null)
{
if (null === $key) {
$key = new Twig_Node_Expression_Constant(++$this->index, $value->getLine());
--- a/popup-by-supsystic/classes/Twig/Node/Expression/BlockReference.php
+++ b/popup-by-supsystic/classes/Twig/Node/Expression/BlockReference.php
@@ -17,7 +17,7 @@
*/
class Twig_Node_Expression_BlockReference extends Twig_Node_Expression
{
- public function __construct(Twig_NodeInterface $name, $asString = false, $lineno, $tag = null)
+ public function __construct(Twig_NodeInterface $name, $asString = false, $lineno = 0, $tag = null)
{
parent::__construct(['name' => $name], ['as_string' => $asString, 'output' => false], $lineno, $tag);
}
--- a/popup-by-supsystic/classes/Twig/Node/Expression/Test.php
+++ b/popup-by-supsystic/classes/Twig/Node/Expression/Test.php
@@ -10,7 +10,7 @@
*/
class Twig_Node_Expression_Test extends Twig_Node_Expression_Call
{
- public function __construct(Twig_NodeInterface $node, $name, Twig_NodeInterface $arguments = null, $lineno)
+ public function __construct(Twig_NodeInterface $node, $name, ?Twig_NodeInterface $arguments = null, $lineno = 0)
{
parent::__construct(['node' => $node, 'arguments' => $arguments], ['name' => $name], $lineno);
}
--- a/popup-by-supsystic/classes/Twig/Node/Expression/Test/Defined.php
+++ b/popup-by-supsystic/classes/Twig/Node/Expression/Test/Defined.php
@@ -23,7 +23,7 @@
*/
class Twig_Node_Expression_Test_Defined extends Twig_Node_Expression_Test
{
- public function __construct(Twig_NodeInterface $node, $name, Twig_NodeInterface $arguments = null, $lineno)
+ public function __construct(Twig_NodeInterface $node, $name, ?Twig_NodeInterface $arguments = null, $lineno = 0)
{
parent::__construct($node, $name, $arguments, $lineno);
--- a/popup-by-supsystic/classes/Twig/Node/For.php
+++ b/popup-by-supsystic/classes/Twig/Node/For.php
@@ -19,7 +19,7 @@
{
protected $loop;
- public function __construct(Twig_Node_Expression_AssignName $keyTarget, Twig_Node_Expression_AssignName $valueTarget, Twig_Node_Expression $seq, Twig_Node_Expression $ifexpr = null, Twig_NodeInterface $body, Twig_NodeInterface $else = null, $lineno, $tag = null)
+ public function __construct(Twig_Node_Expression_AssignName $keyTarget, Twig_Node_Expression_AssignName $valueTarget, Twig_Node_Expression $seq, ?Twig_Node_Expression $ifexpr = null, ?Twig_NodeInterface $body = null, ?Twig_NodeInterface $else = null, $lineno = 0, $tag = null)
{
$body = new Twig_Node([$body, ($this->loop = new Twig_Node_ForLoop($lineno, $tag))]);
--- a/popup-by-supsystic/classes/Twig/Node/If.php
+++ b/popup-by-supsystic/classes/Twig/Node/If.php
@@ -17,7 +17,7 @@
*/
class Twig_Node_If extends Twig_Node
{
- public function __construct(Twig_NodeInterface $tests, Twig_NodeInterface $else = null, $lineno, $tag = null)
+ public function __construct(Twig_NodeInterface $tests, ?Twig_NodeInterface $else = null, $lineno = 0, $tag = null)
{
parent::__construct(['tests' => $tests, 'else' => $else], [], $lineno, $tag);
}
--- a/popup-by-supsystic/classes/Twig/Node/Include.php
+++ b/popup-by-supsystic/classes/Twig/Node/Include.php
@@ -17,7 +17,7 @@
*/
class Twig_Node_Include extends Twig_Node implements Twig_NodeOutputInterface
{
- public function __construct(Twig_Node_Expression $expr, Twig_Node_Expression $variables = null, $only = false, $ignoreMissing = false, $lineno, $tag = null)
+ public function __construct(Twig_Node_Expression $expr, ?Twig_Node_Expression $variables = null, $only = false, $ignoreMissing = false, $lineno = 0, $tag = null)
{
parent::__construct(['expr' => $expr, 'variables' => $variables], ['only' => (bool) $only, 'ignore_missing' => (bool) $ignoreMissing], $lineno, $tag);
}
--- a/popup-by-supsystic/classes/Twig/Node/Module.php
+++ b/popup-by-supsystic/classes/Twig/Node/Module.php
@@ -17,7 +17,7 @@
*/
class Twig_Node_Module extends Twig_Node
{
- public function __construct(Twig_NodeInterface $body, Twig_Node_Expression $parent = null, Twig_NodeInterface $blocks, Twig_NodeInterface $macros, Twig_NodeInterface $traits, $embeddedTemplates, $filename)
+ public function __construct(Twig_NodeInterface $body, ?Twig_Node_Expression $parent = null, ?Twig_NodeInterface $blocks = null, ?Twig_NodeInterface $macros = null, ?Twig_NodeInterface $traits = null, $embeddedTemplates = null, $filename = null)
{
// embedded templates are set as attributes so that they are only visited once by the visitors
parent::__construct(['parent' => $parent, 'body' => $body, 'blocks' => $blocks, 'macros' => $macros, 'traits' => $traits], ['filename' => $filename, 'index' => null, 'embedded_templates' => $embeddedTemplates], 1);
--- a/popup-by-supsystic/classes/Twig/NodeTraverser.php
+++ b/popup-by-supsystic/classes/Twig/NodeTraverser.php
@@ -67,7 +67,7 @@
return $node;
}
- protected function traverseForVisitor(Twig_NodeVisitorInterface $visitor, Twig_NodeInterface $node = null)
+ protected function traverseForVisitor(Twig_NodeVisitorInterface $visitor, ?Twig_NodeInterface $node = null)
{
if (null === $node) {
return;
--- a/popup-by-supsystic/classes/Twig/NodeVisitor/SafeAnalysis.php
+++ b/popup-by-supsystic/classes/Twig/NodeVisitor/SafeAnalysis.php
@@ -112,7 +112,7 @@
return $node;
}
- protected function intersectSafe(array $a = null, array $b = null)
+ protected function intersectSafe(?array $a = null, ?array $b = null)
{
if (null === $a || null === $b) {
return [];
--- a/popup-by-supsystic/classes/Twig/Parser.php
+++ b/popup-by-supsystic/classes/Twig/Parser.php
@@ -286,7 +286,7 @@
$this->embeddedTemplates[] = $template;
}
- public function addImportedSymbol($type, $alias, $name = null, Twig_Node_Expression $node = null)
+ public function addImportedSymbol($type, $alias, $name = null, ?Twig_Node_Expression $node = null)
{
$this->importedSymbols[0][$type][$alias] = ['name' => $name, 'node' => $node];
}
--- a/popup-by-supsystic/classes/dispatcher.php
+++ b/popup-by-supsystic/classes/dispatcher.php
@@ -21,6 +21,7 @@
if ($numArgs > 2) {
$args = [];
for ($i = 1; $i < $numArgs; $i++) {
+ // phpcs:ignore PHPCompatibility.FunctionUse.ArgumentFunctionsReportCurrentValue.Changed -- only $tag (arg 0) is reassigned above; it is never fetched via func_get_arg().
$args[] = func_get_arg($i);
}
} elseif ($numArgs == 2) {
@@ -45,6 +46,7 @@
if (func_num_args() > 2) {
$args = [$tag];
for ($i = 1; $i < func_num_args(); $i++) {
+ // phpcs:ignore PHPCompatibility.FunctionUse.ArgumentFunctionsReportCurrentValue.Changed -- only $tag (arg 0) is reassigned above; it is never fetched via func_get_arg().
$args[] = func_get_arg($i);
}
return call_user_func_array('apply_filters', $args);
--- a/popup-by-supsystic/classes/helpers/mobileDetect.php
+++ b/popup-by-supsystic/classes/helpers/mobileDetect.php
@@ -692,7 +692,7 @@
* @param string $userAgent Inject the User-Agent header. If null, will use HTTP_USER_AGENT
* from the $headers array instead.
*/
- public function __construct(array $headers = null, $userAgent = null)
+ public function __construct(?array $headers = null, $userAgent = null)
{
$this->setHttpHeaders($headers);
$this->setUserAgent($userAgent);
--- a/popup-by-supsystic/classes/helpers/recaptchalib.php
+++ b/popup-by-supsystic/classes/helpers/recaptchalib.php
@@ -242,12 +242,18 @@
function _recaptcha_aes_encrypt($val, $ky)
{
+ // Legacy reCAPTCHA v1 Mailhide feature; unreachable on PHP 7.2+ since the
+ // mcrypt extension no longer exists, so mcrypt_encrypt() is never called
+ // and MCRYPT_* below is never evaluated. Not called anywhere in this plugin.
if (!function_exists('mcrypt_encrypt')) {
die('To use reCAPTCHA Mailhide, you need to have the mcrypt php module installed.');
}
+ // phpcs:ignore PHPCompatibility.Constants.RemovedConstants.mcrypt_mode_cbcDeprecatedRemoved -- unreachable, see guard above.
$mode = MCRYPT_MODE_CBC;
+ // phpcs:ignore PHPCompatibility.Constants.RemovedConstants.mcrypt_rijndael_128DeprecatedRemoved -- unreachable, see guard above.
$enc = MCRYPT_RIJNDAEL_128;
$val = _recaptcha_aes_pad($val);
+ // phpcs:ignore PHPCompatibility.Extensions.RemovedExtensions.mcryptDeprecatedRemoved, PHPCompatibility.FunctionUse.RemovedFunctions.mcrypt_encryptDeprecatedRemoved -- unreachable, see guard above.
return mcrypt_encrypt($enc, $ky, $val, $mode, "