Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
bytesRead: self.bytesRead,
stubBuffer: self.stubBuffer
}
};
// We got a parse Error fire it off then keep going
self.emit('parseError', errorObject, self);
return;
}
// Ensure that the size of message is larger than 0 and less than the max allowed
if (
sizeOfMessage > 4 &&
sizeOfMessage < self.maxBsonMessageSize &&
sizeOfMessage > data.length
) {
self.buffer = Buffer.alloc(sizeOfMessage);
// Copy all the data into the buffer
data.copy(self.buffer, 0);
// Update bytes read
self.bytesRead = data.length;
// Update sizeOfMessage
self.sizeOfMessage = sizeOfMessage;
// Ensure stub buffer is null
self.stubBuffer = null;
// Exit parsing loop
data = Buffer.alloc(0);
} else if (
sizeOfMessage > 4 &&
sizeOfMessage < self.maxBsonMessageSize &&
sizeOfMessage === data.length
) {
try {
function deterministicGenerateK(curve, hash, d, checkSig, nonce) {
enforceType("Buffer", hash);
enforceType(BigInteger, d);
if (nonce) {
hash = sha256(Buffer.concat([hash, Buffer.alloc(nonce)]));
}
// sanity check
assert.equal(hash.length, 32, "Hash must be 256 bit");
var x = d.toBuffer(32);
var k = Buffer.alloc(32);
var v = Buffer.alloc(32);
// Step B
v.fill(1);
// Step C
k.fill(0);
// Step D
k = HmacSHA256(Buffer.concat([v, new Buffer([0]), x, hash]), k);
// Step E
v = HmacSHA256(v, k);
// Step F
k = HmacSHA256(Buffer.concat([v, new Buffer([1]), x, hash]), k);
compress(self, messageToBeCompressed, function(err, compressedMessage) {
if (err) return callback(err, null);
// Create the msgHeader of OP_COMPRESSED
const msgHeader = Buffer.alloc(MESSAGE_HEADER_SIZE);
msgHeader.writeInt32LE(
MESSAGE_HEADER_SIZE + COMPRESSION_DETAILS_SIZE + compressedMessage.length,
0
); // messageLength
msgHeader.writeInt32LE(command.requestId, 4); // requestID
msgHeader.writeInt32LE(0, 8); // responseTo (zero)
msgHeader.writeInt32LE(opcodes.OP_COMPRESSED, 12); // opCode
// Create the compression details of OP_COMPRESSED
const compressionDetails = Buffer.alloc(COMPRESSION_DETAILS_SIZE);
compressionDetails.writeInt32LE(originalCommandOpCode, 0); // originalOpcode
compressionDetails.writeInt32LE(messageToBeCompressed.length, 4); // Size of the uncompressed compressedMessage, excluding the MsgHeader
compressionDetails.writeUInt8(compressorIDs[self.options.agreedCompressor], 8); // compressorID
return callback(null, [msgHeader, compressionDetails, compressedMessage]);
});
compress(self, messageToBeCompressed, function(err, compressedMessage) {
if (err) return callback(err, null);
// Create the msgHeader of OP_COMPRESSED
const msgHeader = Buffer.alloc(MESSAGE_HEADER_SIZE);
msgHeader.writeInt32LE(
MESSAGE_HEADER_SIZE + COMPRESSION_DETAILS_SIZE + compressedMessage.length,
0
); // messageLength
msgHeader.writeInt32LE(command.requestId, 4); // requestID
msgHeader.writeInt32LE(0, 8); // responseTo (zero)
msgHeader.writeInt32LE(opcodes.OP_COMPRESSED, 12); // opCode
// Create the compression details of OP_COMPRESSED
const compressionDetails = Buffer.alloc(COMPRESSION_DETAILS_SIZE);
compressionDetails.writeInt32LE(originalCommandOpCode, 0); // originalOpcode
compressionDetails.writeInt32LE(messageToBeCompressed.length, 4); // Size of the uncompressed compressedMessage, excluding the MsgHeader
compressionDetails.writeUInt8(compressorIDs[self.options.agreedCompressor], 8); // compressorID
return callback(null, [msgHeader, compressionDetails, compressedMessage]);
});
}
if (range === -2) {
return 200 // malformed header string
} else if (range === -1) {
responseData = Buffer.alloc(0) // unsatisfiable range
return 416
} else if (range.type === 'bytes') {
responseData = Buffer.from(responseData)
if (range.length === 1) {
const { start, end } = range[0]
response.setHeader('Content-Range', `bytes ${start}-${end}/${responseData.length}`)
response.setHeader('Accept-Ranges', 'bytes')
response.setHeader('Content-Length', end - start + 1)
responseData = responseData.slice(start, end + 1)
return 206
} else {
responseData = Buffer.alloc(0) // Multiple ranges are not supported. Maybe future?
return 416
}
}
return 200 // All other states, ignore
}
Auth.hashPassword = function(password) {
var nr = [0x5030, 0x5735];
var add = 7;
var nr2 = [0x1234, 0x5671];
var result = Buffer.alloc(8);
if (typeof password === 'string'){
password = Buffer.from(password);
}
for (var i = 0; i < password.length; i++) {
var c = password[i];
if (c === 32 || c === 9) {
// skip space in password
continue;
}
// nr^= (((nr & 63)+add)*c)+ (nr << 8);
// nr = xor(nr, add(mul(add(and(nr, 63), add), c), shl(nr, 8)))
nr = this.xor32(nr, this.add32(this.mul32(this.add32(this.and32(nr, [0, 63]), [0, add]), [0, c]), this.shl32(nr, 8)));
fileOffsetInRange: Math.max(requestedFile.offset - rangeStart, 0),
start: Math.max(rangeStart - requestedFile.offset, 0),
end: Math.min(fileEnd, rangeEnd - requestedFile.offset)
}
})
}
// Now make all the HTTP requests we need in order to load this piece
// Usually that's one requests, but sometimes it will be multiple
// Send requests in parallel and wait for them all to come back
var numRequestsSucceeded = 0
var hasError = false
var ret
if (requests.length > 1) {
ret = Buffer.alloc(length)
}
requests.forEach(function (request) {
var url = request.url
var start = request.start
var end = request.end
debug(
'Requesting url=%s pieceIndex=%d offset=%d length=%d start=%d end=%d',
url, pieceIndex, offset, length, start, end
)
var opts = {
url: url,
method: 'GET',
headers: {
'user-agent': 'WebTorrent/' + VERSION + ' (https://webtorrent.io)',
range: 'bytes=' + start + '-' + end
if (self.encoding === 'utf8' && strings[0].length > 0 && strings[0][0] === '\uFEFF') {
strings[0] = strings[0].substring(1)
}
response.body = strings.join('')
}
if (self._json) {
try {
response.body = JSON.parse(response.body, self._jsonReviver)
} catch (e) {
debug('invalid JSON received', self.uri.href)
}
}
debug('emitting complete', self.uri.href)
if (typeof response.body === 'undefined' && !self._json) {
response.body = self.encoding === null ? Buffer.alloc(0) : ''
}
self.emit('complete', response, response.body)
})
}
var mergeBuffer = Buffer.alloc(options.bufferSize);
var mergeBuffers = [];
var offset = 0;
for (var i = 0; i < buffers.length; i++) {
var buffer = buffers[i];
var bytesRemaining = mergeBuffer.length - offset;
if (buffer.length < bytesRemaining) {
buffer.copy(mergeBuffer, offset);
offset += buffer.length;
} else {
buffer.copy(mergeBuffer, offset, 0, bytesRemaining);
mergeBuffers.push(mergeBuffer);
mergeBuffer = Buffer.alloc(options.bufferSize);
buffer.copy(mergeBuffer, 0, bytesRemaining);
offset = buffer.length - bytesRemaining;
}
}
if (offset > 0) {
mergeBuffers.push(mergeBuffer.slice(0, offset));
}
return mergeBuffers;
}
sendAuthCommand(connection, `${db}.$cmd`, saslContinueCmd, ((err: Error|null|undefined, r: any) => {
if (!r || r.done !== false) {
return callback(err, r);
}
const retrySaslContinueCmd = {
saslContinue: 1,
conversationId: r.conversationId,
payload: SafeBuffer.alloc(0)
};
sendAuthCommand(connection, `${db}.$cmd`, retrySaslContinueCmd, callback);
}));
});