summaryrefslogtreecommitdiffstats
path: root/library/X509/SqlFilter.php
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-28 12:47:35 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-28 12:47:35 +0000
commit5f112e7d0464d98282443b78870cdccabe42aae9 (patch)
treeaac24e989ceebb84c04de382960608c3fcef7313 /library/X509/SqlFilter.php
parentInitial commit. (diff)
downloadicingaweb2-module-x509-5f112e7d0464d98282443b78870cdccabe42aae9.tar.xz
icingaweb2-module-x509-5f112e7d0464d98282443b78870cdccabe42aae9.zip
Adding upstream version 1:1.1.2.upstream/1%1.1.2upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'library/X509/SqlFilter.php')
-rw-r--r--library/X509/SqlFilter.php84
1 files changed, 84 insertions, 0 deletions
diff --git a/library/X509/SqlFilter.php b/library/X509/SqlFilter.php
new file mode 100644
index 0000000..40da0d9
--- /dev/null
+++ b/library/X509/SqlFilter.php
@@ -0,0 +1,84 @@
+<?php
+// Icinga Web 2 X.509 Module | (c) 2018 Icinga GmbH | GPLv2
+
+namespace Icinga\Module\X509;
+
+use ReflectionClass;
+use Icinga\Data\ConfigObject;
+use Icinga\Data\Db\DbConnection;
+use Icinga\Data\Filter\Filter;
+use ipl\Sql\Select;
+
+/**
+ * @internal
+ */
+class Quoter
+{
+ public function quote($identifier, $quoteCharacter = '"')
+ {
+ if (strlen($quoteCharacter) === 1) {
+ return $quoteCharacter . $identifier . $quoteCharacter;
+ } else {
+ return $quoteCharacter[0] . $identifier . $quoteCharacter[1];
+ }
+ }
+}
+
+/**
+ * @internal
+ */
+class NoImplicitConnectDbConnection extends DbConnection
+{
+ protected $renderFilterCallback;
+
+ public function __construct(ConfigObject $config = null)
+ {
+ }
+
+ public function setRenderFilterCallback(callable $callback = null)
+ {
+ $this->renderFilterCallback = $callback;
+
+ return $this;
+ }
+
+ protected function renderFilterExpression(Filter $filter)
+ {
+ $hit = false;
+
+ if (isset($this->renderFilterCallback)) {
+ $hit = call_user_func($this->renderFilterCallback, clone $filter);
+ }
+
+ if ($hit !== false) {
+ $filter = $hit;
+ }
+
+ return parent::renderFilterExpression($filter);
+ }
+}
+
+/**
+ * @internal
+ */
+class SqlFilter
+{
+ public static function apply(Select $select, Filter $filter = null, callable $renderFilterCallback = null)
+ {
+ if ($filter === null || $filter->isEmpty()) {
+ return;
+ }
+
+ if (! $filter->isEmpty()) {
+ $conn = (new NoImplicitConnectDbConnection())->setRenderFilterCallback($renderFilterCallback);
+
+ $reflection = new ReflectionClass('\Icinga\Data\Db\DbConnection');
+
+ $dbAdapter = $reflection->getProperty('dbAdapter');
+ $dbAdapter->setAccessible(true);
+ $dbAdapter->setValue($conn, new Quoter());
+
+ $select->where($conn->renderFilter($filter));
+ }
+ }
+}