UNPKG

s-bit-agent

Version:

s.BitAgent is a simple Bitwarden CLI wrapper which provides a SSH2 Key Agent solution for Bitwarden.

76 lines 3.82 kB
"use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.ClientService = void 0; const common_1 = require("@nestjs/common"); const log_service_1 = require("../shared/log.service"); const session_service_1 = require("../bitwarden/session.service"); const agent_service_1 = require("./agent.service"); const message_1 = require("./types/message"); const handler_1 = require("./types/handler"); const node_ipc_1 = require("node-ipc"); const fs = require("fs"); let ClientService = class ClientService { constructor(logService, sessionService, agentService) { this.logService = logService; this.sessionService = sessionService; this.agentService = agentService; } async requestSession(reason) { try { if (this.agentService.running || !fs.existsSync(this.agentService.file)) throw new Error(); const res = await this.sendMessage(new message_1.RequestSession(reason)); if (res.type !== message_1.SBitAgentMessageType.RESPONSE_SESSION) throw new Error(); } catch (ignored) { } return this.sessionService.getSession(reason); } async sendMessage(message) { const size = Buffer.alloc(4); const type = Buffer.from([handler_1.IcpMessageType.S_BIT_AGENT_EXCHANGE]); const data = Buffer.from(JSON.stringify(message)); size.writeUInt32BE(type.length + data.length, 0); const buffer = Buffer.concat([size, type, data]); const clientId = `client-${Math.random().toString(36).substring(7)}`; let res; await new Promise((resolve, reject) => { node_ipc_1.default.connectTo(clientId, this.agentService.file, () => { node_ipc_1.default.of[clientId].on('connect', () => { this.logService.info('Connected to server'); node_ipc_1.default.of[clientId].emit(buffer); this.logService.info('Sent', message.type); }); node_ipc_1.default.of[clientId].on('data', async (buf) => { const size = buf.readUInt32BE(0); if (size < 6) return reject('Invalid response size'); const type = buf.readUInt8(4); if (type !== handler_1.IcpMessageType.S_BIT_AGENT_EXCHANGE) return reject('Invalid response type'); const data = buf.toString('utf-8', 5, size + 4); resolve(JSON.parse(data)); }); }); }).then((data) => (res = data)) .finally(() => node_ipc_1.default.disconnect(clientId)); return res; } }; exports.ClientService = ClientService; exports.ClientService = ClientService = __decorate([ (0, common_1.Injectable)(), __metadata("design:paramtypes", [log_service_1.LogService, session_service_1.SessionService, agent_service_1.AgentService]) ], ClientService); //# sourceMappingURL=client.service.js.map