store buffer on extended request

This commit is contained in:
dododedodonl 2019-08-27 14:04:45 +02:00
parent e4264f7940
commit b87e4bb288
2 changed files with 128 additions and 6 deletions

View File

@ -24,6 +24,12 @@ function ExtendedRequest(options) {
this.requestName = options.requestName || ''; this.requestName = options.requestName || '';
this.requestValue = options.requestValue; this.requestValue = options.requestValue;
if(Buffer.isBuffer(this.requestValue)) {
this.requestValueBuffer = this.requestValue;
} else {
this.requestValueBuffer = new Buffer(this.requestValue || '', 'utf8');
}
} }
util.inherits(ExtendedRequest, LDAPMessage); util.inherits(ExtendedRequest, LDAPMessage);
Object.defineProperties(ExtendedRequest.prototype, { Object.defineProperties(ExtendedRequest.prototype, {
@ -49,9 +55,27 @@ Object.defineProperties(ExtendedRequest.prototype, {
if (!(Buffer.isBuffer(val) || typeof (val) === 'string')) if (!(Buffer.isBuffer(val) || typeof (val) === 'string'))
throw new TypeError('value must be a buffer or a string'); throw new TypeError('value must be a buffer or a string');
if(Buffer.isBuffer(val)) {
this.requestValueBuffer = val;
} else {
this.requestValueBuffer = new Buffer(val, 'utf8');
}
this.requestValue = val; this.requestValue = val;
}, },
configurable: false 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
} }
}); });
@ -59,11 +83,9 @@ ExtendedRequest.prototype._parse = function (ber) {
assert.ok(ber); assert.ok(ber);
this.requestName = ber.readString(0x80); this.requestName = ber.readString(0x80);
if (ber.peek() === 0x81) if (ber.peek() === 0x81) {
try { this.requestValueBuffer = ber.readString(0x81, true);
this.requestValue = ber.readString(0x81); this.requestValue = this.requestValueBuffer.toString('utf8');
} catch (e) {
this.requestValue = ber.readBuffer(0x81);
} }
return true; return true;

View File

@ -4,6 +4,30 @@ var test = require('tape').test;
var asn1 = require('asn1'); var asn1 = require('asn1');
var Buffer = require('buffer').Buffer;
// Buffer.compare was only added on node 0.11.13
var areBuffersEqual = function areBuffersEqual(bufA, bufB) {
if(!(Buffer.isBuffer(bufA) && Buffer.isBuffer(bufB))) {
return false;
}
if(typeof Buffer.compare === 'function') {
return Buffer.compare(bufA, bufB) === 0;
}
var len = bufA.length;
if (len !== bufB.length) {
return false;
}
for (var i = 0; i < len; i++) {
if (bufA.readUInt8(i) !== bufB.readUInt8(i)) {
return false;
}
}
return true;
};
///--- Globals ///--- Globals
@ -37,6 +61,58 @@ test('new with args', function (t) {
t.ok(req); t.ok(req);
t.equal(req.requestName, '1.2.3.4'); t.equal(req.requestName, '1.2.3.4');
t.equal(req.requestValue, 'test'); t.equal(req.requestValue, 'test');
t.ok(areBuffersEqual(req.requestValueBuffer, new Buffer('test', 'utf8')));
t.equal(req.value, 'test');
t.ok(areBuffersEqual(req.valueBuffer, new Buffer('test', 'utf8')));
t.end();
});
test('new with buffer args', function (t) {
var req = new ExtendedRequest({
requestName: '1.2.3.4',
requestValue: new Buffer('test', 'utf8')
});
t.ok(req);
t.equal(req.requestName, '1.2.3.4');
t.equal(req.requestValue, req.requestValueBuffer);
t.ok(areBuffersEqual(req.requestValueBuffer, new Buffer('test', 'utf8')));
t.equal(req.value, req.valueBuffer);
t.ok(areBuffersEqual(req.valueBuffer, new Buffer('test', 'utf8')));
t.end();
});
test('new no args set args', function (t) {
var req = new ExtendedRequest();
t.ok(req);
req.name = '1.2.3.4';
t.equal(req.requestName, '1.2.3.4');
req.value = 'test';
t.equal(req.requestValue, 'test');
t.ok(areBuffersEqual(req.requestValueBuffer, new Buffer('test', 'utf8')));
t.equal(req.value, 'test');
t.ok(areBuffersEqual(req.valueBuffer, new Buffer('test', 'utf8')));
t.end();
});
test('new no args set args buffer', function (t) {
var req = new ExtendedRequest();
t.ok(req);
req.name = '1.2.3.4';
t.equal(req.requestName, '1.2.3.4');
req.value = new Buffer('test', 'utf8');
t.equal(req.requestValue, req.requestValueBuffer);
t.ok(areBuffersEqual(req.requestValueBuffer, new Buffer('test', 'utf8')));
t.equal(req.value, req.valueBuffer);
t.ok(areBuffersEqual(req.valueBuffer, new Buffer('test', 'utf8')));
t.end(); t.end();
}); });
@ -51,6 +127,9 @@ test('parse', function (t) {
t.ok(req._parse(new BerReader(ber.buffer))); t.ok(req._parse(new BerReader(ber.buffer)));
t.equal(req.requestName, '1.2.3.4'); t.equal(req.requestName, '1.2.3.4');
t.equal(req.requestValue, 'test'); t.equal(req.requestValue, 'test');
t.ok(areBuffersEqual(req.requestValueBuffer, new Buffer('test', 'utf8')));
t.equal(req.value, 'test');
t.ok(areBuffersEqual(req.valueBuffer, new Buffer('test', 'utf8')));
t.end(); t.end();
}); });
@ -74,3 +153,24 @@ test('toBer', function (t) {
t.end(); t.end();
}); });
test('toBer from buffer', function (t) {
var req = new ExtendedRequest({
messageID: 123,
requestName: '1.2.3.4',
requestValue: new Buffer('test', 'utf8')
});
t.ok(req);
var ber = new BerReader(req.toBer());
t.ok(ber);
t.equal(ber.readSequence(), 0x30);
t.equal(ber.readInt(), 123);
t.equal(ber.readSequence(), 0x77);
t.equal(ber.readString(0x80), '1.2.3.4');
t.equal(ber.readString(0x81), 'test');
t.end();
});