From 65055fd47547da94e2fdc866e4dbfc1613fc7da6 Mon Sep 17 00:00:00 2001 From: trevor-signal <131492920+trevor-signal@users.noreply.github.com> Date: Mon, 27 Jan 2025 14:53:43 -0500 Subject: [PATCH] Roundtrip group.blocked state --- protos/Backups.proto | 1 + ts/services/backups/export.ts | 3 + ts/services/backups/import.ts | 3 + ts/test-electron/backup/conversations_test.ts | 69 +++++++++++++++++++ 4 files changed, 76 insertions(+) create mode 100644 ts/test-electron/backup/conversations_test.ts diff --git a/protos/Backups.proto b/protos/Backups.proto index 2977db9a3..27c958437 100644 --- a/protos/Backups.proto +++ b/protos/Backups.proto @@ -188,6 +188,7 @@ message Group { bool hideStory = 3; StorySendMode storySendMode = 4; GroupSnapshot snapshot = 5; + bool blocked = 6; // These are simply plaintext copies of the groups proto from Groups.proto. // They should be kept completely in-sync with Groups.proto. diff --git a/ts/services/backups/export.ts b/ts/services/backups/export.ts index da627d01b..302d7d20b 100644 --- a/ts/services/backups/export.ts +++ b/ts/services/backups/export.ts @@ -910,6 +910,9 @@ export class BackupExportStream extends Readable { whitelisted: convo.profileSharing, hideStory: convo.hideStory === true, storySendMode, + blocked: convo.groupId + ? window.storage.blocked.isGroupBlocked(convo.groupId) + : false, snapshot: { title: { title: convo.name?.trim() ?? '', diff --git a/ts/services/backups/import.ts b/ts/services/backups/import.ts index fc5fb3f6e..d71fb338d 100644 --- a/ts/services/backups/import.ts +++ b/ts/services/backups/import.ts @@ -1116,6 +1116,9 @@ export class BackupImportStream extends Writable { if (avatarUrl) { this.#pendingGroupAvatars.set(attrs.id, avatarUrl); } + if (group.blocked) { + await window.storage.blocked.addBlockedGroup(groupId); + } return attrs; } diff --git a/ts/test-electron/backup/conversations_test.ts b/ts/test-electron/backup/conversations_test.ts new file mode 100644 index 000000000..44d357fee --- /dev/null +++ b/ts/test-electron/backup/conversations_test.ts @@ -0,0 +1,69 @@ +// Copyright 2024 Signal Messenger, LLC +// SPDX-License-Identifier: AGPL-3.0-only + +import { assert } from 'chai'; +import { getRandomBytes } from '../../Crypto'; +import * as Bytes from '../../Bytes'; +import { setupBasics, symmetricRoundtripHarness } from './helpers'; +import { loadAllAndReinitializeRedux } from '../../services/allLoaders'; +import { deriveGroupID, deriveGroupSecretParams } from '../../util/zkgroup'; +import { DataWriter } from '../../sql/Client'; + +function getGroupTestInfo() { + const masterKey = getRandomBytes(32); + const secretParams = deriveGroupSecretParams(masterKey); + const groupId = Bytes.toBase64(deriveGroupID(secretParams)); + + return { masterKey: Bytes.toBase64(masterKey), secretParams, groupId }; +} + +describe('backup/conversations', () => { + beforeEach(async () => { + await DataWriter._removeAllMessages(); + await DataWriter._removeAllConversations(); + window.storage.reset(); + + await setupBasics(); + + await loadAllAndReinitializeRedux(); + }); + + it('roundtrips block state on group conversations', async () => { + const blockedGroupInfo = getGroupTestInfo(); + await window.ConversationController.getOrCreateAndWait( + blockedGroupInfo.groupId, + 'group', + { + groupId: blockedGroupInfo.groupId, + groupVersion: 2, + masterKey: blockedGroupInfo.masterKey, + name: 'Rock Enthusiasts', + } + ); + + const unblockedGroupInfo = getGroupTestInfo(); + await window.ConversationController.getOrCreateAndWait( + unblockedGroupInfo.groupId, + 'group', + { + groupId: unblockedGroupInfo.groupId, + groupVersion: 2, + masterKey: unblockedGroupInfo.masterKey, + name: 'Rock Enthusiasts 2', + } + ); + + await window.storage.blocked.addBlockedGroup(blockedGroupInfo.groupId); + + await symmetricRoundtripHarness([]); + + const blockedGroupAfter = window.ConversationController.get( + blockedGroupInfo.groupId + ); + assert.isTrue(blockedGroupAfter?.isBlocked()); + const unblockedGroupAfter = window.ConversationController.get( + unblockedGroupInfo.groupId + ); + assert.isFalse(unblockedGroupAfter?.isBlocked()); + }); +});