function get_accessible_groups_by_user($user_data, $perm, $perm_res = null, $nodeid = null) { global $ZBX_LOCALNODEID; if (is_null($perm_res)) { $perm_res = PERM_RES_IDS_ARRAY; } if (is_null($nodeid)) { $nodeid = get_current_nodeid(); } $result = array(); $userid =& $user_data['userid']; if (!isset($userid)) { fatal_error('Incorrect user data in "get_accessible_groups_by_user"'); } $user_type =& $user_data['type']; COpt::counter_up('perm_group[' . $userid . ',' . $perm . ',' . $perm_res . ',' . $nodeid . ']'); COpt::counter_up('perm'); $processed = array(); $where = array(); if (!is_null($nodeid)) { array_push($where, DBin_node('hg.groupid', $nodeid)); } $where = count($where) ? ' WHERE ' . implode(' AND ', $where) : ''; $sql = 'SELECT n.nodeid as nodeid,n.name as node_name,hg.groupid,hg.name,min(r.permission) as permission,g.userid' . ' FROM groups hg ' . ' LEFT JOIN rights r ON r.id=hg.groupid ' . ' LEFT JOIN users_groups g ON r.groupid=g.usrgrpid AND g.userid=' . $userid . ' LEFT JOIN nodes n ON ' . DBid2nodeid('hg.groupid') . '=n.nodeid ' . $where . ' GROUP BY n.nodeid, n.name, hg.groupid, hg.name, g.userid, g.userid ' . ' ORDER BY node_name, hg.name, permission '; $db_groups = DBselect($sql); while ($group_data = DBfetch($db_groups)) { if (zbx_empty($group_data['nodeid'])) { $group_data['nodeid'] = id2nodeid($group_data['groupid']); } /* deny if no rights defined */ if (USER_TYPE_SUPER_ADMIN == $user_type) { $group_data['permission'] = PERM_MAX; } else { if (zbx_empty($group_data['permission']) || zbx_empty($group_data['userid'])) { continue; } if (isset($processed[$group_data['groupid']])) { if (PERM_DENY == $group_data['permission']) { unset($result[$group_data['groupid']]); } else { if ($processed[$group_data['groupid']] > $group_data['permission']) { unset($processed[$group_data['groupid']]); } else { continue; } } } } $processed[$group_data['groupid']] = $group_data['permission']; if ($group_data['permission'] < $perm) { continue; } switch ($perm_res) { case PERM_RES_DATA_ARRAY: $result[$group_data['groupid']] = $group_data; break; default: $result[$group_data['groupid']] = $group_data["groupid"]; break; } } unset($processed, $group_data, $db_groups); if ($perm_res == PERM_RES_STRING_LINE) { if (count($result) == 0) { $result = '-1'; } else { $result = implode(',', $result); } } return $result; }