You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

559 lines
15 KiB

1 year ago
<?php
/*
** Zabbix
** Copyright (C) 2001-2023 Zabbix SIA
**
** This program is free software; you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation; either version 2 of the License, or
** (at your option) any later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program; if not, write to the Free Software
** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
**/
/**
* Find user theme or get default theme.
*
* @param array $userData
*
* @return string
*/
function getUserTheme($userData) {
if (null !== CSettingsHelper::getGlobal(CSettingsHelper::DEFAULT_THEME)) {
$css = CSettingsHelper::get(CSettingsHelper::DEFAULT_THEME);
}
if (isset($userData['theme']) && $userData['theme'] != THEME_DEFAULT) {
$css = $userData['theme'];
}
if (!isset($css)) {
$css = ZBX_DEFAULT_THEME;
}
return $css;
}
/**
* Get user type name.
*
* @param int $userType
*
* @return string|array
*/
function user_type2str($userType = null) {
$userTypes = [
USER_TYPE_ZABBIX_USER => _('User'),
USER_TYPE_ZABBIX_ADMIN => _('Admin'),
USER_TYPE_SUPER_ADMIN => _('Super admin')
];
if ($userType === null) {
return $userTypes;
}
elseif (isset($userTypes[$userType])) {
return $userTypes[$userType];
}
else {
return _('Unknown');
}
}
/**
* Get user authentication name.
*
* @param int $authType
*
* @return string
*/
function user_auth_type2str($authType) {
if ($authType === null) {
$authType = getUserGuiAccess(CWebUser::$data['userid']);
}
$authUserType = [
GROUP_GUI_ACCESS_SYSTEM => _('System default'),
GROUP_GUI_ACCESS_INTERNAL => _x('Internal', 'user type'),
GROUP_GUI_ACCESS_LDAP => _('LDAP'),
GROUP_GUI_ACCESS_DISABLED => _('Disabled')
];
return isset($authUserType[$authType]) ? $authUserType[$authType] : _('Unknown');
}
/**
* Get users ids by groups ids.
*
* @param array $userGroupIds
*
* @return array
*/
function get_userid_by_usrgrpid($userGroupIds) {
zbx_value2array($userGroupIds);
$userIds = [];
$dbUsers = DBselect(
'SELECT DISTINCT u.userid'.
' FROM users u,users_groups ug'.
' WHERE u.userid=ug.userid'.
' AND '.dbConditionInt('ug.usrgrpid', $userGroupIds)
);
while ($user = DBFetch($dbUsers)) {
$userIds[$user['userid']] = $user['userid'];
}
return $userIds;
}
/**
* Check if group has permissions for update.
*
* @param array $userGroupIds
*
* @return bool
*/
function granted2update_group($userGroupIds) {
zbx_value2array($userGroupIds);
$users = get_userid_by_usrgrpid($userGroupIds);
return !isset($users[CWebUser::$data['userid']]);
}
/**
* Gets user full name in format "username (name surname)". If both name and surname exist, returns translated string.
*
* @param array $userData
* @param string $userData['username']
* @param string $userData['name']
* @param string $userData['surname']
*
* @return string
*/
function getUserFullname($userData) {
if (!zbx_empty($userData['surname'])) {
if (!zbx_empty($userData['name'])) {
return $userData['username'].' '._xs('(%1$s %2$s)', 'user fullname', $userData['name'],
$userData['surname']
);
}
$fullname = $userData['surname'];
}
else {
$fullname = zbx_empty($userData['name']) ? '' : $userData['name'];
}
return zbx_empty($fullname) ? $userData['username'] : $userData['username'].' ('.$fullname.')';
}
/**
* Returns the list of permissions to the host groups for selected user groups.
*
* @param array $usrgrpids An array of user group IDs.
*
* @return array
*/
function getHostGroupsRights(array $usrgrpids = []) {
$groups_rights = [
'0' => [
'permission' => PERM_NONE,
'name' => '',
'grouped' => '1'
]
];
$host_groups = API::HostGroup()->get(['output' => ['groupid', 'name']]);
foreach ($host_groups as $host_group) {
$groups_rights[$host_group['groupid']] = [
'permission' => PERM_NONE,
'name' => $host_group['name']
];
}
if ($usrgrpids) {
$db_rights = DBselect(
'SELECT r.id AS groupid,'.
'CASE WHEN MIN(r.permission)='.PERM_DENY.' THEN '.PERM_DENY.' ELSE MAX(r.permission) END AS permission'.
' FROM rights r'.
' WHERE '.dbConditionInt('r.groupid', $usrgrpids).
' GROUP BY r.id'
);
while ($db_right = DBfetch($db_rights)) {
if (array_key_exists($db_right['groupid'], $groups_rights)) {
$groups_rights[$db_right['groupid']]['permission'] = $db_right['permission'];
}
}
}
return $groups_rights;
}
/**
* Returns the list of permissions to the template groups for selected user groups.
*
* @param array $usrgrpids An array of user group IDs.
*
* @return array
*/
function getTemplateGroupsRights(array $usrgrpids = []) {
$groups_rights = [
'0' => [
'permission' => PERM_NONE,
'name' => '',
'grouped' => '1'
]
];
$template_groups = API::TemplateGroup()->get(['output' => ['groupid', 'name']]);
foreach ($template_groups as $template_group) {
$groups_rights[$template_group['groupid']] = [
'permission' => PERM_NONE,
'name' => $template_group['name']
];
}
if ($usrgrpids) {
$db_rights = DBselect(
'SELECT r.id AS groupid,'.
'CASE WHEN MIN(r.permission)='.PERM_DENY.' THEN '.PERM_DENY.' ELSE MAX(r.permission) END AS permission'.
' FROM rights r'.
' WHERE '.dbConditionInt('r.groupid', $usrgrpids).
' GROUP BY r.id'
);
while ($db_right = DBfetch($db_rights)) {
if (array_key_exists($db_right['groupid'], $groups_rights)) {
$groups_rights[$db_right['groupid']]['permission'] = $db_right['permission'];
}
}
}
return $groups_rights;
}
/**
* Returns the sorted list of permissions to the host groups in collapsed form.
*
* @param array $groups_rights
* @param string $groups_rights[<groupid>]['name']
* @param int $groups_rights[<groupid>]['permission']
*
* @return array
*/
function collapseGroupRights(array $groups_rights) {
$groups = [];
foreach ($groups_rights as $groupid => $group_rights) {
$groups[$group_rights['name']] = $groupid;
}
CArrayHelper::sort($groups_rights, [['field' => 'name', 'order' => ZBX_SORT_DOWN]]);
$permissions = [];
foreach ($groups_rights as $groupid => $group_rights) {
if ($groupid == 0) {
continue;
}
$permissions[$group_rights['permission']] = true;
$parent_group_name = $group_rights['name'];
do {
$pos = strrpos($parent_group_name, '/');
$parent_group_name = ($pos === false) ? '' : substr($parent_group_name, 0, $pos);
if (array_key_exists($parent_group_name, $groups)) {
$parent_group_rights = &$groups_rights[$groups[$parent_group_name]];
if ($parent_group_rights['permission'] == $group_rights['permission']) {
$parent_group_rights['grouped'] = '1';
unset($groups_rights[$groupid]);
}
unset($parent_group_rights);
break;
}
}
while ($parent_group_name !== '');
}
if (count($permissions) == 1) {
$groups_rights = array_slice($groups_rights, -1);
$groups_rights[0]['permission'] = key($permissions);
}
CArrayHelper::sort($groups_rights, [['field' => 'name', 'order' => ZBX_SORT_UP]]);
return $groups_rights;
}
/**
* Returns the sorted list of the unique tag filters.
*
* @param array $tag_filters
*
* @return array
*/
function uniqTagFilters(array $tag_filters) {
CArrayHelper::sort($tag_filters, ['groupid', 'tag', 'value']);
$prev_tag_filter = null;
foreach ($tag_filters as $key => $tag_filter) {
if ($prev_tag_filter !== null && $prev_tag_filter['groupid'] == $tag_filter['groupid']
&& ($prev_tag_filter['tag'] === '' || $prev_tag_filter['tag'] === $tag_filter['tag'])
&& ($prev_tag_filter['value'] === '' || $prev_tag_filter['value'] === $tag_filter['value'])) {
unset($tag_filters[$key]);
}
else {
$prev_tag_filter = $tag_filter;
}
}
return $tag_filters;
}
/**
* Returns the sorted list of the unique tag filters and group names.
* The list will be enriched by group names. Tag filters with filled tags or values will be overwritten empty.
*
* @param array $tag_filters
* @param string $tag_filters[]['groupid']
* @param string $tag_filters[]['tag']
* @param string $tag_filters[]['value']
*
* @return array
*/
function collapseTagFilters(array $tag_filters) {
$tag_filters = uniqTagFilters($tag_filters);
$groupids = [];
foreach ($tag_filters as $tag_filter) {
$groupids[$tag_filter['groupid']] = true;
}
if ($groupids) {
$groups = API::HostGroup()->get([
'output' => ['name'],
'groupids' => array_keys($groupids),
'preservekeys' => true
]);
foreach ($tag_filters as $key => $tag_filter) {
if (array_key_exists($tag_filter['groupid'], $groups)) {
$tag_filters[$key]['name'] = $groups[$tag_filter['groupid']]['name'];
}
else {
unset($tag_filters[$key]);
}
}
CArrayHelper::sort($tag_filters, ['name', 'tag', 'value']);
}
return $tag_filters;
}
/**
* Applies new permissions to the host groups.
*
* @param array $groups_rights Array with host roup rights information.
* @param string $groups_rights[<groupid>]['name'] Name of the host group.
* @param int $groups_rights[<groupid>]['permission'] Permission level.
* @param int $groups_rights[<groupid>]['grouped'] (optional) If group is grouped with subgroups.
* @param array $groupids Host group ID.
* @param array $groupids_subgroupids Host group's subgroup IDs.
* @param int $new_permission New permission level.
*
* @return array
*/
function applyHostGroupRights(array $groups_rights, array $groupids = [], array $groupids_subgroupids = [],
$new_permission = PERM_NONE) {
// Get list of host groups.
$ex_groups_rights = getHostGroupsRights();
$ex_groups = [];
foreach ($ex_groups_rights as $groupid => $ex_group_rights) {
$ex_groups[$ex_group_rights['name']] = $groupid;
}
// Convert $groupids_subgroupids into $groupids.
foreach ($groupids_subgroupids as $groupid) {
if (!array_key_exists($groupid, $ex_groups_rights)) {
continue;
}
$groupids[] = $groupid;
$parent_group_name = $ex_groups_rights[$groupid]['name'].'/';
$parent_group_name_len = strlen($parent_group_name);
foreach ($ex_groups_rights as $groupid => $ex_group_rights) {
if (substr($ex_group_rights['name'], 0, $parent_group_name_len) === $parent_group_name) {
$groupids[] = $groupid;
}
}
}
$groupids = array_fill_keys($groupids, true);
// Apply new permissions to all groups.
foreach ($ex_groups_rights as $groupid => &$ex_group_rights) {
if ($groupid == 0) {
continue;
}
if (array_key_exists($groupid, $groupids)) {
$ex_group_rights['permission'] = $new_permission;
continue;
}
if (array_key_exists($groupid, $groups_rights)) {
$ex_group_rights['permission'] = $groups_rights[$groupid]['permission'];
continue;
}
$parent_group_name = $ex_group_rights['name'];
do {
$pos = strrpos($parent_group_name, '/');
$parent_group_name = ($pos === false) ? '' : substr($parent_group_name, 0, $pos);
if (array_key_exists($parent_group_name, $ex_groups)
&& array_key_exists($ex_groups[$parent_group_name], $groups_rights)) {
$parent_group_rights = $groups_rights[$ex_groups[$parent_group_name]];
if (array_key_exists('grouped', $parent_group_rights) && $parent_group_rights['grouped']) {
$ex_group_rights['permission'] = $parent_group_rights['permission'];
break;
}
}
}
while ($parent_group_name !== '');
}
unset($ex_group_rights);
CArrayHelper::sort($ex_groups_rights, [['field' => 'name', 'order' => ZBX_SORT_UP]]);
return $ex_groups_rights;
}
/**
* Applies new permissions to the template groups.
*
* @param array $groups_rights Array with template group rights information.
* @param string $groups_rights[<groupid>]['name'] Name of the template group.
* @param int $groups_rights[<groupid>]['permission'] Permission level.
* @param int $groups_rights[<groupid>]['grouped'] (optional) If group is grouped with subgroups.
* @param array $groupids Group ID.
* @param array $groupids_subgroupids Group's subgroup IDs
* @param int $new_permission New permission level.
*
* @return array
*/
function applyTemplateGroupRights(array $groups_rights, array $groupids = [], array $groupids_subgroupids = [],
$new_permission = PERM_NONE) {
// Get list of host groups.
$ex_groups_rights = getTemplateGroupsRights();
$ex_groups = [];
foreach ($ex_groups_rights as $groupid => $ex_group_rights) {
$ex_groups[$ex_group_rights['name']] = $groupid;
}
// Convert $groupids_subgroupids into $groupids.
foreach ($groupids_subgroupids as $groupid) {
if (!array_key_exists($groupid, $ex_groups_rights)) {
continue;
}
$groupids[] = $groupid;
$parent_group_name = $ex_groups_rights[$groupid]['name'].'/';
$parent_group_name_len = strlen($parent_group_name);
foreach ($ex_groups_rights as $groupid => $ex_group_rights) {
if (substr($ex_group_rights['name'], 0, $parent_group_name_len) === $parent_group_name) {
$groupids[] = $groupid;
}
}
}
$groupids = array_fill_keys($groupids, true);
// Apply new permissions to all groups.
foreach ($ex_groups_rights as $groupid => &$ex_group_rights) {
if ($groupid == 0) {
continue;
}
if (array_key_exists($groupid, $groupids)) {
$ex_group_rights['permission'] = $new_permission;
continue;
}
if (array_key_exists($groupid, $groups_rights)) {
$ex_group_rights['permission'] = $groups_rights[$groupid]['permission'];
continue;
}
$parent_group_name = $ex_group_rights['name'];
do {
$pos = strrpos($parent_group_name, '/');
$parent_group_name = ($pos === false) ? '' : substr($parent_group_name, 0, $pos);
if (array_key_exists($parent_group_name, $ex_groups)
&& array_key_exists($ex_groups[$parent_group_name], $groups_rights)) {
$parent_group_rights = $groups_rights[$ex_groups[$parent_group_name]];
if (array_key_exists('grouped', $parent_group_rights) && $parent_group_rights['grouped']) {
$ex_group_rights['permission'] = $parent_group_rights['permission'];
break;
}
}
}
while ($parent_group_name !== '');
}
unset($ex_group_rights);
CArrayHelper::sort($ex_groups_rights, [['field' => 'name', 'order' => ZBX_SORT_UP]]);
return $ex_groups_rights;
}
/**
* Get textual representation of given permission.
*
* @param string $perm Numerical value of permission.
* Possible values are:
* 3 - PERM_READ_WRITE,
* 2 - PERM_READ,
* 0 - PERM_DENY,
* -1 - PERM_NONE;
*
* @return string
*/
function permissionText($perm) {
switch ($perm) {
case PERM_READ_WRITE: return _('Read-write');
case PERM_READ: return _('Read');
case PERM_DENY: return _('Deny');
case PERM_NONE: return _('None');
}
}