[TikiWiki-commits] [Git][tikiwiki/tiki][master] [FIX] trackerlib: Guard get_tracker_field cache key against non-scalar values
"Victor Emanouilov \(@kroky\) via TikiWiki-cvs" <[email protected]>
| Newsgroups | gmane.comp.cms.tiki.cvs |
|---|---|
| Message-ID | <69b1240c956c_3c1899bc632d9@gitlab-sidekiq-low-urgency-cpu-bound-v2-5758567f7b-6v59j.mail> |
Victor Emanouilov pushed to branch master at Tiki Wiki CMS Groupware / Tiki
Commits:
aa1c6e97 by Domeshow Emmanuel at 2026-03-11T08:05:04+00:00
[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
- - - - -
3 changed files:
- lib/trackers/trackerlib.php
- lib/wiki-plugins/wikiplugin_trackerfilter.php
- lib/wiki-plugins/wikiplugin_trackerlist.php
Changes:
=====================================
lib/trackers/trackerlib.php
=====================================
@@ -1381,6 +1381,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);
@@ -1394,7 +1395,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])) {
@@ -3922,9 +3937,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 {
@@ -3940,7 +3958,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
=====================================
@@ -1002,7 +1002,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
=====================================
@@ -1086,7 +1086,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.
@@ -1932,10 +1944,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/aa1c6e97f0dfe22a7815e6f3d5c8d0a59cfd2d45
--
View it on GitLab: https://gitlab.com/tikiwiki/tiki/-/commit/aa1c6e97f0dfe22a7815e6f3d5c8d0a59cfd2d45
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