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
JavaScript
;
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