From 772895bea128b7b33865d4530311489836c91b96 Mon Sep 17 00:00:00 2001
From: Elmar Ludwig <elmar.ludwig@uni-osnabrueck.de>
Date: Tue, 28 Mar 2023 07:38:26 +0000
Subject: [PATCH] require Closure instead of callable, fixes #2446

Closes #2446

Merge request studip/studip!1669
---
 vendor/exTpl/Expression.php    |  2 +-
 vendor/exTpl/Template.php      |  5 ++++-
 vendor/exTpl/template_test.php | 10 +++++++---
 3 files changed, 12 insertions(+), 5 deletions(-)

diff --git a/vendor/exTpl/Expression.php b/vendor/exTpl/Expression.php
index ced08b59a68..35ea4581001 100644
--- a/vendor/exTpl/Expression.php
+++ b/vendor/exTpl/Expression.php
@@ -320,7 +320,7 @@ class FunctionExpression implements Expression
             $arguments[] = $expr->value($context);
         }
 
-        if (is_callable($callable)) {
+        if ($callable instanceof \Closure) {
             return call_user_func_array($callable, $arguments);
         }
 
diff --git a/vendor/exTpl/Template.php b/vendor/exTpl/Template.php
index 0be46bf85ff..9d5be04be15 100644
--- a/vendor/exTpl/Template.php
+++ b/vendor/exTpl/Template.php
@@ -49,7 +49,10 @@ class Template
     public function __construct($string)
     {
         $this->template = new ArrayNode();
-        $this->functions = array('count' => 'count', 'strlen' => 'mb_strlen');
+        $this->functions = array(
+            'count' => function($a) { return count($a); },
+            'strlen' => function($a) { return mb_strlen($a); }
+        );
         self::parseTemplate($this->template, $string, 0);
     }
 
diff --git a/vendor/exTpl/template_test.php b/vendor/exTpl/template_test.php
index b794a820a1b..62aee1c555b 100644
--- a/vendor/exTpl/template_test.php
+++ b/vendor/exTpl/template_test.php
@@ -168,8 +168,12 @@ class template_test extends PHPUnit\Framework\TestCase
 
     public function testFilters()
     {
-        $bindings = array('pi' => 3.14159, 'format_number' => 'number_format', 'upper' => 'strtoupper');
-        $template = '{pi|format_number(3) ~ ":" ~ "foobar"|upper}';
+        $bindings = array(
+            'pi' => 3.14159,
+            'format' => function($a, $b) { return number_format($a, $b); },
+            'upper' => function($a) { return strtoupper($a); }
+        );
+        $template = '{pi|format(3) ~ ":" ~ "foobar"|upper}';
         $expected = '3.142:FOOBAR';
         $tmpl_obj = new Template($template);
 
@@ -178,7 +182,7 @@ class template_test extends PHPUnit\Framework\TestCase
 
     public function testRawFilter()
     {
-        $bindings = array('foo' => '<img>', 'upper' => 'strtoupper');
+        $bindings = array('foo' => '<img>', 'upper' => function($a) { return strtoupper($a); });
         $template = '{foo}:{foo|upper|raw}';
         $expected = '&lt;img&gt;:<IMG>';
         $tmpl_obj = new Template($template);
-- 
GitLab