diff --git a/ts/receiver/closedGroups.ts b/ts/receiver/closedGroups.ts index 1a216e1c2..ae369eca7 100644 --- a/ts/receiver/closedGroups.ts +++ b/ts/receiver/closedGroups.ts @@ -346,7 +346,6 @@ export async function handleNewClosedGroup( isKickedFromGroup: false, lastJoinedTimestamp: toNumber(envelope.timestamp), // we just got readded. Consider the zombie list to have been cleared - zombies: [], }); } @@ -372,7 +371,7 @@ export async function handleNewClosedGroup( // be sure to call this before sending the message. // the sending pipeline needs to know from GroupUtils when a message is for a medium group - await ClosedGroup.updateOrCreateClosedGroup(groupDetails, fromLegacyConfig); + await ClosedGroup.updateOrCreateClosedGroup(groupDetails); // ClosedGroup.updateOrCreateClosedGroup will mark the activeAt to Date.now if it's active // But we need to override this value with the sent timestamp of the message creating this group for us. diff --git a/ts/session/group/closed-group.ts b/ts/session/group/closed-group.ts index f1d365bbf..b818c73f1 100644 --- a/ts/session/group/closed-group.ts +++ b/ts/session/group/closed-group.ts @@ -88,7 +88,7 @@ export async function initiateClosedGroupUpdate( zombies: convo.get('zombies')?.filter(z => members.includes(z)), activeAt: Date.now(), expirationType, - expireTimer: convo.get('expireTimer') || 0, + expireTimer: convo.get('expireTimer'), }; const diff = buildGroupDiff(convo, groupDetails); @@ -170,7 +170,7 @@ export async function addUpdateMessage( } const expirationMode = convo.get('expirationType'); - const expireTimer = convo.get('expireTimer') || 0; + const expireTimer = convo.get('expireTimer'); let expirationType; let expirationStartTimestamp; diff --git a/ts/util/expiringMessages.ts b/ts/util/expiringMessages.ts index 9ae6f7568..f16419c96 100644 --- a/ts/util/expiringMessages.ts +++ b/ts/util/expiringMessages.ts @@ -352,7 +352,7 @@ export function changeToDisappearingMessageConversationType( // TODO legacy messages support will be removed in a future release // NOTE We need this to check for legacy disappearing messages where the expirationType and expireTimer should be undefined on the ContentMessage -function checkIsLegacyContentMessage(contentMessage: SignalService.Content): boolean { +function checkIsLegacyDisappearingContentMessage(contentMessage: SignalService.Content): boolean { return ( (contentMessage.expirationType === SignalService.Content.ExpirationType.UNKNOWN || !ProtobufUtils.hasDefinedProperty(contentMessage, 'expirationType')) && @@ -360,7 +360,7 @@ function checkIsLegacyContentMessage(contentMessage: SignalService.Content): boo ); } -function checkIsLegacyDataMessage(dataMessage: SignalService.DataMessage): boolean { +function checkIsLegacyDisappearingDataMessage(dataMessage: SignalService.DataMessage): boolean { return ( ProtobufUtils.hasDefinedProperty(dataMessage, 'expireTimer') && dataMessage.expireTimer > -1 ); @@ -375,9 +375,10 @@ export async function checkForExpireUpdateInContentMessage( // We will only support legacy disappearing messages for a short period before disappearing messages v2 is unlocked const isDisappearingMessagesV2Released = await ReleasedFeatures.checkIsDisappearMessageV2FeatureReleased(); - const isLegacyContentMessage = checkIsLegacyContentMessage(content); + const isLegacyContentMessage = checkIsLegacyDisappearingContentMessage(content); const isLegacyDataMessage = Boolean( - isLegacyContentMessage && checkIsLegacyDataMessage(dataMessage as SignalService.DataMessage) + isLegacyContentMessage && + checkIsLegacyDisappearingDataMessage(dataMessage as SignalService.DataMessage) ); const isLegacyConversationSettingMessage = isDisappearingMessagesV2Released ? isLegacyContentMessage && @@ -414,12 +415,38 @@ export async function checkForExpireUpdateInContentMessage( convoToUpdate.get('expirationType') !== 'off' && convoToUpdate.get('expireTimer') !== 0; - // If it is a legacy message and disappearing messages v2 is released then we ignore it and use the local client's conversation settings + // NOTE some platforms do not include the diappearing message values in the Data Message for sent messages so we have to trust the conversation settings until v2 is released + if ( + !isDisappearingMessagesV2Released && + !isLegacyConversationSettingMessage && + isLegacyContentMessage && + convoToUpdate.get('expirationType') !== 'off' + ) { + if ( + expirationType !== convoToUpdate.get('expirationType') || + expirationTimer !== convoToUpdate.get('expireTimer') + ) { + window.log.debug( + 'WIP: Received a legacy disappearing message before v2 was released without values set. Using the conversation settings.', + content + ); + expirationTimer = convoToUpdate.get('expireTimer'); + expirationType = changeToDisappearingMessageType( + convoToUpdate, + convoToUpdate.get('expirationType') + ); + } + } + + // NOTE If it is a legacy message and disappearing messages v2 is released then we ignore it and use the local client's conversation settings if ( isDisappearingMessagesV2Released && (isLegacyDataMessage || isLegacyConversationSettingMessage || shouldDisappearButIsntMessage) ) { - window.log.warn('Received a legacy disappearing message after v2 was released.', content); + window.log.warn( + 'Received a legacy disappearing message after v2 was released. Overriding it with the conversation settings', + content + ); expirationTimer = convoToUpdate.get('expireTimer'); expirationType = changeToDisappearingMessageType( convoToUpdate,