tedious 1.13.2 → 1.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/appveyor.yml +2 -0
- package/lib/all-headers.js +2 -5
- package/lib/buffertools.js +1 -1
- package/lib/bulk-load.js +18 -27
- package/lib/collation.js +78 -6
- package/lib/connection.js +120 -159
- package/lib/data-type.js +73 -72
- package/lib/debug.js +5 -17
- package/lib/errors.js +8 -16
- package/lib/guid-parser.js +2 -5
- package/lib/instance-lookup.js +7 -16
- package/lib/library.js +1 -5
- package/lib/login7-payload.js +16 -34
- package/lib/message-io.js +21 -35
- package/lib/metadata-parser.js +22 -18
- package/lib/ntlm-payload.js +9 -24
- package/lib/packet.js +11 -18
- package/lib/prelogin-payload.js +10 -19
- package/lib/request.js +15 -24
- package/lib/rpcrequest-payload.js +7 -16
- package/lib/special-stored-procedure.js +3 -7
- package/lib/sqlbatch-payload.js +7 -16
- package/lib/stream-parser.js +24 -36
- package/lib/tds-versions.js +2 -8
- package/lib/tedious.js +8 -52
- package/lib/token/colmetadata-token-parser.js +4 -14
- package/lib/token/done-token-parser.js +6 -9
- package/lib/token/env-change-token-parser.js +4 -9
- package/lib/token/infoerror-token-parser.js +9 -12
- package/lib/token/loginack-token-parser.js +8 -8
- package/lib/token/nbcrow-token-parser.js +5 -15
- package/lib/token/order-token-parser.js +3 -9
- package/lib/token/returnstatus-token-parser.js +3 -9
- package/lib/token/returnvalue-token-parser.js +7 -20
- package/lib/token/row-token-parser.js +5 -15
- package/lib/token/sspi-token-parser.js +3 -8
- package/lib/token/stream-parser.js +60 -58
- package/lib/token/token-stream-parser.js +14 -23
- package/lib/token/token.js +3 -7
- package/lib/tracking-buffer/bigint.js +2 -5
- package/lib/tracking-buffer/readable-tracking-buffer.js +6 -13
- package/lib/tracking-buffer/tracking-buffer.js +2 -16
- package/lib/tracking-buffer/writable-tracking-buffer.js +3 -15
- package/lib/transaction.js +7 -12
- package/lib/value-parser.js +95 -69
- package/package.json +6 -1
package/lib/login7-payload.js
CHANGED
|
@@ -4,27 +4,13 @@ var _createClass = require('babel-runtime/helpers/create-class')['default'];
|
|
|
4
4
|
|
|
5
5
|
var _classCallCheck = require('babel-runtime/helpers/class-call-check')['default'];
|
|
6
6
|
|
|
7
|
-
var _interopRequireDefault = require('babel-runtime/helpers/interop-require-default')['default'];
|
|
8
|
-
|
|
9
|
-
Object.defineProperty(exports, '__esModule', {
|
|
10
|
-
value: true
|
|
11
|
-
});
|
|
12
|
-
|
|
13
7
|
require('./buffertools');
|
|
14
8
|
|
|
15
|
-
var
|
|
16
|
-
|
|
17
|
-
var
|
|
18
|
-
|
|
19
|
-
var
|
|
20
|
-
|
|
21
|
-
var _os2 = _interopRequireDefault(_os);
|
|
22
|
-
|
|
23
|
-
var _sprintf = require('sprintf');
|
|
24
|
-
|
|
25
|
-
var _library = require('./library');
|
|
26
|
-
|
|
27
|
-
var _tdsVersions = require('./tds-versions');
|
|
9
|
+
var WritableTrackingBuffer = require('./tracking-buffer/writable-tracking-buffer');
|
|
10
|
+
var os = require('os');
|
|
11
|
+
var sprintf = require('sprintf').sprintf;
|
|
12
|
+
var libraryName = require('./library').name;
|
|
13
|
+
var versions = require('./tds-versions').versions;
|
|
28
14
|
|
|
29
15
|
var FLAGS_1 = {
|
|
30
16
|
ENDIAN_LITTLE: 0x00,
|
|
@@ -114,8 +100,7 @@ var NTLMFlags = {
|
|
|
114
100
|
/*
|
|
115
101
|
s2.2.6.3
|
|
116
102
|
*/
|
|
117
|
-
|
|
118
|
-
var Login7Payload = (function () {
|
|
103
|
+
module.exports = (function () {
|
|
119
104
|
function Login7Payload(loginData) {
|
|
120
105
|
_classCallCheck(this, Login7Payload);
|
|
121
106
|
|
|
@@ -125,7 +110,7 @@ var Login7Payload = (function () {
|
|
|
125
110
|
var fixed = this.createFixedData();
|
|
126
111
|
var variable = this.createVariableData(lengthLength + fixed.length);
|
|
127
112
|
var length = lengthLength + fixed.length + variable.length;
|
|
128
|
-
var data = new
|
|
113
|
+
var data = new WritableTrackingBuffer(300);
|
|
129
114
|
data.writeUInt32LE(length);
|
|
130
115
|
data.writeBuffer(fixed);
|
|
131
116
|
data.writeBuffer(variable);
|
|
@@ -135,7 +120,7 @@ var Login7Payload = (function () {
|
|
|
135
120
|
_createClass(Login7Payload, [{
|
|
136
121
|
key: 'createFixedData',
|
|
137
122
|
value: function createFixedData() {
|
|
138
|
-
this.tdsVersion =
|
|
123
|
+
this.tdsVersion = versions[this.loginData.tdsVersion];
|
|
139
124
|
this.packetSize = this.loginData.packetSize;
|
|
140
125
|
this.clientProgVer = 0;
|
|
141
126
|
this.clientPid = process.pid;
|
|
@@ -162,7 +147,7 @@ var Login7Payload = (function () {
|
|
|
162
147
|
this.typeFlags |= TYPE_FLAGS.READ_WRITE_INTENT;
|
|
163
148
|
}
|
|
164
149
|
|
|
165
|
-
var buffer = new
|
|
150
|
+
var buffer = new WritableTrackingBuffer(100);
|
|
166
151
|
buffer.writeUInt32LE(this.tdsVersion);
|
|
167
152
|
buffer.writeUInt32LE(this.packetSize);
|
|
168
153
|
buffer.writeUInt32LE(this.clientProgVer);
|
|
@@ -184,14 +169,14 @@ var Login7Payload = (function () {
|
|
|
184
169
|
this.variableLengthsLength = 9 * 4 + 6 + 2 * 4;
|
|
185
170
|
}
|
|
186
171
|
var variableData = {
|
|
187
|
-
offsetsAndLengths: new
|
|
188
|
-
data: new
|
|
172
|
+
offsetsAndLengths: new WritableTrackingBuffer(200),
|
|
173
|
+
data: new WritableTrackingBuffer(200, 'ucs2'),
|
|
189
174
|
offset: offset + this.variableLengthsLength
|
|
190
175
|
};
|
|
191
|
-
this.hostname =
|
|
176
|
+
this.hostname = os.hostname();
|
|
192
177
|
this.loginData = this.loginData || {};
|
|
193
178
|
this.loginData.appName = this.loginData.appName || 'Tedious';
|
|
194
|
-
this.libraryName =
|
|
179
|
+
this.libraryName = libraryName;
|
|
195
180
|
this.clientId = new Buffer([1, 2, 3, 4, 5, 6]);
|
|
196
181
|
if (!this.loginData.domain) {
|
|
197
182
|
this.sspi = '';
|
|
@@ -251,7 +236,7 @@ var Login7Payload = (function () {
|
|
|
251
236
|
var protocol = 'NTLMSSP\u0000';
|
|
252
237
|
var BODY_LENGTH = 40;
|
|
253
238
|
var bufferLength = BODY_LENGTH + domain.length;
|
|
254
|
-
var buffer = new
|
|
239
|
+
var buffer = new WritableTrackingBuffer(bufferLength);
|
|
255
240
|
|
|
256
241
|
var type1flags = this.getNTLMFlags();
|
|
257
242
|
if (workstation === '') {
|
|
@@ -302,12 +287,9 @@ var Login7Payload = (function () {
|
|
|
302
287
|
key: 'toString',
|
|
303
288
|
value: function toString(indent) {
|
|
304
289
|
indent || (indent = '');
|
|
305
|
-
return indent + 'Login7 - ' +
|
|
290
|
+
return indent + 'Login7 - ' + sprintf('TDS:0x%08X, PacketSize:0x%08X, ClientProgVer:0x%08X, ClientPID:0x%08X, ConnectionID:0x%08X', this.tdsVersion, this.packetSize, this.clientProgVer, this.clientPid, this.connectionId) + '\n' + indent + ' ' + sprintf('Flags1:0x%02X, Flags2:0x%02X, TypeFlags:0x%02X, Flags3:0x%02X, ClientTimezone:%d, ClientLCID:0x%08X', this.flags1, this.flags2, this.typeFlags, this.flags3, this.clientTimeZone, this.clientLcid) + '\n' + indent + ' ' + sprintf("Hostname:'%s', Username:'%s', Password:'%s', AppName:'%s', ServerName:'%s', LibraryName:'%s'", this.hostname, this.loginData.userName, this.loginData.password, this.loginData.appName, this.loginData.serverName, libraryName) + '\n' + indent + ' ' + sprintf("Language:'%s', Database:'%s', SSPI:'%s', AttachDbFile:'%s', ChangePassword:'%s'", this.loginData.language, this.loginData.database, this.sspi, this.attachDbFile, this.changePassword);
|
|
306
291
|
}
|
|
307
292
|
}]);
|
|
308
293
|
|
|
309
294
|
return Login7Payload;
|
|
310
|
-
})();
|
|
311
|
-
|
|
312
|
-
exports['default'] = Login7Payload;
|
|
313
|
-
module.exports = exports['default'];
|
|
295
|
+
})();
|
package/lib/message-io.js
CHANGED
|
@@ -8,27 +8,16 @@ var _createClass = require('babel-runtime/helpers/create-class')['default'];
|
|
|
8
8
|
|
|
9
9
|
var _classCallCheck = require('babel-runtime/helpers/class-call-check')['default'];
|
|
10
10
|
|
|
11
|
-
var
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
var _tls = require('tls');
|
|
18
|
-
|
|
19
|
-
var _tls2 = _interopRequireDefault(_tls);
|
|
20
|
-
|
|
21
|
-
var _crypto = require('crypto');
|
|
22
|
-
|
|
23
|
-
var _crypto2 = _interopRequireDefault(_crypto);
|
|
24
|
-
|
|
25
|
-
var _events = require('events');
|
|
26
|
-
|
|
27
|
-
var _readableStream = require('readable-stream');
|
|
11
|
+
var tls = require('tls');
|
|
12
|
+
var crypto = require('crypto');
|
|
13
|
+
var EventEmitter = require('events').EventEmitter;
|
|
14
|
+
var Transform = require('readable-stream').Transform;
|
|
28
15
|
|
|
29
16
|
require('./buffertools');
|
|
30
17
|
|
|
31
|
-
var
|
|
18
|
+
var Packet = require('./packet').Packet;
|
|
19
|
+
var TYPE = require('./packet').TYPE;
|
|
20
|
+
var packetHeaderLength = require('./packet').HEADER_LENGTH;
|
|
32
21
|
|
|
33
22
|
var ReadablePacketStream = (function (_Transform) {
|
|
34
23
|
_inherits(ReadablePacketStream, _Transform);
|
|
@@ -36,7 +25,7 @@ var ReadablePacketStream = (function (_Transform) {
|
|
|
36
25
|
function ReadablePacketStream() {
|
|
37
26
|
_classCallCheck(this, ReadablePacketStream);
|
|
38
27
|
|
|
39
|
-
_get(Object.getPrototypeOf(ReadablePacketStream.prototype), 'constructor', this).call(this, {
|
|
28
|
+
_get(Object.getPrototypeOf(ReadablePacketStream.prototype), 'constructor', this).call(this, { objectMode: true });
|
|
40
29
|
|
|
41
30
|
this.buffer = new Buffer(0);
|
|
42
31
|
this.position = 0;
|
|
@@ -58,14 +47,14 @@ var ReadablePacketStream = (function (_Transform) {
|
|
|
58
47
|
this.position = 0;
|
|
59
48
|
|
|
60
49
|
// The packet header is always 8 bytes of length.
|
|
61
|
-
while (this.buffer.length >= this.position +
|
|
50
|
+
while (this.buffer.length >= this.position + packetHeaderLength) {
|
|
62
51
|
// Get the full packet length
|
|
63
52
|
var _length = this.buffer.readUInt16BE(this.position + 2);
|
|
64
53
|
|
|
65
54
|
if (this.buffer.length >= this.position + _length) {
|
|
66
55
|
var data = this.buffer.slice(this.position, this.position + _length);
|
|
67
56
|
this.position += _length;
|
|
68
|
-
this.push(new
|
|
57
|
+
this.push(new Packet(data));
|
|
69
58
|
} else {
|
|
70
59
|
// Not enough data to provide the next packet. Stop here and wait for
|
|
71
60
|
// the next call to `_transform`.
|
|
@@ -78,9 +67,9 @@ var ReadablePacketStream = (function (_Transform) {
|
|
|
78
67
|
}]);
|
|
79
68
|
|
|
80
69
|
return ReadablePacketStream;
|
|
81
|
-
})(
|
|
70
|
+
})(Transform);
|
|
82
71
|
|
|
83
|
-
|
|
72
|
+
module.exports = (function (_EventEmitter) {
|
|
84
73
|
_inherits(MessageIO, _EventEmitter);
|
|
85
74
|
|
|
86
75
|
function MessageIO(socket, _packetSize, debug) {
|
|
@@ -105,16 +94,16 @@ var MessageIO = (function (_EventEmitter) {
|
|
|
105
94
|
});
|
|
106
95
|
|
|
107
96
|
this.socket.pipe(this.packetStream);
|
|
108
|
-
this.packetDataSize = this._packetSize -
|
|
97
|
+
this.packetDataSize = this._packetSize - packetHeaderLength;
|
|
109
98
|
}
|
|
110
99
|
|
|
111
100
|
_createClass(MessageIO, [{
|
|
112
101
|
key: 'packetSize',
|
|
113
102
|
value: function packetSize(_packetSize2) {
|
|
114
103
|
if (arguments.length > 0) {
|
|
115
|
-
this.debug.log(
|
|
104
|
+
this.debug.log('Packet size changed from ' + this._packetSize + ' to ' + _packetSize2);
|
|
116
105
|
this._packetSize = _packetSize2;
|
|
117
|
-
this.packetDataSize = this._packetSize -
|
|
106
|
+
this.packetDataSize = this._packetSize - packetHeaderLength;
|
|
118
107
|
}
|
|
119
108
|
return this._packetSize;
|
|
120
109
|
}
|
|
@@ -123,20 +112,20 @@ var MessageIO = (function (_EventEmitter) {
|
|
|
123
112
|
value: function startTls(credentialsDetails) {
|
|
124
113
|
var _this2 = this;
|
|
125
114
|
|
|
126
|
-
var credentials =
|
|
115
|
+
var credentials = tls.createSecureContext ? tls.createSecureContext(credentialsDetails) : crypto.createCredentials(credentialsDetails);
|
|
127
116
|
|
|
128
|
-
this.securePair =
|
|
117
|
+
this.securePair = tls.createSecurePair(credentials);
|
|
129
118
|
this.tlsNegotiationComplete = false;
|
|
130
119
|
|
|
131
120
|
this.securePair.on('secure', function () {
|
|
132
121
|
var cipher = _this2.securePair.cleartext.getCipher();
|
|
133
|
-
_this2.debug.log(
|
|
122
|
+
_this2.debug.log('TLS negotiated (' + cipher.name + ', ' + cipher.version + ')');
|
|
134
123
|
_this2.emit('secure', _this2.securePair.cleartext);
|
|
135
124
|
_this2.encryptAllFutureTraffic();
|
|
136
125
|
});
|
|
137
126
|
|
|
138
127
|
this.securePair.encrypted.on('data', function (data) {
|
|
139
|
-
_this2.sendMessage(
|
|
128
|
+
_this2.sendMessage(TYPE.PRELOGIN, data);
|
|
140
129
|
});
|
|
141
130
|
|
|
142
131
|
// On Node >= 0.12, the encrypted stream automatically starts spewing out
|
|
@@ -186,7 +175,7 @@ var MessageIO = (function (_EventEmitter) {
|
|
|
186
175
|
|
|
187
176
|
var packetPayload = data.slice(payloadStart, payloadEnd);
|
|
188
177
|
|
|
189
|
-
var packet = new
|
|
178
|
+
var packet = new Packet(packetType);
|
|
190
179
|
packet.last(packetNumber === numberOfPackets - 1);
|
|
191
180
|
packet.resetConnection(resetConnection);
|
|
192
181
|
packet.packetId(packetNumber + 1);
|
|
@@ -213,7 +202,4 @@ var MessageIO = (function (_EventEmitter) {
|
|
|
213
202
|
}]);
|
|
214
203
|
|
|
215
204
|
return MessageIO;
|
|
216
|
-
})(
|
|
217
|
-
|
|
218
|
-
exports['default'] = MessageIO;
|
|
219
|
-
module.exports = exports['default'];
|
|
205
|
+
})(EventEmitter);
|
package/lib/metadata-parser.js
CHANGED
|
@@ -1,19 +1,25 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
var codepageBySortId = require('./collation').codepageBySortId;
|
|
4
|
+
var codepageByLcid = require('./collation').codepageByLcid;
|
|
5
|
+
var TYPE = require('./data-type').TYPE;
|
|
6
|
+
var sprintf = require('sprintf').sprintf;
|
|
6
7
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
var _sprintf = require('sprintf');
|
|
8
|
+
module.exports = metadataParse;
|
|
9
|
+
module.exports.readPrecision = readPrecision;
|
|
10
|
+
module.exports.readScale = readScale;
|
|
11
|
+
module.exports.readCollation = readCollation;
|
|
12
12
|
|
|
13
13
|
function readDataLength(parser, type, callback) {
|
|
14
14
|
if ((type.id & 0x30) === 0x20) {
|
|
15
15
|
// xx10xxxx - s2.2.4.2.1.3
|
|
16
16
|
// Variable length
|
|
17
|
+
if (type.dataLengthFromScale) {
|
|
18
|
+
return callback(0); // dataLength is resolved from scale
|
|
19
|
+
} else if (type.fixedDataLength) {
|
|
20
|
+
return callback(type.fixedDataLength);
|
|
21
|
+
}
|
|
22
|
+
|
|
17
23
|
switch (type.dataLengthLength) {
|
|
18
24
|
case 0:
|
|
19
25
|
return callback(undefined);
|
|
@@ -28,7 +34,7 @@ function readDataLength(parser, type, callback) {
|
|
|
28
34
|
return parser.readUInt32LE(callback);
|
|
29
35
|
|
|
30
36
|
default:
|
|
31
|
-
return parser.emit(new Error(
|
|
37
|
+
return parser.emit(new Error('Unsupported dataLengthLength ' + type.dataLengthLength + ' for data type ' + type.name));
|
|
32
38
|
}
|
|
33
39
|
} else {
|
|
34
40
|
callback(undefined);
|
|
@@ -61,8 +67,6 @@ function readCollation(parser, type, callback) {
|
|
|
61
67
|
collation.lcid |= collationData[1] << 8;
|
|
62
68
|
collation.lcid |= collationData[0];
|
|
63
69
|
|
|
64
|
-
collation.codepage = _collation.codepageByLcid[collation.lcid];
|
|
65
|
-
|
|
66
70
|
// This may not be extracting the correct nibbles in the correct order.
|
|
67
71
|
collation.flags = collationData[3] >> 4;
|
|
68
72
|
collation.flags |= collationData[2] & 0xF0;
|
|
@@ -72,6 +76,8 @@ function readCollation(parser, type, callback) {
|
|
|
72
76
|
|
|
73
77
|
collation.sortId = collationData[4];
|
|
74
78
|
|
|
79
|
+
collation.codepage = codepageBySortId[collation.sortId] || codepageByLcid[collation.lcid] || 'CP1252';
|
|
80
|
+
|
|
75
81
|
callback(collation);
|
|
76
82
|
});
|
|
77
83
|
} else {
|
|
@@ -128,14 +134,14 @@ function readUDTInfo(parser, type, callback) {
|
|
|
128
134
|
}
|
|
129
135
|
}
|
|
130
136
|
|
|
131
|
-
|
|
132
|
-
(options.tdsVersion <
|
|
137
|
+
function metadataParse(parser, options, callback) {
|
|
138
|
+
(options.tdsVersion < '7_2' ? parser.readUInt16LE : parser.readUInt32LE).call(parser, function (userType) {
|
|
133
139
|
parser.readUInt16LE(function (flags) {
|
|
134
140
|
parser.readUInt8(function (typeNumber) {
|
|
135
|
-
var type =
|
|
141
|
+
var type = TYPE[typeNumber];
|
|
136
142
|
|
|
137
143
|
if (!type) {
|
|
138
|
-
return parser.emit(new Error(
|
|
144
|
+
return parser.emit(new Error(sprintf('Unrecognised data type 0x%02X', typeNumber)));
|
|
139
145
|
}
|
|
140
146
|
|
|
141
147
|
readDataLength(parser, type, function (dataLength) {
|
|
@@ -168,6 +174,4 @@ exports['default'] = function (parser, options, callback) {
|
|
|
168
174
|
});
|
|
169
175
|
});
|
|
170
176
|
});
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
module.exports = exports['default'];
|
|
177
|
+
}
|
package/lib/ntlm-payload.js
CHANGED
|
@@ -4,25 +4,13 @@ var _createClass = require('babel-runtime/helpers/create-class')['default'];
|
|
|
4
4
|
|
|
5
5
|
var _classCallCheck = require('babel-runtime/helpers/class-call-check')['default'];
|
|
6
6
|
|
|
7
|
-
var
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
value: true
|
|
11
|
-
});
|
|
12
|
-
|
|
13
|
-
var _trackingBufferWritableTrackingBuffer = require('./tracking-buffer/writable-tracking-buffer');
|
|
14
|
-
|
|
15
|
-
var _trackingBufferWritableTrackingBuffer2 = _interopRequireDefault(_trackingBufferWritableTrackingBuffer);
|
|
16
|
-
|
|
17
|
-
var _crypto = require('crypto');
|
|
18
|
-
|
|
19
|
-
var _crypto2 = _interopRequireDefault(_crypto);
|
|
20
|
-
|
|
21
|
-
var _bigNumber = require('big-number');
|
|
7
|
+
var WritableTrackingBuffer = require('./tracking-buffer/writable-tracking-buffer');
|
|
8
|
+
var crypto = require('crypto');
|
|
9
|
+
var BigInteger = require('big-number').n;
|
|
22
10
|
|
|
23
11
|
var hex = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'];
|
|
24
12
|
|
|
25
|
-
|
|
13
|
+
module.exports = (function () {
|
|
26
14
|
function NTLMResponsePayload(loginData) {
|
|
27
15
|
_classCallCheck(this, NTLMResponsePayload);
|
|
28
16
|
|
|
@@ -48,7 +36,7 @@ var NTLMResponsePayload = (function () {
|
|
|
48
36
|
var server_data = ntlmData.target;
|
|
49
37
|
var server_nonce = ntlmData.nonce;
|
|
50
38
|
var bufferLength = 64 + domain.length * 2 + username.length * 2 + lmv2len + ntlmv2len + 8 + 8 + 8 + 4 + server_data.length + 4;
|
|
51
|
-
var data = new
|
|
39
|
+
var data = new WritableTrackingBuffer(bufferLength);
|
|
52
40
|
data.position = 0;
|
|
53
41
|
data.writeString('NTLMSSP\u0000', 'utf8');
|
|
54
42
|
data.writeUInt32LE(0x03);
|
|
@@ -125,7 +113,7 @@ var NTLMResponsePayload = (function () {
|
|
|
125
113
|
}, {
|
|
126
114
|
key: 'createTimestamp',
|
|
127
115
|
value: function createTimestamp(time) {
|
|
128
|
-
var tenthsOfAMicrosecond = new
|
|
116
|
+
var tenthsOfAMicrosecond = new BigInteger(time).plus(11644473600).multiply(10000000);
|
|
129
117
|
var hexArray = [];
|
|
130
118
|
|
|
131
119
|
var pair = [];
|
|
@@ -175,7 +163,7 @@ var NTLMResponsePayload = (function () {
|
|
|
175
163
|
hash.fill(0);
|
|
176
164
|
|
|
177
165
|
var unicodeString = new Buffer(text, 'ucs2');
|
|
178
|
-
var md4 =
|
|
166
|
+
var md4 = crypto.createHash('md4').update(unicodeString).digest();
|
|
179
167
|
if (md4.copy) {
|
|
180
168
|
md4.copy(hash);
|
|
181
169
|
} else {
|
|
@@ -186,7 +174,7 @@ var NTLMResponsePayload = (function () {
|
|
|
186
174
|
}, {
|
|
187
175
|
key: 'hmacMD5',
|
|
188
176
|
value: function hmacMD5(data, key) {
|
|
189
|
-
var hmac =
|
|
177
|
+
var hmac = crypto.createHmac('MD5', key);
|
|
190
178
|
hmac.update(data);
|
|
191
179
|
|
|
192
180
|
var result = hmac.digest();
|
|
@@ -199,7 +187,4 @@ var NTLMResponsePayload = (function () {
|
|
|
199
187
|
}]);
|
|
200
188
|
|
|
201
189
|
return NTLMResponsePayload;
|
|
202
|
-
})();
|
|
203
|
-
|
|
204
|
-
exports['default'] = NTLMResponsePayload;
|
|
205
|
-
module.exports = exports['default'];
|
|
190
|
+
})();
|
package/lib/packet.js
CHANGED
|
@@ -4,20 +4,13 @@ var _createClass = require('babel-runtime/helpers/create-class')['default'];
|
|
|
4
4
|
|
|
5
5
|
var _classCallCheck = require('babel-runtime/helpers/class-call-check')['default'];
|
|
6
6
|
|
|
7
|
-
Object.defineProperty(exports, '__esModule', {
|
|
8
|
-
value: true
|
|
9
|
-
});
|
|
10
|
-
exports.isPacketComplete = isPacketComplete;
|
|
11
|
-
exports.packetLength = packetLength;
|
|
12
|
-
|
|
13
7
|
require('./buffertools');
|
|
14
8
|
|
|
15
|
-
var
|
|
9
|
+
var sprintf = require('sprintf').sprintf;
|
|
16
10
|
|
|
17
|
-
var HEADER_LENGTH = 8;
|
|
11
|
+
var HEADER_LENGTH = module.exports.HEADER_LENGTH = 8;
|
|
18
12
|
|
|
19
|
-
exports.
|
|
20
|
-
var TYPE = {
|
|
13
|
+
var TYPE = module.exports.TYPE = {
|
|
21
14
|
SQL_BATCH: 0x01,
|
|
22
15
|
RPC_REQUEST: 0x03,
|
|
23
16
|
TABULAR_RESULT: 0x04,
|
|
@@ -29,7 +22,6 @@ var TYPE = {
|
|
|
29
22
|
PRELOGIN: 0x12
|
|
30
23
|
};
|
|
31
24
|
|
|
32
|
-
exports.TYPE = TYPE;
|
|
33
25
|
var typeByValue = {};
|
|
34
26
|
|
|
35
27
|
for (var _name in TYPE) {
|
|
@@ -44,7 +36,7 @@ var STATUS = {
|
|
|
44
36
|
RESETCONNECTIONSKIPTRAN: 0x10
|
|
45
37
|
};
|
|
46
38
|
|
|
47
|
-
var OFFSET = {
|
|
39
|
+
var OFFSET = module.exports.OFFSET = {
|
|
48
40
|
Type: 0,
|
|
49
41
|
Status: 1,
|
|
50
42
|
Length: 2,
|
|
@@ -53,7 +45,6 @@ var OFFSET = {
|
|
|
53
45
|
Window: 7
|
|
54
46
|
};
|
|
55
47
|
|
|
56
|
-
exports.OFFSET = OFFSET;
|
|
57
48
|
var DEFAULT_SPID = 0;
|
|
58
49
|
|
|
59
50
|
var DEFAULT_PACKETID = 1;
|
|
@@ -167,7 +158,7 @@ var Packet = (function () {
|
|
|
167
158
|
key: 'headerToString',
|
|
168
159
|
value: function headerToString(indent) {
|
|
169
160
|
indent || (indent = '');
|
|
170
|
-
var text =
|
|
161
|
+
var text = sprintf('type:0x%02X(%s), status:0x%02X(%s), length:0x%04X, spid:0x%04X, packetId:0x%02X, window:0x%02X', this.buffer.readUInt8(OFFSET.Type), typeByValue[this.buffer.readUInt8(OFFSET.Type)], this.buffer.readUInt8(OFFSET.Status), this.statusAsString(), this.buffer.readUInt16BE(OFFSET.Length), this.buffer.readUInt16BE(OFFSET.SPID), this.buffer.readUInt8(OFFSET.PacketID), this.buffer.readUInt8(OFFSET.Window));
|
|
171
162
|
return indent + text;
|
|
172
163
|
}
|
|
173
164
|
}, {
|
|
@@ -186,7 +177,7 @@ var Packet = (function () {
|
|
|
186
177
|
for (var offset = 0; offset < data.length; offset++) {
|
|
187
178
|
if (offset % BYTES_PER_LINE === 0) {
|
|
188
179
|
dataDump += indent;
|
|
189
|
-
dataDump +=
|
|
180
|
+
dataDump += sprintf('%04X ', offset);
|
|
190
181
|
}
|
|
191
182
|
|
|
192
183
|
if (data[offset] < 0x20 || data[offset] > 0x7E) {
|
|
@@ -199,7 +190,7 @@ var Packet = (function () {
|
|
|
199
190
|
}
|
|
200
191
|
|
|
201
192
|
if (data[offset] != null) {
|
|
202
|
-
dataDump +=
|
|
193
|
+
dataDump += sprintf('%02X', data[offset]);
|
|
203
194
|
}
|
|
204
195
|
|
|
205
196
|
if ((offset + 1) % BYTES_PER_GROUP === 0 && !((offset + 1) % BYTES_PER_LINE === 0)) {
|
|
@@ -230,15 +221,16 @@ var Packet = (function () {
|
|
|
230
221
|
}, {
|
|
231
222
|
key: 'payloadString',
|
|
232
223
|
value: function payloadString() {
|
|
233
|
-
return
|
|
224
|
+
return '';
|
|
234
225
|
}
|
|
235
226
|
}]);
|
|
236
227
|
|
|
237
228
|
return Packet;
|
|
238
229
|
})();
|
|
239
230
|
|
|
240
|
-
exports.Packet = Packet;
|
|
231
|
+
module.exports.Packet = Packet;
|
|
241
232
|
|
|
233
|
+
module.exports.isPacketComplete = isPacketComplete;
|
|
242
234
|
function isPacketComplete(potentialPacketBuffer) {
|
|
243
235
|
if (potentialPacketBuffer.length < HEADER_LENGTH) {
|
|
244
236
|
return false;
|
|
@@ -247,6 +239,7 @@ function isPacketComplete(potentialPacketBuffer) {
|
|
|
247
239
|
}
|
|
248
240
|
}
|
|
249
241
|
|
|
242
|
+
module.exports.packetLength = packetLength;
|
|
250
243
|
function packetLength(potentialPacketBuffer) {
|
|
251
244
|
return potentialPacketBuffer.readUInt16BE(OFFSET.Length);
|
|
252
245
|
}
|
package/lib/prelogin-payload.js
CHANGED
|
@@ -4,13 +4,8 @@ var _createClass = require('babel-runtime/helpers/create-class')['default'];
|
|
|
4
4
|
|
|
5
5
|
var _classCallCheck = require('babel-runtime/helpers/class-call-check')['default'];
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
});
|
|
10
|
-
|
|
11
|
-
var _sprintf = require('sprintf');
|
|
12
|
-
|
|
13
|
-
var _trackingBufferTrackingBuffer = require('./tracking-buffer/tracking-buffer');
|
|
7
|
+
var sprintf = require('sprintf').sprintf;
|
|
8
|
+
var WritableTrackingBuffer = require('./tracking-buffer/tracking-buffer').WritableTrackingBuffer;
|
|
14
9
|
|
|
15
10
|
var optionBufferSize = 20;
|
|
16
11
|
|
|
@@ -56,8 +51,7 @@ for (var _name2 in MARS) {
|
|
|
56
51
|
/*
|
|
57
52
|
s2.2.6.4
|
|
58
53
|
*/
|
|
59
|
-
|
|
60
|
-
var PreloginPayload = (function () {
|
|
54
|
+
module.exports = (function () {
|
|
61
55
|
function PreloginPayload(bufferOrOptions) {
|
|
62
56
|
_classCallCheck(this, PreloginPayload);
|
|
63
57
|
|
|
@@ -100,7 +94,7 @@ var PreloginPayload = (function () {
|
|
|
100
94
|
}, {
|
|
101
95
|
key: 'createVersionOption',
|
|
102
96
|
value: function createVersionOption() {
|
|
103
|
-
var buffer = new
|
|
97
|
+
var buffer = new WritableTrackingBuffer(optionBufferSize);
|
|
104
98
|
buffer.writeUInt32BE(VERSION);
|
|
105
99
|
buffer.writeUInt16BE(SUBBUILD);
|
|
106
100
|
return {
|
|
@@ -111,7 +105,7 @@ var PreloginPayload = (function () {
|
|
|
111
105
|
}, {
|
|
112
106
|
key: 'createEncryptionOption',
|
|
113
107
|
value: function createEncryptionOption() {
|
|
114
|
-
var buffer = new
|
|
108
|
+
var buffer = new WritableTrackingBuffer(optionBufferSize);
|
|
115
109
|
if (this.options.encrypt) {
|
|
116
110
|
buffer.writeUInt8(ENCRYPT.ON);
|
|
117
111
|
} else {
|
|
@@ -125,7 +119,7 @@ var PreloginPayload = (function () {
|
|
|
125
119
|
}, {
|
|
126
120
|
key: 'createInstanceOption',
|
|
127
121
|
value: function createInstanceOption() {
|
|
128
|
-
var buffer = new
|
|
122
|
+
var buffer = new WritableTrackingBuffer(optionBufferSize);
|
|
129
123
|
buffer.writeUInt8(0x00);
|
|
130
124
|
return {
|
|
131
125
|
token: TOKEN.INSTOPT,
|
|
@@ -135,7 +129,7 @@ var PreloginPayload = (function () {
|
|
|
135
129
|
}, {
|
|
136
130
|
key: 'createThreadIdOption',
|
|
137
131
|
value: function createThreadIdOption() {
|
|
138
|
-
var buffer = new
|
|
132
|
+
var buffer = new WritableTrackingBuffer(optionBufferSize);
|
|
139
133
|
buffer.writeUInt32BE(0x00);
|
|
140
134
|
return {
|
|
141
135
|
token: TOKEN.THREADID,
|
|
@@ -145,7 +139,7 @@ var PreloginPayload = (function () {
|
|
|
145
139
|
}, {
|
|
146
140
|
key: 'createMarsOption',
|
|
147
141
|
value: function createMarsOption() {
|
|
148
|
-
var buffer = new
|
|
142
|
+
var buffer = new WritableTrackingBuffer(optionBufferSize);
|
|
149
143
|
buffer.writeUInt8(MARS.OFF);
|
|
150
144
|
return {
|
|
151
145
|
token: TOKEN.MARS,
|
|
@@ -218,12 +212,9 @@ var PreloginPayload = (function () {
|
|
|
218
212
|
key: 'toString',
|
|
219
213
|
value: function toString(indent) {
|
|
220
214
|
indent || (indent = '');
|
|
221
|
-
return indent + 'PreLogin - ' +
|
|
215
|
+
return indent + 'PreLogin - ' + sprintf('version:%d.%d.%d.%d %d, encryption:0x%02X(%s), instopt:0x%02X, threadId:0x%08X, mars:0x%02X(%s)', this.version.major, this.version.minor, this.version.patch, this.version.trivial, this.version.subbuild, this.encryption ? this.encryption : 0, this.encryptionString ? this.encryptionString : 0, this.instance ? this.instance : 0, this.threadId ? this.threadId : 0, this.mars ? this.mars : 0, this.marsString ? this.marsString : 0);
|
|
222
216
|
}
|
|
223
217
|
}]);
|
|
224
218
|
|
|
225
219
|
return PreloginPayload;
|
|
226
|
-
})();
|
|
227
|
-
|
|
228
|
-
exports['default'] = PreloginPayload;
|
|
229
|
-
module.exports = exports['default'];
|
|
220
|
+
})();
|