Script to bypass AD range

Active Directory has a default limit for returning values of a multi-valued attribute, called range.

The following script can be used to bypass this limit. You can register it in an external js file (see Scripting).

function getRangeValues(attrName) {
    var newDataset = new Array();
    var rangeStart = null;
    var rangeEnd = null;
    var rangeSize = null;
    var arrayCounter = 0;
    var tmpDataset = srcBean.getDatasetValuesById(attrName).toArray();
    if (tmpDataset.length > 0) {
        rangeStart = 0
        rangeEnd = "*"
        rangeSize = 0
    } else {
        var attrList = srcBean.getDatasetsNames().toArray()
        if (attrList != null) {
            if (attrList.length > 0) {
                for (var i = 0; i < attrList.length; i++) {
                    if (attrList[i].toString().contains(attrName + ";range")) {
                        var startPos = null
                        var sepPos = null
                        startPos = attrList[i].toString().indexOf(";range=") + 7
                        sepPos = attrList[i].toString().indexOf("-", startPos)
                        rangeStart = attrList[i].toString().substring(startPos, sepPos)
                        rangeEnd = attrList[i].toString().substring(sepPos + 1)
                        rangeSize = Number(rangeEnd) - Number(rangeStart)
                        break
                    }
                }
            }
        }
    }
    if (rangeStart != null) {
        var tmpAttrName = "";
        while (rangeStart != "*") {
            if (rangeStart == "0" && rangeEnd != "*") {
                tmpAttrName = attrName + ";range=" + rangeStart.toString() + "-" + rangeEnd.toString()
                tmpDataset = srcBean.getDatasetValuesById(tmpAttrName).toArray()
            } else if (rangeStart != "0") {
                tmpAttrName = "member;range=" + rangeStart.toString() + "-" + rangeEnd.toString()
                tmpDataset = srcLdap.attribute(srcBean.getMainIdentifier(), tmpAttrName).toArray()
            }
            if (rangeEnd == "*") {
                rangeStart = "*"
            }
            if (tmpDataset != null) {
                if (tmpDataset.length > 0) {
                    for (var i = 0; i < tmpDataset.length; i++) {
                        // Add attribute value processing logic here;
                        // Be sure to explicitly type the array elements to prevent conversion to an object array;
                        newDataset[arrayCounter++] = String(tmpDataset[i])
                    }
                    if (rangeEnd != "*") {
                        rangeStart = Number(rangeEnd) + 1
                        rangeEnd = Number(rangeStart) + Number(rangeSize)
                    }
                } else {
                    rangeEnd = "*"
                }
            } else {
                rangeEnd = "*"
            }
        }
    }
    return newDataset;
}