[TikiWiki-commits] [Git][tikiwiki/tiki][29.x] [FIX] trackerlib: Guard get_tracker_field cache key against non-scalar values

"Domeshow Emmanuel \(@Domeshow\) via TikiWiki-cvs" <[email protected]>
Newsgroups gmane.comp.cms.tiki.cvs
Message-ID <69b1d8b6daa2e_3b18aa74843aa@gitlab-sidekiq-low-urgency-cpu-bound-v2-6d4b95ff96-qp92k.mail>

Domeshow Emmanuel pushed to branch 29.x at Tiki Wiki CMS Groupware / Tiki


Commits:
86bec875 by Domeshow Emmanuel at 2026-03-11T22:55:41+02:00
[FIX] trackerlib: Guard get_tracker_field cache key against non-scalar values
---
* [FIX] trackerlib: Guard get_tracker_field cache key against non-scalar values
---
* [FIX] tracker plugins: Prevent array warnings with composite filters

* [FIX] trackerlib: Skip invalid get_tracker_field lookup for composite filters

See merge request tikiwiki/tiki!9632

(cherry picked from commit aa1c6e97f0dfe22a7815e6f3d5c8d0a59cfd2d45)

See merge request tikiwiki/tiki!9735

- - - - -


3 changed files:

- lib/trackers/trackerlib.php
- lib/wiki-plugins/wikiplugin_trackerfilter.php
- lib/wiki-plugins/wikiplugin_trackerlist.php


Changes:

=====================================
lib/trackers/trackerlib.php
=====================================
@@ -1430,6 +1430,7 @@ class TrackerLib extends TikiLib
                 $fv = $filtervalue;
                 $ev = $exactvalue;
                 $ff = (int) $filterfield;
+                $ff_array = $filterfield;
                 $nb_filtered_fields = 1;
             } else {
                 $nb_filtered_fields = count($filterfield);
@@ -1444,7 +1445,21 @@ class TrackerLib extends TikiLib
                     $ev = ! empty($exactvalue[$i]) ? $exactvalue[$i] : null;
                     $fv = ! empty($filtervalue[$i]) ? $filtervalue[$i] : null;
                 }
-                $filter = $this->get_tracker_field($ff);
+                $isCompositeFilter = is_array($ff_array)
+                    && (
+                        (isset($ff_array['sqlsearch']) && is_array($ff_array['sqlsearch']))
+                        || (isset($ff_array['usersearch']) && is_array($ff_array['usersearch']))
+                    );
+                if ($isCompositeFilter) {
+                    $filter = ['type' => null];
+                } else {
+                    $field = $this->get_tracker_field($ff);
+                    if ($field) {
+                        $filter = $field;
+                    } else {
+                        $filter = ['type' => null];
+                    }
+                }
 
                 // Determine if field is an item list field and postpone filtering till later if so
                 if ($filter["type"] == 'l' && isset($filter['options_array'][2]) && isset($filter['options_array'][2]) && isset($filter['options_array'][3])) {
@@ -3998,9 +4013,12 @@ class TrackerLib extends TikiLib
     public function get_tracker_field($fieldIdOrPermName, $useCache = true)
     {
         static $cache = [];
-        if ($useCache && (is_string($fieldIdOrPermName) || is_int($fieldIdOrPermName)) && isset($cache[$fieldIdOrPermName])) {
+        $isCacheableKey = is_string($fieldIdOrPermName) || is_int($fieldIdOrPermName);
+
+        if ($useCache && $isCacheableKey && isset($cache[$fieldIdOrPermName])) {
             return $cache[$fieldIdOrPermName];
         }
+
         if ((int)$fieldIdOrPermName > 0) {
             $res = $this->fields()->fetchFullRow(['fieldId' => (int)$fieldIdOrPermName]);
         } else {
@@ -4016,7 +4034,9 @@ class TrackerLib extends TikiLib
             if (TikiLib::lib('tiki')->isMemoryLow()) {
                 $cache = [];
             }
-            $cache[$fieldIdOrPermName] = $res;
+            if ($isCacheableKey) {
+                $cache[$fieldIdOrPermName] = $res;
+            }
             return $res;
         }
     }


=====================================
lib/wiki-plugins/wikiplugin_trackerfilter.php
=====================================
@@ -1004,7 +1004,17 @@ function wikiplugin_trackerFilter_build_urlquery($params)
     }
     $urlquery = [];
     foreach ($params['filterfield'] as $key => $filter) {
-        $filterfield[] = $filter;
+        if (is_array($filter)) {
+            if (! empty($filter['sqlsearch']) && is_array($filter['sqlsearch'])) {
+                $filterfield[] = '(' . implode(':', $filter['sqlsearch']) . ')';
+            } elseif (! empty($filter['usersearch']) && is_array($filter['usersearch'])) {
+                $filterfield[] = '(' . implode(':', $filter['usersearch']) . ')';
+            } else {
+                continue;
+            }
+        } else {
+            $filterfield[] = $filter;
+        }
         if (! empty($params['exactvalue'][$key]) && empty($params['filtervalue'][$key])) {
             $filtervalue[] = '';
             $exactvalue[] = $params['exactvalue'][$key];


=====================================
lib/wiki-plugins/wikiplugin_trackerlist.php
=====================================
@@ -1114,7 +1114,19 @@ function wikiplugin_trackerlist($data, $params)
         }
 
         if (! empty($filterfield) && ! empty($limit)) {
-            $limit = array_unique(array_merge($limit, $filterfield));
+            $flattenedFilterFields = [];
+            foreach ($filterfield as $ff) {
+                if (is_array($ff)) {
+                    if (! empty($ff['sqlsearch']) && is_array($ff['sqlsearch'])) {
+                        $flattenedFilterFields = array_merge($flattenedFilterFields, $ff['sqlsearch']);
+                    } elseif (! empty($ff['usersearch']) && is_array($ff['usersearch'])) {
+                        $flattenedFilterFields = array_merge($flattenedFilterFields, $ff['usersearch']);
+                    }
+                } else {
+                    $flattenedFilterFields[] = $ff;
+                }
+            }
+            $limit = array_unique(array_merge($limit, $flattenedFilterFields));
         }
 
         // for some reason if param popup is set but empty, the array contains 2 empty elements. We filter them out.
@@ -2031,10 +2043,16 @@ function wikiplugin_trackerlist($data, $params)
             $catfilternotvalue = [];
             if (! empty($filterfield)) {
                 foreach ($filterfield as $k => $ff) {
-                    if (! empty($ff['usersearch'])) {
+                    if (is_array($ff) && (! empty($ff['usersearch']) || ! empty($ff['sqlsearch']))) {
+                        continue;
+                    }
+                    if (! is_scalar($ff)) {
                         continue;
                     }
                     $filterfieldinfo = $trklib->get_tracker_field($ff);
+                    if (! is_array($filterfieldinfo) || ! isset($filterfieldinfo['type'])) {
+                        continue;
+                    }
                     if ($filterfieldinfo['type'] == 'e') {
                         $catfilters[] = $k;
                         if (! empty($filtervalue[$k]) && empty($exactvalue[$k])) {



View it on GitLab: https://gitlab.com/tikiwiki/tiki/-/commit/86bec875926966ee5174b2f589028fa181f380d0

-- 
View it on GitLab: https://gitlab.com/tikiwiki/tiki/-/commit/86bec875926966ee5174b2f589028fa181f380d0
You're receiving this email because of your account on gitlab.com. Manage all notifications: https://gitlab.com/-/profile/notifications | Help: https://gitlab.com/help

_______________________________________________
TikiWiki-cvs mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/tikiwiki-cvs
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.