2 require_once
'base/Ego_User_Search_Factory.php';
13 $this->table =
'egotec_user';
16 $this->db = new_db_connection();
34 public function searchUsers(array $search,
int $limit = -1,
string $type =
'',
bool $checkRights =
true,
bool $filterSearch =
true,
bool $sortResult =
true,
int $from = 0,
bool $returnTotal =
false, array $sort_order = [],
string $rights =
''): array {
46 return $returnTotal ? [
'users' => [],
'hits' => 0] : [];
50 if ($search[
'user_id']) {
51 $query .=
" AND user_id = :user_id";
52 $bind[
'user_id'] = $search[
'user_id'];
56 if ($search[
'username']) {
57 $query .=
" AND LOWER(egotec_user.username) LIKE :username";
58 $bind[
'username'] =
'%' . mb_strtolower($search[
'username']) .
'%';
62 if ($search[
'username_char']) {
63 $query .=
" AND UPPER(egotec_user.username) LIKE :username_char";
64 $bind[
'username_char'] =
"{$search['username_char']}%";
68 if ($search[
'email']) {
69 $query .=
' AND LOWER(egotec_user.email) LIKE :email';
70 $bind[
'email'] =
'%' . mb_strtolower($search[
'email']) .
'%';
74 if ($search[
'multiple_login']) {
75 $query .=
' AND egotec_user.multiple_login = :multiple_login';
76 $bind[
'multiple_login'] = $search[
'multiple_login'];
82 $params[
'join'] =
'egotec_user_group ON egotec_user_group.user_id = egotec_user.user_id';
87 foreach (explode(
';', $rights) as $group_role) {
88 [$group, $role] = explode(
',', $group_role);
90 $query_parts[] =
"(egotec_user_group.group_id = '$group' AND egotec_user_group.role_id = '$role')";
93 $query .= implode(
' OR ', $query_parts) .
')';
99 if ($sort_order && $sort_order[
'field'] && $sort_order[
'field'] !==
'') {
100 $field = $sort_order[
'field'];
103 if ($sort_order && $sort_order[
'order'] && $sort_order[
'order'] !==
'') {
104 $order = $sort_order[
'order'];
110 $query .=
' AND deleted = 0';
111 $this->db->select(array_merge([
112 'fields' =>
'egotec_user.user_id',
113 'table' => $this->table,
114 'where' =>
'no_admin = 0 AND ' . $this->getActiveQuery() .
' AND ' . $query,
116 'order' => $field .
' ' . $order
120 $query .=
' AND deleted = 0';
121 $this->db->select(array_merge([
122 'fields' =>
'egotec_user.user_id',
123 'table' => $this->table,
124 'where' =>
'no_admin = 1 AND ' . $this->getActiveQuery() .
' AND ' . $query,
126 'order' => $field .
' ' . $order
130 $query .=
' AND deleted = 0';
131 $this->db->select(array_merge([
132 'fields' =>
'egotec_user.user_id',
133 'table' => $this->table,
134 'where' =>
'egotec_user_group.user_id IS NULL AND ' . $this->getActiveQuery() .
' AND ' . $query,
137 'egotec_user_group ON egotec_user.user_id = egotec_user_group.user_id'
139 'order' => $field .
' ' . $order
143 $query .=
' AND deleted = 0';
144 $this->db->select(array_merge([
145 'fields' =>
'egotec_user.user_id',
146 'table' => $this->table,
147 'where' => $this->getInactiveQuery() .
' AND ' . $query,
149 'order' => $field .
' ' . $order
153 $this->db->select(array_merge([
154 'fields' =>
'egotec_user.user_id',
155 'table' => $this->table,
156 'where' =>
'deleted = 1 AND ' . $query,
158 'order' => $field .
' ' . $order
162 $query .=
' AND deleted = 0';
163 $this->db->select(array_merge([
164 'fields' =>
'egotec_user.user_id',
165 'table' => $this->table,
166 'where' => $query.
' AND ' . (key_exists(
'user_inactive', $search) ? ($search[
'user_inactive'] === 0 ? $this->getActiveQuery() : $this->getInactiveQuery()) :
'1=1'),
168 'order' => $field .
' ' . $order
181 while ($record = $this->db->nextRecord()) {
182 $user =
new User_SQL($record[
'user_id']);
185 !$this->checkFilters($search, $user)
193 if ($from && $user_count < ($from + 1)) {
199 if ($limit > 0 && $user_count == (($from + 1) + $limit)) {
221 'fields' =>
'LEFT(UPPER(username), 1) AS charx, username',
222 'table' => $this->table,
223 'group' =>
'username',
224 'order' =>
'charx ASC'
230 $params[
'where'] =
'no_admin = 0 AND deleted = 0 AND ' . $this->getActiveQuery();
233 $params[
'where'] =
'no_admin = 1 AND deleted = 0 AND ' . $this->getActiveQuery();
236 $params[
'where'] =
'deleted = 0 AND egotec_user_group.user_id IS NULL AND ' . $this->getActiveQuery();
237 $params[
'join'] =
'egotec_user_group ON (egotec_user.user_id = egotec_user_group.user_id)';
240 $params[
'where'] =
'deleted = 0 AND ' . $this->getInactiveQuery();
243 $params[
'where'] =
'deleted = 1';
247 $this->db->select($params);
250 while ($record = $this->db->nextRecord()) {
251 $chars[$record[
'charx']] = $chars[$record[
'charx']] ? $chars[$record[
'charx']] = [
252 'char' => $record[
'charx'],
253 'number' => $chars[$record[
'charx']][
'number'] + 1
255 'char' => $record[
'charx'],
268 private function getActiveQuery():string {
269 $now = date(
'Y-m-d H:i:s');
270 return "((release_from = '0000-00-00 00:00:00' OR release_from <= '$now')"
271 .
" AND (release_until = '0000-00-00 00:00:00' OR release_until >= '$now')"
272 .
" AND extra NOT LIKE '%\\\"user_inactive\\\";s:1:\\\"1\\\";%'"
273 .
" AND extra NOT LIKE '%\\\"user_inactive\\\";i:1;%')";
281 private function getInactiveQuery(): string {
282 $now = date(
'Y-m-d H:i:s');
283 return "((release_from != '0000-00-00 00:00:00' AND release_from >= '$now')"
284 .
" OR (release_until != '0000-00-00 00:00:00' AND release_until <= '$now')"
285 .
" OR extra LIKE '%\\\"user_inactive\\\";s:1:\\\"1\\\";%'"
286 .
" OR extra LIKE '%\\\"user_inactive\\\";i:1;%')";
297 private function checkFilters(array $filters, User_SQL $user): bool {
298 $result = (!$filters[
'abteilung'] || strpos(mb_strtolower($user->extra[
'abteilung']), mb_strtolower($filters[
'abteilung'])) !== false)
299 && (!$filters[
'anrede'] || strpos(mb_strtolower($user->extra[
'anrede']), mb_strtolower($filters[
'anrede'])) !== false)
300 && (!$filters[
'branche'] || strpos(mb_strtolower($user->extra[
'branche']), mb_strtolower($filters[
'branche'])) !== false)
301 && (!$filters[
'name'] || strpos(mb_strtolower($user->extra[
'name']), mb_strtolower($filters[
'name'])) !== false)
302 && (!$filters[
'vorname'] || strpos(mb_strtolower($user->extra[
'vorname']), mb_strtolower($filters[
'vorname'])) !== false)
303 && (!$filters[
'position'] || strpos(mb_strtolower($user->extra[
'position']), mb_strtolower($filters[
'position'])) !== false)
304 && (!$filters[
'strasse'] || strpos(mb_strtolower($user->extra[
'strasse']), mb_strtolower($filters[
'strasse'])) !== false)
305 && (!$filters[
'firma'] || strpos(mb_strtolower($user->extra[
'firma']), mb_strtolower($filters[
'firma'])) !== false)
306 && (!$filters[
'plz'] || strpos(mb_strtolower($user->extra[
'plz']), mb_strtolower($filters[
'plz'])) !== false)
307 && (!$filters[
'telefon'] || strpos(mb_strtolower($user->extra[
'telefon']), mb_strtolower($filters[
'telefon'])) !== false)
308 && (!$filters[
'ort'] || strpos(mb_strtolower($user->extra[
'ort']), mb_strtolower($filters[
'ort'])) !== false)
309 && (!$filters[
'mobil'] || strpos(mb_strtolower($user->extra[
'mobil']), mb_strtolower($filters[
'mobil'])) !== false)
310 && (!$filters[
'land'] || strpos(mb_strtolower($user->extra[
'land']), mb_strtolower($filters[
'land'])) !== false)
311 && (!$filters[
'liveserver'] || $user->extra[
'liveserver'] == $filters[
'liveserver'])
312 && (!$filters[
'no_singlesignon'] || $user->extra[
'no_singlesignon'] == $filters[
'no_singlesignon'])
313 && (!$filters[
'categories'] || strpos($user->extra[
'categories'], $filters[
'categories']) !== false)
314 && (!$filters[
'auth_persist_token'] || strpos($user->extra[
'auth_persist_token'], $filters[
'auth_persist_token']) !== false)
315 && (!$filters[
'tfa_secret'] || !empty($user->extra[
'tfa_secret']));
321 function_exists(
'user_search_fields')
322 ||
Ego_System::file_exists($user_search_fields = ($GLOBALS[
'egotec_conf'][
'var_dir'] .
'lib/admin/user_search_fields.php'))
325 if (isset($user_search_fields)) {
326 require_once $user_search_fields;
328 if (function_exists(
'user_search_fields') && !user_search_fields($user, $filters)) {
static file_exists($file)
static isAcceptedUser(User_SQL $user, array $group_role_rel=null)
static filterSearch(array $search)
static checkSearchFilter(string $type, array $search)
static checkRightsFilter(string $rightsFilter, User_SQL $user, array $group_role_rel=null)
searchUsers(array $search, int $limit=-1, string $type='', bool $checkRights=true, bool $filterSearch=true, bool $sortResult=true, int $from=0, bool $returnTotal=false, array $sort_order=[], string $rights='')