Send to just-removed folks in groupv2 removal operations

This commit is contained in:
Scott Nonnenberg 2021-03-24 14:28:55 -07:00 committed by GitHub
parent 7c4e4c97e7
commit 2d8f237b76
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 50 additions and 17 deletions

View file

@ -1163,11 +1163,13 @@ export async function uploadGroupChange({
export async function modifyGroupV2({ export async function modifyGroupV2({
conversation, conversation,
createGroupChange, createGroupChange,
extraConversationsForSend,
inviteLinkPassword, inviteLinkPassword,
name, name,
}: { }: {
conversation: ConversationModel; conversation: ConversationModel;
createGroupChange: () => Promise<GroupChangeClass.Actions | undefined>; createGroupChange: () => Promise<GroupChangeClass.Actions | undefined>;
extraConversationsForSend?: Array<string>;
inviteLinkPassword?: string; inviteLinkPassword?: string;
name: string; name: string;
}): Promise<void> { }): Promise<void> {
@ -1248,6 +1250,7 @@ export async function modifyGroupV2({
groupV2: conversation.getGroupV2Info({ groupV2: conversation.getGroupV2Info({
groupChange: groupChangeBuffer, groupChange: groupChangeBuffer,
includePendingMembers: true, includePendingMembers: true,
extraConversationsForSend,
}), }),
timestamp, timestamp,
profileKey, profileKey,

View file

@ -42,6 +42,7 @@ import { GroupChangeClass } from '../textsecure.d';
import { BodyRangesType } from '../types/Util'; import { BodyRangesType } from '../types/Util';
import { getTextWithMentions } from '../util'; import { getTextWithMentions } from '../util';
import { migrateColor } from '../util/migrateColor'; import { migrateColor } from '../util/migrateColor';
import { isNotNil } from '../util/isNotNil';
/* eslint-disable more/no-then */ /* eslint-disable more/no-then */
window.Whisper = window.Whisper || {}; window.Whisper = window.Whisper || {};
@ -722,17 +723,20 @@ export class ConversationModel extends window.Backbone.Model<
} }
async modifyGroupV2({ async modifyGroupV2({
name,
inviteLinkPassword,
createGroupChange, createGroupChange,
extraConversationsForSend,
inviteLinkPassword,
name,
}: { }: {
name: string;
inviteLinkPassword?: string;
createGroupChange: () => Promise<GroupChangeClass.Actions | undefined>; createGroupChange: () => Promise<GroupChangeClass.Actions | undefined>;
extraConversationsForSend?: Array<string>;
inviteLinkPassword?: string;
name: string;
}): Promise<void> { }): Promise<void> {
await window.Signal.Groups.modifyGroupV2({ await window.Signal.Groups.modifyGroupV2({
createGroupChange,
conversation: this, conversation: this,
createGroupChange,
extraConversationsForSend,
inviteLinkPassword, inviteLinkPassword,
name, name,
}); });
@ -1011,11 +1015,15 @@ export class ConversationModel extends window.Backbone.Model<
window.Signal.Data.updateConversation(this.attributes); window.Signal.Data.updateConversation(this.attributes);
} }
getGroupV2Info( getGroupV2Info({
options: { groupChange?: ArrayBuffer; includePendingMembers?: boolean } = {} groupChange,
): GroupV2InfoType | undefined { includePendingMembers,
const { groupChange, includePendingMembers } = options; extraConversationsForSend,
}: {
groupChange?: ArrayBuffer;
includePendingMembers?: boolean;
extraConversationsForSend?: Array<string>;
} = {}): GroupV2InfoType | undefined {
if (this.isPrivate() || !this.isGroupV2()) { if (this.isPrivate() || !this.isGroupV2()) {
return undefined; return undefined;
} }
@ -1028,6 +1036,7 @@ export class ConversationModel extends window.Backbone.Model<
revision: this.get('revision')!, revision: this.get('revision')!,
members: this.getRecipients({ members: this.getRecipients({
includePendingMembers, includePendingMembers,
extraConversationsForSend,
}), }),
groupChange, groupChange,
}; };
@ -1833,17 +1842,20 @@ export class ConversationModel extends window.Backbone.Model<
await this.modifyGroupV2({ await this.modifyGroupV2({
name: 'removePendingMember', name: 'removePendingMember',
createGroupChange: () => this.removePendingMember(conversationIds), createGroupChange: () => this.removePendingMember(conversationIds),
extraConversationsForSend: conversationIds,
}); });
} else if (this.isMemberRequestingToJoin(conversationId)) { } else if (this.isMemberRequestingToJoin(conversationId)) {
await this.modifyGroupV2({ await this.modifyGroupV2({
name: 'denyPendingApprovalRequest', name: 'denyPendingApprovalRequest',
createGroupChange: () => createGroupChange: () =>
this.denyPendingApprovalRequest(conversationId), this.denyPendingApprovalRequest(conversationId),
extraConversationsForSend: [conversationId],
}); });
} else if (this.isMemberPending(conversationId)) { } else if (this.isMemberPending(conversationId)) {
await this.modifyGroupV2({ await this.modifyGroupV2({
name: 'removePendingMember', name: 'removePendingMember',
createGroupChange: () => this.removePendingMember([conversationId]), createGroupChange: () => this.removePendingMember([conversationId]),
extraConversationsForSend: [conversationId],
}); });
} }
} }
@ -1854,16 +1866,19 @@ export class ConversationModel extends window.Backbone.Model<
name: 'denyPendingApprovalRequest', name: 'denyPendingApprovalRequest',
createGroupChange: () => createGroupChange: () =>
this.denyPendingApprovalRequest(conversationId), this.denyPendingApprovalRequest(conversationId),
extraConversationsForSend: [conversationId],
}); });
} else if (this.isGroupV2() && this.isMemberPending(conversationId)) { } else if (this.isGroupV2() && this.isMemberPending(conversationId)) {
await this.modifyGroupV2({ await this.modifyGroupV2({
name: 'removePendingMember', name: 'removePendingMember',
createGroupChange: () => this.removePendingMember([conversationId]), createGroupChange: () => this.removePendingMember([conversationId]),
extraConversationsForSend: [conversationId],
}); });
} else if (this.isGroupV2() && this.isMember(conversationId)) { } else if (this.isGroupV2() && this.isMember(conversationId)) {
await this.modifyGroupV2({ await this.modifyGroupV2({
name: 'removeFromGroup', name: 'removeFromGroup',
createGroupChange: () => this.removeMember(conversationId), createGroupChange: () => this.removeMember(conversationId),
extraConversationsForSend: [conversationId],
}); });
} else { } else {
window.log.error( window.log.error(
@ -2835,16 +2850,31 @@ export class ConversationModel extends window.Backbone.Model<
return members.map(member => member.id); return members.map(member => member.id);
} }
getRecipients( getRecipients({
options: { includePendingMembers?: boolean } = {} includePendingMembers,
): Array<string> { extraConversationsForSend,
const { includePendingMembers } = options; }: {
includePendingMembers?: boolean;
extraConversationsForSend?: Array<string>;
} = {}): Array<string> {
const members = this.getMembers({ includePendingMembers }); const members = this.getMembers({ includePendingMembers });
// Eliminate our // There are cases where we need to send to someone we just removed from the group, to
// let them know that we removed them. In that case, we need to send to more than
// are currently in the group.
const extraConversations = extraConversationsForSend
? extraConversationsForSend
.map(id => window.ConversationController.get(id))
.filter(isNotNil)
: [];
const unique = extraConversations.length
? window._.unique([...members, ...extraConversations])
: members;
// Eliminate ourself
return window._.compact( return window._.compact(
members.map(member => (member.isMe() ? null : member.getSendTarget())) unique.map(member => (member.isMe() ? null : member.getSendTarget()))
); );
} }