// Copyright 2011 Mark Cavage, Inc. All rights reserved. var assert = require('assert-plus') var util = require('util') var LDAPMessage = require('./message') var Attribute = require('../attribute') var Protocol = require('../protocol') var lassert = require('../assert') /// --- API function AddRequest (options) { options = options || {} assert.object(options) lassert.optionalStringDN(options.entry) lassert.optionalArrayOfAttribute(options.attributes) options.protocolOp = Protocol.LDAP_REQ_ADD LDAPMessage.call(this, options) this.entry = options.entry || null this.attributes = options.attributes ? options.attributes.slice(0) : [] } util.inherits(AddRequest, LDAPMessage) Object.defineProperties(AddRequest.prototype, { type: { get: function getType () { return 'AddRequest' }, configurable: false }, _dn: { get: function getDN () { return this.entry }, configurable: false } }) AddRequest.prototype._parse = function (ber) { assert.ok(ber) this.entry = ber.readString() ber.readSequence() var end = ber.offset + ber.length while (ber.offset < end) { var a = new Attribute() a.parse(ber) a.type = a.type.toLowerCase() if (a.type === 'objectclass') { for (var i = 0; i < a.vals.length; i++) { a.vals[i] = a.vals[i].toLowerCase() } } this.attributes.push(a) } this.attributes.sort(Attribute.compare) return true } AddRequest.prototype._toBer = function (ber) { assert.ok(ber) ber.writeString(this.entry.toString()) ber.startSequence() this.attributes.forEach(function (a) { a.toBer(ber) }) ber.endSequence() return ber } AddRequest.prototype._json = function (j) { assert.ok(j) j.entry = this.entry.toString() j.attributes = [] this.attributes.forEach(function (a) { j.attributes.push(a.json) }) return j } AddRequest.prototype.indexOf = function (attr) { if (!attr || typeof (attr) !== 'string') { throw new TypeError('attr (string) required') } for (var i = 0; i < this.attributes.length; i++) { if (this.attributes[i].type === attr) { return i } } return -1 } AddRequest.prototype.attributeNames = function () { var attrs = [] for (var i = 0; i < this.attributes.length; i++) { attrs.push(this.attributes[i].type.toLowerCase()) } return attrs } AddRequest.prototype.getAttribute = function (name) { if (!name || typeof (name) !== 'string') { throw new TypeError('attribute name (string) required') } name = name.toLowerCase() for (var i = 0; i < this.attributes.length; i++) { if (this.attributes[i].type === name) { return this.attributes[i] } } return null } AddRequest.prototype.addAttribute = function (attr) { if (!(attr instanceof Attribute)) { throw new TypeError('attribute (Attribute) required') } return this.attributes.push(attr) } /** * Returns a "pure" JS representation of this object. * * An example object would look like: * * { * "dn": "cn=unit, dc=test", * "attributes": { * "cn": ["unit", "foo"], * "objectclass": ["top", "person"] * } * } * * @return {Object} that looks like the above. */ AddRequest.prototype.toObject = function () { var self = this var obj = { dn: self.entry ? self.entry.toString() : '', attributes: {} } if (!this.attributes || !this.attributes.length) { return obj } this.attributes.forEach(function (a) { if (!obj.attributes[a.type]) { obj.attributes[a.type] = [] } a.vals.forEach(function (v) { if (obj.attributes[a.type].indexOf(v) === -1) { obj.attributes[a.type].push(v) } }) }) return obj } /// --- Exports module.exports = AddRequest