From 437ef2d3a789a7243be70e9af6649627ffedfbd0 Mon Sep 17 00:00:00 2001 From: Fedor Indutny <79877362+indutny-signal@users.noreply.github.com> Date: Wed, 26 Jan 2022 16:02:23 -0800 Subject: [PATCH] Fetch joinedAtVersion before change log fetch for new groups --- ts/groups.ts | 42 +----------------------------------- ts/textsecure/SendMessage.ts | 2 +- ts/textsecure/WebAPI.ts | 21 ++++++++++++++++-- 3 files changed, 21 insertions(+), 44 deletions(-) diff --git a/ts/groups.ts b/ts/groups.ts index 0c07114eca..7f578ca292 100644 --- a/ts/groups.ts +++ b/ts/groups.ts @@ -2946,11 +2946,6 @@ async function getGroupUpdates({ group, serverPublicParamsBase64, newRevision, - - // If we just linked and this is a group where we have been a member - // from the beggining - applying all changes since the start is the best - // case scenario. - fallbackRevision: 0, }); return result; @@ -2973,36 +2968,6 @@ async function getGroupUpdates({ throw error; } } - - // Fetch of logs starting from the revision 0 failed, so we probably were - // just invited to the group. Try fetching logs from the same revision as in - // this message. - if (isFirstFetch) { - try { - const result = await updateGroupViaLogs({ - group, - serverPublicParamsBase64, - newRevision, - fallbackRevision: newRevision, - }); - - return result; - } catch (error) { - if (error.code === TEMPORAL_AUTH_REJECTED_CODE) { - // We will fail over to the updateGroupViaState call below - log.info( - `getGroupUpdates/${logId}: Temporal credential failure, now fetching full state` - ); - } else if (error.code === GROUP_ACCESS_DENIED_CODE) { - // We will fail over to the updateGroupViaState call below - log.info( - `getGroupUpdates/${logId}: Log access denied, now fetching full state` - ); - } else { - throw error; - } - } - } } if (window.GV2_ENABLE_STATE_PROCESSING) { @@ -3120,11 +3085,9 @@ async function updateGroupViaSingleChange({ async function updateGroupViaLogs({ group, serverPublicParamsBase64, - fallbackRevision, newRevision, }: { group: ConversationAttributesType; - fallbackRevision: number; newRevision: number; serverPublicParamsBase64: string; }): Promise { @@ -3137,7 +3100,6 @@ async function updateGroupViaLogs({ const groupCredentials = getCredentialsForToday(data); const deltaOptions = { group, - fallbackRevision, newRevision, serverPublicParamsBase64, authCredentialBase64: groupCredentials.today.credential, @@ -3261,13 +3223,11 @@ function getGroupCredentials({ async function getGroupDelta({ group, newRevision, - fallbackRevision, serverPublicParamsBase64, authCredentialBase64, }: { group: ConversationAttributesType; newRevision: number; - fallbackRevision: number; serverPublicParamsBase64: string; authCredentialBase64: string; }): Promise { @@ -3292,7 +3252,7 @@ async function getGroupDelta({ const currentRevision = group.revision; let revisionToFetch = isNumber(currentRevision) ? currentRevision + 1 - : fallbackRevision; + : undefined; let response; const changes: Array = []; diff --git a/ts/textsecure/SendMessage.ts b/ts/textsecure/SendMessage.ts index ce8e489a4e..5c13a8b2c7 100644 --- a/ts/textsecure/SendMessage.ts +++ b/ts/textsecure/SendMessage.ts @@ -2134,7 +2134,7 @@ export default class MessageSender { } async getGroupLog( - startVersion: number, + startVersion: number | undefined, options: Readonly ): Promise { return this.server.getGroupLog(startVersion, options); diff --git a/ts/textsecure/WebAPI.ts b/ts/textsecure/WebAPI.ts index 299c99563d..b4a1057215 100644 --- a/ts/textsecure/WebAPI.ts +++ b/ts/textsecure/WebAPI.ts @@ -538,6 +538,7 @@ const URL_CALLS = { getIceServers: 'v1/accounts/turn', getStickerPackUpload: 'v1/sticker/pack/form', groupLog: 'v1/groups/logs', + groupJoinedAtVersion: 'v1/groups/joined_at_version', groups: 'v1/groups', groupsViaLink: 'v1/groups/join', groupToken: 'v1/groups/token', @@ -803,7 +804,7 @@ export type WebAPIType = { options: GroupCredentialsType ) => Promise; getGroupLog: ( - startVersion: number, + startVersion: number | undefined, options: GroupCredentialsType ) => Promise; getIceServers: () => Promise; @@ -2590,7 +2591,7 @@ export function initialize({ } async function getGroupLog( - startVersion: number, + startVersion: number | undefined, options: GroupCredentialsType ): Promise { const basicAuth = generateGroupAuth( @@ -2598,6 +2599,22 @@ export function initialize({ options.authCredentialPresentationHex ); + // If we don't know starting revision - fetch it from the server + if (startVersion === undefined) { + const { data: joinedData } = await _ajax({ + basicAuth, + call: 'groupJoinedAtVersion', + contentType: 'application/x-protobuf', + host: storageUrl, + httpType: 'GET', + responseType: 'byteswithdetails', + }); + + const { joinedAtVersion } = Proto.Member.decode(joinedData); + + return getGroupLog(joinedAtVersion, options); + } + const withDetails = await _ajax({ basicAuth, call: 'groupLog',