コード例 #1
0
ファイル: perm.inc.php プロジェクト: rennhak/zabbix
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;
}