From c5a4cf674dd8b9f4e5d46f925f56981225c38af3 Mon Sep 17 00:00:00 2001
From: Audric Ackermann <audric@loki.network>
Date: Wed, 5 May 2021 15:49:44 +1000
Subject: [PATCH] remove non explicit group updates support

---
 ts/receiver/closedGroups.ts | 96 ++++++++-----------------------------
 1 file changed, 21 insertions(+), 75 deletions(-)

diff --git a/ts/receiver/closedGroups.ts b/ts/receiver/closedGroups.ts
index 312462def..de27b2d01 100644
--- a/ts/receiver/closedGroups.ts
+++ b/ts/receiver/closedGroups.ts
@@ -54,25 +54,38 @@ export async function handleClosedGroupControlMessage(
     await removeFromCache(envelope);
     return;
   }
+
+  if (type === Type.UPDATE) {
+    window.log.error('ClosedGroup: Got a non explicit group update. dropping it ', type);
+    await removeFromCache(envelope);
+    return;
+  }
+
   // We drop New closed group message from our other devices, as they will come as ConfigurationMessage instead
   if (type === Type.ENCRYPTION_KEY_PAIR) {
     const isComingFromGroupPubkey =
       envelope.type === SignalService.Envelope.Type.CLOSED_GROUP_CIPHERTEXT;
     await handleClosedGroupEncryptionKeyPair(envelope, groupUpdate, isComingFromGroupPubkey);
-  } else if (type === Type.NEW) {
+    return;
+  }
+  if (type === Type.NEW) {
     await handleNewClosedGroup(envelope, groupUpdate);
-  } else if (
+    return;
+  }
+
+  if (
     type === Type.NAME_CHANGE ||
     type === Type.MEMBERS_REMOVED ||
     type === Type.MEMBERS_ADDED ||
     type === Type.MEMBER_LEFT ||
-    type === Type.ENCRYPTION_KEY_PAIR_REQUEST ||
-    type === Type.UPDATE
+    type === Type.ENCRYPTION_KEY_PAIR_REQUEST
   ) {
     await performIfValid(envelope, groupUpdate);
-  } else {
-    window.log.error('Unknown group update type: ', type);
+    return;
   }
+
+  window.log.error('Unknown group update type: ', type);
+  await removeFromCache(envelope);
 }
 
 function sanityCheckNewGroup(
@@ -267,69 +280,6 @@ export async function markGroupAsLeftOrKicked(
   SwarmPolling.getInstance().removePubkey(groupPublicKey);
 }
 
-async function handleUpdateClosedGroup(
-  envelope: EnvelopePlus,
-  groupUpdate: SignalService.DataMessage.ClosedGroupControlMessage,
-  convo: ConversationModel
-) {
-  const { name, members: membersBinary } = groupUpdate;
-  const { log } = window;
-
-  // for a closed group update message, the envelope.source is the groupPublicKey
-  const groupPublicKey = envelope.source;
-
-  const curAdmins = convo.get('groupAdmins');
-
-  // NOTE: admins cannot change with closed groups
-  const members = membersBinary.map(toHex);
-  const diff = ClosedGroup.buildGroupDiff(convo, { name, members });
-
-  // Check whether we are still in the group
-  const ourNumber = UserUtils.getOurPubKeyFromCache();
-  const wasCurrentUserRemoved = !members.includes(ourNumber.key);
-  const isCurrentUserAdmin = curAdmins?.includes(ourNumber.key);
-
-  if (wasCurrentUserRemoved) {
-    if (isCurrentUserAdmin) {
-      // cannot remove the admin from a closed group
-      log.info('Dropping message trying to remove the admin (us) from a closed group');
-      await removeFromCache(envelope);
-      return;
-    }
-    await markGroupAsLeftOrKicked(groupPublicKey, convo, true);
-  } else {
-    if (convo.get('isKickedFromGroup')) {
-      // Enable typing:
-      convo.set('isKickedFromGroup', false);
-      convo.set('left', false);
-      // Subscribe to this group id
-      SwarmPolling.getInstance().addGroupId(new PubKey(groupPublicKey));
-    }
-  }
-
-  // Generate and distribute a new encryption key pair if needed
-  const wasAnyUserRemoved = diff.leavingMembers && diff.leavingMembers.length > 0;
-  if (wasAnyUserRemoved && isCurrentUserAdmin) {
-    window.log.info(
-      'Handling group update: A user was removed and we are the admin. Generating and sending a new ECKeyPair'
-    );
-    await ClosedGroup.generateAndSendNewEncryptionKeyPair(groupPublicKey, members);
-  }
-
-  // Only add update message if we have something to show
-  if (diff.joiningMembers?.length || diff.leavingMembers?.length || diff.newName) {
-    await ClosedGroup.addUpdateMessage(convo, diff, 'incoming', _.toNumber(envelope.timestamp));
-  }
-
-  convo.set('name', name);
-  convo.set('members', members);
-
-  await convo.commit();
-  convo.updateLastMessage();
-
-  await removeFromCache(envelope);
-}
-
 /**
  * This function is called when we get a message with the new encryption keypair for a closed group.
  * In this message, we have n-times the same keypair encoded with n being the number of current members.
@@ -501,11 +451,7 @@ async function performIfValid(
     await removeFromCache(envelope);
     return;
   }
-
-  if (groupUpdate.type === Type.UPDATE) {
-    window.log.warn('Received a groupUpdate non explicit. This should not happen anymore.');
-    await handleUpdateClosedGroup(envelope, groupUpdate, convo);
-  } else if (groupUpdate.type === Type.NAME_CHANGE) {
+  if (groupUpdate.type === Type.NAME_CHANGE) {
     await handleClosedGroupNameChanged(envelope, groupUpdate, convo);
   } else if (groupUpdate.type === Type.MEMBERS_ADDED) {
     await handleClosedGroupMembersAdded(envelope, groupUpdate, convo);
@@ -574,12 +520,12 @@ async function handleClosedGroupMembersAdded(
     return;
   }
 
+  // this is to avoid a race condition where a user gets removed and added back while the admin is offline
   if (await areWeAdmin(convo)) {
     await sendLatestKeyPairToUsers(convo, convo.id, membersNotAlreadyPresent);
   }
 
   const members = [...oldMembers, ...membersNotAlreadyPresent];
-  // Only add update message if we have something to show
 
   const groupDiff: ClosedGroup.GroupDiff = {
     joiningMembers: membersNotAlreadyPresent,