// Copyright 2011 Mark Cavage, Inc. All rights reserved. var assert = require('assert-plus'); var util = require('util'); var LDAPMessage = require('./message'); var Protocol = require('../protocol'); ///--- API function ExtendedRequest(options) { options = options || {}; assert.object(options); assert.optionalString(options.requestName); if (options.requestValue && !(Buffer.isBuffer(options.requestValue) || typeof (options.requestValue) === 'string')) { throw new TypeError('options.requestValue must be a buffer or a string'); } options.protocolOp = Protocol.LDAP_REQ_EXTENSION; LDAPMessage.call(this, options); this.requestName = options.requestName || ''; this.requestValue = options.requestValue; if(Buffer.isBuffer(this.requestValue)) { this.requestValueBuffer = this.requestValue; } else { this.requestValueBuffer = Buffer.from(this.requestValue || '', 'utf8'); } } util.inherits(ExtendedRequest, LDAPMessage); Object.defineProperties(ExtendedRequest.prototype, { type: { get: function getType() { return 'ExtendedRequest'; }, configurable: false }, _dn: { get: function getDN() { return this.requestName; }, configurable: false }, name: { get: function getName() { return this.requestName; }, set: function setName(val) { assert.string(val); this.requestName = val; }, configurable: false }, value: { get: function getValue() { return this.requestValue; }, set: function setValue(val) { if (!(Buffer.isBuffer(val) || typeof (val) === 'string')) throw new TypeError('value must be a buffer or a string'); if(Buffer.isBuffer(val)) { this.requestValueBuffer = val; } else { this.requestValueBuffer = Buffer.from(val, 'utf8'); } this.requestValue = val; }, configurable: false }, valueBuffer: { get: function getValueBuffer() { return this.requestValueBuffer; }, set: function setValueBuffer(val) { if(!Buffer.isBuffer(val)) throw new TypeError('valueBuffer must be a buffer'); this.value = val; }, configurable: false } }); ExtendedRequest.prototype._parse = function (ber) { assert.ok(ber); this.requestName = ber.readString(0x80); if (ber.peek() === 0x81) { this.requestValueBuffer = ber.readString(0x81, true); this.requestValue = this.requestValueBuffer.toString('utf8'); } return true; }; ExtendedRequest.prototype._toBer = function (ber) { assert.ok(ber); ber.writeString(this.requestName, 0x80); if (Buffer.isBuffer(this.requestValue)) { ber.writeBuffer(this.requestValue, 0x81); } else if (typeof (this.requestValue) === 'string') { ber.writeString(this.requestValue, 0x81); } return ber; }; ExtendedRequest.prototype._json = function (j) { assert.ok(j); j.requestName = this.requestName; j.requestValue = (Buffer.isBuffer(this.requestValue)) ? this.requestValue.toString('hex') : this.requestValue; return j; }; ///--- Exports module.exports = ExtendedRequest;