fix: improved logic for turning off disappearing messages

pull/2660/head
William Grant 2 years ago
parent a3a0c3f9de
commit 854742c0b1

@ -95,10 +95,7 @@ import {
import { sogsV3FetchPreviewAndSaveIt } from '../session/apis/open_group_api/sogsv3/sogsV3FetchFile'; import { sogsV3FetchPreviewAndSaveIt } from '../session/apis/open_group_api/sogsv3/sogsV3FetchFile';
import { Reaction } from '../types/Reaction'; import { Reaction } from '../types/Reaction';
import { Reactions } from '../util/reactions'; import { Reactions } from '../util/reactions';
import { import { DisappearingMessageConversationType } from '../util/expiringMessages';
DisappearingMessageConversationType,
DisappearingMessageType,
} from '../util/expiringMessages';
export class ConversationModel extends Backbone.Model<ConversationAttributes> { export class ConversationModel extends Backbone.Model<ConversationAttributes> {
public updateLastMessage: () => any; public updateLastMessage: () => any;
@ -635,8 +632,7 @@ export class ConversationModel extends Backbone.Model<ConversationAttributes> {
if (this.isPrivate()) { if (this.isPrivate()) {
if (this.isMe()) { if (this.isMe()) {
// TODO legacy messages support will be removed in a future release if (this.isDisappearingMode('deleteAfterRead')) {
if (!this.isDisappearingMode('legacy') && !this.isDisappearingMode('deleteAfterSend')) {
return; return;
} }
chatMessageParams.syncTarget = this.id; chatMessageParams.syncTarget = this.id;
@ -668,8 +664,7 @@ export class ConversationModel extends Backbone.Model<ConversationAttributes> {
} }
if (this.isMediumGroup()) { if (this.isMediumGroup()) {
// TODO legacy messages support will be removed in a future release if (this.isDisappearingMode('deleteAfterRead')) {
if (!this.isDisappearingMode('legacy') && !this.isDisappearingMode('disappearAfterSend')) {
return; return;
} }
@ -1082,7 +1077,7 @@ export class ConversationModel extends Backbone.Model<ConversationAttributes> {
const lastDisappearingMessageChangeTimestamp = providedChangeTimestamp; const lastDisappearingMessageChangeTimestamp = providedChangeTimestamp;
let source = providedSource; let source = providedSource;
if (!expirationType || !expireTimer) { if (expirationType === undefined || expireTimer === undefined) {
expirationType = 'off'; expirationType = 'off';
expireTimer = 0; expireTimer = 0;
} }
@ -1198,9 +1193,7 @@ export class ConversationModel extends Backbone.Model<ConversationAttributes> {
const expirationTimerMessage = new ExpirationTimerUpdateMessage(expireUpdate); const expirationTimerMessage = new ExpirationTimerUpdateMessage(expireUpdate);
const pubkey = new PubKey(this.get('id')); const pubkey = new PubKey(this.get('id'));
await getMessageQueue().sendToPubKey(pubkey, expirationTimerMessage); await getMessageQueue().sendToPubKey(pubkey, expirationTimerMessage);
} else { } else if (this.isMediumGroup()) {
// Cannot be an open group
window?.log?.warn('TODO: Expiration update for closed groups are to be updated');
const expireUpdateForGroup = { const expireUpdateForGroup = {
...expireUpdate, ...expireUpdate,
groupId: this.get('id'), groupId: this.get('id'),
@ -1209,8 +1202,9 @@ export class ConversationModel extends Backbone.Model<ConversationAttributes> {
const expirationTimerMessage = new ExpirationTimerUpdateMessage(expireUpdateForGroup); const expirationTimerMessage = new ExpirationTimerUpdateMessage(expireUpdateForGroup);
await getMessageQueue().sendToGroup(expirationTimerMessage); await getMessageQueue().sendToGroup(expirationTimerMessage);
} else {
window?.log?.warn('Communities should not use disappearing messages');
} }
return;
} }
public triggerUIRefresh() { public triggerUIRefresh() {
@ -2237,24 +2231,18 @@ export class ConversationModel extends Backbone.Model<ConversationAttributes> {
return []; return [];
} }
// TODO I think this is flawed private isDisappearingMode(mode: DisappearingMessageConversationType) {
private isDisappearingMode(mode: DisappearingMessageType) {
// TODO legacy messages support will be removed in a future release // TODO legacy messages support will be removed in a future release
const success = const success =
this.get('expirationType') && this.get('expirationType') !== 'off' && mode === 'legacy' mode === 'deleteAfterRead'
? this.get('expirationType') === 'legacy'
: mode === 'deleteAfterRead'
? this.get('expirationType') === 'deleteAfterRead' ? this.get('expirationType') === 'deleteAfterRead'
: this.get('expirationType') === 'deleteAfterSend'; : mode === 'deleteAfterSend'
? this.get('expirationType') === 'deleteAfterSend'
if (!success) { : mode === 'legacy'
window.log.info( ? this.get('expirationType') === 'legacy'
`WIP: This message should be ${ : mode === 'off'
mode === 'legacy' ? ' a legacy disappearing message' : ` disappear after ${mode}` ? this.get('expirationType') === 'off'
}`, : false;
this
);
}
return success; return success;
} }

@ -1086,7 +1086,6 @@ export class MessageModel extends Backbone.Model<MessageAttributes> {
const { dataMessage } = content; const { dataMessage } = content;
// TODO maybe we need to account for lastDisappearingMessageChangeTimestamp? // TODO maybe we need to account for lastDisappearingMessageChangeTimestamp?
// if this message needs to be synced
if ( if (
dataMessage && dataMessage &&
(dataMessage.body?.length || (dataMessage.body?.length ||
@ -1099,15 +1098,21 @@ 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 expirationType = content.expirationType const expirationType = content.expirationType
? DisappearingMessageConversationSetting[content.expirationType] ? DisappearingMessageConversationSetting[content.expirationType]
: DisappearingMessageConversationSetting[3]; : isLegacyMessage
const expireTimer = content.expirationTimer || content?.dataMessage?.expireTimer || undefined; ? DisappearingMessageConversationSetting[3]
: 'off';
const expireTimer = isLegacyMessage
? Number(dataMessage.expireTimer)
: content.expirationTimer;
const lastDisappearingMessageChangeTimestamp = content.lastDisappearingMessageChangeTimestamp const lastDisappearingMessageChangeTimestamp = content.lastDisappearingMessageChangeTimestamp
? Number(content.lastDisappearingMessageChangeTimestamp) ? Number(content.lastDisappearingMessageChangeTimestamp)
: undefined; : undefined;
let expireUpdate: DisappearingMessageUpdate | null = null;
let expireUpdate: DisappearingMessageUpdate | null = null;
if (expirationType && expireTimer !== undefined) { if (expirationType && expireTimer !== undefined) {
expireUpdate = { expireUpdate = {
expirationType, expirationType,

@ -408,13 +408,31 @@ export async function innerHandleSwarmContentMessage(
perfStart(`handleSwarmDataMessage-${envelope.id}`); perfStart(`handleSwarmDataMessage-${envelope.id}`);
// TODO legacy messages support will be removed in a future release
// We will only support legacy disappearing messages for a short period before disappearing messages v2 is unlocked // We will only support legacy disappearing messages for a short period before disappearing messages v2 is unlocked
const isDisappearingMessagesV2Released = await checkIsFeatureReleased( const isDisappearingMessagesV2Released = await checkIsFeatureReleased(
'Disappearing Messages V2' 'Disappearing Messages V2'
); );
const isLegacyMessage = Boolean(dataMessage.expireTimer && dataMessage.expireTimer > 0); const isLegacyMessage = Boolean(dataMessage.expireTimer && dataMessage.expireTimer > -1);
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,
isLegacyMessage,
isDisappearingMessagesV2Released,
};
// TODO account for outdated groups separately probably
if (isLegacyMessage) { if (isLegacyMessage) {
window.log.info( window.log.info(
'WIP: Received a legacy disappearing message', 'WIP: Received a legacy disappearing message',
@ -425,6 +443,7 @@ export async function innerHandleSwarmContentMessage(
: '' : ''
}` }`
); );
// trigger notice banner // trigger notice banner
if (!conversationModel.get('hasOutdatedClient')) { if (!conversationModel.get('hasOutdatedClient')) {
conversationModel.set({ hasOutdatedClient: true }); conversationModel.set({ hasOutdatedClient: true });
@ -435,23 +454,6 @@ export async function innerHandleSwarmContentMessage(
} }
} }
// TODO legacy messages support will be removed in a future release
const expireUpdate: DisappearingMessageUpdate = {
expirationType:
!isDisappearingMessagesV2Released && isLegacyMessage
? DisappearingMessageConversationSetting[3]
: DisappearingMessageConversationSetting[content.expirationType] || 'off',
expireTimer:
!isDisappearingMessagesV2Released && isLegacyMessage
? Number(dataMessage.expireTimer)
: content.expirationTimer,
lastDisappearingMessageChangeTimestamp: content.lastDisappearingMessageChangeTimestamp
? Number(content.lastDisappearingMessageChangeTimestamp)
: undefined,
isLegacyMessage,
isDisappearingMessagesV2Released,
};
await handleSwarmDataMessage( await handleSwarmDataMessage(
envelope, envelope,
sentAtTimestamp, sentAtTimestamp,

@ -247,7 +247,7 @@ export async function handleSwarmDataMessage(
// TODO handle sync messages separately // TODO handle sync messages separately
window.log.info('WIP: Sync Message dropping'); window.log.info('WIP: Sync Message dropping');
} else { } else {
const { let {
expirationType, expirationType,
expireTimer, expireTimer,
lastDisappearingMessageChangeTimestamp, lastDisappearingMessageChangeTimestamp,
@ -256,13 +256,19 @@ export async function handleSwarmDataMessage(
} = expireUpdate; } = expireUpdate;
// TODO legacy messages support will be removed in a future release // TODO legacy messages support will be removed in a future release
msgModel.set({ // 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 expirationType =
isDisappearingMessagesV2Released && isLegacyMessage
? senderConversationModel.get('expirationType') ? senderConversationModel.get('expirationType')
: expirationType, : expirationType;
expireTimer: isDisappearingMessagesV2Released expireTimer =
isDisappearingMessagesV2Released && isLegacyMessage
? senderConversationModel.get('expireTimer') ? senderConversationModel.get('expireTimer')
: expireTimer, : expireTimer;
msgModel.set({
expirationType,
expireTimer,
}); });
// TODO legacy messages support will be removed in a future release // TODO legacy messages support will be removed in a future release
@ -276,21 +282,13 @@ export async function handleSwarmDataMessage(
expirationType, expirationType,
expireTimer, expireTimer,
lastDisappearingMessageChangeTimestamp: isLegacyMessage lastDisappearingMessageChangeTimestamp: isLegacyMessage
? Date.now() ? isDisappearingMessagesV2Released
? senderConversationModel.get('lastDisappearingMessageChangeTimestamp')
: Date.now()
: Number(lastDisappearingMessageChangeTimestamp), : Number(lastDisappearingMessageChangeTimestamp),
source: msgModel.get('source'), source: msgModel.get('source'),
}; };
if (isLegacyMessage && isDisappearingMessagesV2Released) {
// if it is a legacy message then we ignore it and use the local client's conversation settings
expirationTimerUpdate.expirationType = senderConversationModel.get('expirationType');
expirationTimerUpdate.expireTimer = senderConversationModel.get('expireTimer');
expirationTimerUpdate.lastDisappearingMessageChangeTimestamp = senderConversationModel.get(
'lastDisappearingMessageChangeTimestamp'
);
}
msgModel.set({ msgModel.set({
expirationTimerUpdate, expirationTimerUpdate,
}); });

@ -328,6 +328,8 @@ export async function handleMessageJob(
) || messageModel.get('timestamp')} in conversation ${conversation.idForLogging()}` ) || messageModel.get('timestamp')} in conversation ${conversation.idForLogging()}`
); );
window.log.info(`WIP: handleMessageJob()`, messageModel, conversation, regularDataMessage);
const sendingDeviceConversation = await getConversationController().getOrCreateAndWait( const sendingDeviceConversation = await getConversationController().getOrCreateAndWait(
source, source,
ConversationTypeEnum.PRIVATE ConversationTypeEnum.PRIVATE
@ -353,7 +355,11 @@ export async function handleMessageJob(
if (messageModel.isExpirationTimerUpdate()) { if (messageModel.isExpirationTimerUpdate()) {
const expirationTimerUpdate = messageModel.get('expirationTimerUpdate'); const expirationTimerUpdate = messageModel.get('expirationTimerUpdate');
if (!expirationTimerUpdate || isEmpty(expirationTimerUpdate)) { if (!expirationTimerUpdate || isEmpty(expirationTimerUpdate)) {
window.log.info(`WIP: There is a problem with the expiration timer update`, messageModel); window.log.info(
`WIP: There is a problem with the expiration timer update`,
messageModel,
expirationTimerUpdate
);
return; return;
} }

@ -24,8 +24,10 @@ export class ExpirableMessage extends ContentMessage {
expirationType: expirationType:
this.expirationType === 'deleteAfterSend' this.expirationType === 'deleteAfterSend'
? SignalService.Content.ExpirationType.DELETE_AFTER_SEND ? SignalService.Content.ExpirationType.DELETE_AFTER_SEND
: SignalService.Content.ExpirationType.DELETE_AFTER_READ, : this.expirationType === 'deleteAfterRead'
expirationTimer: this.expireTimer, ? SignalService.Content.ExpirationType.DELETE_AFTER_READ
: undefined,
expirationTimer: this.expireTimer && this.expireTimer > -1 ? this.expireTimer : undefined,
}); });
} }
@ -33,7 +35,7 @@ export class ExpirableMessage extends ContentMessage {
return this.expirationType; return this.expirationType;
} }
// TODO need to account for legacy messages here? // TODO legacy messages? + update expire endpoint for message after read
public ttl(): number { public ttl(): number {
switch (this.expirationType) { switch (this.expirationType) {
case 'deleteAfterSend': case 'deleteAfterSend':

@ -44,6 +44,11 @@ export abstract class ClosedGroupMessage extends ExpirableMessage {
dataMessage.closedGroupControlMessage = new SignalService.DataMessage.ClosedGroupControlMessage(); dataMessage.closedGroupControlMessage = new SignalService.DataMessage.ClosedGroupControlMessage();
// TODO legacy messages support will be removed in a future release
if (this.expirationType === 'legacy' && this.expireTimer) {
dataMessage.expireTimer = this.expireTimer;
}
return dataMessage; return dataMessage;
} }
} }

@ -45,11 +45,6 @@ export class ClosedGroupVisibleMessage extends ClosedGroupMessage {
dataProto.group = groupMessage; dataProto.group = groupMessage;
// TODO legacy messages support will be removed in a future release
if (this.expirationType === 'legacy' && this.expireTimer) {
dataProto.expireTimer = this.expireTimer;
}
return dataProto; return dataProto;
} }
} }

@ -122,11 +122,6 @@ export class VisibleMessage extends ExpirableMessage {
dataMessage.attachments = this.attachments || []; dataMessage.attachments = this.attachments || [];
// TODO should only happen in legacy mode and should be cancelled out once we have trigger the unix timestamp
// if (this.expireTimer) {
// dataMessage.expireTimer = this.expireTimer;
// }
if (this.preview) { if (this.preview) {
dataMessage.preview = this.preview; dataMessage.preview = this.preview;
} }

Loading…
Cancel
Save