srcds-log-receiver
Version:
A simple too to receive srcds logs
120 lines • 4.68 kB
JavaScript
"use strict";
exports.__esModule = true;
var logs = require("./index");
var moment = require("moment");
var packetHeader = new Buffer([255, 255, 255, 255]), magicBytePassword = 0x53, magicByteNoPassword = 0x52, magicStringEndHeader = "L ";
function getPassword(message) {
var start = packetHeader.length + 1;
var end = message.indexOf(magicStringEndHeader);
if (end < 0) {
return null;
}
else {
return message.slice(start, end);
}
}
function stringifyAddress(address) {
return address.address + ":" + address.port;
}
var LogMessageConstructor = (function () {
function LogMessageConstructor(opts) {
this.serverInfo = {};
this.opts = opts;
this.buildServerInfo(opts);
}
LogMessageConstructor.prototype.buildServerInfo = function (opts) {
var _this = this;
opts.definedSources.forEach(function (v) {
_this.serverInfo[stringifyAddress(v)] = v;
});
};
LogMessageConstructor.prototype.GetLogMessage = function (message, senderInfo) {
var logMessage = { isValid: false };
if (message.length < 16) {
logMessage.invalidReason = InvalidReason.TooShort;
return logMessage;
}
if (!this.validateHeader(message)) {
logMessage.invalidReason = InvalidReason.BadHeader;
return logMessage;
}
if (!this.validatePassword(logMessage, message, senderInfo)) {
return logMessage;
}
if (!this.extractPayload(logMessage, message)) {
return logMessage;
}
logMessage.isValid = true;
logMessage.receivedAt = moment();
logMessage.original = message;
logMessage.receivedFrom = senderInfo;
return logMessage;
};
LogMessageConstructor.prototype.validateHeader = function (message) {
return message.slice(0, 4).compare(packetHeader) === 0;
};
LogMessageConstructor.prototype.validatePassword = function (logMessage, message, senderInfo) {
var packetType = message[4];
if (packetType == magicBytePassword) {
logMessage.packetType = logs.LogType.Password;
var serverString = stringifyAddress(senderInfo);
var server = this.serverInfo[serverString];
var providedPass = getPassword(message);
if (providedPass) {
if (server) {
if (server.password == providedPass.toString()) {
logMessage.password = server.password;
return true;
}
else {
logMessage.invalidReason = InvalidReason.WrongPassword;
return false;
}
}
else if (this.opts.defaultPassword == providedPass.toString()) {
logMessage.password = providedPass.toString();
return true;
}
else {
logMessage.invalidReason = InvalidReason.WrongPassword;
return false;
}
}
else {
logMessage.invalidReason = InvalidReason.NoPassword;
return false;
}
}
else if (packetType == magicByteNoPassword) {
logMessage.packetType = logs.LogType.NoPassword;
if (this.opts.requirePassword)
return false;
return true;
}
else {
return false;
}
};
LogMessageConstructor.prototype.extractPayload = function (logMessage, message) {
var messageStart = message.indexOf(magicStringEndHeader);
if (messageStart < 0) {
logMessage.invalidReason = InvalidReason.NoPayload;
return false;
}
messageStart += magicStringEndHeader.length;
logMessage.message = message.slice(messageStart, message.length - 2).toString();
return true;
};
return LogMessageConstructor;
}());
exports.LogMessageConstructor = LogMessageConstructor;
var InvalidReason;
(function (InvalidReason) {
InvalidReason[InvalidReason["TooShort"] = 0] = "TooShort";
InvalidReason[InvalidReason["BadHeader"] = 1] = "BadHeader";
InvalidReason[InvalidReason["NoType"] = 2] = "NoType";
InvalidReason[InvalidReason["NoPassword"] = 3] = "NoPassword";
InvalidReason[InvalidReason["WrongPassword"] = 4] = "WrongPassword";
InvalidReason[InvalidReason["NoPayload"] = 5] = "NoPayload";
})(InvalidReason = exports.InvalidReason || (exports.InvalidReason = {}));
//# sourceMappingURL=PacketParser.js.map