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.
zabbix/ui/app/views/administration.user.edit.php

880 lines
28 KiB

<?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.
**/
/**
* @var CView $this
*/
$this->includeJsFile('administration.user.edit.common.js.php');
$this->includeJsFile(($data['action'] === 'user.edit')
? 'administration.user.edit.js.php'
: 'administration.userprofile.edit.js.php'
);
$html_page = new CHtmlPage();
if ($data['action'] === 'user.edit') {
$widget_name = _('Users');
$doc_url = CDocHelper::USERS_USER_EDIT;
$csrf_token = CCsrfTokenHelper::get('user');
}
else {
$widget_name = _('User profile').NAME_DELIMITER;
$widget_name .= ($data['name'] !== '' || $data['surname'] !== '')
? $data['name'].' '.$data['surname']
: $data['username'];
$html_page->setTitleSubmenu(getUserSettingsSubmenu());
$doc_url = CDocHelper::USERS_USERPROFILE_EDIT;
$csrf_token = CCsrfTokenHelper::get('userprofile');
}
$html_page
->setTitle($widget_name)
->setDocUrl(CDocHelper::getUrl($doc_url));
$tabs = new CTabView();
if ($data['form_refresh'] == 0) {
$tabs->setSelected(0);
}
if ($data['readonly'] == true) {
CMessageHelper::addWarning(
_('This user is IdP provisioned. Manual changes for provisioned fields are not allowed.')
);
show_messages();
}
// Create form.
$user_form = (new CForm())
->addItem((new CVar('form_refresh', $data['form_refresh'] + 1))->removeId())
->addItem((new CVar(CCsrfTokenHelper::CSRF_TOKEN_NAME, $csrf_token))->removeId())
->setId('user-form')
->setName('user_form')
->setAttribute('aria-labelledby', CHtmlPage::PAGE_TITLE_ID)
->addVar('action', $data['action'])
->addVar('userid', $data['userid']);
// Create form list and user tab.
$user_form_list = new CFormList('user_form_list');
if ($data['action'] === 'user.edit') {
$user_form_list
->addRow((new CLabel(_('Username'), 'username'))->setAsteriskMark(),
(new CTextBox('username', $data['username']))
->setReadonly($data['db_user']['username'] === ZBX_GUEST_USER || $data['readonly'])
->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
->setAriaRequired()
->setAttribute('autofocus', 'autofocus')
->setAttribute('maxlength', DB::getFieldLength('users', 'username'))
)
->addRow(_x('Name', 'user first name'),
(new CTextBox('name', $data['name']))
->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
->setAttribute('maxlength', DB::getFieldLength('users', 'name'))
->setReadonly($data['readonly'])
)
->addRow(_('Last name'),
(new CTextBox('surname', $data['surname']))
->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
->setAttribute('maxlength', DB::getFieldLength('users', 'surname'))
->setReadonly($data['readonly'])
)
->addRow(
new CLabel(_('Groups'), 'user_groups__ms'),
(new CMultiSelect([
'name' => 'user_groups[]',
'object_name' => 'usersGroups',
'data' => $data['groups'],
'disabled' => $data['readonly'],
'popup' => [
'parameters' => [
'srctbl' => 'usrgrp',
'srcfld1' => 'usrgrpid',
'dstfrm' => $user_form->getName(),
'dstfld1' => 'user_groups_'
]
]
]))
->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
->setAriaRequired()
);
}
if ($data['change_password']) {
$user_form->disablePasswordAutofill();
$password_requirements = [];
if ($data['password_requirements']['min_length'] > 1) {
$password_requirements[] = _s('must be at least %1$d characters long',
$data['password_requirements']['min_length']
);
}
if ($data['password_requirements']['check_rules'] & PASSWD_CHECK_CASE) {
$password_requirements[] = new CListItem([
_('must contain at least one lowercase and one uppercase Latin letter'),
' (', (new CSpan('A-Z'))->addClass(ZBX_STYLE_MONOSPACE_FONT), ', ',
(new CSpan('a-z'))->addClass(ZBX_STYLE_MONOSPACE_FONT), ')'
]);
}
if ($data['password_requirements']['check_rules'] & PASSWD_CHECK_DIGITS) {
$password_requirements[] = new CListItem([
_('must contain at least one digit'),
' (', (new CSpan('0-9'))->addClass(ZBX_STYLE_MONOSPACE_FONT), ')'
]);
}
if ($data['password_requirements']['check_rules'] & PASSWD_CHECK_SPECIAL) {
$password_requirements[] = new CListItem([
_('must contain at least one special character'),
' (', (new CSpan(' !"#$%&\'()*+,-./:;<=>?@[\]^_`{|}~'))->addClass(ZBX_STYLE_MONOSPACE_FONT), ')'
]);
}
if ($data['password_requirements']['check_rules'] & PASSWD_CHECK_SIMPLE) {
$password_requirements[] = _("must not contain user's name, surname or username");
$password_requirements[] = _('must not be one of common or context-specific passwords');
}
$password_hint_icon = $password_requirements
? makeHelpIcon([
_('Password requirements:'),
(new CList($password_requirements))->addClass(ZBX_STYLE_LIST_DASHED)
])
: null;
$current_password = (new CPassBox('current_password'))
->setWidth(ZBX_TEXTAREA_SMALL_WIDTH)
->setAriaRequired();
if ($data['action'] !== 'user.edit') {
$current_password->setAttribute('autofocus', 'autofocus');
}
if (CWebUser::$data['userid'] == $data['userid']) {
$user_form_list
->addRow((new CLabel(_('Current password'), 'current_password'))->setAsteriskMark(), $current_password);
}
$user_form_list
->addRow((new CLabel([_('Password'), $password_hint_icon], 'password1'))->setAsteriskMark(), [
// Hidden dummy login field for protection against chrome error when password autocomplete.
(new CInput('text', null, null))
->setAttribute('tabindex', '-1')
->addStyle('position: absolute; left: -100vw;'),
(new CPassBox('password1', $data['password1']))
->setWidth(ZBX_TEXTAREA_SMALL_WIDTH)
->setAriaRequired()
])
->addRow((new CLabel(_('Password (once again)'), 'password2'))->setAsteriskMark(),
(new CPassBox('password2', $data['password2']))
->setWidth(ZBX_TEXTAREA_SMALL_WIDTH)
->setAriaRequired()
)
->addRow('', _('Password is not mandatory for non internal authentication type.'));
}
else {
$change_password_enabled = !$data['readonly'] && $data['internal_auth'];
if ($change_password_enabled && $data['action'] === 'user.edit') {
$change_password_enabled = $data['db_user']['username'] !== ZBX_GUEST_USER;
}
$hint = !$change_password_enabled
? $hint = makeErrorIcon(_('Password can only be changed for users using the internal Zabbix authentication.'))
: null;
$user_form_list->addRow(_('Password'), [
(new CSimpleButton(_('Change password')))
->setEnabled($change_password_enabled)
->setAttribute('autofocus', 'autofocus')
->onClick('submitFormWithParam("'.$user_form->getName().'", "change_password", "1");')
->addClass(ZBX_STYLE_BTN_GREY),
$hint
]);
}
// Append languages, timezones & themes to form list.
$lang_select = (new CSelect('lang'))
->setFocusableElementId('label-lang')
->setValue($data['lang'])
->addOption(new CSelectOption(LANG_DEFAULT, _('System default')));
$timezone_select = (new CSelect('timezone'))->setFocusableElementId('label-timezone');
$theme_select = (new CSelect('theme'))
->setFocusableElementId('label-theme')
->setValue($data['theme'])
->addOption(new CSelectOption(THEME_DEFAULT, _('System default')));
$language_error = null;
if ($data['action'] === 'user.edit' && $data['db_user']['username'] === ZBX_GUEST_USER) {
$lang_select
->setName(null)
->setReadonly();
$theme_select
->setName(null)
->setReadonly();
$timezone_select
->addOption(new CSelectOption(TIMEZONE_DEFAULT, $data['timezones'][TIMEZONE_DEFAULT]))
->setValue(TIMEZONE_DEFAULT)
->setReadonly();
}
else {
$all_locales_available = true;
foreach (getLocales() as $localeid => $locale) {
if (!$locale['display']) {
continue;
}
/*
* Checking if this locale exists in the system. The only way of doing it is to try and set one
* trying to set only the LC_MONETARY locale to avoid changing LC_NUMERIC.
*/
$locale_available = setlocale(LC_MONETARY, zbx_locale_variants($localeid));
$lang_select->addOption((new CSelectOption($localeid, $locale['name']))->setDisabled(!$locale_available));
if (!$locale_available) {
$all_locales_available = false;
}
}
// Restoring original locale.
setlocale(LC_MONETARY, zbx_locale_variants(CWebUser::$data['lang']));
if (!function_exists('bindtextdomain')) {
$language_error = 'Translations are unavailable because the PHP gettext module is missing.';
$lang_select->setReadonly();
}
elseif (!$all_locales_available) {
$language_error = _('You are not able to choose some of the languages, because locales for them are not installed on the web server.');
}
if ($language_error) {
$language_error = makeErrorIcon($language_error);
}
$timezone_select
->addOptions(CSelect::createOptionsFromArray($data['timezones']))
->setValue($data['timezone']);
$theme_select->addOptions(CSelect::createOptionsFromArray(APP::getThemes()));
}
$user_form_list
->addRow(new CLabel(_('Language'), $lang_select->getFocusableElementId()), [$lang_select, $language_error])
->addRow(new CLabel(_('Time zone'), $timezone_select->getFocusableElementId()), $timezone_select)
->addRow(new CLabel(_('Theme'), $theme_select->getFocusableElementId()), $theme_select);
// Append auto-login & auto-logout to form list.
if ($data['action'] === 'userprofile.edit' || $data['db_user']['username'] !== ZBX_GUEST_USER) {
$autologout = ($data['autologout'] !== '0') ? $data['autologout'] : DB::getDefault('users', 'autologout');
$user_form_list->addRow(_('Auto-login'),
(new CCheckBox('autologin'))
->setUncheckedValue('0')
->setChecked($data['autologin'])
);
$user_form_list->addRow(_('Auto-logout'), [
(new CCheckBox(null))
->setId('autologout_visible')
->setChecked($data['autologout'] !== '0'),
(new CDiv())->addClass(ZBX_STYLE_FORM_INPUT_MARGIN),
(new CTextBox('autologout', $autologout))->setWidth(ZBX_TEXTAREA_TINY_WIDTH)
]);
}
$user_form_list
->addRow((new CLabel(_('Refresh'), 'refresh'))->setAsteriskMark(),
(new CTextBox('refresh', $data['refresh']))
->setWidth(ZBX_TEXTAREA_TINY_WIDTH)
->setAriaRequired()
)
->addRow((new CLabel(_('Rows per page'), 'rows_per_page'))->setAsteriskMark(),
(new CNumericBox('rows_per_page', $data['rows_per_page'], 6))
->setWidth(ZBX_TEXTAREA_NUMERIC_STANDARD_WIDTH)
->setAriaRequired()
)
->addRow(_('URL (after login)'),
(new CTextBox('url', $data['url'], false, DB::getFieldLength('users', 'url')))
->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
);
$tabs->addTab('userTab', _('User'), $user_form_list);
// Media tab.
if ($data['action'] === 'user.edit' || CWebUser::$data['type'] > USER_TYPE_ZABBIX_USER) {
$media_form_list = new CFormList('userMediaFormList');
$user_form->addVar('medias', $data['medias']);
$media_table_info = (new CTable())
->setId('media-table')
->setAttribute('style', 'width: 100%;')
->setHeader([_('Type'), _('Send to'), _('When active'), _('Use if severity'), _('Status'), _('Action')]);
foreach ($data['medias'] as $index => $media) {
if ($data['mediatypes'][$media['mediatypeid']]['status'] == MEDIA_TYPE_STATUS_ACTIVE) {
$media_name = $media['name'];
if ($media['active'] == MEDIA_STATUS_ACTIVE) {
$status_action = 'return create_var("'.$user_form->getName().'","disable_media",'.$index.', true);';
$status_label = _('Enabled');
$status_class = ZBX_STYLE_GREEN;
}
else {
$status_action = 'return create_var("'.$user_form->getName().'","enable_media",'.$index.', true);';
$status_label = _('Disabled');
$status_class = ZBX_STYLE_RED;
}
$status = (new CButtonLink($status_label))
->onClick(!$data['readonly'] ? $status_action : null)
->addClass(!$data['readonly'] ? $status_class : null)
->setEnabled(!$data['readonly']);
}
else {
$media_name = [
new CSpan($media['name']),
makeWarningIcon(_('Media type disabled by Administration.'))
];
$status = (new CSpan(_('Disabled')))->addClass(ZBX_STYLE_RED);
}
$parameters = [
'dstfrm' => $user_form->getName(),
'media' => $index,
'mediatypeid' => $media['mediatypeid'],
($media['mediatype'] == MEDIA_TYPE_EMAIL) ? 'sendto_emails' : 'sendto' => $media['sendto'],
'period' => $media['period'],
'severity' => $media['severity'],
'active' => $media['active']
];
$media_severity = [];
for ($severity = TRIGGER_SEVERITY_NOT_CLASSIFIED; $severity < TRIGGER_SEVERITY_COUNT; $severity++) {
$severity_name = CSeverityHelper::getName($severity);
$media_active = ($media['severity'] & (1 << $severity));
$media_severity[$severity] = (new CSpan(mb_substr($severity_name, 0, 1)))
->setHint($severity_name.' ('.($media_active ? _('on') : _('off')).')', '', false)
->addClass($media_active
? CSeverityHelper::getStatusStyle($severity)
: ZBX_STYLE_STATUS_DISABLED
);
}
if ($media['mediatype'] == MEDIA_TYPE_EMAIL) {
$media['sendto'] = implode(', ', $media['sendto']);
}
if (mb_strlen($media['sendto']) > 50) {
$media['sendto'] = (new CSpan(mb_substr($media['sendto'], 0, 50).'...'))->setHint($media['sendto']);
}
$media_table_info->addRow(
(new CRow([
$media_name,
$media['sendto'],
(new CDiv($media['period']))
->setAttribute('style', 'max-width: '.ZBX_TEXTAREA_STANDARD_WIDTH.'px;')
->addClass(ZBX_STYLE_OVERFLOW_ELLIPSIS),
(new CDiv($media_severity))->addClass(ZBX_STYLE_STATUS_CONTAINER),
$status,
(new CCol(
new CHorList([
(new CButtonLink(_('Edit')))
->setAttribute('data-parameters', json_encode($parameters))
->setEnabled(!$data['readonly'])
->onClick('PopUp("popup.media", JSON.parse(this.dataset.parameters));'),
(new CButtonLink(_('Remove')))
->setEnabled(!$data['readonly'])
->onClick('removeMedia('.$index.');')
])
))->addClass(ZBX_STYLE_NOWRAP)
]))->setId('medias_'.$index)
);
}
$media_form_list->addRow(_('Media'),
(new CDiv([
$media_table_info,
(new CButtonLink(_('Add')))
->setEnabled(!$data['readonly'])
->onClick('PopUp("popup.media", '.json_encode(['dstfrm' => $user_form->getName()]).');')
]))
->addClass(ZBX_STYLE_TABLE_FORMS_SEPARATOR)
->setAttribute('style', 'min-width: '.ZBX_TEXTAREA_BIG_WIDTH.'px;')
);
$tabs->addTab('mediaTab', _('Media'), $media_form_list, TAB_INDICATOR_MEDIA);
}
// Permissions tab.
if ($data['action'] === 'user.edit') {
$permissions_form_list = new CFormList('permissionsFormList');
$role_disabled = $data['userid'] != 0 && bccomp(CWebUser::$data['userid'], $data['userid']) == 0;
$role_disabled |= $data['readonly'];
$role_multiselect = (new CMultiSelect([
'name' => 'roleid',
'object_name' => 'roles',
'data' => $data['role'],
'multiple' => false,
'disabled' => $role_disabled,
'popup' => [
'parameters' => [
'srctbl' => 'roles',
'srcfld1' => 'roleid',
'dstfrm' => 'user_form',
'dstfld1' => 'roleid'
]
]
]))->setWidth(ZBX_TEXTAREA_MEDIUM_WIDTH);
if ($data['userid'] != 0 && bccomp(CWebUser::$data['userid'], $data['userid']) == 0) {
$permissions_form_list->addRow(new CLabel(_('Role')),
(new CDiv([
$role_multiselect,
new CDiv(_('User cannot change own role.'))
]))
->setWidth(ZBX_TEXTAREA_BIG_WIDTH)
->addClass('multiselect-description-container')
);
}
else {
$permissions_form_list->addRow((new CLabel(_('Role'), 'roleid_ms'))->setAsteriskMark($data['roleid_required']),
$role_multiselect
);
}
if ($data['roleid']) {
$permissions_form_list->addRow(_('User type'),
new CTextBox('user_type', user_type2str($data['user_type']), true)
);
$permissions_table = (new CTable())
->setAttribute('style', 'width: 100%;')
->setHeader([_('Group'), _('Type'), _('Permissions')]);
if ($data['user_type'] == USER_TYPE_SUPER_ADMIN) {
$permissions_table->addRow([italic(_('All groups')), _('Hosts'), permissionText(PERM_READ_WRITE)]);
$permissions_table->addRow([italic(_('All groups')), _('Templates'), permissionText(PERM_READ_WRITE)]);
}
else {
foreach ($data['groups_rights'] as $groupid => $group_rights) {
if (array_key_exists('grouped', $group_rights) && $group_rights['grouped']) {
$group_name = ($groupid == 0)
? italic(_('All groups'))
: [$group_rights['name'], NBSP(), italic('('._('including subgroups').')')];
}
else {
$group_name = $group_rights['name'];
}
$permissions_table->addRow([$group_name, _('Hosts'), permissionText($group_rights['permission'])]);
}
foreach ($data['templategroups_rights'] as $groupid => $group_rights) {
if (array_key_exists('grouped', $group_rights) && $group_rights['grouped']) {
$group_name = ($groupid == 0)
? italic(_('All groups'))
: [$group_rights['name'], NBSP(), italic('('._('including subgroups').')')];
}
else {
$group_name = $group_rights['name'];
}
$permissions_table->addRow([$group_name, _('Templates'), permissionText($group_rights['permission'])]);
}
}
$permissions_form_list
->addRow(_('Permissions'),
(new CDiv($permissions_table))
->addClass(ZBX_STYLE_TABLE_FORMS_SEPARATOR)
->setAttribute('style', 'min-width: '.ZBX_TEXTAREA_BIG_WIDTH.'px;')
)
->addInfo(_('Permissions can be assigned for user groups only.'));
// UI elements section.
$permissions_form_list
->addRow((new CTag('h4', true, _('Access to UI elements')))->addClass('input-section-header'));
foreach (CRoleHelper::getUiSectionsLabels($data['user_type']) as $section_name => $section_label) {
$elements = [];
foreach (CRoleHelper::getUiSectionRulesLabels($section_name, $data['user_type']) as $rule_name => $rule_label) {
$elements[] = (new CSpan($rule_label))->addClass(
CRoleHelper::checkAccess($rule_name, $data['roleid']) ? ZBX_STYLE_STATUS_GREEN : ZBX_STYLE_STATUS_GREY
);
}
if ($elements) {
$permissions_form_list->addRow($section_label, (new CDiv($elements))
->setWidth(ZBX_TEXTAREA_BIG_WIDTH)
->addClass('rules-status-container')
);
}
}
// Services section.
$permissions_form_list->addRow(
(new CTag('h4', true, _('Access to services')))->addClass('input-section-header')
);
if ($data['service_write_access'] == CRoleHelper::SERVICES_ACCESS_ALL) {
$permissions_form_list->addRow(
_('Read-write access to services'),
(new CDiv((new CSpan(_('All')))->addClass(ZBX_STYLE_STATUS_GREEN)))
->setWidth(ZBX_TEXTAREA_BIG_WIDTH)
->addClass('rules-status-container')
);
}
elseif ($data['service_write_access'] == CRoleHelper::SERVICES_ACCESS_NONE) {
$permissions_form_list->addRow(
_('Read-write access to services'),
(new CDiv((new CSpan(_('None')))->addClass(ZBX_STYLE_STATUS_GREY)))
->setWidth(ZBX_TEXTAREA_BIG_WIDTH)
->addClass('rules-status-container')
);
}
elseif ($data['service_write_list']) {
$service_list = [];
foreach ($data['service_write_list'] as $service) {
$service_list[] = (new CSpan($service['name']))->addClass(ZBX_STYLE_STATUS_GREEN);
}
$permissions_form_list->addRow(
_('Read-write access to services'),
(new CDiv($service_list))
->setWidth(ZBX_TEXTAREA_BIG_WIDTH)
->addClass('rules-status-container')
);
}
if ($data['service_write_tag']['tag'] !== '') {
$permissions_form_list->addRow(
_('Read-write access to services with tag'),
(new CDiv(
(new CSpan([
$data['service_write_tag']['tag'],
$data['service_write_tag']['value'] !== '' ? ': '.$data['service_write_tag']['value'] : null
]))->addClass(ZBX_STYLE_TAG)
))
->setWidth(ZBX_TEXTAREA_BIG_WIDTH)
->addClass('rules-status-container')
);
}
if ($data['service_read_access'] == CRoleHelper::SERVICES_ACCESS_ALL) {
$permissions_form_list->addRow(
_('Read-only access to services'),
(new CDiv((new CSpan(_('All')))->addClass(ZBX_STYLE_STATUS_GREEN)))
->setWidth(ZBX_TEXTAREA_BIG_WIDTH)
->addClass('rules-status-container')
);
}
elseif ($data['service_read_access'] == CRoleHelper::SERVICES_ACCESS_NONE) {
$permissions_form_list->addRow(
_('Read-only access to services'),
(new CDiv((new CSpan(_('None')))->addClass(ZBX_STYLE_STATUS_GREY)))
->setWidth(ZBX_TEXTAREA_BIG_WIDTH)
->addClass('rules-status-container')
);
}
elseif ($data['service_read_list']) {
$service_list = [];
foreach ($data['service_read_list'] as $service) {
$service_list[] = (new CSpan($service['name']))->addClass(ZBX_STYLE_STATUS_GREEN);
}
$permissions_form_list->addRow(
_('Read-only access to services'),
(new CDiv($service_list))
->setWidth(ZBX_TEXTAREA_BIG_WIDTH)
->addClass('rules-status-container')
);
}
if ($data['service_read_tag']['tag'] !== '') {
$permissions_form_list->addRow(
_('Read-only access to services with tag'),
(new CDiv(
(new CSpan([
$data['service_read_tag']['tag'],
$data['service_read_tag']['value'] !== '' ? ': '.$data['service_read_tag']['value'] : null
]))->addClass(ZBX_STYLE_TAG)
))
->setWidth(ZBX_TEXTAREA_BIG_WIDTH)
->addClass('rules-status-container')
);
}
// Modules section.
$permissions_form_list->addRow(
(new CTag('h4', true, _('Access to modules')))->addClass('input-section-header')
);
if (!$data['modules']) {
$permissions_form_list->addRow(italic(_('No enabled modules found.')));
}
else {
$elements = [];
foreach ($data['modules'] as $moduleid => $module_name) {
$elements[] = (new CSpan($module_name))->addClass(
array_key_exists($moduleid, $data['disabled_moduleids'])
|| $data['modules_rules'][$moduleid] == MODULE_STATUS_DISABLED
? ZBX_STYLE_STATUS_GREY
: ZBX_STYLE_STATUS_GREEN
);
}
if ($elements) {
$permissions_form_list->addRow((new CDiv($elements))
->setWidth(ZBX_TEXTAREA_BIG_WIDTH)
->addClass('rules-status-container')
);
}
}
// API section.
$api_access_enabled = CRoleHelper::checkAccess('api.access', $data['roleid']);
$permissions_form_list
->addRow((new CTag('h4', true, _('Access to API')))->addClass('input-section-header'))
->addRow((new CDiv((new CSpan($api_access_enabled ? _('Enabled') : _('Disabled')))->addClass(
$api_access_enabled ? ZBX_STYLE_STATUS_GREEN : ZBX_STYLE_STATUS_GREY
)))
->setWidth(ZBX_TEXTAREA_BIG_WIDTH)
->addClass('rules-status-container')
);
$api_methods = CRoleHelper::getRoleApiMethods($data['roleid']);
if ($api_methods) {
$api_access_mode_allowed = CRoleHelper::checkAccess('api.mode', $data['roleid']);
$elements = [];
foreach ($api_methods as $api_method) {
$elements[] = (new CSpan($api_method))->addClass(
$api_access_mode_allowed ? ZBX_STYLE_STATUS_GREEN : ZBX_STYLE_STATUS_GREY
);
}
$permissions_form_list->addRow($api_access_mode_allowed ? _('Allowed methods') : _('Denied methods'),
(new CDiv($elements))
->setWidth(ZBX_TEXTAREA_BIG_WIDTH)
->addClass('rules-status-container')
);
}
// Actions section.
$permissions_form_list->addRow((new CTag('h4', true, _('Access to actions')))->addClass('input-section-header'));
$elements = [];
foreach (CRoleHelper::getActionsLabels($data['user_type']) as $rule_name => $rule_label) {
$elements[] = (new CSpan($rule_label))
->addClass(CRoleHelper::checkAccess($rule_name, $data['roleid'])
? ZBX_STYLE_STATUS_GREEN
: ZBX_STYLE_STATUS_GREY
);
}
$permissions_form_list->addRow((new CDiv($elements))
->setWidth(ZBX_TEXTAREA_BIG_WIDTH)
->addClass('rules-status-container')
);
}
$tabs->addTab('permissionsTab', _('Permissions'), $permissions_form_list);
}
// Messaging tab.
if ($data['action'] !== 'user.edit') {
$messaging_form_list = (new CFormList())
->addRow(_('Frontend messaging'),
(new CCheckBox('messages[enabled]'))
->setChecked($data['messages']['enabled'] == 1)
->setUncheckedValue(0)
)
->addRow(_('Message timeout'),
(new CTextBox('messages[timeout]', $data['messages']['timeout']))->setWidth(ZBX_TEXTAREA_TINY_WIDTH),
'timeout_row'
)
->addRow(new CLabel(_('Play sound'), 'label-sounds'),
(new CSelect('messages[sounds.repeat]'))
->setId('messages_sounds.repeat')
->setFocusableElementId('label-sounds')
->setValue($data['messages']['sounds.repeat'])
->addOptions(CSelect::createOptionsFromArray([
1 => _('Once'),
10 => _n('%1$s second', '%1$s seconds', 10),
-1 => _('Message timeout')
])),
'repeat_row'
);
$zbx_sounds = array_flip(getSounds());
$triggers_table = (new CTable())
->addRow([
(new CCheckBox('messages[triggers.recovery]'))
->setLabel(_('Recovery'))
->setChecked($data['messages']['triggers.recovery'] == 1)
->setUncheckedValue(0),
[
(new CSelect('messages[sounds.recovery]'))
->setId('messages_sounds.recovery')
->setValue($data['messages']['sounds.recovery'])
->addOptions(CSelect::createOptionsFromArray($zbx_sounds)),
(new CDiv())->addClass(ZBX_STYLE_FORM_INPUT_MARGIN),
(new CButton('start', _('Play')))
->addClass(ZBX_STYLE_BTN_GREY)
->onClick("testUserSound('messages_sounds.recovery');")
->removeId(),
(new CDiv())->addClass(ZBX_STYLE_FORM_INPUT_MARGIN),
(new CButton('stop', _('Stop')))
->addClass(ZBX_STYLE_BTN_GREY)
->onClick('AudioControl.stop();')
->removeId()
]
]);
$msg_visibility = ['1' => [
'messages[timeout]',
'messages[sounds.repeat]',
'messages[sounds.recovery]',
'messages[triggers.recovery]',
'timeout_row',
'repeat_row',
'triggers_row'
]];
// trigger sounds
for ($severity = TRIGGER_SEVERITY_NOT_CLASSIFIED; $severity < TRIGGER_SEVERITY_COUNT; $severity++) {
$triggers_table->addRow([
(new CCheckBox('messages[triggers.severities]['.$severity.']'))
->setLabel(CSeverityHelper::getName($severity))
->setChecked(array_key_exists($severity, $data['messages']['triggers.severities']))
->setUncheckedValue(0),
[
(new CSelect('messages[sounds.'.$severity.']'))
->setId('messages_sounds.'.$severity)
->setValue($data['messages']['sounds.'.$severity])
->addOptions(CSelect::createOptionsFromArray($zbx_sounds)),
(new CDiv())->addClass(ZBX_STYLE_FORM_INPUT_MARGIN),
(new CButton('start', _('Play')))
->addClass(ZBX_STYLE_BTN_GREY)
->onClick("testUserSound('messages_sounds.".$severity."');")
->removeId(),
(new CDiv())->addClass(ZBX_STYLE_FORM_INPUT_MARGIN),
(new CButton('stop', _('Stop')))
->addClass(ZBX_STYLE_BTN_GREY)
->onClick('AudioControl.stop();')
->removeId()
]
]);
zbx_subarray_push($msg_visibility, 1, 'messages[triggers.severities]['.$severity.']');
zbx_subarray_push($msg_visibility, 1, 'messages[sounds.'.$severity.']');
}
$messaging_form_list
->addRow(_('Trigger severity'), $triggers_table, 'triggers_row')
->addRow(_('Show suppressed problems'),
(new CCheckBox('messages[show_suppressed]'))
->setChecked($data['messages']['show_suppressed'] == ZBX_PROBLEM_SUPPRESSED_TRUE)
->setUncheckedValue(ZBX_PROBLEM_SUPPRESSED_FALSE)
);
$tabs->addTab('messagingTab', _('Messaging'), $messaging_form_list, TAB_INDICATOR_FRONTEND_MESSAGE);
}
// Append buttons to form.
if ($data['action'] === 'user.edit') {
$cancel_button = (new CRedirectButton(_('Cancel'), (new CUrl('zabbix.php'))
->setArgument('action', 'user.list')
->setArgument('page', CPagerHelper::loadPage('user.list', null))
))->setId('cancel');
if ($data['userid'] != 0) {
$tabs->setFooter(makeFormFooter(
(new CSubmitButton(_('Update'), 'action', 'user.update'))->setId('update'),
[
(new CRedirectButton(_('Delete'), (new CUrl('zabbix.php'))
->setArgument('action', 'user.delete')
->setArgument('userids', [$data['userid']])
->setArgument(CCsrfTokenHelper::CSRF_TOKEN_NAME, $csrf_token),
_('Delete selected user?')
))
->setEnabled(bccomp(CWebUser::$data['userid'], $data['userid']) != 0)
->setId('delete'),
$cancel_button
]
));
}
else {
$tabs->setFooter(makeFormFooter(
(new CSubmitButton(_('Add'), 'action', 'user.create'))->setId('add'),
[
$cancel_button
]
));
}
}
else {
$tabs->setFooter(makeFormFooter(
(new CSubmitButton(_('Update'), 'action', 'userprofile.update'))->setId('update'),
[(new CRedirectButton(_('Cancel'), CMenuHelper::getFirstUrl()))->setId('cancel')]
));
}
// Append tab to form.
$user_form->addItem($tabs);
$html_page
->addItem($user_form)
->show();
if ($data['action'] === 'user.edit') {
(new CScriptTag('view.init('.json_encode([
'userid' => $data['userid'] ?: null
]).');'))
->setOnDocumentReady()
->show();
}
else {
(new CScriptTag('view.init();'))
->setOnDocumentReady()
->show();
}