From 688938b5a167ee07d040623f15d7df7821117034 Mon Sep 17 00:00:00 2001 From: Evan Hahn <69474926+EvanHahn-Signal@users.noreply.github.com> Date: Tue, 1 Dec 2020 11:04:14 -0600 Subject: [PATCH] Don't send messages to blocked group members --- js/models/blockedNumbers.js | 36 +++++++++++++++++++++++++++--------- ts/textsecure/SendMessage.ts | 19 ++++++++++++------- ts/window.d.ts | 3 +++ 3 files changed, 42 insertions(+), 16 deletions(-) diff --git a/js/models/blockedNumbers.js b/js/models/blockedNumbers.js index a06b0ecca..852564663 100644 --- a/js/models/blockedNumbers.js +++ b/js/models/blockedNumbers.js @@ -9,13 +9,29 @@ const BLOCKED_UUIDS_ID = 'blocked-uuids'; const BLOCKED_GROUPS_ID = 'blocked-groups'; + function getArray(key) { + const result = storage.get(key, []); + + if (!Array.isArray(result)) { + window.log.error( + `Expected storage key ${JSON.stringify( + key + )} to contain an array or nothing` + ); + return []; + } + + return result; + } + + storage.getBlockedNumbers = () => getArray(BLOCKED_NUMBERS_ID); storage.isBlocked = number => { - const numbers = storage.get(BLOCKED_NUMBERS_ID, []); + const numbers = storage.getBlockedNumbers(); return _.include(numbers, number); }; storage.addBlockedNumber = number => { - const numbers = storage.get(BLOCKED_NUMBERS_ID, []); + const numbers = storage.getBlockedNumbers(); if (_.include(numbers, number)) { return; } @@ -24,7 +40,7 @@ storage.put(BLOCKED_NUMBERS_ID, numbers.concat(number)); }; storage.removeBlockedNumber = number => { - const numbers = storage.get(BLOCKED_NUMBERS_ID, []); + const numbers = storage.getBlockedNumbers(); if (!_.include(numbers, number)) { return; } @@ -33,13 +49,14 @@ storage.put(BLOCKED_NUMBERS_ID, _.without(numbers, number)); }; + storage.getBlockedUuids = () => getArray(BLOCKED_UUIDS_ID); storage.isUuidBlocked = uuid => { - const uuids = storage.get(BLOCKED_UUIDS_ID, []); + const uuids = storage.getBlockedUuids(); return _.include(uuids, uuid); }; storage.addBlockedUuid = uuid => { - const uuids = storage.get(BLOCKED_UUIDS_ID, []); + const uuids = storage.getBlockedUuids(); if (_.include(uuids, uuid)) { return; } @@ -48,7 +65,7 @@ storage.put(BLOCKED_UUIDS_ID, uuids.concat(uuid)); }; storage.removeBlockedUuid = uuid => { - const numbers = storage.get(BLOCKED_UUIDS_ID, []); + const numbers = storage.getBlockedUuids(); if (!_.include(numbers, uuid)) { return; } @@ -57,13 +74,14 @@ storage.put(BLOCKED_UUIDS_ID, _.without(numbers, uuid)); }; + storage.getBlockedGroups = () => getArray(BLOCKED_GROUPS_ID); storage.isGroupBlocked = groupId => { - const groupIds = storage.get(BLOCKED_GROUPS_ID, []); + const groupIds = storage.getBlockedGroups(); return _.include(groupIds, groupId); }; storage.addBlockedGroup = groupId => { - const groupIds = storage.get(BLOCKED_GROUPS_ID, []); + const groupIds = storage.getBlockedGroups(); if (_.include(groupIds, groupId)) { return; } @@ -72,7 +90,7 @@ storage.put(BLOCKED_GROUPS_ID, groupIds.concat(groupId)); }; storage.removeBlockedGroup = groupId => { - const groupIds = storage.get(BLOCKED_GROUPS_ID, []); + const groupIds = storage.getBlockedGroups(); if (!_.include(groupIds, groupId)) { return; } diff --git a/ts/textsecure/SendMessage.ts b/ts/textsecure/SendMessage.ts index 983386ae0..13bd0593d 100644 --- a/ts/textsecure/SendMessage.ts +++ b/ts/textsecure/SendMessage.ts @@ -1655,12 +1655,8 @@ export default class MessageSender { const myE164 = window.textsecure.storage.user.getNumber(); const myUuid = window.textsecure.storage.user.getUuid(); - // prettier-ignore - const recipients = groupV2 - ? groupV2.members - : groupV1 - ? groupV1.members - : []; + + const groupMembers = groupV2?.members || groupV1?.members || []; // We should always have a UUID but have this check just in case we don't. let isNotMe: (recipient: string) => boolean; @@ -1670,8 +1666,17 @@ export default class MessageSender { isNotMe = r => r !== myE164; } + const blockedIdentifiers = new Set([ + ...window.storage.getBlockedUuids(), + ...window.storage.getBlockedNumbers(), + ]); + + const recipients = groupMembers.filter( + recipient => isNotMe(recipient) && !blockedIdentifiers.has(recipient) + ); + const attrs = { - recipients: recipients.filter(isNotMe), + recipients, body: messageText, timestamp, attachments, diff --git a/ts/window.d.ts b/ts/window.d.ts index e60e37c3c..ed6a5551c 100644 --- a/ts/window.d.ts +++ b/ts/window.d.ts @@ -171,6 +171,9 @@ declare global { (key: string): T | undefined; (key: string, defaultValue: T): T; }; + getBlockedGroups: () => Array; + getBlockedNumbers: () => Array; + getBlockedUuids: () => Array; getItemsState: () => WhatIsThis; isBlocked: (number: string) => boolean; isGroupBlocked: (group: unknown) => boolean;