function gs_user_external_number_del($user, $number)
{
    if (!preg_match('/^[a-z0-9\\-_.]+$/', $user)) {
        return new GsError('User must be alphanumeric.');
    }
    if (!preg_match('/^[\\d]+$/', $number)) {
        return new GsError('Number must be numeric.');
    }
    # connect to db
    #
    $db = gs_db_master_connect();
    if (!$db) {
        return new GsError('Could not connect to database.');
    }
    # get user_id
    #
    $user_id = $db->executeGetOne('SELECT `id` FROM `users` WHERE `user`=\'' . $db->escape($user) . '\'');
    if ($user_id < 1) {
        return new GsError('Unknown user.');
    }
    switch (GS_EXTERNAL_NUMBERS_BACKEND) {
        case 'ldap':
            $ldap = gs_ldap_connect();
            if (!$ldap) {
                return new GsError('Could not connect to LDAP server.');
            }
            # check if number exists (to return proper err msg)
            #
            /*
            $numbers = gs_user_external_numbers_get( $user );
            if (isGsError($numbers))
            	return new GsError( $numbers->getMsg() );
            if (! is_array($numbers))
            	return new GsError( 'Failed to get numbers from LDAP' );
            if (! in_array($number, $numbers, true))
            	return new GsError( 'No such number.' );
            */
            # find ldap user name
            #
            if (GS_LDAP_PROP_UID === GS_LDAP_PROP_USER) {
                $ldap_uid = $user;
                if (gs_get_conf('GS_LVM_USER_6_DIGIT_INT')) {
                    $user = preg_replace('/^0+/', '', $user);
                    # if the usernames in your LDAP are integers without
                    # a leading "0"
                }
            } else {
                if (gs_get_conf('GS_LVM_USER_6_DIGIT_INT')) {
                    $user = preg_replace('/^0+/', '', $user);
                    # if the usernames in your LDAP are integers without
                    # a leading "0"
                }
                $userArr = gs_ldap_get_first($ldap, GS_LDAP_SEARCHBASE, GS_LDAP_PROP_USER . '=' . $user, array(GS_LDAP_PROP_UID));
                if (isGsError($userArr)) {
                    return new GsError($userArr->getMsg());
                }
                if (!is_array($userArr)) {
                    return new GsError('Could not find user by "' . GS_LDAP_PROP_USER . '=' . $user . '" in search base "' . GS_LDAP_SEARCHBASE . '" in LDAP.');
                }
                $ldap_uid = @$userArr[strToLower(GS_LDAP_PROP_UID)][0];
                if (strLen($ldap_uid) < 1) {
                    return new GsError('Could not find user by "' . GS_LDAP_PROP_USER . '=' . $user . '" in search base "' . GS_LDAP_SEARCHBASE . '" in LDAP.');
                }
            }
            $dn = GS_LDAP_PROP_UID . '=' . $ldap_uid . ',' . GS_LDAP_SEARCHBASE;
            # delete number
            #
            $ok = @ldap_mod_del($ldap, $dn, array(GS_EXTERNAL_NUMBERS_LDAP_PROP => $number));
            if (!$ok) {
                if (@ldap_errNo($ldap) == 16) {
                    // err #16 is: "No such attribute"
                    return new GsError('No such number.');
                }
                return new GsError('Failed to delete number for LDAP user "' . $dn . '". - ' . gs_get_ldap_error($ldap));
            }
            break;
        case 'db':
        default:
            # check if number exists (to return proper err msg)
            #
            $num = (int) $db->executeGetOne('SELECT COUNT(*) FROM `users_external_numbers` WHERE `user_id`=' . $user_id . ' AND `number`=\'' . $db->escape($number) . '\'');
            if ($num < 1) {
                return new GsError('No such number.');
            }
            # delete number
            #
            $ok = $db->execute('DELETE FROM `users_external_numbers` WHERE `user_id`=' . $user_id . ' AND `number`=\'' . $db->escape($number) . '\'');
            if (!$ok) {
                return new GsError('Failed to delete external number.');
            }
            break;
    }
    return true;
}
Exemple #2
0
function gs_ldap_get_list($ldap_conn, $base, $filter = '', $props = array(), $limit = 0)
{
    if (!is_resource($ldap_conn)) {
        return new GsError('Failed to query LDAP - Not connected!');
    }
    if (strLen($filter) < 1) {
        $filter = 'objectclass=*';
    }
    if (!is_array($props)) {
        $props = array();
    }
    $rs = @ldap_search($ldap_conn, $base, $filter, $props, 0, (int) $limit, 60, LDAP_DEREF_SEARCHING);
    if (!$rs) {
        return new GsError('Failed to query LDAP, search base: "' . $base . '", filter: "' . $filter . '" - ' . @gs_get_ldap_error($ldap));
    }
    /*
    if (count($sort) > 0) {
    	foreach ($sort as $sort_prop) {
    		if (count($props) < 1 || in_array($sort_prop, $props)) {
    			echo ".";
    			ldap_sort( $ldap_conn, $rs, array('telephonenumber') );
    		}
    	}
    }
    */
    if (count($props) > 0) {
        $revProps = array_reverse($props);
        foreach ($revProps as $prop) {
            ldap_sort($ldap_conn, $rs, $prop);
        }
    }
    $res = @ldap_get_entries($ldap_conn, $rs);
    @ldap_free_result($rs);
    if (!is_array($res)) {
        return new GsError('Failed to get LDAP entries.');
    }
    /*
    $arr = array();
    $cnt = @$res['count'];
    for ($i=0; $i<$cnt; ++$i) {
    	$res_entry = @$res[$i];
    	if (! is_array($res_entry)) continue;
    	$entry = array(
    		'dn' => @$res_entry['dn'];
    	);
    	$ecnt = @$res_entry['count'];
    	for ($j=0; $j<$ecnt; ++$j) {
    		$propname = @$res_entry[$j];
    		
    		
    	}
    }
    */
    $ret = array();
    $numRows = @$res['count'];
    unset($res['count']);
    for ($i = 0; $i < $numRows; ++$i) {
        $cnt = @$res[$i]['count'];
        unset($res[$i]['count']);
        for ($j = 0; $j < $cnt; ++$j) {
            $propname = @$res[$i][$j];
            unset($res[$i][$j]);
            unset($res[$i][$propname]['count']);
        }
        foreach ($res[$i] as $key => $arr) {
            unset($res[$i][$key]);
            $res[$i][strToLower($key)] = $arr;
        }
        /*
        if (count($props) > 0) {
        	foreach ($props as $wanted_prop) {
        		$wanted_prop = strToLower($wanted_prop);
        		if (! array_key_exists($wanted_prop, $res[$i]))
        			$res[$i][$wanted_prop] = array();
        	}
        }
        */
        if (count($props) > 0) {
            $ret[$i] = array();
            foreach ($res[$i] as $returned_prop => $arr) {
                foreach ($props as $wanted_prop) {
                    if (ldap_prop_equal($returned_prop, $wanted_prop)) {
                        $ret[$i][$wanted_prop] = $arr;
                    }
                }
            }
        } else {
            $ret[$i] = $res[$i];
        }
        unset($res[$i]);
    }
    return $ret;
}
function gs_user_external_number_add($user, $number)
{
    if (!preg_match('/^[a-z0-9\\-_.]+$/', $user)) {
        return new GsError('User must be alphanumeric.');
    }
    if (!preg_match('/^[\\d]+$/', $number)) {
        return new GsError('Number must be numeric.');
    }
    # connect to db
    #
    $db = gs_db_master_connect();
    if (!$db) {
        return new GsError('Could not connect to database.');
    }
    # get user_id
    #
    $user_id = $db->executeGetOne('SELECT `id` FROM `users` WHERE `user`=\'' . $db->escape($user) . '\'');
    if ($user_id < 1) {
        return new GsError('Unknown user.');
    }
    # add number
    #
    switch (GS_EXTERNAL_NUMBERS_BACKEND) {
        case 'ldap':
            $ldap = gs_ldap_connect();
            if (!$ldap) {
                return new GsError('Could not connect to LDAP server.');
            }
            # find ldap user name
            #
            if (GS_LDAP_PROP_UID === GS_LDAP_PROP_USER) {
                $ldap_uid = $user;
                if (gs_get_conf('GS_LVM_USER_6_DIGIT_INT')) {
                    $user = preg_replace('/^0+/', '', $user);
                    # if the usernames in your LDAP are integers without
                    # a leading "0"
                }
            } else {
                if (gs_get_conf('GS_LVM_USER_6_DIGIT_INT')) {
                    $user = preg_replace('/^0+/', '', $user);
                    # if the usernames in your LDAP are integers without
                    # a leading "0"
                }
                $userArr = gs_ldap_get_first($ldap, GS_LDAP_SEARCHBASE, GS_LDAP_PROP_USER . '=' . $user, array(GS_LDAP_PROP_UID));
                if (isGsError($userArr)) {
                    return new GsError($userArr->getMsg());
                }
                if (!is_array($userArr)) {
                    return new GsError('Could not find user by "' . GS_LDAP_PROP_USER . '=' . $user . '" in search base "' . GS_LDAP_SEARCHBASE . '" in LDAP.');
                }
                $ldap_uid = @$userArr[strToLower(GS_LDAP_PROP_UID)][0];
                if (strLen($ldap_uid) < 1) {
                    return new GsError('Could not find user by "' . GS_LDAP_PROP_USER . '=' . $user . '" in search base "' . GS_LDAP_SEARCHBASE . '" in LDAP.');
                }
            }
            $dn = GS_LDAP_PROP_UID . '=' . $ldap_uid . ',' . GS_LDAP_SEARCHBASE;
            $ok = @ldap_mod_add($ldap, $dn, array(GS_EXTERNAL_NUMBERS_LDAP_PROP => $number));
            if (!$ok && @ldap_errNo($ldap) != 20) {
                // err #20 is: "Type or value exists"
                return new GsError('Failed to add number to LDAP user "' . $dn . '". - ' . gs_get_ldap_error($ldap));
                return false;
            }
            break;
        case 'db':
        default:
            $ok = $db->execute('REPLACE INTO `users_external_numbers` (`user_id`, `number`) VALUES (' . $user_id . ', \'' . $db->escape($number) . '\')');
            if (!$ok) {
                return new GsError('Failed to add external number.');
            }
            break;
    }
    return true;
}