handle objectclass as lower case vals in add/search, error handling cleanup and some minor fixes
This commit is contained in:
parent
0e77b69dc0
commit
fcec8d626f
|
@ -160,7 +160,7 @@ function Client(options) {
|
||||||
});
|
});
|
||||||
c.on('connect', function() {
|
c.on('connect', function() {
|
||||||
c.ldap.connected = true;
|
c.ldap.connected = true;
|
||||||
c.ldap.id += ':' + (c.type !== 'unix' ? c.remotePort : c.fd);
|
c.ldap.id += ':' + c.fd;
|
||||||
self.emit('connect', c.ldap.id);
|
self.emit('connect', c.ldap.id);
|
||||||
});
|
});
|
||||||
c.on('end', function() {
|
c.on('end', function() {
|
||||||
|
|
|
@ -27,7 +27,7 @@ var CODES = {
|
||||||
LDAP_INAPPROPRIATE_MATCHING: 18,
|
LDAP_INAPPROPRIATE_MATCHING: 18,
|
||||||
LDAP_CONSTRAINT_VIOLATION: 19,
|
LDAP_CONSTRAINT_VIOLATION: 19,
|
||||||
LDAP_ATTRIBUTE_OR_VALUE_EXISTS: 20,
|
LDAP_ATTRIBUTE_OR_VALUE_EXISTS: 20,
|
||||||
LDAP_INVALID_ATTRIUBTE_SYNTAX: 21,
|
LDAP_INVALID_ATTRIBUTE_SYNTAX: 21,
|
||||||
LDAP_NO_SUCH_OBJECT: 32,
|
LDAP_NO_SUCH_OBJECT: 32,
|
||||||
LDAP_ALIAS_PROBLEM: 33,
|
LDAP_ALIAS_PROBLEM: 33,
|
||||||
LDAP_INVALID_DN_SYNTAX: 34,
|
LDAP_INVALID_DN_SYNTAX: 34,
|
||||||
|
|
|
@ -70,6 +70,9 @@ EqualityFilter.prototype.parse = function(ber) {
|
||||||
this.attribute = ber.readString().toLowerCase();
|
this.attribute = ber.readString().toLowerCase();
|
||||||
this.value = ber.readString();
|
this.value = ber.readString();
|
||||||
|
|
||||||
|
if (this.attribute === 'objectclass')
|
||||||
|
this.value = this.value.toLowerCase();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -94,12 +94,19 @@ SubstringFilter.prototype.parse = function(ber) {
|
||||||
switch (tag) {
|
switch (tag) {
|
||||||
case 0x80: // Initial
|
case 0x80: // Initial
|
||||||
this.initial = ber.readString(tag);
|
this.initial = ber.readString(tag);
|
||||||
|
if (this.attribute === 'objectclass')
|
||||||
|
this.initial = this.initial.toLowerCase();
|
||||||
break;
|
break;
|
||||||
case 0x81: // Any
|
case 0x81: // Any
|
||||||
this.any.push(ber.readString(tag));
|
var anyVal = ber.readString(tag);
|
||||||
|
if (this.attribute === 'objectclass')
|
||||||
|
anyVal = anyVal.toLowerCase();
|
||||||
|
this.any.push(anyVal);
|
||||||
break;
|
break;
|
||||||
case 0x82: // Final
|
case 0x82: // Final
|
||||||
this['final'] = ber.readString(tag);
|
this['final'] = ber.readString(tag);
|
||||||
|
if (this.attribute === 'objectclass')
|
||||||
|
this['final'] = this['final'].toLowerCase();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
throw new Error('Invalid substrings filter type: 0x' + tag.toString(16));
|
throw new Error('Invalid substrings filter type: 0x' + tag.toString(16));
|
||||||
|
|
|
@ -67,6 +67,7 @@ module.exports = {
|
||||||
|
|
||||||
log4js: logStub,
|
log4js: logStub,
|
||||||
parseURL: url.parse,
|
parseURL: url.parse,
|
||||||
|
url: url,
|
||||||
|
|
||||||
loadSchema: schema.load,
|
loadSchema: schema.load,
|
||||||
createSchemaAddHandler: schema.createAddHandler,
|
createSchemaAddHandler: schema.createAddHandler,
|
||||||
|
|
|
@ -63,6 +63,10 @@ AddRequest.prototype._parse = function(ber) {
|
||||||
while (ber.offset < end) {
|
while (ber.offset < end) {
|
||||||
var a = new Attribute();
|
var a = new Attribute();
|
||||||
a.parse(ber);
|
a.parse(ber);
|
||||||
|
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.push(a);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -25,6 +25,8 @@ var SearchEntry = require('./search_entry');
|
||||||
var SearchResponse = require('./search_response');
|
var SearchResponse = require('./search_response');
|
||||||
var UnbindRequest = require('./unbind_request');
|
var UnbindRequest = require('./unbind_request');
|
||||||
var UnbindResponse = require('./unbind_response');
|
var UnbindResponse = require('./unbind_response');
|
||||||
|
|
||||||
|
var LDAPResult = require('./result');
|
||||||
var Message = require('./message');
|
var Message = require('./message');
|
||||||
|
|
||||||
var Protocol = require('../protocol');
|
var Protocol = require('../protocol');
|
||||||
|
@ -90,19 +92,14 @@ Parser.prototype.write = function(data) {
|
||||||
data = data.slice(0, ber.length);
|
data = data.slice(0, ber.length);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!this._message.parse(data, ber.length))
|
assert.ok(this._message.parse(data, ber.length));
|
||||||
this.emit('protocolError', new Error('TODO'));
|
|
||||||
|
|
||||||
var message = this._message;
|
var message = this._message;
|
||||||
this._reset();
|
this._reset();
|
||||||
this.emit('message', message);
|
this.emit('message', message);
|
||||||
|
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
if (e.name === 'InvalidAsn1Error') {
|
self.emit('error', e, self._message);
|
||||||
self.emit('protocolError', e, self._message);
|
|
||||||
} else {
|
|
||||||
self.emit('error', e);
|
|
||||||
}
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -224,7 +221,9 @@ Parser.prototype._newMessage = function(ber) {
|
||||||
|
|
||||||
default:
|
default:
|
||||||
var e = new Error('protocolOp 0x' + type.toString(16) + ' not supported');
|
var e = new Error('protocolOp 0x' + type.toString(16) + ' not supported');
|
||||||
this.emit('protocolError', e, messageID);
|
this.emit('error', e, new LDAPResult({
|
||||||
|
messageID: messageID
|
||||||
|
}));
|
||||||
this._reset();
|
this._reset();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -50,6 +50,8 @@ function LDAPResult(options) {
|
||||||
this.errorMessage = options.errorMessage || '';
|
this.errorMessage = options.errorMessage || '';
|
||||||
this.referrals = options.referrals || [];
|
this.referrals = options.referrals || [];
|
||||||
|
|
||||||
|
this.connection = options.connection || null;
|
||||||
|
|
||||||
this.__defineGetter__('type', function() { return 'LDAPResult'; });
|
this.__defineGetter__('type', function() { return 'LDAPResult'; });
|
||||||
}
|
}
|
||||||
util.inherits(LDAPResult, LDAPMessage);
|
util.inherits(LDAPResult, LDAPMessage);
|
||||||
|
|
|
@ -21,6 +21,7 @@ var BindResponse = require('./messages/bind_response');
|
||||||
var CompareResponse = require('./messages/compare_response');
|
var CompareResponse = require('./messages/compare_response');
|
||||||
var DeleteResponse = require('./messages/del_response');
|
var DeleteResponse = require('./messages/del_response');
|
||||||
var ExtendedResponse = require('./messages/ext_response');
|
var ExtendedResponse = require('./messages/ext_response');
|
||||||
|
var LDAPResult = require('./messages/result');
|
||||||
var ModifyResponse = require('./messages/modify_response');
|
var ModifyResponse = require('./messages/modify_response');
|
||||||
var ModifyDNResponse = require('./messages/moddn_response');
|
var ModifyDNResponse = require('./messages/moddn_response');
|
||||||
var SearchRequest = require('./messages/search_request');
|
var SearchRequest = require('./messages/search_request');
|
||||||
|
@ -372,15 +373,17 @@ function Server(options) {
|
||||||
}();
|
}();
|
||||||
});
|
});
|
||||||
|
|
||||||
c.parser.on('protocolError', function(err, messageID) {
|
c.parser.on('error', function(err, message) {
|
||||||
log.warn('%s sent invalid protocol message', c.ldap.id, err);
|
|
||||||
c.destroy();
|
|
||||||
});
|
|
||||||
c.parser.on('error', function(err) {
|
|
||||||
log.error('Exception happened parsing for %s: %s',
|
log.error('Exception happened parsing for %s: %s',
|
||||||
c.ldap.id, err.stack);
|
c.ldap.id, err.stack);
|
||||||
c.destroy();
|
|
||||||
|
var res = getResponse(message);
|
||||||
|
|
||||||
|
res.status = 0x02; // protocol error
|
||||||
|
res.errorMessage = err.toString();
|
||||||
|
c.end(res.toBer());
|
||||||
});
|
});
|
||||||
|
|
||||||
c.on('data', function(data) {
|
c.on('data', function(data) {
|
||||||
if (log.isTraceEnabled())
|
if (log.isTraceEnabled())
|
||||||
log.trace('data on %s: %s', c.ldap.id, util.inspect(data));
|
log.trace('data on %s: %s', c.ldap.id, util.inspect(data));
|
||||||
|
|
Loading…
Reference in New Issue