UNPKG

@signalapp/mock-server

Version:
97 lines (96 loc) 3.75 kB
"use strict"; // Copyright 2022 Signal Messenger, LLC // SPDX-License-Identifier: AGPL-3.0-only var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.Group = void 0; const assert_1 = __importDefault(require("assert")); const zkgroup_1 = require("@signalapp/libsignal-client/zkgroup"); const libsignal_client_1 = require("@signalapp/libsignal-client"); const compiled_1 = require("../../protos/compiled"); const group_1 = require("../data/group"); const AccessRequired = compiled_1.signalservice.AccessControl.AccessRequired; function encryptBlob(cipher, proto) { const plaintext = compiled_1.signalservice.GroupAttributeBlob.encode(proto).finish(); return cipher.encryptBlob(Buffer.from(plaintext)); } function decryptBlob(cipher, ciphertext) { const plaintext = cipher.decryptBlob(Buffer.from(ciphertext)); return compiled_1.signalservice.GroupAttributeBlob.decode(plaintext); } class Group extends group_1.Group { secretParams; title; constructor({ secretParams, groupState }) { super(); assert_1.default.ok(groupState.title, 'Group must have a title blob'); this.secretParams = secretParams; const cipher = new zkgroup_1.ClientZkGroupCipher(secretParams); this.title = decryptBlob(cipher, groupState.title)?.title ?? ''; this.privPublicParams = this.secretParams.getPublicParams(); // Build group log this.privChanges = { groupChanges: [ { groupState, }, ], }; } static fromConfig({ secretParams, title, members, }) { const cipher = new zkgroup_1.ClientZkGroupCipher(secretParams); const groupState = { publicKey: secretParams.getPublicParams().serialize(), version: 0, title: encryptBlob(cipher, { title }), // TODO(indutny): make it configurable accessControl: { attributes: AccessRequired.MEMBER, members: AccessRequired.MEMBER, addFromInviteLink: AccessRequired.UNSATISFIABLE, }, members: members.map(({ presentation }) => { return { role: compiled_1.signalservice.Member.Role.ADMINISTRATOR, presentation: presentation.serialize(), }; }), }; return new Group({ secretParams, groupState, }); } get masterKey() { return this.secretParams.getMasterKey().serialize(); } toContext() { const masterKey = this.masterKey; return { masterKey, revision: this.revision, }; } encryptServiceId(serviceId) { const cipher = new zkgroup_1.ClientZkGroupCipher(this.secretParams); return cipher .encryptServiceId(libsignal_client_1.ServiceId.parseFromServiceIdString(serviceId)) .serialize(); } decryptServiceId(ciphertext) { const cipher = new zkgroup_1.ClientZkGroupCipher(this.secretParams); const uuidCiphertext = new zkgroup_1.UuidCiphertext(Buffer.from(ciphertext)); return cipher .decryptServiceId(uuidCiphertext) .getServiceIdString(); } getMemberByServiceId(serviceId) { return this.getMember(new zkgroup_1.UuidCiphertext(this.encryptServiceId(serviceId))); } getPendingMemberByServiceId(serviceId) { return this.getPendingMember(new zkgroup_1.UuidCiphertext(this.encryptServiceId(serviceId))); } } exports.Group = Group;