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.

1234 lines
35 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.
**/
require_once dirname(__FILE__) . '/../../include/CWebTest.php';
/**
* @backup users
* @dataSource LoginUsers
*/
class testFormUser extends CWebTest {
/**
* Attach MessageBehavior to the test.
*
* @return array
*/
public function getBehaviors() {
return ['class' => CMessageBehavior::class];
}
public function getCreateData() {
return [
// Username is already taken by another user.
[
[
'expected' => TEST_BAD,
'fields' => [
'Username' => 'Admin',
'Groups' => 'Zabbix administrators',
'Password' => 'test5678',
'Password (once again)' => 'test5678'
],
'role' => 'Super admin role',
'error_title' => 'Cannot add user',
'error_details' => 'User with username "Admin" already exists.'
]
],
// Empty 'Username' field.
[
[
'expected' => TEST_BAD,
'fields' => [
'Username' => '',
'Groups' => 'Zabbix administrators',
'Password' => 'zabbix',
'Password (once again)' => 'zabbix'
],
'role' => 'Super admin role',
'error_title' => 'Cannot add user',
'error_details' => 'Incorrect value for field "username": cannot be empty.'
]
],
// Space as 'Username' field value.
[
[
'expected' => TEST_BAD,
'fields' => [
'Username' => ' ',
'Groups' => 'Zabbix administrators',
'Password' => 'test5678',
'Password (once again)' => 'test5678'
],
'role' => 'Super admin role',
'error_title' => 'Cannot add user',
'error_details' => 'Incorrect value for field "username": cannot be empty.'
]
],
// Empty 'Role' field.
[
[
'expected' => TEST_BAD,
'fields' => [
'Username' => 'Negative_Test1',
'Groups' => 'Zabbix administrators',
'Password' => 'test5678',
'Password (once again)' => 'test5678'
],
'error_title' => 'Cannot add user',
'error_details' => 'Field "roleid" is mandatory.'
]
],
// Empty mandatory fields
[
[
'expected' => TEST_BAD,
'fields' => [
'Username' => ''
],
'error_title' => 'Cannot add user',
'error_details' => [
'Incorrect value for field "username": cannot be empty.',
'Field "roleid" is mandatory.'
]
]
],
// 'Password' fields not specified.
[
[
'expected' => TEST_BAD,
'fields' => [
'Username' => 'Negative_Test2',
'Groups' => 'Zabbix administrators'
],
'role' => 'Super admin role',
'error_title' => 'Cannot add user',
'error_details' => 'Incorrect value for field "Password": cannot be empty.'
]
],
// Empty 'Password (once again)' field.
[
[
'expected' => TEST_BAD,
'fields' => [
'Username' => 'Negative_Test3',
'Groups' => 'Zabbix administrators',
'Password' => 'test5678'
],
'role' => 'Super admin role',
'error_title' => 'Cannot add user',
'error_details' => 'Both passwords must be equal.'
]
],
// Empty 'Password' field.
[
[
'expected' => TEST_BAD,
'fields' => [
'Username' => 'Negative_Test4',
'Groups' => 'Zabbix administrators',
'Password (once again)' => 'test5678'
],
'role' => 'Super admin role',
'error_title' => 'Cannot add user',
'error_details' => 'Both passwords must be equal.'
]
],
// 'Password' and 'Password (once again)' do not match.
[
[
'expected' => TEST_BAD,
'fields' => [
'Username' => 'Negative_Test5',
'Groups' => 'Zabbix administrators',
'Password' => 'test5678',
'Password (once again)' => 'tEST5678'
],
'role' => 'Super admin role',
'error_title' => 'Cannot add user',
'error_details' => 'Both passwords must be equal.'
]
],
// Empty 'Refresh' field.
[
[
'expected' => TEST_BAD,
'fields' => [
'Username' => 'Negative_Test6',
'Groups' => 'Zabbix administrators',
'Password' => 'test5678',
'Password (once again)' => 'test5678',
'Refresh' => ''
],
'role' => 'Super admin role',
'error_title' => 'Cannot add user',
'error_details' => 'Incorrect value for field "refresh": cannot be empty.'
]
],
// Digits in value of the 'Refresh' field.
[
[
'expected' => TEST_BAD,
'fields' => [
'Username' => 'Negative_Test7',
'Groups' => 'Zabbix administrators',
'Password' => 'test5678',
'Password (once again)' => 'test5678',
'Refresh' => '123abc'
],
'role' => 'Super admin role',
'error_title' => 'Cannot add user',
'error_details' => 'Invalid parameter "/1/refresh": a time unit is expected.'
]
],
// Value of the 'Refresh' field too large.
[
[
'expected' => TEST_BAD,
'fields' => [
'Username' => 'Negative_Test8',
'Groups' => 'Zabbix administrators',
'Password' => 'test5678',
'Password (once again)' => 'test5678',
'Refresh' => '3601'
],
'role' => 'Super admin role',
'error_title' => 'Cannot add user',
'error_details' => 'Invalid parameter "/1/refresh": value must be one of 0-3600.'
]
],
[
[
'expected' => TEST_BAD,
'fields' => [
'Username' => 'Negative_Test_2h',
'Groups' => 'Zabbix administrators',
'Password' => 'test5678',
'Password (once again)' => 'test5678',
'Refresh' => '2h'
],
'role' => 'Super admin role',
'error_title' => 'Cannot add user',
'error_details' => 'Invalid parameter "/1/refresh": value must be one of 0-3600.'
]
],
[
[
'expected' => TEST_BAD,
'fields' => [
'Username' => 'Negative_Test_61m',
'Groups' => 'Zabbix administrators',
'Password' => 'test5678',
'Password (once again)' => 'test5678',
'Refresh' => '61m'
],
'role' => 'Super admin role',
'error_title' => 'Cannot add user',
'error_details' => 'Invalid parameter "/1/refresh": value must be one of 0-3600.'
]
],
// Non-time unit value in 'Refresh' field.
[
[
'expected' => TEST_BAD,
'fields' => [
'Username' => 'Negative_Test9',
'Groups' => 'Zabbix administrators',
'Password' => 'test5678',
'Password (once again)' => 'test5678',
'Refresh' => '00000000000001'
],
'role' => 'Super admin role',
'error_title' => 'Cannot add user',
'error_details' => 'Invalid parameter "/1/refresh": a time unit is expected.'
]
],
// 'Rows per page' field equal to '0'.
[
[
'expected' => TEST_BAD,
'fields' => [
'Username' => 'Negative_Test10',
'Groups' => 'Zabbix administrators',
'Password' => 'test5678',
'Password (once again)' => 'test5678',
'Rows per page' => '0'
],
'role' => 'Super admin role',
'error_title' => 'Cannot add user',
'error_details' => 'Invalid parameter "/1/rows_per_page": value must be one of 1-999999.'
]
],
// Non-numeric value of 'Rows per page' field.
[
[
'expected' => TEST_BAD,
'fields' => [
'Username' => 'Negative_Test11',
'Groups' => 'Zabbix administrators',
'Password' => 'test5678',
'Password (once again)' => 'test5678',
'Rows per page' => 'abc123'
],
'role' => 'Super admin role',
'error_title' => 'Cannot add user',
'error_details' => 'Invalid parameter "/1/rows_per_page": value must be one of 1-999999.'
]
],
// 'Autologout' below minimal value.
[
[
'expected' => TEST_BAD,
'fields' => [
'Username' => 'Negative_Test12',
'Groups' => 'Zabbix administrators',
'Password' => 'test5678',
'Password (once again)' => 'test5678'
],
'auto_logout' => [
'checked' => true,
'value' => '89'
],
'role' => 'Super admin role',
'error_title' => 'Cannot add user',
'error_details' => 'Invalid parameter "/1/autologout": value must be one of 0, 90-86400.'
]
],
[
[
'expected' => TEST_BAD,
'fields' => [
'Username' => 'Negative_Test12_1m',
'Groups' => 'Zabbix administrators',
'Password' => 'test5678',
'Password (once again)' => 'test5678'
],
'auto_logout' => [
'checked' => true,
'value' => '1m'
],
'role' => 'Super admin role',
'error_title' => 'Cannot add user',
'error_details' => 'Invalid parameter "/1/autologout": value must be one of 0, 90-86400.'
]
],
// 'Autologout' above maximal value.
[
[
'expected' => TEST_BAD,
'fields' => [
'Username' => 'Negative_Test13',
'Groups' => 'Zabbix administrators',
'Password' => 'test5678',
'Password (once again)' => 'test5678'
],
'auto_logout' => [
'checked' => true,
'value' => '86401'
],
'role' => 'Super admin role',
'error_title' => 'Cannot add user',
'error_details' => 'Invalid parameter "/1/autologout": value must be one of 0, 90-86400.'
]
],
[
[
'expected' => TEST_BAD,
'fields' => [
'Username' => 'Negative_Test13_1441m',
'Groups' => 'Zabbix administrators',
'Password' => 'test5678',
'Password (once again)' => 'test5678'
],
'auto_logout' => [
'checked' => true,
'value' => '1441m'
],
'role' => 'Super admin role',
'error_title' => 'Cannot add user',
'error_details' => 'Invalid parameter "/1/autologout": value must be one of 0, 90-86400.'
]
],
[
[
'expected' => TEST_BAD,
'fields' => [
'Username' => 'Negative_Test13_25h',
'Groups' => 'Zabbix administrators',
'Password' => 'test5678',
'Password (once again)' => 'test5678'
],
'auto_logout' => [
'checked' => true,
'value' => '25h'
],
'role' => 'Super admin role',
'error_title' => 'Cannot add user',
'error_details' => 'Invalid parameter "/1/autologout": value must be one of 0, 90-86400.'
]
],
// 'Autologout' with a non-numeric value.
[
[
'expected' => TEST_BAD,
'fields' => [
'Username' => 'Negative_Test14',
'Groups' => 'Zabbix administrators',
'Password' => 'test5678',
'Password (once again)' => 'test5678'
],
'auto_logout' => [
'checked' => true,
'value' => 'ninety'
],
'role' => 'Super admin role',
'error_title' => 'Cannot add user',
'error_details' => 'Invalid parameter "/1/autologout": a time unit is expected.'
]
],
// 'Autologout' with an empty value.
[
[
'expected' => TEST_BAD,
'fields' => [
'Username' => 'Negative_Test15',
'Groups' => 'Zabbix administrators',
'Password' => 'test5678',
'Password (once again)' => 'test5678'
],
'auto_logout' => [
'checked' => true,
'value' => ''
],
'role' => 'Super admin role',
'error_title' => 'Cannot add user',
'error_details' => 'Incorrect value for field "autologout": cannot be empty.'
]
],
// URL unacceptable.
[
[
'expected' => TEST_BAD,
'fields' => [
'Username' => 'Negative_Test16',
'Groups' => 'Zabbix administrators',
'Password' => 'test5678',
'Password (once again)' => 'test5678',
'URL (after login)' => 'javascript:alert(123);'
],
'role' => 'Super admin role',
'error_title' => 'Cannot add user',
'error_details' => 'Invalid parameter "/1/url": unacceptable URL.'
]
],
// Incorrect URL protocol.
[
[
'expected' => TEST_BAD,
'fields' => [
'Username' => 'Negative_Test19',
'Groups' => 'Zabbix administrators',
'Password' => 'test5678',
'Password (once again)' => 'test5678',
'URL (after login)' => 'snmp://zabbix.com'
],
'role' => 'Super admin role',
'error_title' => 'Cannot add user',
'error_details' => 'Invalid parameter "/1/url": unacceptable URL.'
]
],
// Creating user by specifying only mandatory parameters.
[
[
'expected' => TEST_GOOD,
'fields' => [
'Username' => 'Mandatory_user',
'Groups' => 'Guests',
'Password' => 'test5678',
'Password (once again)' => 'test5678'
],
'role' => 'Guest role'
]
],
// Creating a user with optional parameters specified (including autologout) using Cyrillic charatcers.
[
[
'expected' => TEST_GOOD,
'fields' => [
'Username' => 'Оверлорд',
'Name' => 'Антон Антонович',
'Last name' => 'Антонов',
'Groups' => ['Zabbix administrators'],
'Password' => 'абвгдеЁж',
'Password (once again)' => 'абвгдеЁж',
'Theme' => 'High-contrast dark',
'Auto-login' => false,
'Refresh' => '0',
'Rows per page' => '999999',
'URL (after login)' => 'https://zabbix.com'
],
'role' => 'Admin role',
'check_form' => true
]
],
// Creating a user with punctuation symbols in password and optional parameters specified.
[
[
'expected' => TEST_GOOD,
'fields' => [
'Username' => 'Detailed user',
'Name' => 'Bugs',
'Last name' => 'Bunny',
'Groups' => [
'Selenium user group in configuration',
'Zabbix administrators'
],
'Password' => '!@#$%^&*()_+',
'Password (once again)' => '!@#$%^&*()_+',
'Language' => 'English (en_US)',
'Theme' => 'Dark',
'Auto-login' => true,
'Refresh' => '3600s',
'Rows per page' => '1',
'URL (after login)' => 'sysmaps.php'
],
'auto_logout' => [
'checked' => true,
'value' => '1d'
],
'role' => 'Admin role',
'check_form' => true,
'check_user' => true
]
],
// Creating user without a user group.
[
[
'expected' => TEST_GOOD,
'fields' => [
'Username' => 'No_usergroup',
'Password' => 'test5678',
'Password (once again)' => 'test5678'
],
'role' => 'Super admin role'
]
],
// Verification that field password is not mandatory for users with LDAP authentication.
[
[
'expected' => TEST_GOOD,
'fields' => [
'Username' => 'LDAP_user',
'Groups' => 'LDAP user group'
],
'role' => 'Super admin role'
]
],
// Verification that field password is not mandatory for users with no access to frontend.
[
[
'expected' => TEST_GOOD,
'fields' => [
'Username' => 'No_frontend_user',
'Groups' => 'No access to the frontend'
],
'role' => 'User role'
]
]
];
}
/**
* @dataProvider getCreateData
*/
public function testFormUser_Create($data) {
$sql = 'SELECT * FROM users';
$old_hash = CDBHelper::getHash($sql);
$this->page->login()->open('zabbix.php?action=user.edit');
$form = $this->query('name:user_form')->asForm()->waitUntilVisible()->one();
$form->fill($data['fields']);
if (array_key_exists('auto_logout', $data)) {
$this->setAutoLogout($data['auto_logout']);
}
if (array_key_exists('role', $data)) {
$form->selectTab('Permissions');
$form->fill(['Role' => $data['role']]);
}
$form->submit();
$this->page->waitUntilReady();
// Verify that the user was created.
if ($data['expected'] === TEST_BAD) {
$this->assertMessage(TEST_BAD, $data['error_title'], $data['error_details']);
$this->assertEquals($old_hash, CDBHelper::getHash($sql));
}
else {
$this->assertMessage(TEST_GOOD, 'User added');
$this->assertEquals(1, CDBHelper::getCount('SELECT userid FROM users WHERE username='.zbx_dbstr($data['fields']['Username'])));
}
if (CTestArrayHelper::get($data, 'check_form', false)) {
$this->assertFormFields($data);
}
if (CTestArrayHelper::get($data, 'check_user', false)) {
$this->assertUserParameters($data);
}
}
/*
* Check the field values after creating or updating user.
*/
private function assertFormFields($data) {
$userid = CDBHelper::getValue('SELECT userid FROM users WHERE username='.zbx_dbstr($data['fields']['Username']));
$this->page->open('zabbix.php?action=user.edit&userid='.$userid);
$form_update = $this->query('name:user_form')->asForm()->waitUntilVisible()->one();
// Verify that fields are updated.
$check_fields = ['Username', 'Name', 'Last name', 'Language', 'Theme', 'Refresh', 'Rows per page', 'URL (after login)'];
foreach ($check_fields as $field_name) {
if (array_key_exists($field_name, $data['fields'])) {
$this->assertEquals($data['fields'][$field_name], $form_update->getField($field_name)->getValue());
}
}
$this->assertEquals($data['fields']['Groups'], $form_update->getField('Groups')->getSelected());
if (CTestArrayHelper::get($data, 'auto_logout.checked', false)) {
$this->assertTrue($form_update->getField('Auto-login')->isChecked(false));
}
else {
$this->assertTrue($form_update->getField('Auto-login')->isChecked($data['fields']['Auto-login']));
}
if (array_key_exists('role', $data)) {
$form_update->selectTab('Permissions');
$this->assertEquals([$data['role']], $form_update->getField('Role')->getSelected());
}
}
/*
* Login as user and check user profile parameters in UI.
*/
private function assertUserParameters($data) {
try {
$this->page->logout();
// Log in with the created or updated user.
$password = CTestArrayHelper::get($data['fields'], 'Password', $data['fields']['Password'] = 'zabbix');
$this->page->userLogin($data['fields']['Username'], $password);
// Verification of URL after login.
$this->assertStringContainsString($data['fields']['URL (after login)'], $this->page->getCurrentURL());
// Verification of the number of rows per page parameter.
$rows = $this->query('name:frm_maps')->asTable()->waitUntilVisible()->one()->getRows();
$this->assertEquals($data['fields']['Rows per page'], $rows->count());
// Verification of default theme.
$db_theme = CDBHelper::getValue('SELECT theme FROM users WHERE username='.zbx_dbstr($data['fields']['Username']));
$color = $this->query('tag:body')->one()->getCSSValue('background-color');
$stylesheet = $this->query('xpath://link[@rel="stylesheet"]')->one();
$parts = explode('/', $stylesheet->getAttribute('href'));
$file_time = explode('?', end($parts));
$file = $file_time[0];
if ($data['fields']['Theme'] === 'Dark') {
$this->assertEquals('dark-theme', $db_theme);
$this->assertEquals('dark-theme.css', $file);
$this->assertEquals('rgba(14, 16, 18, 1)', $color);
}
else if ($data['fields']['Theme'] === 'High-contrast light') {
$this->assertEquals('hc-light', $db_theme);
$this->assertEquals('hc-light.css', $file);
$this->assertEquals('rgba(255, 255, 255, 1)', $color);
}
$this->page->logout();
}
catch (Exception $e) {
$this->page->logout();
throw $e;
}
}
public function getUpdateData() {
return [
// Username is already taken by another user.
[
[
'expected' => TEST_BAD,
'fields' => [
'Username' => 'Admin'
],
'error_title' => 'Cannot update user',
'error_details' => 'User with username "Admin" already exists.'
]
],
// Empty 'Username' field.
[
[
'expected' => TEST_BAD,
'fields' => [
'Username' => ''
],
'error_title' => 'Cannot update user',
'error_details' => 'Incorrect value for field "username": cannot be empty.'
]
],
// Empty 'Password (once again)' field.
[
[
'expected' => TEST_BAD,
'fields' => [
'Password' => 'test5678'
],
'error_title' => 'Cannot update user',
'error_details' => 'Both passwords must be equal.'
]
],
// Empty 'Password' field.
[
[
'expected' => TEST_BAD,
'fields' => [
'Password (once again)' => 'test5678'
],
'error_title' => 'Cannot update user',
'error_details' => 'Both passwords must be equal.'
]
],
// 'Password' and 'Password (once again)' do not match.
[
[
'expected' => TEST_BAD,
'fields' => [
'Groups' => 'Zabbix administrators',
'Password' => 'test5678',
'Password (once again)' => 'teST5678'
],
'error_title' => 'Cannot update user',
'error_details' => 'Both passwords must be equal.'
]
],
// Empty 'Refresh' field.
[
[
'expected' => TEST_BAD,
'fields' => [
'Groups' => 'Zabbix administrators',
'Password' => 'test5678',
'Password (once again)' => 'test5678',
'Refresh' => ''
],
'error_title' => 'Cannot update user',
'error_details' => 'Incorrect value for field "refresh": cannot be empty.'
]
],
// Digits in value of the 'Refresh' field.
[
[
'expected' => TEST_BAD,
'fields' => [
'Refresh' => '123abc'
],
'error_title' => 'Cannot update user',
'error_details' => 'Invalid parameter "/1/refresh": a time unit is expected.'
]
],
// Value of the 'Refresh' field too large.
[
[
'expected' => TEST_BAD,
'fields' => [
'Refresh' => '3601'
],
'error_title' => 'Cannot update user',
'error_details' => 'Invalid parameter "/1/refresh": value must be one of 0-3600.'
]
],
[
[
'expected' => TEST_BAD,
'fields' => [
'Refresh' => '61m'
],
'error_title' => 'Cannot update user',
'error_details' => 'Invalid parameter "/1/refresh": value must be one of 0-3600.'
]
],
// Non time unit value in 'Refresh' field.
[
[
'expected' => TEST_BAD,
'fields' => [
'Refresh' => '00000000000001'
],
'error_title' => 'Cannot update user',
'error_details' => 'Invalid parameter "/1/refresh": a time unit is expected.'
]
],
// 'Rows per page' field equal to '0'.
[
[
'expected' => TEST_BAD,
'fields' => [
'Rows per page' => '0'
],
'error_title' => 'Cannot update user',
'error_details' => 'Invalid parameter "/1/rows_per_page": value must be one of 1-999999.'
]
],
// Non-numeric value of 'Rows per page' field.
[
[
'expected' => TEST_BAD,
'fields' => [
'Rows per page' => 'abc123'
],
'error_title' => 'Cannot update user',
'error_details' => 'Invalid parameter "/1/rows_per_page": value must be one of 1-999999.'
]
],
// 'Autologout' below minimal value.
[
[
'expected' => TEST_BAD,
'fields' => [],
'auto_logout' => [
'checked' => true,
'value' => '89'
],
'error_title' => 'Cannot update user',
'error_details' => 'Invalid parameter "/1/autologout": value must be one of 0, 90-86400.'
]
],
// 'Autologout' above maximal value.
[
[
'expected' => TEST_BAD,
'fields' => [],
'auto_logout' => [
'checked' => true,
'value' => '86401'
],
'error_title' => 'Cannot update user',
'error_details' => 'Invalid parameter "/1/autologout": value must be one of 0, 90-86400.'
]
],
[
[
'expected' => TEST_BAD,
'fields' => [],
'auto_logout' => [
'checked' => true,
'value' => '1m'
],
'error_title' => 'Cannot update user',
'error_details' => 'Invalid parameter "/1/autologout": value must be one of 0, 90-86400.'
]
],
[
[
'expected' => TEST_BAD,
'fields' => [],
'auto_logout' => [
'checked' => true,
'value' => '1441m'
],
'error_title' => 'Cannot update user',
'error_details' => 'Invalid parameter "/1/autologout": value must be one of 0, 90-86400.'
]
],
[
[
'expected' => TEST_BAD,
'fields' => [],
'auto_logout' => [
'checked' => true,
'value' => '25h'
],
'error_title' => 'Cannot update user',
'error_details' => 'Invalid parameter "/1/autologout": value must be one of 0, 90-86400.'
]
],
// 'Autologout' with a non-numeric value.
[
[
'expected' => TEST_BAD,
'fields' => [],
'auto_logout' => [
'checked' => true,
'value' => 'ninety'
],
'error_title' => 'Cannot update user',
'error_details' => 'Invalid parameter "/1/autologout": a time unit is expected.'
]
],
// 'Autologout' with an empty value.
[
[
'expected' => TEST_BAD,
'fields' => [],
'auto_logout' => [
'checked' => true,
'value' => ''
],
'error_title' => 'Cannot update user',
'error_details' => 'Incorrect value for field "autologout": cannot be empty.'
]
],
// URL unacceptable.
[
[
'expected' => TEST_BAD,
'fields' => [
'URL (after login)' => 'javascript:alert(123);'
],
'error_title' => 'Cannot update user',
'error_details' => 'Invalid parameter "/1/url": unacceptable URL.'
]
],
// Incorrect URL protocol.
[
[
'expected' => TEST_BAD,
'fields' => [
'URL (after login)' => 'snmp://zabbix.com'
],
'error_title' => 'Cannot update user',
'error_details' => 'Invalid parameter "/1/url": unacceptable URL.'
]
],
// Updating all fields (except password) of an existing user.
[
[
'expected' => TEST_GOOD,
'user_to_update' => 'disabled-user',
'fields' => [
'Username' => 'Updated_user_1',
'Name' => 'Test_Name',
'Last name' => 'Test_Surname',
'Groups' => [
'Selenium user group in configuration'
],
'Language' => 'English (en_US)',
'Theme' => 'Dark',
'Auto-login' => true,
'Refresh' => '60m',
'Rows per page' => '1',
'URL (after login)' => 'sysmaps.php'
],
'auto_logout' => [
'checked' => true,
'value' => '24h'
],
'check_form' => true
]
],
[
[
'expected' => TEST_GOOD,
'fields' => [
'Username' => 'Updated_user',
'Name' => 'Road',
'Last name' => 'Runner',
'Groups' => [],
'Language' => 'English (en_US)',
'Theme' => 'High-contrast light',
'Auto-login' => true,
'Refresh' => '1h',
'Rows per page' => '1',
'URL (after login)' => 'sysmaps.php'
],
'check_form' => true,
'check_user' => true
]
]
];
}
/**
* @dataProvider getUpdateData
*/
public function testFormUser_Update($data) {
$update_user = CTestArrayHelper::get($data, 'user_to_update', 'Tag-user');
$sql = 'SELECT * FROM users';
$old_hash = CDBHelper::getHash($sql);
$this->page->login()->open('zabbix.php?action=user.list');
$this->query('link', $update_user)->waitUntilVisible()->one()->click();
// Update user parameters.
$form = $this->query('name:user_form')->asForm()->one();
if (array_key_exists('Password', $data['fields']) || array_key_exists('Password (once again)', $data['fields'])) {
$form->query('button:Change password')->one()->click();
}
$form->fill($data['fields']);
if (array_key_exists('auto_logout', $data)) {
$this->setAutoLogout($data['auto_logout']);
}
$form->submit();
if (array_key_exists('Password', $data['fields']) && array_key_exists('Password (once again)', $data['fields'])) {
$this->assertTrue($this->page->isAlertPresent());
$this->assertEquals('In case of successful password change user will be logged out of all active sessions. Continue?',
$this->page->getAlertText()
);
$this->page->acceptAlert();
}
$this->page->waitUntilReady();
// Verify if the user was updated.
if ($data['expected'] === TEST_BAD) {
$this->assertMessage(TEST_BAD, $data['error_title'], $data['error_details']);
$this->assertEquals($old_hash, CDBHelper::getHash($sql));
}
else {
$this->assertMessage(TEST_GOOD, 'User updated');
$this->assertEquals(1, CDBHelper::getCount('SELECT userid FROM users WHERE username='.zbx_dbstr($data['fields']['Username'])));
}
if (CTestArrayHelper::get($data, 'check_form', false)) {
$this->assertFormFields($data);
}
if (CTestArrayHelper::get($data, 'check_user', false)) {
$this->assertUserParameters($data);
}
}
/**
* Test update without any modification of user data.
*/
public function testFormUser_SimpleUpdate() {
$sql_hash = 'SELECT * FROM users ORDER BY userid';
$old_hash = CDBHelper::getHash($sql_hash);
$this->page->login()->open('zabbix.php?action=user.list');
$this->query('link', 'test-user')->waitUntilVisible()->one()->click();
$form = $this->query('name:user_form')->asForm()->waitUntilVisible()->one();
$form->submit();
$this->page->waitUntilReady();
$message = CMessageElement::find()->one();
$this->assertTrue($message->isGood());
$this->assertEquals('User updated', $message->getTitle());
$this->assertEquals($old_hash, CDBHelper::getHash($sql_hash));
}
/**
* Test user password change and sign in with new password.
*/
public function testFormUser_PasswordUpdate() {
$data = [
'username' => 'user-zabbix',
'old_password' => 'test5678',
'new_password' => 'test5678_new',
'error_message' => 'Incorrect user name or password or account is temporarily blocked.',
'attempt_message' => '1 failed login attempt logged. Last failed attempt was from'
];
$this->page->login()->open('zabbix.php?action=user.list');
$this->query('link', $data['username'])->waitUntilVisible()->one()->click();
$form_update = $this->query('name:user_form')->asForm()->waitUntilVisible()->one();
$form_update->query('button:Change password')->one()->click();
// Change user password and log out.
$form_update->fill([
'Password' => $data['new_password'],
'Password (once again)' => $data['new_password']
]);
$form_update->submit();
$this->assertTrue($this->page->isAlertPresent());
$this->assertEquals('In case of successful password change user will be logged out of all active sessions. Continue?',
$this->page->getAlertText()
);
$this->page->acceptAlert();
try {
$this->page->logout();
// Attempt to sign in with old password.
$this->page->userLogin($data['username'], $data['old_password']);
$message = $this->query('class:red')->one()->getText();
$this->assertEquals($message, $data['error_message']);
// Sign in with new password.
$this->page->userLogin($data['username'], $data['new_password']);
$attempt_message = CMessageElement::find()->one();
$this->assertTrue($attempt_message->hasLine($data['attempt_message']));
$this->page->logout();
}
catch (\Exception $e) {
// Logout to execute remaining tests.
$this->page->logout();
throw $e;
}
}
public function getDeleteData() {
return [
[
[
'expected' => TEST_GOOD,
'fields' => [
'Username' => 'no-access-to-the-frontend'
]
]
],
// Attempt to delete internal user guest.
[
[
'expected' => TEST_BAD,
'username' => 'guest',
'error_details' => 'Cannot delete Zabbix internal user "guest", try disabling that user.'
]
],
// Attempt to delete a user that owns a map.
[
[
'expected' => TEST_BAD,
'username' => 'user-zabbix',
'parameters' => [
'DB_table' => 'sysmaps',
'column' => 'name',
'value' => 'Local network'
],
'error_details' => 'User "user-zabbix" is map "Local network" owner.'
]
],
// Attempt to delete a user that owns a dashboard.
[
[
'expected' => TEST_BAD,
'username' => 'test-timezone',
'error_details' => 'User "test-timezone" is dashboard "Testing share dashboard" owner.'
]
],
// Attempt to delete a user that is mentioned in an action.
[
[
'expected' => TEST_BAD,
'username' => 'user-for-blocking',
'parameters' => [
'DB_table' => 'opmessage_usr',
'column' => 'operationid',
'value' => '19'
],
'error_details' => 'User "user-for-blocking" is used in "Trigger action 4" action.'
]
]
];
}
/**
* @dataProvider getDeleteData
*/
public function testFormUser_Delete($data) {
// Defined required variables.
if (array_key_exists('username', $data)) {
$username = $data['username'];
}
else {
$username = $data['fields']['Username'];
}
$this->page->login()->open('zabbix.php?action=user.list');
$this->query('link', $username)->one()->click();
$userid = CDBHelper::getValue('SELECT userid FROM users WHERE username='.zbx_dbstr($username));
// Link user with map, action to validate user deletion.
if (array_key_exists('parameters', $data)) {
DBexecute(
'UPDATE '.$data['parameters']['DB_table'].' SET userid ='.zbx_dbstr($userid).
' WHERE '.$data['parameters']['column'].'='.zbx_dbstr($data['parameters']['value'])
);
}
// Attempt to delete the user from user update view and verify result.
$this->query('button:Delete')->one()->click();
$this->page->acceptAlert();
$this->page->waitUntilReady();
// Validate if the user was deleted.
if ($data['expected'] === TEST_BAD) {
$this->assertMessage(TEST_BAD, 'Cannot delete user', $data['error_details']);
$this->assertEquals(1, CDBHelper::getCount('SELECT userid FROM users WHERE username='.zbx_dbstr($username)));
}
else {
$this->assertMessage(TEST_GOOD, 'User deleted');
$this->assertEquals(0, CDBHelper::getCount('SELECT userid FROM users WHERE username='.zbx_dbstr($data['fields']['Username'])));
}
}
/**
* Check that user can't delete himself.
*/
public function testFormUser_SelfDeletion() {
$this->page->login()->open('zabbix.php?action=user.edit&userid=1');
$this->assertTrue($this->query('button:Delete')->waitUntilVisible()->one()->isEnabled(false));
}
public function testFormUser_Cancel() {
$data = [
'Username' => 'user-cancel',
'Password' => 'zabbix',
'Password (once again)' => 'zabbix',
'Groups' => 'Guests'
];
$sql_users = 'SELECT * FROM users ORDER BY userid';
$user_hash = CDBHelper::getHash($sql_users);
$this->page->login()->open('zabbix.php?action=user.edit');
// Check cancellation when creating users.
$form_create = $this->query('name:user_form')->asForm()->waitUntilVisible()->one();
$form_create->fill($data);
$this->query('button:Cancel')->one()->click();
$cancel_url = $this->page->getCurrentURL();
$this->assertStringContainsString('zabbix.php?action=user.list', $cancel_url);
$this->assertEquals($user_hash, CDBHelper::getHash($sql_users));
// Check Cancellation when updating users.
$this->page->open('zabbix.php?action=user.edit&userid=1');
$this->query('id:name')->one()->fill('Boris');
$this->query('button:Cancel')->one()->click();
$this->assertEquals($user_hash, CDBHelper::getHash($sql_users));
}
private function setAutoLogout($data) {
$form = $this->query('name:user_form')->asForm()->one();
$auto_logout = $form->getFieldContainer('Auto-logout');
$auto_logout->query('id:autologout_visible')->asCheckbox()->one()->set($data['checked']);
if (array_key_exists('value', $data)) {
$auto_logout->query('id:autologout')->one()->overwrite($data['value']);
}
// Verify that Auto-login is unchecked after setting Auto-logout.
$this->assertTrue($form->getField('Auto-login')->isChecked(false));
}
}