@ldapjs/filter
Version:
API for handling LDAP-style filters
76 lines (69 loc) • 2.32 kB
JavaScript
const ApproximateFilter = require('../filters/approximate')
const EqualityFilter = require('../filters/equality')
const GreaterThanEqualsFilter = require('../filters/greater-than-equals')
const LessThanEqualsFilter = require('../filters/less-than-equals')
const PresenceFilter = require('../filters/presence')
const SubstringFilter = require('../filters/substring')
const escapeSubstring = require('./escape-substring')
const parseExtensibleFilterString = require('./parse-extensible-filter-string')
const attrRegex = /^[-_a-zA-Z0-9]+/
/**
* Given the expression part of a filter string, e.g. `cn=foo` in `(cn=foo)`,
* parse it into the corresponding filter instance(s).
*
* @param {string} inputString The filter expression to parse.
*
* @returns {FilterString}
*
* @throws When some parsing error occurs.
*/
module.exports = function parseExpr (inputString) {
let attribute
let match
let remainder
if (inputString[0] === ':' || inputString.indexOf(':=') > 0) {
// An extensible filter can have no attribute name.
return parseExtensibleFilterString(inputString)
} else if ((match = inputString.match(attrRegex)) !== null) {
attribute = match[0]
remainder = inputString.substring(attribute.length)
} else {
throw new Error('invalid attribute name')
}
if (remainder === '=*') {
return new PresenceFilter({ attribute })
} else if (remainder[0] === '=') {
remainder = remainder.substring(1)
if (remainder.indexOf('*') !== -1) {
const val = escapeSubstring(remainder)
return new SubstringFilter({
attribute,
initial: val.initial,
any: val.any,
final: val.final
})
} else {
return new EqualityFilter({
attribute,
value: remainder
})
}
} else if (remainder[0] === '>' && remainder[1] === '=') {
return new GreaterThanEqualsFilter({
attribute,
value: remainder.substring(2)
})
} else if (remainder[0] === '<' && remainder[1] === '=') {
return new LessThanEqualsFilter({
attribute,
value: remainder.substring(2)
})
} else if (remainder[0] === '~' && remainder[1] === '=') {
return new ApproximateFilter({
attribute,
value: remainder.substring(2)
})
}
throw new Error('invalid expression')
}