From 812fac40206bae96fd0016dfa078a7aa651c77e0 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Fri, 5 Feb 2021 13:30:26 +1100 Subject: [PATCH 1/2] fix max size of closed group back to 100 --- preload.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/preload.js b/preload.js index d59110f9d..3fa221dcb 100644 --- a/preload.js +++ b/preload.js @@ -85,7 +85,7 @@ window.CONSTANTS = new (function() { this.DEFAULT_PUBLIC_CHAT_URL = appConfig.get('defaultPublicChatServer'); this.MAX_LINKED_DEVICES = 1; this.MAX_CONNECTION_DURATION = 5000; - this.CLOSED_GROUP_SIZE_LIMIT = 20; + this.CLOSED_GROUP_SIZE_LIMIT = 100; // Number of seconds to turn on notifications after reconnect/start of app this.NOTIFICATION_ENABLE_TIMEOUT_SECONDS = 10; this.SESSION_ID_LENGTH = 66; From aede96b69b61f406adeacf6ca91303743c469078 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Mon, 8 Feb 2021 14:04:34 +1100 Subject: [PATCH 2/2] enable explicit group updates on the sending side --- preload.js | 2 - ts/receiver/closedGroups.ts | 3 + ts/session/group/index.ts | 131 ++---------------------------------- ts/window.d.ts | 1 - 4 files changed, 9 insertions(+), 128 deletions(-) diff --git a/preload.js b/preload.js index e3f6d3532..2cb0e9313 100644 --- a/preload.js +++ b/preload.js @@ -448,7 +448,6 @@ window.lokiFeatureFlags = { useFileOnionRequests: true, useFileOnionRequestsV2: true, // more compact encoding of files in response onionRequestHops: 3, - useExplicitGroupUpdatesSending: false, }; // eslint-disable-next-line no-extend-native,func-names @@ -482,7 +481,6 @@ if (config.environment.includes('test-integration')) { useOnionRequests: false, useFileOnionRequests: false, useOnionRequestsV2: false, - useExplicitGroupUpdatesSending: false, }; /* eslint-disable global-require, import/no-extraneous-dependencies */ window.sinon = require('sinon'); diff --git a/ts/receiver/closedGroups.ts b/ts/receiver/closedGroups.ts index 83bdf1fb2..5ec8ab946 100644 --- a/ts/receiver/closedGroups.ts +++ b/ts/receiver/closedGroups.ts @@ -473,6 +473,9 @@ async function performIfValid( } 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) { await handleClosedGroupNameChanged(envelope, groupUpdate, convo); diff --git a/ts/session/group/index.ts b/ts/session/group/index.ts index c576f69ec..1b0b45bd6 100644 --- a/ts/session/group/index.ts +++ b/ts/session/group/index.ts @@ -122,111 +122,6 @@ export async function initiateGroupUpdate( expireTimer: convo.get('expireTimer'), }; - if (!window.lokiFeatureFlags.useExplicitGroupUpdatesSending) { - // we still don't send any explicit group updates for now - only the receiving side is enabled - const dbMessageAdded = await addUpdateMessage(convo, diff, 'outgoing'); - window.getMessageController().register(dbMessageAdded.id, dbMessageAdded); - // Check preconditions - const hexEncryptionKeyPair = await Data.getLatestClosedGroupEncryptionKeyPair( - groupId - ); - if (!hexEncryptionKeyPair) { - throw new Error("Couldn't get key pair for closed group"); - } - - const encryptionKeyPair = ECKeyPair.fromHexKeyPair(hexEncryptionKeyPair); - const removedMembers = diff.leavingMembers || []; - const newMembers = diff.joiningMembers || []; // joining members - const wasAnyUserRemoved = removedMembers.length > 0; - const ourPrimary = await UserUtils.getOurNumber(); - const isUserLeaving = removedMembers.includes(ourPrimary.key); - const isCurrentUserAdmin = convo - .get('groupAdmins') - ?.includes(ourPrimary.key); - const expireTimerToShare = groupDetails.expireTimer || 0; - - const admins = convo.get('groupAdmins') || []; - if (removedMembers.includes(admins[0]) && newMembers.length !== 0) { - throw new Error( - "Can't remove admin from closed group without removing everyone." - ); // Error.invalidClosedGroupUpdate - } - - if (isUserLeaving && newMembers.length !== 0) { - if (removedMembers.length !== 1 || newMembers.length !== 0) { - throw new Error( - "Can't remove self and add or remove others simultaneously." - ); - } - } - - // Send the update to the group - const mainClosedGroupUpdate = new ClosedGroupUpdateMessage({ - timestamp: Date.now(), - groupId, - name: groupName, - members, - identifier: dbMessageAdded.id || uuid(), - expireTimer: expireTimerToShare, - }); - - if (isUserLeaving) { - window.log.info( - `We are leaving the group ${groupId}. Sending our leaving message.` - ); - // sent the message to the group and once done, remove everything related to this group - window.SwarmPolling.removePubkey(groupId); - await getMessageQueue().sendToGroup(mainClosedGroupUpdate, async () => { - window.log.info( - `Leaving message sent ${groupId}. Removing everything related to this group.` - ); - await Data.removeAllClosedGroupEncryptionKeyPairs(groupId); - }); - } else { - // Send the group update, and only once sent, generate and distribute a new encryption key pair if needed - await getMessageQueue().sendToGroup(mainClosedGroupUpdate, async () => { - if (wasAnyUserRemoved && isCurrentUserAdmin) { - // we send the new encryption key only to members already here before the update - const membersNotNew = members.filter(m => !newMembers.includes(m)); - window.log.info( - `Sending group update: A user was removed from ${groupId} and we are the admin. Generating and sending a new EncryptionKeyPair` - ); - - await generateAndSendNewEncryptionKeyPair(groupId, membersNotNew); - } - }); - - if (newMembers.length) { - // Send closed group update messages to any new members individually - const newClosedGroupUpdate = new ClosedGroupNewMessage({ - timestamp: Date.now(), - name: groupName, - groupId, - admins, - members, - keypair: encryptionKeyPair, - identifier: dbMessageAdded.id || uuid(), - expireTimer: expireTimerToShare, - }); - - const promises = newMembers.map(async m => { - await ConversationController.getInstance().getOrCreateAndWait( - m, - 'private' - ); - const memberPubKey = PubKey.cast(m); - await getMessageQueue().sendToPubKey( - memberPubKey, - newClosedGroupUpdate - ); - }); - await Promise.all(promises); - } - } - - return; - } - if (diff.newName?.length) { const nameOnlyDiff: GroupDiff = { newName: diff.newName }; const dbMessageName = await addUpdateMessage( @@ -452,26 +347,12 @@ export async function leaveClosedGroup(groupId: string) { window.getMessageController().register(dbMessage.id, dbMessage); const existingExpireTimer = convo.get('expireTimer') || 0; // Send the update to the group - let ourLeavingMessage; - - if (window.lokiFeatureFlags.useExplicitGroupUpdatesSending) { - ourLeavingMessage = new ClosedGroupMemberLeftMessage({ - timestamp: Date.now(), - groupId, - identifier: dbMessage.id, - expireTimer: existingExpireTimer, - }); - } else { - const ourPubkey = await UserUtils.getOurNumber(); - ourLeavingMessage = new ClosedGroupUpdateMessage({ - timestamp: Date.now(), - groupId, - identifier: dbMessage.id, - expireTimer: existingExpireTimer, - name: convo.get('name'), - members: convo.get('members').filter(m => m !== ourPubkey.key), - }); - } + const ourLeavingMessage = new ClosedGroupMemberLeftMessage({ + timestamp: Date.now(), + groupId, + identifier: dbMessage.id, + expireTimer: existingExpireTimer, + }); window.log.info( `We are leaving the group ${groupId}. Sending our leaving message.` diff --git a/ts/window.d.ts b/ts/window.d.ts index 75c3cc702..6bd056219 100644 --- a/ts/window.d.ts +++ b/ts/window.d.ts @@ -63,7 +63,6 @@ declare global { useOnionRequestsV2: boolean; useFileOnionRequests: boolean; useFileOnionRequestsV2: boolean; - useExplicitGroupUpdatesSending: boolean; onionRequestHops: number; }; lokiFileServerAPI: LokiFileServerInstance;