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.

824 lines
21 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?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/CAPITest.php';
/**
* @backup globalmacro
* @backup hostmacro
*/
class testUserMacro extends CAPITest {
public static function hostmacro_create() {
return [
[
'hostmacro' => [
'macro' => '{$ADD_1}',
'value' => 'test',
'type' => '0',
'hostid' => '90020',
'description' => 'text'
],
'expected_error' => null
],
[
'hostmacro' => [
[
'macro' => '{$MACRO}',
'value' => '',
'hostid' => 90020
],
[
'macro' => '{$MACRO}',
'value' => '',
'hostid' => 90020
]
],
'expected_error' => 'Invalid parameter "/2": value (hostid, macro)=(90020, {$MACRO}) already exists.'
],
[
'hostmacro' => [
[
'macro' => '{$MACRO: /var}',
'value' => '',
'hostid' => 90020
],
[
'macro' => '{$MACRO: /var}',
'value' => '',
'hostid' => 90021
],
[
'macro' => '{$MACRO: "/tmp"}',
'value' => '',
'hostid' => 90020
],
[
'macro' => '{$MACRO: "/var"}',
'value' => '',
'hostid' => 90020
]
],
'expected_error' => 'Invalid parameter "/4": value (hostid, macro)=(90020, {$MACRO: "/var"}) already exists.'
],
[
'hostmacro' => [
'macro' => '{$ADD_2}',
'value' => 'test',
'type' => '0',
'hostid' => '90020',
'description' => ''
],
'expected_error' => null,
'expect_db_row' => [
'macro' => '{$ADD_2}',
'value' => 'test',
'type' => '0',
'hostid' => '90020',
'description' => '',
'automatic' => '0'
]
],
[
'hostmacro' => [
'macro' => '{$VAULT}',
'value' => 'a/b:c',
'type' => '2',
'hostid' => '90020'
],
'expected_error' => null
],
[
'hostmacro' => [
'macro' => '{$VAULT: "context"}',
'value' => 'a/b:c',
'type' => '2',
'hostid' => '90020'
],
'expected_error' => null
],
[
'hostmacro' => [
'macro' => '{$VAULT: "empty"}',
'value' => '',
'type' => '2',
'hostid' => '90020'
],
'expected_error' => 'Invalid parameter "/1/value": cannot be empty.'
],
[
'hostmacro' => [
'macro' => '{$VAULT: "invalid"}',
'value' => '/',
'type' => '2',
'hostid' => '90020'
],
'expected_error' => 'Invalid parameter "/1/value": incorrect syntax near "/".'
]
];
}
/**
* @dataProvider hostmacro_create
*/
public function testUserMacro_Create($hostmacro, $expected_error, $expect = []) {
$result = $this->call('usermacro.create', $hostmacro, $expected_error);
if ($expected_error === null) {
foreach ($result['result']['hostmacroids'] as $key => $id) {
$dbResult = DBSelect('select * from hostmacro where hostmacroid='.zbx_dbstr($id));
$dbRow = DBFetch($dbResult);
$this->assertEquals($dbRow['macro'], $hostmacro['macro']);
$this->assertEquals($dbRow['value'], $hostmacro['value']);
$this->assertEquals($dbRow['type'], $hostmacro['type']);
if (array_key_exists('description', $hostmacro)) {
$this->assertEquals($dbRow['description'], $hostmacro['description']);
}
if ($expect) {
$expect['hostmacroid'] = $id;
$this->assertEquals($dbRow, $expect);
}
}
}
}
public static function globalmacro_create() {
return [
// Check unexpected parameter
[
'globalmacro' => [
'macro' => '{$HOSTID}',
'value' => 'test',
'hostid' => '100084'
],
'expected_error' => 'Invalid parameter "/1": unexpected parameter "hostid".'
],
// Check macro.
[
'globalmacro' => [
'value' => 'test'
],
'expected_error' => 'Invalid parameter "/1": the parameter "macro" is missing.'
],
// Check existing macro
[
'globalmacro' => [
'macro' => '{$SNMP_COMMUNITY}',
'value' => 'test'
],
'expected_error' => 'Macro "{$SNMP_COMMUNITY}" already exists.'
],
[
'globalmacro' => [
[
'macro' => '{$THESAMEMACRO}',
'value' => 'test'
],
[
'macro' => '{$THESAMEMACRO}',
'value' => 'test'
]
],
'expected_error' => 'Invalid parameter "/2": value (macro)=({$THESAMEMACRO}) already exists.'
],
// Check value
[
'globalmacro' => [
'macro' => '{$CHECKVALUE}'
],
'expected_error' => 'Invalid parameter "/1": the parameter "value" is missing.'
],
// Check successfully creation of global macro.
[
'globalmacro' => [
[
'macro' => '{$ABC123}',
'value' => 'test'
]
],
'expected_error' => null
],
[
'globalmacro' => [
[
'macro' => '{$MACRO:context}',
'value' => 'test'
]
],
'expected_error' => null
],
[
'globalmacro' => [
[
'macro' => '{$MACRO:"A"}',
'value' => 'test'
]
],
'expected_error' => null
],
[
'globalmacro' => [
[
'macro' => '{$VAULT}',
'value' => 'a/b:c',
'type' => '2'
]
],
'expected_error' => null
],
[
'globalmacro' => [
[
'macro' => '{$ONE_MACRO}',
'value' => 'one'
],
[
'macro' => '{$TWO.MACRO}',
'value' => 'æų'
]
],
'expected_error' => null
],
// Description field.
[
'globalmacro' => [
[
'macro' => '{$ONE_MACRO_DESC}',
'value' => 'one',
'description' => 'one'
],
[
'macro' => '{$TWO.MACRO_DESC}',
'value' => 'æų',
'description' => 'æų'
]
],
'expected_error' => null
]
];
}
/**
* @dataProvider globalmacro_create
*/
public function testUserMacro_CreateGlobal($globalmacro, $expected_error) {
$result = $this->call('usermacro.createglobal', $globalmacro, $expected_error);
if ($expected_error === null) {
foreach ($result['result']['globalmacroids'] as $key => $id) {
$dbResult = DBSelect('select * from globalmacro where globalmacroid='.zbx_dbstr($id));
$dbRow = DBFetch($dbResult);
$this->assertEquals($dbRow['macro'], $globalmacro[$key]['macro']);
$this->assertEquals($dbRow['value'], $globalmacro[$key]['value']);
if (array_key_exists('description', $globalmacro[$key])) {
$this->assertEquals($dbRow['description'], $globalmacro[$key]['description']);
}
}
}
}
public static function globalmacro_failed() {
return [
// Check unexpected parameter
[
'globalmacro' => [
'macro' => '{$HOSTID}',
'value' => 'test',
'hostid ' => '100084'
],
'expected_error' => 'Invalid parameter "/1": unexpected parameter "hostid ".'
],
// Check macro.
[
'globalmacro' => [
'macro' => '',
'value' => 'test'
],
'expected_error' => 'Invalid parameter "/1/macro": cannot be empty.'
],
[
'globalmacro' => [
'macro' => 'test',
'value' => 'test'
],
'expected_error' => 'Invalid parameter "/1/macro": incorrect syntax near "test".'
],
[
'globalmacro' => [
'macro' => '{$globalmacro}',
'value' => 'test'
],
'expected_error' => 'Invalid parameter "/1/macro": incorrect syntax near "globalmacro}".'
],
[
'globalmacro' => [
'macro' => '☺',
'value' => 'test'
],
'expected_error' => 'Invalid parameter "/1/macro": incorrect syntax near "☺".'
],
[
'globalmacro' => [
'macro' => '{GlOBALMACRO}',
'value' => 'test'
],
'expected_error' => 'Invalid parameter "/1/macro": incorrect syntax near "GlOBALMACRO}".'
],
[
'globalmacro' => [
'macro' => '{$GlOBALMACRO',
'value' => 'test'
],
'expected_error' => 'Invalid parameter "/1/macro": incorrect syntax near "lOBALMACRO".'
],
[
'globalmacro' => [
'macro' => '{$GlOBALMACRO}}',
'value' => 'test'
],
'expected_error' => 'Invalid parameter "/1/macro": incorrect syntax near "lOBALMACRO}}".'
],
[
'globalmacro' => [
'macro' => '{{$GlOBALMACRO}}',
'value' => 'test'
],
'expected_error' => 'Invalid parameter "/1/macro": incorrect syntax near "{$GlOBALMACRO}}".'
],
[
'globalmacro' => [
'macro' => '{$УТФ8}',
'value' => 'test'
],
'expected_error' => 'Invalid parameter "/1/macro": incorrect syntax near "УТФ8}".'
],
[
'globalmacro' => [
'macro' => '{$!@#$%^&*()-=<>}',
'value' => 'test'
],
'expected_error' => 'Invalid parameter "/1/macro": incorrect syntax near "!@#$%^&*()-=<>}".'
],
[
'globalmacro' => [
'macro' => '{$SUSPENDISSE_CONDIMENTUM_VELIT_EU_SAPIENAPELLENTESQUEFPRETIUMTVELHACAAUGUEU_FFUSCE_ET_ANTE_IN_SEM_PHARETRA_PRETIUMMMMAURIS_DAPIBUS_FERMENTUM_URNA_SSCELERISQUE_ACCUMSAN_NULL_GCOMMODO_SIT_AMET_NNULLA_DAPIBUS_ID_PURUS_VITAE_MOLLIS_UPROIN_ET_SAPIEN_ET_TELLUS1}',
'value' => 'long macro'
],
'expected_error' => 'Invalid parameter "/1/macro": value is too long.'
],
[
'globalmacro' => [
'macro' => '{$LONG_VALUE}',
'value' => str_repeat('a', 2049)
],
'expected_error' => 'Invalid parameter "/1/value": value is too long.'
],
[
'globalmacro' => [
'macro' => '{$GLOBALMACRO_WITH_LONG_2_BYTE_CHARACTER_VALUE}',
'value' => str_repeat('ö', 2049)
],
'expected_error' => 'Invalid parameter "/1/value": value is too long.'
],
[
'globalmacro' => [
'macro' => '{$GLOBALMACRO_WITH_LONG_3_BYTE_CHARACTER_VALUE}',
'value' => str_repeat('坏', 2049)
],
'expected_error' => 'Invalid parameter "/1/value": value is too long.'
],
[
'globalmacro' => [
'macro' => '{$VAULT: "empty"}',
'value' => '',
'type' => '2'
],
'expected_error' => 'Invalid parameter "/1/value": cannot be empty.'
],
[
'globalmacro' => [
'macro' => '{$VAULT: "cute"}',
'value' => ':)',
'type' => '2'
],
'expected_error' => 'Invalid parameter "/1/value": incorrect syntax near ":)".'
]
];
}
/**
* @dataProvider globalmacro_failed
*/
public function testUserMacro_FailedCreateUpdateGlobal($globalmacro, $expected_error) {
$methods = ['usermacro.createglobal', 'usermacro.updateglobal'];
foreach ($methods as $method) {
if ($method == 'usermacro.updateglobal') {
$globalmacro['globalmacroid'] = '13';
}
$this->call($method, $globalmacro, $expected_error);
if (array_key_exists('macro', $globalmacro)) {
$dbResult = 'select * from globalmacro where macro='.zbx_dbstr($globalmacro['macro']);
$this->assertEquals(0, CDBHelper::getCount($dbResult));
}
}
}
public static function hostmacro_update() {
return [
[
'hostmacro' => [
[
'hostmacroid' => '1',
'value' => 'test'
],
[
'hostmacroid' => '2',
'value' => 'test',
'description' => 'notes'
]
],
'expected_error' => null,
'expect_db_rows' => [
[
'hostmacroid' => '1',
'value' => 'test',
'description' => 'description'
],
[
'hostmacroid' => '2',
'value' => 'test',
'description' => 'notes'
]
]
]
];
}
/**
* @dataProvider hostmacro_update
*/
public function testUserMacro_Update($hostmacros, $expected_error, $expect) {
$result = $this->call('usermacro.update', $hostmacros, $expected_error);
if ($expected_error === null) {
foreach ($result['result']['hostmacroids'] as $key => $id) {
$dbResult = DBSelect('select * from hostmacro where hostmacroid='.zbx_dbstr($id));
$dbRow = DBFetch($dbResult);
foreach ($expect[$key] as $field => $value) {
$this->assertEquals($dbRow[$field], $expect[$key][$field]);
}
}
}
}
public static function globalmacro_update() {
return [
// Check macro id
[
'globalmacro' => [[
'value' => 'test'
]],
'expected_error' => 'Invalid parameter "/1": the parameter "globalmacroid" is missing.'
],
[
'globalmacro' => [[
'globalmacroid' => '',
'value' => 'test'
]],
'expected_error' => 'Invalid parameter "/1/globalmacroid": a number is expected.'
],
[
'globalmacro' => [[
'globalmacroid' => 'abc',
'value' => 'test'
]],
'expected_error' => 'Invalid parameter "/1/globalmacroid": a number is expected.'
],
[
'globalmacro' => [[
'globalmacroid' => '123456',
'value' => 'test'
]],
'expected_error' => 'No permissions to referred object or it does not exist!'
],
// Check existing macro
[
'globalmacro' => [[
'globalmacroid' => '13',
'macro' => '{$SNMP_COMMUNITY}'
]],
'expected_error' => 'Macro "{$SNMP_COMMUNITY}" already exists.'
],
[
'globalmacro' => [
[
'globalmacroid' => '13',
'macro' => '{$THESAMEMACROID1}'
],
[
'globalmacroid' => '13',
'macro' => '{$THESAMEMACROID2}'
]
],
'expected_error' => 'Invalid parameter "/2": value (globalmacroid)=(13) already exists.'
],
// Check successfully update of global macro.
[
'globalmacro' => [
[
'globalmacroid' => '13',
'macro' => '{$MACRO_UPDATED}',
'value' => 'updated'
]
],
'expected_error' => null
],
[
'globalmacro' => [
[
'globalmacroid' => '13',
'macro' => '{$MACRO_UPDATED1}',
'value' => 'updated1'
],
[
'globalmacroid' => '14',
'macro' => '{$MACRO_UPDATED2}',
'value' => 'updated2',
'description' => 'æų'
]
],
'expected_error' => null,
'expect_db_rows' => [
[
'globalmacroid' => '13',
'macro' => '{$MACRO_UPDATED1}',
'value' => 'updated1',
'description' => 'desc',
'type' => '0'
],
[
'globalmacroid' => '14',
'macro' => '{$MACRO_UPDATED2}',
'value' => 'updated2',
'description' => 'æų',
'type' => '0'
]
]
],
[
'globalmacro' => [
[
'globalmacroid' => '13',
'macro' => '{$MACRO_UPDATED1}',
'value' => 'updated1',
'description' => ''
]
],
'expected_error' => null
]
];
}
/**
* @dataProvider globalmacro_update
*/
public function testUserMacro_UpdateGlobal($globalmacros, $expected_error, $expect = []) {
$result = $this->call('usermacro.updateglobal', $globalmacros, $expected_error);
if ($expected_error === null) {
foreach ($result['result']['globalmacroids'] as $key => $id) {
$dbResult = DBSelect('select * from globalmacro where globalmacroid='.zbx_dbstr($id));
$dbRow = DBFetch($dbResult);
$this->assertEquals($dbRow['macro'], $globalmacros[$key]['macro']);
$this->assertEquals($dbRow['value'], $globalmacros[$key]['value']);
if (array_key_exists('description', $globalmacros[$key])) {
$this->assertEquals($dbRow['description'], $globalmacros[$key]['description']);
}
if ($expect) {
$this->assertEquals($dbRow, $expect[$key]);
}
}
}
else {
foreach ($globalmacros as $globalmacro) {
if (array_key_exists('macro', $globalmacro) && $globalmacro['macro'] != '{$SNMP_COMMUNITY}') {
$dbResult = "select * from globalmacro where macro=".zbx_dbstr($globalmacro['macro']);
$this->assertEquals(0, CDBHelper::getCount($dbResult));
}
}
}
}
public static function globalmacro_delete() {
return [
[
'globalmacro' => [
''
],
'expected_error' => 'Invalid parameter "/1": a number is expected.'
],
[
'globalmacro' => [
'123456'
],
'expected_error' => 'No permissions to referred object or it does not exist!'
],
[
'globalmacro' => [
'abc'
],
'expected_error' => 'Invalid parameter "/1": a number is expected.'
],
[
'globalmacro' => [
'.'
],
'expected_error' => 'Invalid parameter "/1": a number is expected.'
],
[
'globalmacro' => [
'15',
'123456'
],
'expected_error' => 'No permissions to referred object or it does not exist!'
],
[
'globalmacro' => [
'15',
'abc'
],
'expected_error' => 'Invalid parameter "/2": a number is expected.'
],
[
'globalmacro' => [
'15',
''
],
'expected_error' => 'Invalid parameter "/2": a number is expected.'
],
[
'globalmacro' => [
'15',
'15'
],
'expected_error' => 'Invalid parameter "/2": value (15) already exists.'
],
[
'globalmacro' => [
'15'
],
'expected_error' => null
],
[
'globalmacro' => [
'16',
'17'
],
'expected_error' => null
]
];
}
/**
* @dataProvider globalmacro_delete
*/
public function testUserMacro_DeleteGlobal($globalmacro, $expected_error) {
$result = $this->call('usermacro.deleteglobal', $globalmacro, $expected_error);
if ($expected_error === null) {
foreach ($result['result']['globalmacroids'] as $id) {
$dbResult = 'select * from globalmacro where globalmacroid='.zbx_dbstr($id);
$this->assertEquals(0, CDBHelper::getCount($dbResult));
}
}
}
public static function globalmacro_permissions() {
return [
// Check zabbix admin permissions to create, update and delete global macro.
[
'method' => 'usermacro.createglobal',
'user' => ['user' => 'zabbix-admin', 'password' => 'zabbix'],
'globalmacro' => [
'macro' => '{$MACRO_ADMIN}',
'value' => 'admin'
],
'expected_error' => 'No permissions to call "usermacro.createglobal".'
],
[
'method' => 'usermacro.updateglobal',
'user' => ['user' => 'zabbix-admin', 'password' => 'zabbix'],
'globalmacro' => [
'globalmacroid' => '13',
'macro' => '{$MACRO_UPDATE_ADMIN}'
],
'expected_error' => 'No permissions to call "usermacro.updateglobal".'
],
[
'method' => 'usermacro.deleteglobal',
'user' => ['user' => 'zabbix-admin', 'password' => 'zabbix'],
'globalmacro' => ['13'],
'expected_error' => 'No permissions to call "usermacro.deleteglobal".'
],
// Check zabbix user permissions to create, update and delete global macro.
[
'method' => 'usermacro.createglobal',
'user' => ['user' => 'zabbix-user', 'password' => 'zabbix'],
'globalmacro' => [
'macro' => '{$MACRO_USER}',
'value' => 'USER'
],
'expected_error' => 'No permissions to call "usermacro.createglobal".'
],
[
'method' => 'usermacro.updateglobal',
'user' => ['user' => 'zabbix-user', 'password' => 'zabbix'],
'globalmacro' => [
'globalmacroid' => '14',
'macro' => '{$MACRO_UPDATE_USER}'
],
'expected_error' => 'No permissions to call "usermacro.updateglobal".'
],
[
'method' => 'usermacro.deleteglobal',
'user' => ['user' => 'zabbix-user', 'password' => 'zabbix'],
'globalmacro' => ['14'],
'expected_error' => 'No permissions to call "usermacro.deleteglobal".'
],
// Check guset permissions to create, update and delete global macro.
[
'method' => 'usermacro.createglobal',
'user' => ['user' => 'guest', 'password' => ''],
'globalmacro' => [
'macro' => '{$MACRO_GUEST}',
'value' => 'GUEST'
],
'expected_error' => 'No permissions to call "usermacro.createglobal".'
],
[
'method' => 'usermacro.updateglobal',
'user' => ['user' => 'guest', 'password' => ''],
'globalmacro' => [
'globalmacroid' => '14',
'macro' => '{$MACRO_UPDATE_GUEST}'
],
'expected_error' => 'No permissions to call "usermacro.updateglobal".'
],
[
'method' => 'usermacro.deleteglobal',
'user' => ['user' => 'guest', 'password' => ''],
'globalmacro' => ['14'],
'expected_error' => 'No permissions to call "usermacro.deleteglobal".'
]
];
}
/**
* @onBefore removeGuestFromDisabledGroup
* @onAfter addGuestToDisabledGroup
*
* @dataProvider globalmacro_permissions
*/
public function testUserMacro_UserPermissionsGlobal($method, $user, $globalmacro, $expected_error) {
$this->authorize($user['user'], $user['password']);
$this->call($method, $globalmacro, $expected_error);
}
/**
* Guest user needs to be out of "Disabled" group to have access to frontend.
*/
public static function removeGuestFromDisabledGroup() {
DBexecute('DELETE FROM users_groups WHERE userid=2 AND usrgrpid=9');
}
public function addGuestToDisabledGroup() {
DBexecute('INSERT INTO users_groups (id, usrgrpid, userid) VALUES (150, 9, 2)');
}
}