UNPKG

limacharlie

Version:

An API for limacharlie.io, a cloud hosted endpoint detection and response platform.

630 lines (538 loc) 18.6 kB
"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;