diff --git a/library/Icinga/Data/UserSuggestions.php b/library/Icinga/Data/UserSuggestions.php new file mode 100644 index 000000000..6e0d45ee5 --- /dev/null +++ b/library/Icinga/Data/UserSuggestions.php @@ -0,0 +1,159 @@ +userGroupBackend = $userGroupBackend; + + return $this; + } + + /** + * Get User group backend + * + * @return UserGroupBackendInterface + */ + public function getUserGroupBackend(): UserGroupBackendInterface + { + return $this->userGroupBackend; + } + + /** + * Set User group name + * + * @param string $userGroupName + * + * @return $this + */ + public function setUserGroupName(string $userGroupName): self + { + $this->userGroupName = $userGroupName; + + return $this; + } + + /** + * Get User group name + * + * @return string + */ + public function getUserGroupName(): string + { + return $this->userGroupName; + } + + /** + * Get user backends + * + * @return array + */ + public function getUserBackends(): array + { + return $this->userBackends; + } + + /** + * Set user backends + * + * @param array $userBackends + * + * @return $this + */ + public function setUserBackends(array $userBackends): self + { + $this->userBackends = $userBackends; + + return $this; + } + + protected function fetchSuggestions(string $searchTerm, array $exclude = []) + { + $filter = $this->prepareFilter($searchTerm, $exclude); + $suggestions = []; + foreach ($this->getUserBackends() as $userBackend) { + try { + if ($userBackend instanceof DomainAwareInterface) { + $domain = $userBackend->getDomain(); + } else { + $domain = null; + } + + $users = $userBackend->select(['user_name']) + ->limit(self::DEFAULT_LIMIT) + ->applyFilter($filter) + ->fetchColumn(); + + foreach ($users as $userName) { + $userObj = (new User($userName))->setDomain($domain); + $suggestions[] = $userObj->getUsername(); + } + } catch (Exception $e) { + Logger::error($e); + Notification::warning(sprintf( + t('Failed to fetch any users from backend %s. Please check your log'), + $userBackend->getName() + )); + } + } + + return array_unique($suggestions); + } + + /** + * Prepare the filter for db query + * + * @param string $searchTerm + * @param array $exclude + * + * @return Filter + */ + private function prepareFilter(string $searchTerm, array $exclude = []): Filter + { + $filter = Filter::where('user_name', $searchTerm); + + $members = $this->getUserGroupBackend() + ->select() + ->from('group_membership', ['user_name']) + ->where('group_name', $this->getUserGroupName()) + ->fetchColumn(); + + $members = array_merge($members, $exclude); + + if (! empty($members)) { + $filter->andFilter( + Filter::not(Filter::where('user_name', $members)) + ); + } + + return $filter; + } +}