@ldapjs/messages
Version:
API for creating and parsing LDAP messages
174 lines (152 loc) • 3.61 kB
JavaScript
'use strict'
const { operations } = require('@ldapjs/protocol')
const { DN } = require('@ldapjs/dn')
const LdapMessage = require('../ldap-message')
/**
* Implements the compare request message as described in
* https://www.rfc-editor.org/rfc/rfc4511.html#section-4.10.
*/
class CompareRequest extends LdapMessage {
#attribute
#entry
#value
/**
* @typedef {LdapMessageOptions} CompareRequestOptions
* @property {string|null} [attribute] The attribute name to compare
* against.
* @property {string} [entry] The target LDAP entity whose attribute
* will be compared.
* @property {string} [value] The value of the attribute to compare.
*/
/**
* @param {CompareRequestOptions} [options]
*/
constructor (options = {}) {
options.protocolOp = operations.LDAP_REQ_COMPARE
super(options)
this.attribute = options.attribute || ''
this.entry = options.entry || null
this.value = options.value || ''
}
/**
* The property of an LDAP entry to compare against.
*
* @returns {string}
*/
get attribute () {
return this.#attribute
}
/**
* Define the LDAP entry property to compare against.
*
* @param {string} value
*/
set attribute (value) {
this.#attribute = value
}
/**
* The LDAP entry that will be inspected.
*
* @returns {string | null}
*/
get entry () {
return this.#entry ?? null
}
/**
* Define the LDAP entity to inspect.
*
* @param {string | null} value
*/
set entry (value) {
if (value === null) return
if (typeof value === 'string') {
this.#entry = DN.fromString(value)
} else if (Object.prototype.toString.call(value) === '[object LdapDn]') {
this.#entry = value
} else {
throw Error('entry must be a valid DN string or instance of LdapDn')
}
}
/**
* The name of the request type.
*
* @type {string}
*/
get type () {
return 'CompareRequest'
}
/**
* The value the attribute should be set to.
*
* @returns {string}
*/
get value () {
return this.#value
}
/**
* Define the value the attribute should match.
*
* @param {string} value
*/
set value (value) {
this.#value = value
}
get _dn () {
return this.#entry
}
/**
* Internal use only.
*
* @param {import('@ldapjs/asn1').BerWriter} ber
*
* @returns {import('@ldapjs/asn1').BerWriter}
*/
_toBer (ber) {
ber.startSequence(operations.LDAP_REQ_COMPARE)
ber.writeString(this.#entry.toString())
ber.startSequence()
ber.writeString(this.#attribute)
ber.writeString(this.#value)
ber.endSequence()
ber.endSequence()
return ber
}
/**
* Internal use only.
*
* @param {object}
*
* @returns {object}
*/
_pojo (obj = {}) {
obj.attribute = this.#attribute
obj.entry = this.#entry ? this.#entry.toString() : null
obj.value = this.#value
return obj
}
/**
* Implements the standardized `parseToPojo` method.
*
* @see LdapMessage.parseToPojo
*
* @param {import('@ldapjs/asn1').BerReader} ber
*/
static parseToPojo (ber) {
const protocolOp = ber.readSequence()
if (protocolOp !== operations.LDAP_REQ_COMPARE) {
const op = protocolOp.toString(16).padStart(2, '0')
throw Error(`found wrong protocol operation: 0x${op}`)
}
const entry = ber.readString()
ber.readSequence()
const attribute = ber.readString()
const value = ber.readString()
return {
protocolOp,
entry,
attribute,
value
}
}
}
module.exports = CompareRequest