limacharlie
Version:
An API for limacharlie.io, a cloud hosted endpoint detection and response platform.
630 lines (538 loc) • 18.6 kB
JavaScript
"use strict";
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var uuid = require("uuid4");
var Sensor = function () {
function Sensor(manager, sid) {
_classCallCheck(this, Sensor);
this._man = manager;
this.sid = sid;
this._invId = null;
this._info = null;
}
_createClass(Sensor, [{
key: "setInvId",
value: function setInvId(invId) {
this._invId = invId;
}
}, {
key: "task",
value: function () {
var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(tasks, invId, isThrowError) {
var req, thisInv;
return regeneratorRuntime.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
if (!Array.isArray(tasks)) {
tasks = [tasks];
}
req = {
tasks: tasks
};
thisInv = invId;
if (!thisInv) {
thisInv = this._invId;
}
if (thisInv) {
req["investigation_id"] = thisInv;
}
_context.next = 7;
return this._man._apiCall(this.sid, "POST", req, false, isThrowError);
case 7:
return _context.abrupt("return", _context.sent);
case 8:
case "end":
return _context.stop();
}
}
}, _callee, this);
}));
function task(_x, _x2, _x3) {
return _ref.apply(this, arguments);
}
return task;
}()
}, {
key: "request",
value: function () {
var _ref2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2(tasks, responseCb, onError) {
var trackingId;
return regeneratorRuntime.wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
if (this._man._isInteractive) {
_context2.next = 2;
break;
}
throw new Error("Manager provided was not created with isInteractive set to true, cannot track responses.");
case 2:
trackingId = this._man._invId + "/" + uuid();
this._man._spout.registerSpecificCallback(trackingId, 60, function (data) {
responseCb(data);
});
if (!onError) {
_context2.next = 14;
break;
}
_context2.prev = 5;
_context2.next = 8;
return this.task(tasks, trackingId, true);
case 8:
return _context2.abrupt("return", _context2.sent);
case 11:
_context2.prev = 11;
_context2.t0 = _context2["catch"](5);
onError(_context2.t0);
case 14:
_context2.next = 16;
return this.task(tasks, trackingId);
case 16:
return _context2.abrupt("return", _context2.sent);
case 17:
case "end":
return _context2.stop();
}
}
}, _callee2, this, [[5, 11]]);
}));
function request(_x4, _x5, _x6) {
return _ref2.apply(this, arguments);
}
return request;
}()
}, {
key: "asAid",
value: function asAid() {
if (!this._info) {
this.getInfo();
return null;
}
return this._info.oid + "." + this._info.iid + "." + this._info.sid + "." + this._info.plat.toString(16) + "." + this._info.arch;
}
}, {
key: "isWindows",
value: function isWindows() {
if (!this._info) {
this.getInfo();
return null;
}
return this._info.plat === 0x10000000;
}
}, {
key: "isLinux",
value: function isLinux() {
if (!this._info) {
this.getInfo();
return null;
}
return this._info.plat === 0x20000000;
}
}, {
key: "isMac",
value: function isMac() {
if (!this._info) {
this.getInfo();
return null;
}
return this._info.plat === 0x30000000;
}
}, {
key: "isAndroid",
value: function isAndroid() {
if (!this._info) {
this.getInfo();
return null;
}
return this._info.plat === 0x50000000;
}
}, {
key: "isChrome",
value: function isChrome() {
if (!this._info) {
this.getInfo();
return null;
}
return this._info.arch === 0x00000006;
}
}, {
key: "isVPN",
value: function isVPN() {
if (!this._info) {
this.getInfo();
return null;
}
return this._info.plat === 0x70000000;
}
}, {
key: "hostname",
value: function () {
var _ref3 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3() {
return regeneratorRuntime.wrap(function _callee3$(_context3) {
while (1) {
switch (_context3.prev = _context3.next) {
case 0:
if (this._info) {
_context3.next = 3;
break;
}
_context3.next = 3;
return this.getInfo();
case 3:
return _context3.abrupt("return", this._info.hostname);
case 4:
case "end":
return _context3.stop();
}
}
}, _callee3, this);
}));
function hostname() {
return _ref3.apply(this, arguments);
}
return hostname;
}()
}, {
key: "tag",
value: function () {
var _ref4 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee4(_tag, ttl) {
return regeneratorRuntime.wrap(function _callee4$(_context4) {
while (1) {
switch (_context4.prev = _context4.next) {
case 0:
_context4.next = 2;
return this._man._apiCall(this.sid + "/tags", "POST", {
tags: _tag,
ttl: ttl
});
case 2:
return _context4.abrupt("return", _context4.sent);
case 3:
case "end":
return _context4.stop();
}
}
}, _callee4, this);
}));
function tag(_x7, _x8) {
return _ref4.apply(this, arguments);
}
return tag;
}()
}, {
key: "untag",
value: function () {
var _ref5 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee5(tag) {
return regeneratorRuntime.wrap(function _callee5$(_context5) {
while (1) {
switch (_context5.prev = _context5.next) {
case 0:
_context5.next = 2;
return this._man._apiCall(this.sid + "/tags", "DELETE", {
tag: tag
});
case 2:
return _context5.abrupt("return", _context5.sent);
case 3:
case "end":
return _context5.stop();
}
}
}, _callee5, this);
}));
function untag(_x9) {
return _ref5.apply(this, arguments);
}
return untag;
}()
}, {
key: "getTags",
value: function () {
var _ref6 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee6() {
var data;
return regeneratorRuntime.wrap(function _callee6$(_context6) {
while (1) {
switch (_context6.prev = _context6.next) {
case 0:
_context6.next = 2;
return this._man._apiCall(this.sid + "/tags", "GET");
case 2:
data = _context6.sent;
return _context6.abrupt("return", Object.keys(data.tags[this.sid]));
case 4:
case "end":
return _context6.stop();
}
}
}, _callee6, this);
}));
function getTags() {
return _ref6.apply(this, arguments);
}
return getTags;
}()
}, {
key: "getInfo",
value: function () {
var _ref7 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee7() {
var data;
return regeneratorRuntime.wrap(function _callee7$(_context7) {
while (1) {
switch (_context7.prev = _context7.next) {
case 0:
_context7.next = 2;
return this._man._apiCall(this.sid, "GET");
case 2:
data = _context7.sent;
this._info = data.info;
return _context7.abrupt("return", data.info);
case 5:
case "end":
return _context7.stop();
}
}
}, _callee7, this);
}));
function getInfo() {
return _ref7.apply(this, arguments);
}
return getInfo;
}()
}, {
key: "isOnline",
value: function () {
var _ref8 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee8() {
var data;
return regeneratorRuntime.wrap(function _callee8$(_context8) {
while (1) {
switch (_context8.prev = _context8.next) {
case 0:
_context8.next = 2;
return this._man._apiCall(this.sid, "GET");
case 2:
data = _context8.sent;
return _context8.abrupt("return", data && data.online && !("error" in data.online) ? true : false);
case 4:
case "end":
return _context8.stop();
}
}
}, _callee8, this);
}));
function isOnline() {
return _ref8.apply(this, arguments);
}
return isOnline;
}()
}, {
key: "getHistoricEvents",
value: function () {
var _ref9 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee9(params) {
var data;
return regeneratorRuntime.wrap(function _callee9$(_context9) {
while (1) {
switch (_context9.prev = _context9.next) {
case 0:
params["is_compressed"] = "true";
_context9.next = 3;
return this._man._apiCall("insight/" + this._man._oid + "/" + this.sid, "GET", params);
case 3:
data = _context9.sent;
_context9.next = 6;
return this._man._unzip(Buffer.from(data.events, "base64"));
case 6:
data.events = _context9.sent;
data.events = JSON.parse(data.events);
return _context9.abrupt("return", data);
case 9:
case "end":
return _context9.stop();
}
}
}, _callee9, this);
}));
function getHistoricEvents(_x10) {
return _ref9.apply(this, arguments);
}
return getHistoricEvents;
}()
}, {
key: "getHistoricEventsGenerator",
value: function getHistoricEventsGenerator(start, end, limit, eventType, isBackwards) {
return new EventsGenerator(this, start, end, limit, eventType, isBackwards);
}
}, {
key: "getSpecificEvent",
value: function () {
var _ref10 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee10(atom, before) {
var data;
return regeneratorRuntime.wrap(function _callee10$(_context10) {
while (1) {
switch (_context10.prev = _context10.next) {
case 0:
_context10.next = 2;
return this._man._apiCall("insight/" + this._man._oid + "/" + this.sid + "/" + atom, "GET", {
before: before
}, false, false, 30 * 1000);
case 2:
data = _context10.sent;
return _context10.abrupt("return", data);
case 4:
case "end":
return _context10.stop();
}
}
}, _callee10, this);
}));
function getSpecificEvent(_x11, _x12) {
return _ref10.apply(this, arguments);
}
return getSpecificEvent;
}()
}, {
key: "getHistoricOverview",
value: function () {
var _ref11 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee11(params) {
var data;
return regeneratorRuntime.wrap(function _callee11$(_context11) {
while (1) {
switch (_context11.prev = _context11.next) {
case 0:
_context11.next = 2;
return this._man._apiCall("insight/" + this._man._oid + "/" + this.sid + "/overview", "GET", params);
case 2:
data = _context11.sent;
return _context11.abrupt("return", data.overview);
case 4:
case "end":
return _context11.stop();
}
}
}, _callee11, this);
}));
function getHistoricOverview(_x13) {
return _ref11.apply(this, arguments);
}
return getHistoricOverview;
}()
}, {
key: "getTrafficStats",
value: function () {
var _ref12 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee12(start, end) {
return regeneratorRuntime.wrap(function _callee12$(_context12) {
while (1) {
switch (_context12.prev = _context12.next) {
case 0:
_context12.next = 2;
return this._man.getTrafficStats(start, end, this.sid);
case 2:
return _context12.abrupt("return", _context12.sent);
case 3:
case "end":
return _context12.stop();
}
}
}, _callee12, this);
}));
function getTrafficStats(_x14, _x15) {
return _ref12.apply(this, arguments);
}
return getTrafficStats;
}()
}]);
return Sensor;
}();
var EventsGenerator = function () {
function EventsGenerator(sensor, start, end, limit, eventType, isBackwards) {
_classCallCheck(this, EventsGenerator);
this._sensor = sensor;
this._start = start;
this._end = end;
this._limit = limit;
this._eventType = eventType;
this._cursor = "-";
this._ready = [];
this._isForwards = !isBackwards;
}
_createClass(EventsGenerator, [{
key: "next",
value: function () {
var _ref13 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee13() {
var params, data, events;
return regeneratorRuntime.wrap(function _callee13$(_context13) {
while (1) {
switch (_context13.prev = _context13.next) {
case 0:
if (!(this._ready.length !== 0)) {
_context13.next = 2;
break;
}
return _context13.abrupt("return", this._ready.shift());
case 2:
if (this._cursor) {
_context13.next = 4;
break;
}
return _context13.abrupt("return", null);
case 4:
params = {
is_compressed: "true",
cursor: this._cursor,
is_forward: this._isForwards
};
if (this._start) {
params["start"] = this._start;
}
if (this._end) {
params["end"] = this._end;
}
if (this._limit) {
params["limit"] = this._limit;
}
if (this._eventType) {
params["event_type"] = this._eventType;
}
case 9:
if (!this._cursor) {
_context13.next = 23;
break;
}
_context13.next = 12;
return this._sensor._man._apiCall("insight/" + this._sensor._man._oid + "/" + this._sensor.sid, "GET", params);
case 12:
data = _context13.sent;
_context13.next = 15;
return this._sensor._man._unzip(Buffer.from(data.events, "base64"));
case 15:
events = _context13.sent;
events = JSON.parse(events);
this._cursor = data.next_cursor;
this._ready = events;
if (!(this._ready.length !== 0)) {
_context13.next = 21;
break;
}
return _context13.abrupt("break", 23);
case 21:
_context13.next = 9;
break;
case 23:
return _context13.abrupt("return", this._ready.shift());
case 24:
case "end":
return _context13.stop();
}
}
}, _callee13, this);
}));
function next() {
return _ref13.apply(this, arguments);
}
return next;
}()
}]);
return EventsGenerator;
}();
module.exports = Sensor;