1<?php declare(strict_types = 1);
2/*
3** Zabbix
4** Copyright (C) 2001-2021 Zabbix SIA
5**
6** This program is free software; you can redistribute it and/or modify
7** it under the terms of the GNU General Public License as published by
8** the Free Software Foundation; either version 2 of the License, or
9** (at your option) any later version.
10**
11** This program is distributed in the hope that it will be useful,
12** but WITHOUT ANY WARRANTY; without even the implied warranty of
13** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14** GNU General Public License for more details.
15**
16** You should have received a copy of the GNU General Public License
17** along with this program; if not, write to the Free Software
18** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
19**/
20
21
22class CMenuHelper {
23
24	/**
25	 * Get main menu element.
26	 *
27	 * @return CMenu
28	 */
29	public static function getMainMenu(): CMenu {
30		$menu = new CMenu();
31
32		$submenu_monitoring = [
33			CWebUser::checkAccess(CRoleHelper::UI_MONITORING_DASHBOARD)
34				? (new CMenuItem(_('Dashboard')))
35					->setAction('dashboard.view')
36					->setAliases(['dashboard.list'])
37				: null,
38			CWebUser::checkAccess(CRoleHelper::UI_MONITORING_PROBLEMS)
39				? (new CMenuItem(_('Problems')))
40					->setAction('problem.view')
41					->setAliases(['tr_events.php'])
42				: null,
43			CWebUser::checkAccess(CRoleHelper::UI_MONITORING_HOSTS)
44				? (new CMenuItem(_('Hosts')))
45					->setAction('host.view')
46					->setAliases([
47						'web.view', 'charts.view', 'chart2.php', 'chart3.php', 'chart6.php', 'chart7.php',
48						'httpdetails.php', 'host.dashboard.view'
49					])
50				: null,
51			CWebUser::checkAccess(CRoleHelper::UI_MONITORING_OVERVIEW)
52				? (new CMenuItem(_('Overview')))
53					->setSubMenu(new CMenu([
54						(new CMenuItem(_('Trigger overview')))
55							->setUrl((new CUrl('overview.php'))->setArgument('type', 0), 'overview.php?type=0'),
56						(new CMenuItem(_('Data overview')))
57							->setUrl((new CUrl('overview.php'))->setArgument('type', 1), 'overview.php?type=1')
58					]))
59				: null,
60			CWebUser::checkAccess(CRoleHelper::UI_MONITORING_LATEST_DATA)
61				? (new CMenuItem(_('Latest data')))
62					->setAction('latest.view')
63					->setAliases(['history.php', 'chart.php'])
64				: null,
65			CWebUser::checkAccess(CRoleHelper::UI_MONITORING_MAPS)
66				? (new CMenuItem(_('Maps')))
67					->setAction('map.view')
68					->setAliases(['image.php', 'sysmaps.php', 'sysmap.php', 'map.php'])
69				: null,
70			CWebUser::checkAccess(CRoleHelper::UI_MONITORING_DISCOVERY)
71				? (new CMenuItem(_('Discovery')))->setAction('discovery.view')
72				: null,
73			CWebUser::checkAccess(CRoleHelper::UI_MONITORING_SERVICES)
74				? (new CMenuItem(_('Services')))
75					->setUrl(new CUrl('srv_status.php'), 'srv_status.php')
76					->setAliases(['report.services', 'chart5.php'])
77				: null
78		];
79		$submenu_monitoring = array_filter($submenu_monitoring);
80
81		if ($submenu_monitoring) {
82			$menu->add(
83				(new CMenuItem(_('Monitoring')))
84					->setId('view')
85					->setIcon('icon-monitoring')
86					->setSubMenu(new CMenu($submenu_monitoring))
87			);
88		}
89
90		$submenu_inventory = [
91			CWebUser::checkAccess(CRoleHelper::UI_INVENTORY_OVERVIEW)
92				? (new CMenuItem(_('Overview')))
93					->setUrl(new CUrl('hostinventoriesoverview.php'), 'hostinventoriesoverview.php')
94				: null,
95			CWebUser::checkAccess(CRoleHelper::UI_INVENTORY_HOSTS)
96				? (new CMenuItem(_('Hosts')))->setUrl(new CUrl('hostinventories.php'), 'hostinventories.php')
97				: null
98		];
99		$submenu_inventory = array_filter($submenu_inventory);
100
101		if ($submenu_inventory) {
102			$menu->add(
103				(new CMenuItem(_('Inventory')))
104					->setId('cm')
105					->setIcon('icon-inventory')
106					->setSubMenu(new CMenu($submenu_inventory))
107			);
108		}
109
110		$submenu_reports = [
111			CWebUser::checkAccess(CRoleHelper::UI_REPORTS_SYSTEM_INFO)
112				? (new CMenuItem(_('System information')))->setAction('report.status')
113				: null,
114			CWebUser::checkAccess(CRoleHelper::UI_REPORTS_SCHEDULED_REPORTS)
115				? (new CMenuItem(_('Scheduled reports')))
116					->setAction('scheduledreport.list')
117					->setAliases(['scheduledreport.edit'])
118				: null,
119			CWebUser::checkAccess(CRoleHelper::UI_REPORTS_AVAILABILITY_REPORT)
120				? (new CMenuItem(_('Availability report')))
121					->setUrl(new CUrl('report2.php'), 'report2.php')
122					->setAliases(['chart4.php'])
123				: null,
124			CWebUser::checkAccess(CRoleHelper::UI_REPORTS_TOP_TRIGGERS)
125				? (new CMenuItem(_('Triggers top 100')))->setUrl(new CUrl('toptriggers.php'), 'toptriggers.php')
126				: null,
127			CWebUser::checkAccess(CRoleHelper::UI_REPORTS_AUDIT)
128				? (new CMenuItem(_('Audit')))->setAction('auditlog.list')
129				: null,
130			CWebUser::checkAccess(CRoleHelper::UI_REPORTS_ACTION_LOG)
131				? (new CMenuItem(_('Action log')))->setUrl(new CUrl('auditacts.php'), 'auditacts.php')
132				: null,
133			CWebUser::checkAccess(CRoleHelper::UI_REPORTS_NOTIFICATIONS)
134				? (new CMenuItem(_('Notifications')))->setUrl(new CUrl('report4.php'), 'report4.php')
135				: null
136		];
137		$submenu_reports = array_filter($submenu_reports);
138
139		if ($submenu_reports) {
140			$menu->add(
141				(new CMenuItem(_('Reports')))
142					->setId('reports')
143					->setIcon('icon-reports')
144					->setSubMenu(new CMenu($submenu_reports))
145			);
146		}
147
148		$submenu_configuration = [
149			CWebUser::checkAccess(CRoleHelper::UI_CONFIGURATION_HOST_GROUPS)
150				? (new CMenuItem(_('Host groups')))->setUrl(new CUrl('hostgroups.php'), 'hostgroups.php')
151				: null,
152			CWebUser::checkAccess(CRoleHelper::UI_CONFIGURATION_TEMPLATES)
153				? (new CMenuItem(_('Templates')))
154					->setUrl(new CUrl('templates.php'), 'templates.php')
155					->setAliases([
156						'template.dashboard.list', 'template.dashboard.edit', 'items.php?context=template',
157						'triggers.php?context=template', 'graphs.php?context=template',
158						'host_discovery.php?context=template', 'disc_prototypes.php?context=template',
159						'trigger_prototypes.php?context=template', 'host_prototypes.php?context=template',
160						'httpconf.php?context=template'
161					])
162				: null,
163			CWebUser::checkAccess(CRoleHelper::UI_CONFIGURATION_HOSTS)
164				? (new CMenuItem(_('Hosts')))
165					->setUrl(new CUrl('hosts.php'), 'hosts.php')
166					->setAliases([
167						'items.php?context=host', 'triggers.php?context=host', 'graphs.php?context=host',
168						'host_discovery.php?context=host', 'disc_prototypes.php?context=host',
169						'trigger_prototypes.php?context=host', 'host_prototypes.php?context=host',
170						'httpconf.php?context=host'
171					])
172				: null,
173			CWebUser::checkAccess(CRoleHelper::UI_CONFIGURATION_MAINTENANCE)
174				? (new CMenuItem(_('Maintenance')))->setUrl(new CUrl('maintenance.php'), 'maintenance.php')
175				: null,
176			CWebUser::checkAccess(CRoleHelper::UI_CONFIGURATION_ACTIONS)
177				? (new CMenuItem(_('Actions')))
178					->setSubMenu(new CMenu([
179						(new CMenuItem(_('Trigger actions')))
180							->setUrl(
181								(new CUrl('actionconf.php'))->setArgument('eventsource', EVENT_SOURCE_TRIGGERS),
182								'actionconf.php?eventsource='.EVENT_SOURCE_TRIGGERS
183							),
184						(new CMenuItem(_('Discovery actions')))
185							->setUrl(
186								(new CUrl('actionconf.php'))->setArgument('eventsource', EVENT_SOURCE_DISCOVERY),
187								'actionconf.php?eventsource='.EVENT_SOURCE_DISCOVERY
188							),
189						(new CMenuItem(_('Autoregistration actions')))
190							->setUrl(
191								(new CUrl('actionconf.php'))->setArgument('eventsource', EVENT_SOURCE_AUTOREGISTRATION),
192								'actionconf.php?eventsource='.EVENT_SOURCE_AUTOREGISTRATION
193							),
194						(new CMenuItem(_('Internal actions')))
195							->setUrl(
196								(new CUrl('actionconf.php'))->setArgument('eventsource', EVENT_SOURCE_INTERNAL),
197								'actionconf.php?eventsource='.EVENT_SOURCE_INTERNAL
198							)
199					]))
200				: null,
201			CWebUser::checkAccess(CRoleHelper::UI_CONFIGURATION_EVENT_CORRELATION)
202				? (new CMenuItem(_('Event correlation')))
203					->setAction('correlation.list')
204					->setAliases(['correlation.edit'])
205				: null,
206			CWebUser::checkAccess(CRoleHelper::UI_CONFIGURATION_DISCOVERY)
207				? (new CMenuItem(_('Discovery')))
208					->setAction('discovery.list')
209					->setAliases(['discovery.edit'])
210				: null,
211			CWebUser::checkAccess(CRoleHelper::UI_CONFIGURATION_SERVICES)
212				? (new CMenuItem(_('Services')))->setUrl(new CUrl('services.php'), 'services.php')
213				: null
214		];
215		$submenu_configuration = array_filter($submenu_configuration);
216
217		if ($submenu_configuration) {
218			$menu->add(
219				(new CMenuItem(_('Configuration')))
220					->setId('config')
221					->setIcon('icon-configuration')
222					->setSubMenu(new CMenu($submenu_configuration))
223			);
224		}
225
226		$submenu_administration = [
227			CWebUser::checkAccess(CRoleHelper::UI_ADMINISTRATION_GENERAL)
228				? (new CMenuItem(_('General')))
229					->setSubMenu(new CMenu(array_filter([
230						(new CMenuItem(_('GUI')))
231							->setAction('gui.edit'),
232						(new CMenuItem(_('Autoregistration')))
233							->setAction('autoreg.edit'),
234						(new CMenuItem(_('Housekeeping')))
235							->setAction('housekeeping.edit'),
236						(new CMenuItem(_('Images')))
237							->setAction('image.list')
238							->setAliases(['image.edit']),
239						(new CMenuItem(_('Icon mapping')))
240							->setAction('iconmap.list')
241							->setAliases(['iconmap.edit']),
242						(new CMenuItem(_('Regular expressions')))
243							->setAction('regex.list')
244							->setAliases(['regex.edit']),
245						(new CMenuItem(_('Macros')))
246							->setAction('macros.edit'),
247						(new CMenuItem(_('Trigger displaying options')))
248							->setAction('trigdisplay.edit'),
249						(new CMenuItem(_('Modules')))
250							->setAction('module.list')
251							->setAliases(['module.edit', 'module.scan']),
252						(!CWebUser::isGuest() && CWebUser::checkAccess(CRoleHelper::ACTIONS_MANAGE_API_TOKENS))
253							? (new CMenuItem(_('API tokens')))
254								->setAction('token.list')
255								->setAliases(['token.edit', 'token.view'])
256							: null,
257						(new CMenuItem(_('Other')))
258							->setAction('miscconfig.edit')
259					])))
260				: null,
261			CWebUser::checkAccess(CRoleHelper::UI_ADMINISTRATION_PROXIES)
262				? (new CMenuItem(_('Proxies')))
263					->setAction('proxy.list')
264					->setAliases(['proxy.edit'])
265				: null,
266			CWebUser::checkAccess(CRoleHelper::UI_ADMINISTRATION_AUTHENTICATION)
267				? (new CMenuItem(_('Authentication')))
268					->setAction('authentication.edit')
269				: null,
270			CWebUser::checkAccess(CRoleHelper::UI_ADMINISTRATION_USER_GROUPS)
271				? (new CMenuItem(_('User groups')))
272					->setAction('usergroup.list')
273					->setAliases(['usergroup.edit'])
274				: null,
275			CWebUser::checkAccess(CRoleHelper::UI_ADMINISTRATION_USER_ROLES)
276				? (new CMenuItem(_('User roles')))
277					->setAction('userrole.list')
278					->setAliases(['userrole.edit'])
279				: null,
280			CWebUser::checkAccess(CRoleHelper::UI_ADMINISTRATION_USERS)
281				? (new CMenuItem(_('Users')))
282					->setAction('user.list')
283					->setAliases(['user.edit'])
284				: null,
285			CWebUser::checkAccess(CRoleHelper::UI_ADMINISTRATION_MEDIA_TYPES)
286				? (new CMenuItem(_('Media types')))
287					->setAction('mediatype.list')
288					->setAliases(['mediatype.edit'])
289				: null,
290			CWebUser::checkAccess(CRoleHelper::UI_ADMINISTRATION_SCRIPTS)
291				? (new CMenuItem(_('Scripts')))
292					->setAction('script.list')
293					->setAliases(['script.edit'])
294				: null,
295			CWebUser::checkAccess(CRoleHelper::UI_ADMINISTRATION_QUEUE)
296				? (new CMenuItem(_('Queue')))
297					->setSubMenu(new CMenu([
298						(new CMenuItem(_('Queue overview')))
299							->setAction('queue.overview'),
300						(new CMenuItem(_('Queue overview by proxy')))
301							->setAction('queue.overview.proxy'),
302						(new CMenuItem(_('Queue details')))
303							->setAction('queue.details')
304					]))
305				: null
306		];
307		$submenu_administration = array_filter($submenu_administration);
308
309		if ($submenu_administration) {
310			$menu->add(
311				(new CMenuItem(_('Administration')))
312					->setId('admin')
313					->setIcon('icon-administration')
314					->setSubMenu(new CMenu($submenu_administration))
315			);
316		}
317
318		return $menu;
319	}
320
321	/**
322	 * Get user menu element.
323	 *
324	 * @return CMenu
325	 */
326	public static function getUserMenu(): CMenu {
327		$menu = new CMenu();
328
329		if (!CBrandHelper::isRebranded()) {
330			$menu
331				->add(
332					(new CMenuItem(_('Support')))
333						->setIcon('icon-support')
334						->setUrl(new CUrl(getSupportUrl(CWebUser::getLang())))
335						->setTitle(_('Zabbix Technical Support'))
336						->setTarget('_blank')
337				)
338				->add(
339					(new CMenuItem(_('Share')))
340						->setIcon('icon-share')
341						->setUrl(new Curl('https://share.zabbix.com/'))
342						->setTitle(_('Zabbix Share'))
343						->setTarget('_blank')
344				);
345		}
346
347		$menu->add(
348			(new CMenuItem(_('Help')))
349				->setIcon('icon-help')
350				->setUrl(new CUrl(CBrandHelper::getHelpUrl()))
351				->setTitle(_('Help'))
352				->setTarget('_blank')
353		);
354
355		$user = array_intersect_key(CWebUser::$data, array_flip(['username', 'name', 'surname'])) + [
356			'name' => null,
357			'surname' => null
358		];
359
360		if (CWebUser::isGuest()) {
361			$menu->add(
362				(new CMenuItem(_('Guest user')))
363					->setIcon('icon-guest')
364					->setTitle(getUserFullname($user))
365			);
366		}
367		elseif (CWebUser::checkAccess(CRoleHelper::ACTIONS_MANAGE_API_TOKENS)) {
368			$menu->add(
369				(new CMenuItem(_('User settings')))
370					->setIcon('icon-profile')
371					->setTitle(getUserFullname($user))
372					->setSubMenu(new CMenu([
373						(new CMenuItem(_('Profile')))
374							->setAction('userprofile.edit'),
375						(new CMenuItem(_('API tokens')))
376							->setAction('user.token.list')
377							->setAliases(['user.token.view', 'user.token.edit'])
378					]))
379			);
380		}
381		else {
382			$menu->add(
383				(new CMenuItem(_('User settings')))
384					->setIcon('icon-profile')
385					->setAction('userprofile.edit')
386					->setTitle(getUserFullname($user))
387			);
388		}
389
390		$menu->add(
391			(new CMenuItem(_('Sign out')))
392				->setIcon('icon-signout')
393				->setUrl(new CUrl('#signout'))
394				->setTitle(_('Sign out'))
395				->onClick('ZABBIX.logout()')
396		);
397
398		return $menu;
399	}
400
401	/**
402	 * Get first menu item from main menu.
403	 *
404	 * @return CMenuItem
405	 */
406	private static function getFirstMenuItem(): CMenuItem {
407		$menu = self::getMainMenu();
408
409		foreach (CRoleHelper::getUiSectionsLabels(CWebUser::$data['type']) as $section_label) {
410			$section_submenu = $menu->find($section_label);
411			if ($section_submenu instanceof CMenuItem) {
412				$menu = $section_submenu
413					->getSubMenu()
414					->getMenuItems();
415				return $menu[0];
416			}
417		}
418
419		return $menu->getMenuItems()[0];
420	}
421
422	public static function getFirstUrl(): string {
423		return self::getFirstMenuItem()
424			->getUrl()
425			->getUrl();
426	}
427
428	public static function getFirstLabel(): string {
429		return self::getFirstMenuItem()->getLabel();
430	}
431}
432