Skip to content

Commit 2b4a8de

Browse files
Refactor search functionality to use SearchColumnProviderHook for custom variable retrieval and added new SearchColumnProviderHook class
1 parent 02e6fb0 commit 2b4a8de

5 files changed

Lines changed: 73 additions & 43 deletions

File tree

library/Icingadb/Common/SearchControls.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
namespace Icinga\Module\Icingadb\Common;
66

7+
use Icinga\Module\Icingadb\Hook\SearchColumnsProviderHook;
78
use Icinga\Module\Icingadb\Web\Control\SearchBar\ObjectSuggestions;
89
use ipl\Html\Html;
910
use ipl\Orm\Query;
@@ -40,9 +41,21 @@ public function createSearchBar(Query $query, ...$params): SearchBar
4041
$searchBar->addWrapper(Html::tag('div', ['class' => 'search-controls']));
4142
}
4243

44+
$model = $query->getModel();
45+
$defaultColumns = $model->getSearchColumns();
46+
$columns = SearchColumnsProviderHook::getCustomVarColumns($model, $defaultColumns);
47+
$searchBar->setSearchColumns($columns);
48+
49+
$searchBar->handleRequest(ServerRequest::fromGlobals());
50+
4351
return $searchBar;
4452
}
4553

54+
private function callHandleRequest()
55+
{
56+
return false;
57+
}
58+
4659
/**
4760
* Create and return a ContinueWith
4861
*

library/Icingadb/Hook/CustomVarsRetrieverHook.php

Lines changed: 0 additions & 37 deletions
This file was deleted.
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
<?php
2+
3+
// SPDX-FileCopyrightText: 2026 Icinga GmbH <https://icinga.com>
4+
// SPDX-License-Identifier: GPL-3.0-or-later
5+
6+
namespace Icinga\Module\Icingadb\Hook;
7+
8+
use Icinga\Application\Hook;
9+
use Icinga\Application\Logger;
10+
use ipl\Orm\Model;
11+
use Throwable;
12+
13+
/**
14+
* Hook for providing additional search columns such as custom variables.
15+
*
16+
* This is a first attempt to generalize support for modules to provide additional search columns.
17+
* The end user won't be able to customize the set provided and every global or route search will
18+
* always use them. Any hook implementation must ensure that only columns the user has access to
19+
* and that are valid in the current route are returned. Returning invalid columns may cause errors
20+
* for users. See https://github.com/Icinga/icingadb-web/security/advisories/GHSA-w57j-28jc-8429
21+
* for an example of what can go wrong.
22+
*
23+
* @deprecated This will not be used by any future version without any further notice.
24+
*/
25+
abstract class SearchColumnsProviderHook
26+
{
27+
abstract public function retrieveCustomVars(Model $model): array;
28+
29+
final public static function getCustomVarColumns(Model $model, array $defaultColumns = []): array
30+
{
31+
$columns = $defaultColumns;
32+
33+
$hooks = Hook::all('icingadb/SearchColumnsProvider');
34+
foreach ($hooks as $hook) {
35+
try {
36+
$customVars = $hook->retrieveCustomVars($model);
37+
if (!empty($customVars)) {
38+
$columns = [...$columns, ...$customVars];
39+
}
40+
} catch (Throwable $e) {
41+
Logger::error(
42+
'Error retrieving Custom Vars for %s with table name "%s": %s',
43+
get_class($model),
44+
$model->getTableName(),
45+
$e->getMessage()
46+
);
47+
}
48+
}
49+
50+
return array_unique($columns);
51+
}
52+
}
53+

library/Icingadb/Web/Control/SearchBar/ObjectSuggestions.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
use Generator;
88
use Icinga\Module\Icingadb\Common\Auth;
99
use Icinga\Module\Icingadb\Common\Database;
10-
use Icinga\Module\Icingadb\Hook\CustomVarsRetrieverHook;
10+
use Icinga\Module\Icingadb\Hook\SearchColumnsProviderHook;
1111
use Icinga\Module\Icingadb\Model\Behavior\ReRoute;
1212
use Icinga\Module\Icingadb\Model\CustomvarFlat;
1313
use Icinga\Module\Icingadb\Model\Host;
@@ -133,8 +133,8 @@ protected function createQuickSearchFilter($searchTerm)
133133
$resolver = $model::on($this->getDb())->getResolver();
134134

135135
$quickFilter = Filter::any();
136-
$customVarColumns = CustomVarsRetrieverHook::getCustomVarColumns($model);
137-
$columns = [...$model->getSearchColumns(), ...$customVarColumns];
136+
$defaultColumns = $model->getSearchColumns();
137+
$columns = SearchColumnsProviderHook::getCustomVarColumns($model, $defaultColumns);
138138

139139
foreach ($columns as $column) {
140140
if (strpos($column, '.') === false) {

library/Icingadb/Web/Controller.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
use Icinga\Module\Icingadb\Common\SearchControls;
2323
use Icinga\Module\Icingadb\Data\CsvResultSet;
2424
use Icinga\Module\Icingadb\Data\JsonResultSet;
25-
use Icinga\Module\Icingadb\Hook\CustomVarsRetrieverHook;
25+
use Icinga\Module\Icingadb\Hook\SearchColumnsProviderHook;
2626
use Icinga\Module\Icingadb\Web\Control\GridViewModeSwitcher;
2727
use Icinga\Module\Icingadb\Web\Control\ViewModeSwitcher;
2828
use Icinga\Module\Icingadb\Widget\ItemTable\StateItemTable;
@@ -305,8 +305,9 @@ public function handleSearchRequest(Query $query, array $additionalColumns = [])
305305
protected function prepareSearchFilter(Query $query, string $search, Filter\Any $filter, array $additionalColumns)
306306
{
307307
$model = $query->getModel();
308-
$customVarColumns = CustomVarsRetrieverHook::getCustomVarColumns($model);
309-
$columns = array_merge($model->getSearchColumns(), $additionalColumns, $customVarColumns);
308+
$defaultColumns = $model->getSearchColumns();
309+
$customVarColumns = SearchColumnsProviderHook::getCustomVarColumns($model, $defaultColumns);
310+
$columns = array_merge($additionalColumns, $customVarColumns);
310311
foreach ($columns as $column) {
311312
if (strpos($column, '.') === false) {
312313
$column = $query->getResolver()->qualifyColumn($column, $query->getModel()->getTableName());

0 commit comments

Comments
 (0)