fix: legacy message checks must look for the ExpirationTimerUpdate flag explicitly

use correct model for a message in a closed group
pull/2660/head
William Grant 2 years ago
parent 854742c0b1
commit 6de7c5c405

@ -1098,7 +1098,11 @@ export class MessageModel extends Backbone.Model<MessageAttributes> {
}
// TODO legacy messages support will be removed in a future release
const isLegacyMessage = Boolean(dataMessage.expireTimer && dataMessage.expireTimer > -1);
const isLegacyMessage = Boolean(
(dataMessage.expireTimer && dataMessage.expireTimer > -1) ||
(!content.expirationTimer &&
dataMessage.flags === SignalService.DataMessage.Flags.EXPIRATION_TIMER_UPDATE)
);
const expirationType = content.expirationType
? DisappearingMessageConversationSetting[content.expirationType]

@ -382,18 +382,21 @@ export async function innerHandleSwarmContentMessage(
* For a closed group message, this holds the conversation with that specific user outside of the closed group.
* For a private conversation message, this is just the conversation with that user
*/
let conversationModel = await getConversationController().getOrCreateAndWait(
const senderConversationModel = await getConversationController().getOrCreateAndWait(
isPrivateConversationMessage ? envelope.source : envelope.senderIdentity,
ConversationTypeEnum.PRIVATE
);
// We need to make sure that we trigger the banner ui on the correct model for the conversation and not the author (for closed groups)
let conversationModelForUIUpdate = senderConversationModel;
/**
* For a closed group message, this holds the closed group's conversation.
* For a private conversation message, this is just the conversation with that user
*/
if (!isPrivateConversationMessage) {
// this is a closed group message, we have a second conversation to make sure exists
conversationModel = await getConversationController().getOrCreateAndWait(
conversationModelForUIUpdate = await getConversationController().getOrCreateAndWait(
envelope.source,
ConversationTypeEnum.GROUP
);
@ -413,22 +416,30 @@ export async function innerHandleSwarmContentMessage(
const isDisappearingMessagesV2Released = await checkIsFeatureReleased(
'Disappearing Messages V2'
);
const isLegacyMessage = Boolean(dataMessage.expireTimer && dataMessage.expireTimer > -1);
const isLegacyMessage = Boolean(
(dataMessage.expireTimer && dataMessage.expireTimer > -1) ||
(!content.expirationTimer &&
dataMessage.flags === SignalService.DataMessage.Flags.EXPIRATION_TIMER_UPDATE)
);
const expireTimer = isDisappearingMessagesV2Released
? content.expirationTimer
: isLegacyMessage
? Number(dataMessage.expireTimer)
: 0;
const expirationType = isDisappearingMessagesV2Released
? DisappearingMessageConversationSetting[content.expirationType]
: isLegacyMessage && expireTimer > 0
? DisappearingMessageConversationSetting[3]
: 'off';
const lastDisappearingMessageChangeTimestamp = content.lastDisappearingMessageChangeTimestamp
? Number(content.lastDisappearingMessageChangeTimestamp)
: undefined;
const expireUpdate: DisappearingMessageUpdate = {
expirationType: isDisappearingMessagesV2Released
? DisappearingMessageConversationSetting[content.expirationType]
: isLegacyMessage
? DisappearingMessageConversationSetting[3]
: 'off',
expireTimer: isDisappearingMessagesV2Released
? content.expirationTimer
: isLegacyMessage
? Number(dataMessage.expireTimer)
: 0,
lastDisappearingMessageChangeTimestamp: content.lastDisappearingMessageChangeTimestamp
? Number(content.lastDisappearingMessageChangeTimestamp)
: undefined,
expirationType,
expireTimer,
lastDisappearingMessageChangeTimestamp,
isLegacyMessage,
isDisappearingMessagesV2Released,
};
@ -439,18 +450,20 @@ export async function innerHandleSwarmContentMessage(
content,
`${
!isPrivateConversationMessage
? ` in closed group ${conversationModel.get('displayNameInProfile')}`
? `in closed group ${conversationModelForUIUpdate.get('displayNameInProfile')}`
: ''
}`
);
// trigger notice banner
if (!conversationModel.get('hasOutdatedClient')) {
conversationModel.set({ hasOutdatedClient: true });
if (!conversationModelForUIUpdate.get('hasOutdatedClient')) {
conversationModelForUIUpdate.set({ hasOutdatedClient: true });
conversationModelForUIUpdate.commit();
}
} else {
if (conversationModel.get('hasOutdatedClient')) {
conversationModel.set({ hasOutdatedClient: false });
if (conversationModelForUIUpdate.get('hasOutdatedClient')) {
conversationModelForUIUpdate.set({ hasOutdatedClient: false });
conversationModelForUIUpdate.commit();
}
}
@ -459,7 +472,7 @@ export async function innerHandleSwarmContentMessage(
sentAtTimestamp,
dataMessage as SignalService.DataMessage,
messageHash,
conversationModel,
senderConversationModel,
expireUpdate
);
perfEnd(`handleSwarmDataMessage-${envelope.id}`, 'handleSwarmDataMessage');

@ -259,11 +259,11 @@ export async function handleSwarmDataMessage(
// if it is a legacy message and disappearing messages v2 is released then we ignore it and use the local client's conversation settings
expirationType =
isDisappearingMessagesV2Released && isLegacyMessage
? senderConversationModel.get('expirationType')
? convoToAddMessageTo.get('expirationType')
: expirationType;
expireTimer =
isDisappearingMessagesV2Released && isLegacyMessage
? senderConversationModel.get('expireTimer')
? convoToAddMessageTo.get('expireTimer')
: expireTimer;
msgModel.set({
@ -283,7 +283,7 @@ export async function handleSwarmDataMessage(
expireTimer,
lastDisappearingMessageChangeTimestamp: isLegacyMessage
? isDisappearingMessagesV2Released
? senderConversationModel.get('lastDisappearingMessageChangeTimestamp')
? convoToAddMessageTo.get('lastDisappearingMessageChangeTimestamp')
: Date.now()
: Number(lastDisappearingMessageChangeTimestamp),
source: msgModel.get('source'),

@ -33,7 +33,7 @@ export class ClosedGroupVisibleMessage extends ClosedGroupMessage {
}
public dataProto(): SignalService.DataMessage {
//expireTimer is set in the dataProto in this call directly
// expireTimer is set in the dataProto in this call directly
const dataProto = this.chatMessage.dataProto();
const groupMessage = new SignalService.GroupContext();

Loading…
Cancel
Save