Skip to content

Commit

Permalink
Don't send messages to blocked group members
Browse files Browse the repository at this point in the history
  • Loading branch information
EvanHahn-Signal committed Dec 1, 2020
1 parent c729030 commit 688938b
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 16 deletions.
36 changes: 27 additions & 9 deletions js/models/blockedNumbers.js
Expand Up @@ -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;
}
Expand All @@ -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;
}
Expand All @@ -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;
}
Expand All @@ -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;
}
Expand All @@ -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;
}
Expand All @@ -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;
}
Expand Down
19 changes: 12 additions & 7 deletions ts/textsecure/SendMessage.ts
Expand Up @@ -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;
Expand All @@ -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,
Expand Down
3 changes: 3 additions & 0 deletions ts/window.d.ts
Expand Up @@ -171,6 +171,9 @@ declare global {
<T = any>(key: string): T | undefined;
<T>(key: string, defaultValue: T): T;
};
getBlockedGroups: () => Array<string>;
getBlockedNumbers: () => Array<string>;
getBlockedUuids: () => Array<string>;
getItemsState: () => WhatIsThis;
isBlocked: (number: string) => boolean;
isGroupBlocked: (group: unknown) => boolean;
Expand Down

0 comments on commit 688938b

Please sign in to comment.