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