public function extend(IcingaDoctrine_Query $query, array $params) { // target, host or service $target = $params["target"]; // alias for the table to join from $alias = $params["alias"]; $this->user = $this->getContext()->getUser()->getNsmUser(); $aliasAbbr = "cv"; $impl = ++Api_Views_Extender_CustomVariableExtenderModel::$impl; switch ($target) { case 'host': $aliasAbbr = "h_cv_{$impl}"; $target = IcingaIPrincipalConstants::TYPE_CUSTOMVAR_HOST; break; case 'service': $aliasAbbr = "s_cv_{$impl}"; $target = IcingaIPrincipalConstants::TYPE_CUSTOMVAR_SERVICE; break; } $targetVals = $this->user->getTargetValues($target, true)->toArray(); if (empty($targetVals)) { return; } $keymap = array("cv_name" => "varname", "cv_value" => "varvalue"); $pairs = array(); $CVcredentials = array(); // build correct array with the data we need foreach ($targetVals as $targetData) { if (isset($targetData["tv_pt_id"]) and isset($targetData["tv_key"])) { $tvid = $targetData["tv_pt_id"]; if ($targetData["tv_key"] == "cv_name") { $CVcredentials[$tvid]["name"] = $targetData["tv_val"]; } else { if ($targetData["tv_key"] == "cv_value") { $CVcredentials[$tvid]["value"] = $targetData["tv_val"]; } } } } // make a join for each CV permission $query->leftJoin("{$alias}.customvariables " . $aliasAbbr); // now we build the sql data foreach ($CVcredentials as $tvid => $cvdata) { // skip incomplete sets if (!isset($cvdata["name"]) || !isset($cvdata["value"])) { continue; } $pairs[] = "({$aliasAbbr}.varname LIKE '" . $cvdata["name"] . "' and {$aliasAbbr}.varvalue LIKE '" . $cvdata["value"] . "')"; } if ($target == IcingaIPrincipalConstants::TYPE_CUSTOMVAR_SERVICE) { $pairs[] = $params["alias"] . '.service_object_id IS NULL'; } $query->orWhere(join(" OR ", $pairs)); }
public function extend(IcingaDoctrine_Query $query, array $params) { $target = $params["target"]; $column = $params["column"]; $ornull = isset($params["ornull"]) && $params["ornull"] == true ? true : false; $user = $this->getContext()->getUser()->getNsmUser(); $targetVals = $user->getTargetValues($target, true)->toArray(); if (empty($targetVals)) { return false; } $dqlParts = array(); $dqlValues = array(); foreach ($targetVals as $currentTarget) { $dqlParts[] = "{$column} LIKE '" . $currentTarget["tv_val"] . "'"; } if ($ornull == true) { $dqlParts[] = "{$column} IS NULL"; } $dql = "(" . implode(" OR ", $dqlParts) . ")"; $query->orWhere($dql); }
private function applyDQLCalls(IcingaDoctrine_Query $query, array $sequence, $targetValues = null, $nr = 0) { if ($targetValues !== null && empty($targetValues)) { return; } AppKitLogger::verbose("Applying dql sequence %s", $sequence); foreach ($sequence as $call) { $call["arg"] = str_replace("{ID}", $nr, $call["arg"]); if (in_array($call["arg"] . $call["type"], $this->dqlHistory)) { continue; } if ($targetValues !== null) { $arg = $this->replaceCredentialTokens($call["arg"], $targetValues); } else { $arg = $this->replaceTokens($call["arg"]); } AppKitLogger::verbose("Applying call query->%s(%s)", $call["type"], $arg); $this->dqlHistory[] = $call["arg"] . $call["type"]; switch ($call["type"]) { case 'select': $query->addSelect($arg); break; case 'innerjoin': case 'join': $query->innerJoin($arg, null); break; case 'leftjoin': $query->leftJoin($arg, null); break; case 'where': case 'andwhere': $query->andWhere($arg); break; case 'orwhere': $query->orWhere($arg); break; case 'limit': $query->limit($arg); break; case 'offset': $query->offset($arg); break; case 'groupby': $query->addGroupBy($arg); break; } AppKitLogger::verbose("After call query->%s(%s): %s ", $call["type"], $arg, $query->getSqlQuery()); } }