@ldapjs/filter
Version:
API for handling LDAP-style filters
87 lines (73 loc) • 2.29 kB
JavaScript
const FilterString = require('../filter-string')
const { BerReader } = require('@ldapjs/asn1')
const { search } = require('@ldapjs/protocol')
const escapeFilterValue = require('../utils/escape-filter-value')
/**
* Represents a basic filter for determining if an LDAP entry contains a
* specified attribute that is approximately equal a given value,
* e.g. `(cn~=foo)`.
*/
class ApproximateFilter extends FilterString {
/**
* @typedef {FilterStringParams} AttributeParams
*/
/**
* @param {AttributeParams} input
*
* @throws When either `attribute` or `value` is not a string of at least
* one character.
*/
constructor ({ attribute, value } = {}) {
if (typeof attribute !== 'string' || attribute.length < 1) {
throw Error('attribute must be a string of at least one character')
}
if (typeof value !== 'string' || value.length < 1) {
throw Error('value must be a string of at least one character')
}
super({ attribute, value })
Object.defineProperties(this, {
TAG: { value: search.FILTER_APPROX },
type: { value: 'ApproximateFilter' }
})
}
/**
* Not implemented.
*
* @throws In all cases.
*/
matches () {
throw Error('not implemented')
}
toString () {
return ('(' + escapeFilterValue(this.attribute) +
'~=' + escapeFilterValue(this.value) + ')')
}
_toBer (ber) {
ber.writeString(this.attribute)
ber.writeString(this.value)
return ber
}
/**
* Parses a BER encoded `Buffer` and returns a new filter.
*
* @param {Buffer} buffer BER encoded buffer.
*
* @throws When the buffer does not start with the proper BER tag.
*
* @returns {ApproximateFilter}
*/
static parse (buffer) {
const reader = new BerReader(buffer)
const seq = reader.readSequence()
if (seq !== search.FILTER_APPROX) {
const expected = '0x' + search.FILTER_APPROX.toString(16).padStart(2, '0')
const found = '0x' + seq.toString(16).padStart(2, '0')
throw Error(`expected approximate filter sequence ${expected}, got ${found}`)
}
const attribute = reader.readString()
const value = reader.readString()
return new ApproximateFilter({ attribute, value })
}
}
module.exports = ApproximateFilter