123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- // Copyright 2011 Mark Cavage, Inc. All rights reserved.
-
- var assert = require('assert-plus');
- var util = require('util');
-
- var asn1 = require('asn1');
-
- var dtrace = require('../dtrace');
- var LDAPMessage = require('./message');
- var Protocol = require('../protocol');
-
-
- ///--- Globals
-
- var Ber = asn1.Ber;
- var BerWriter = asn1.BerWriter;
-
-
- ///--- API
-
- function LDAPResult(options) {
- options = options || {};
- assert.object(options);
- assert.optionalNumber(options.status);
- assert.optionalString(options.matchedDN);
- assert.optionalString(options.errorMessage);
- assert.optionalArrayOfString(options.referrals);
-
- LDAPMessage.call(this, options);
-
- this.status = options.status || 0; // LDAP SUCCESS
- this.matchedDN = options.matchedDN || '';
- this.errorMessage = options.errorMessage || '';
- this.referrals = options.referrals || [];
-
- this.connection = options.connection || null;
- }
- util.inherits(LDAPResult, LDAPMessage);
- Object.defineProperties(LDAPResult.prototype, {
- type: {
- get: function getType() { return 'LDAPResult'; },
- configurable: false
- }
- });
-
- LDAPResult.prototype.end = function (status) {
- assert.ok(this.connection);
-
- if (typeof (status) === 'number')
- this.status = status;
-
- var ber = this.toBer();
- if (this.log.debug())
- this.log.debug('%s: sending: %j', this.connection.ldap.id, this.json);
-
- try {
- var self = this;
- this.connection.write(ber);
-
- if (self._dtraceOp && self._dtraceId) {
- dtrace.fire('server-' + self._dtraceOp + '-done', function () {
- var c = self.connection || {ldap: {}};
- return [
- self._dtraceId || 0,
- (c.remoteAddress || ''),
- c.ldap.bindDN ? c.ldap.bindDN.toString() : '',
- (self.requestDN ? self.requestDN.toString() : ''),
- status || self.status,
- self.errorMessage
- ];
- });
- }
-
- } catch (e) {
- this.log.warn(e, '%s failure to write message %j',
- this.connection.ldap.id, this.json);
- }
-
- };
-
- LDAPResult.prototype._parse = function (ber) {
- assert.ok(ber);
-
- this.status = ber.readEnumeration();
- this.matchedDN = ber.readString();
- this.errorMessage = ber.readString();
-
- var t = ber.peek();
-
- if (t === Protocol.LDAP_REP_REFERRAL) {
- var end = ber.offset + ber.length;
- while (ber.offset < end)
- this.referrals.push(ber.readString());
- }
-
- return true;
- };
-
- LDAPResult.prototype._toBer = function (ber) {
- assert.ok(ber);
-
- ber.writeEnumeration(this.status);
- ber.writeString(this.matchedDN || '');
- ber.writeString(this.errorMessage || '');
-
- if (this.referrals.length) {
- ber.startSequence(Protocol.LDAP_REP_REFERRAL);
- ber.writeStringArray(this.referrals);
- ber.endSequence();
- }
-
- return ber;
- };
-
- LDAPResult.prototype._json = function (j) {
- assert.ok(j);
-
- j.status = this.status;
- j.matchedDN = this.matchedDN;
- j.errorMessage = this.errorMessage;
- j.referrals = this.referrals;
-
- return j;
- };
-
-
- ///--- Exports
-
- module.exports = LDAPResult;
|