fix: prevent duplicate expire timer updates while keeping backwards compatibility

pull/2660/head
William Grant 2 years ago
parent 996d204dc8
commit b4fc33c8fa

@ -1053,6 +1053,17 @@ export class ConversationModel extends Backbone.Model<ConversationAttributes> {
expireTimer = 0;
}
// TODO does this actually work?
if (
isEqual(expirationType, this.get('expirationType')) &&
isEqual(expireTimer, this.get('expireTimer'))
) {
window.log.info(
'WIP: Dropping ExpireTimerUpdate message as we already have the same one set.'
);
return;
}
const isOutgoing = Boolean(!receivedAt);
source = source || UserUtils.getOurPubKeyStrFromCache();

@ -247,8 +247,18 @@ export class MessageModel extends Backbone.Model<MessageAttributes> {
return window.i18n('mediaMessage');
}
if (this.isExpirationTimerUpdate()) {
// Backwards compatibility for Disappearing Messages in old clients
const expireTimerUpdate = this.get('expirationTimerUpdate');
if (!expireTimerUpdate || !expireTimerUpdate.expireTimer) {
const expirationType = this.get('expirationType');
const expireTimer = this.get('expireTimer');
if (
!expireTimerUpdate ||
expireTimerUpdate.expirationType === 'off' ||
!expireTimerUpdate.expireTimer ||
expirationType === 'off' ||
!expireTimer ||
expireTimer === 0
) {
return window.i18n('disappearingMessagesDisabled');
}

@ -253,11 +253,6 @@ export async function handleSwarmDataMessage(
msgModel.get('sent_at')
);
msgModel.set('expirationStartTimestamp', expirationStartTimestamp);
console.log(
`WIP: handleSwarmDataMessage msgModel expirationStartTimestamp`,
msgModel.get('expirationStartTimestamp'),
msgModel.get('sent_at')
);
}
}

@ -226,8 +226,6 @@ async function handleRegularMessage(
}
handleLinkPreviews(rawDataMessage.body, rawDataMessage.preview, message);
const existingExpireTimer = conversation.get('expireTimer');
message.set({
flags: rawDataMessage.flags,
// quote: rawDataMessage.quote, // do not do this copy here, it must be done only in copyFromQuotedMessage()
@ -238,10 +236,6 @@ async function handleRegularMessage(
errors: [],
});
if (existingExpireTimer) {
message.set({ expireTimer: existingExpireTimer });
}
const ourIdInThisConversation =
getUsBlindedInThatServer(conversation.id) || UserUtils.getOurPubKeyStrFromCache();
@ -322,12 +316,6 @@ async function handleExpirationTimerUpdateNoCommit(
}
message.set({
expirationTimerUpdate: {
source,
expirationType: expirationType !== 'off' ? expirationType : null,
expireTimer,
lastDisappearingMessageChangeTimestamp: providedChangeTimestamp,
},
unread: 0, // mark the message as read.
});
@ -361,20 +349,32 @@ export async function handleMessageJob(
ConversationTypeEnum.PRIVATE
);
try {
console.log(`WIP: handleMessageJob expireUpdate`, expireUpdate, regularDataMessage);
messageModel.set({ flags: regularDataMessage.flags });
// TODO remove 2 weeks after release
if (messageModel.isExpirationTimerUpdate()) {
console.log(`WIP: isExpirationTimerUpdate`, messageModel);
// TODO account for lastDisappearingMessageChangeTimestamp
const { expireTimer: oldExpireTimer } = regularDataMessage;
const expirationType = expireUpdate.expirationType;
const expireTimer = expireUpdate.expireTimer || oldExpireTimer;
// TODO in the future we will remove the dataMessage expireTimer and the expirationTimerUpdate
let expirationType = expireUpdate.expirationType;
let expireTimer = expireUpdate.expireTimer;
if (!expirationType) {
expirationType = conversation.isPrivate() ? 'deleteAfterRead' : 'deleteAfterSend';
}
// Backwards compatibility for Disappearing Messages in old clients
if (regularDataMessage.expireTimer) {
const expirationTimerUpdate = messageModel.get('expirationTimerUpdate');
if (!isEmpty(expirationTimerUpdate)) {
expirationType = expirationTimerUpdate?.expirationType;
expireTimer = expirationTimerUpdate?.expireTimer;
}
}
// TODO compare types and change timestamps
const oldTypeValue = conversation.get('expirationType');
const oldTimerValue = conversation.get('expireTimer');
if (isEqual(expirationType, oldTypeValue) && expireTimer === oldTimerValue) {
if (isEqual(expirationType, oldTypeValue) && isEqual(expireTimer, oldTimerValue)) {
confirm?.();
window?.log?.info(
'WIP: Dropping ExpireTimerUpdate message as we already have the same one set.'
@ -390,6 +390,7 @@ export async function handleMessageJob(
expireTimer
);
} else {
// NOTE this is a disappearing message NOT a expiration timer update
if (!isEmpty(expireUpdate)) {
messageModel.set({
expirationType: expireUpdate.expirationType,

Loading…
Cancel
Save