[TikiWiki-commits] [Git][tikiwiki/tiki][27.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 <69b1dd6bbaaa9_3b189f203167f@gitlab-sidekiq-low-urgency-cpu-bound-v2-6d4b95ff96-mbt9t.mail>

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


Commits:
fa37a658 by Domeshow Emmanuel at 2026-03-11T23:16:04+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] 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


(cherry picked from commit 86bec875926966ee5174b2f589028fa181f380d0)

8bbe264b [FIX] trackerlib: Guard get_tracker_field cache key against non-scalar values

Co-authored-by: Domeshow Emmanuel <[email protected]>

See merge request tikiwiki/tiki!9736

- - - - -


3 changed files:

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


Changes:

=====================================
lib/trackers/trackerlib.php
=====================================
@@ -1390,6 +1390,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);
@@ -1404,7 +1405,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])) {
@@ -3953,9 +3968,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 {
@@ -3971,7 +3989,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
=====================================
@@ -993,7 +993,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.
@@ -2043,10 +2055,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/fa37a6583c96d9f7519b82aff5c4a1605e29cdb1

-- 
View it on GitLab: https://gitlab.com/tikiwiki/tiki/-/commit/fa37a6583c96d9f7519b82aff5c4a1605e29cdb1
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.