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 // 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 const expirationType = content.expirationType
? DisappearingMessageConversationSetting[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 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 * 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, isPrivateConversationMessage ? envelope.source : envelope.senderIdentity,
ConversationTypeEnum.PRIVATE 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 closed group message, this holds the closed group's conversation.
* For a private conversation message, this is just the conversation with that user * For a private conversation message, this is just the conversation with that user
*/ */
if (!isPrivateConversationMessage) { if (!isPrivateConversationMessage) {
// this is a closed group message, we have a second conversation to make sure exists // 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, envelope.source,
ConversationTypeEnum.GROUP ConversationTypeEnum.GROUP
); );
@ -413,22 +416,30 @@ export async function innerHandleSwarmContentMessage(
const isDisappearingMessagesV2Released = await checkIsFeatureReleased( const isDisappearingMessagesV2Released = await checkIsFeatureReleased(
'Disappearing Messages V2' '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 = { const expireUpdate: DisappearingMessageUpdate = {
expirationType: isDisappearingMessagesV2Released expirationType,
? DisappearingMessageConversationSetting[content.expirationType] expireTimer,
: isLegacyMessage lastDisappearingMessageChangeTimestamp,
? DisappearingMessageConversationSetting[3]
: 'off',
expireTimer: isDisappearingMessagesV2Released
? content.expirationTimer
: isLegacyMessage
? Number(dataMessage.expireTimer)
: 0,
lastDisappearingMessageChangeTimestamp: content.lastDisappearingMessageChangeTimestamp
? Number(content.lastDisappearingMessageChangeTimestamp)
: undefined,
isLegacyMessage, isLegacyMessage,
isDisappearingMessagesV2Released, isDisappearingMessagesV2Released,
}; };
@ -439,18 +450,20 @@ export async function innerHandleSwarmContentMessage(
content, content,
`${ `${
!isPrivateConversationMessage !isPrivateConversationMessage
? ` in closed group ${conversationModel.get('displayNameInProfile')}` ? `in closed group ${conversationModelForUIUpdate.get('displayNameInProfile')}`
: '' : ''
}` }`
); );
// trigger notice banner // trigger notice banner
if (!conversationModel.get('hasOutdatedClient')) { if (!conversationModelForUIUpdate.get('hasOutdatedClient')) {
conversationModel.set({ hasOutdatedClient: true }); conversationModelForUIUpdate.set({ hasOutdatedClient: true });
conversationModelForUIUpdate.commit();
} }
} else { } else {
if (conversationModel.get('hasOutdatedClient')) { if (conversationModelForUIUpdate.get('hasOutdatedClient')) {
conversationModel.set({ hasOutdatedClient: false }); conversationModelForUIUpdate.set({ hasOutdatedClient: false });
conversationModelForUIUpdate.commit();
} }
} }
@ -459,7 +472,7 @@ export async function innerHandleSwarmContentMessage(
sentAtTimestamp, sentAtTimestamp,
dataMessage as SignalService.DataMessage, dataMessage as SignalService.DataMessage,
messageHash, messageHash,
conversationModel, senderConversationModel,
expireUpdate expireUpdate
); );
perfEnd(`handleSwarmDataMessage-${envelope.id}`, 'handleSwarmDataMessage'); 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 // 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 = expirationType =
isDisappearingMessagesV2Released && isLegacyMessage isDisappearingMessagesV2Released && isLegacyMessage
? senderConversationModel.get('expirationType') ? convoToAddMessageTo.get('expirationType')
: expirationType; : expirationType;
expireTimer = expireTimer =
isDisappearingMessagesV2Released && isLegacyMessage isDisappearingMessagesV2Released && isLegacyMessage
? senderConversationModel.get('expireTimer') ? convoToAddMessageTo.get('expireTimer')
: expireTimer; : expireTimer;
msgModel.set({ msgModel.set({
@ -283,7 +283,7 @@ export async function handleSwarmDataMessage(
expireTimer, expireTimer,
lastDisappearingMessageChangeTimestamp: isLegacyMessage lastDisappearingMessageChangeTimestamp: isLegacyMessage
? isDisappearingMessagesV2Released ? isDisappearingMessagesV2Released
? senderConversationModel.get('lastDisappearingMessageChangeTimestamp') ? convoToAddMessageTo.get('lastDisappearingMessageChangeTimestamp')
: Date.now() : Date.now()
: Number(lastDisappearingMessageChangeTimestamp), : Number(lastDisappearingMessageChangeTimestamp),
source: msgModel.get('source'), source: msgModel.get('source'),

@ -33,7 +33,7 @@ export class ClosedGroupVisibleMessage extends ClosedGroupMessage {
} }
public dataProto(): SignalService.DataMessage { 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 dataProto = this.chatMessage.dataProto();
const groupMessage = new SignalService.GroupContext(); const groupMessage = new SignalService.GroupContext();

Loading…
Cancel
Save