feat: tested v2 releas

made some updates to expire update generation and handling, one final fix required
pull/2971/head
William Grant 2 years ago
parent c93315b0e7
commit b88842b687

@ -740,7 +740,11 @@ export class ConversationModel extends Backbone.Model<ConversationAttributes> {
const { attachments, body, groupInvitation, preview, quote } = msg; const { attachments, body, groupInvitation, preview, quote } = msg;
this.clearTypingTimers(); this.clearTypingTimers();
const expireTimer = this.get('expireTimer'); const expireTimer = this.get('expireTimer');
const expirationType = changeToDisappearingMessageType(this, this.get('expirationType')); const expirationType = changeToDisappearingMessageType(
this,
expireTimer,
this.get('expirationType')
);
const networkTimestamp = GetNetworkTime.getNowWithNetworkOffset(); const networkTimestamp = GetNetworkTime.getNowWithNetworkOffset();
@ -882,7 +886,11 @@ export class ConversationModel extends Backbone.Model<ConversationAttributes> {
}); });
let message: MessageModel | undefined = existingMessage || undefined; let message: MessageModel | undefined = existingMessage || undefined;
const messageExpirationType = changeToDisappearingMessageType(this, expirationType); const messageExpirationType = changeToDisappearingMessageType(
this,
expireTimer,
expirationType
);
window.log.debug(`WIP: updateExpireTimer() messageExpirationType: ${messageExpirationType}`); window.log.debug(`WIP: updateExpireTimer() messageExpirationType: ${messageExpirationType}`);
// we don't have info about who made the change and when, when we get a change from a config message, so do not add a control message // we don't have info about who made the change and when, when we get a change from a config message, so do not add a control message
@ -897,7 +905,6 @@ export class ConversationModel extends Backbone.Model<ConversationAttributes> {
source, source,
fromSync, fromSync,
}, },
// TODO Confirm that legacy devices ignore this and that everything works
expirationType: messageExpirationType, expirationType: messageExpirationType,
expireTimer, expireTimer,
}; };

@ -84,7 +84,7 @@ export async function handleClosedGroupControlMessage(
const { type } = groupUpdate; const { type } = groupUpdate;
const { Type } = SignalService.DataMessage.ClosedGroupControlMessage; const { Type } = SignalService.DataMessage.ClosedGroupControlMessage;
window?.log?.info( window?.log?.info(
` handle closed group update from ${envelope.senderIdentity || envelope.source} about group ${ `handle closed group update from ${envelope.senderIdentity || envelope.source} about group ${
envelope.source envelope.source
}` }`
); );

@ -469,8 +469,8 @@ export async function innerHandleSwarmContentMessage(
window.log.debug(`WIP: innerHandleSwarmContentMessage: ${JSON.stringify(content)}`); window.log.debug(`WIP: innerHandleSwarmContentMessage: ${JSON.stringify(content)}`);
const expireUpdate = await checkForExpireUpdateInContentMessage( const expireUpdate = await checkForExpireUpdateInContentMessage(
conversationModelForUIUpdate, content,
content conversationModelForUIUpdate
); );
window.log.debug( window.log.debug(
@ -478,7 +478,7 @@ export async function innerHandleSwarmContentMessage(
); );
// TODO legacy messages support will be removed in a future release // TODO legacy messages support will be removed in a future release
if (expireUpdate && !isEmpty(expireUpdate) && expireUpdate.isDisappearingMessagesV2Released) { if (expireUpdate.isDisappearingMessagesV2Released) {
await checkHasOutdatedClient( await checkHasOutdatedClient(
conversationModelForUIUpdate, conversationModelForUIUpdate,
senderConversationModel, senderConversationModel,
@ -486,7 +486,7 @@ export async function innerHandleSwarmContentMessage(
); );
if (expireUpdate.isLegacyConversationSettingMessage) { if (expireUpdate.isLegacyConversationSettingMessage) {
window.log.debug( window.log.debug(
'The legacy message is an expiration timer update. Ignoring it.', 'WIP: The legacy message is an expiration timer update. Ignoring it.',
content content
); );
return; return;
@ -861,7 +861,7 @@ export async function handleDataExtractionNotification(
if (convo && expirationMode && expireTimer > 0) { if (convo && expirationMode && expireTimer > 0) {
expirationType = expirationType =
expirationType !== 'off' expirationType !== 'off'
? changeToDisappearingMessageType(convo, expirationMode) ? changeToDisappearingMessageType(convo, expireTimer, expirationMode)
: undefined; : undefined;
if (expirationMode === 'legacy' || expirationMode === 'deleteAfterSend') { if (expirationMode === 'legacy' || expirationMode === 'deleteAfterSend') {

@ -25,7 +25,7 @@ import { isUsFromCache } from '../session/utils/User';
import { Action, Reaction } from '../types/Reaction'; import { Action, Reaction } from '../types/Reaction';
import { toLogFormat } from '../types/attachments/Errors'; import { toLogFormat } from '../types/attachments/Errors';
import { Reactions } from '../util/reactions'; import { Reactions } from '../util/reactions';
import { DisappearingMessageUpdate, handleExpireUpdate } from '../util/expiringMessages'; import { DisappearingMessageUpdate, updateMessageModelToExpire } from '../util/expiringMessages';
function cleanAttachment(attachment: any) { function cleanAttachment(attachment: any) {
return { return {
@ -159,7 +159,7 @@ export async function handleSwarmDataMessage(
rawDataMessage: SignalService.DataMessage, rawDataMessage: SignalService.DataMessage,
messageHash: string, messageHash: string,
senderConversationModel: ConversationModel, senderConversationModel: ConversationModel,
expireUpdate?: DisappearingMessageUpdate expireUpdate: DisappearingMessageUpdate
): Promise<void> { ): Promise<void> {
window.log.info('handleSwarmDataMessage'); window.log.info('handleSwarmDataMessage');
@ -261,10 +261,8 @@ export async function handleSwarmDataMessage(
sentAt: sentAtTimestamp, sentAt: sentAtTimestamp,
}); });
if (!isEmpty(expireUpdate)) { msgModel = updateMessageModelToExpire(convoToAddMessageTo, msgModel, expireUpdate);
msgModel = handleExpireUpdate(convoToAddMessageTo, msgModel, expireUpdate); window.log.debug(`WIP: innerHandleSwarmContentMessage msgModel ${JSON.stringify(msgModel)}`);
window.log.debug(`WIP: innerHandleSwarmContentMessage msgModel ${JSON.stringify(msgModel)}`);
}
await handleSwarmMessage( await handleSwarmMessage(
msgModel, msgModel,

@ -72,7 +72,11 @@ export async function initiateClosedGroupUpdate(
isGroupV3 ? ConversationTypeEnum.GROUPV3 : ConversationTypeEnum.GROUP isGroupV3 ? ConversationTypeEnum.GROUPV3 : ConversationTypeEnum.GROUP
); );
const expirationType = changeToDisappearingMessageType(convo, convo.get('expirationType')); const expirationType = changeToDisappearingMessageType(
convo,
convo.get('expireTimer'),
convo.get('expirationType')
);
if (expirationType === 'deleteAfterRead') { if (expirationType === 'deleteAfterRead') {
throw new Error(`Groups cannot be deleteAfterRead. convo id: ${convo.id}`); throw new Error(`Groups cannot be deleteAfterRead. convo id: ${convo.id}`);
@ -176,7 +180,9 @@ export async function addUpdateMessage(
if (convo && expirationMode && expireTimer > 0) { if (convo && expirationMode && expireTimer > 0) {
expirationType = expirationType =
expirationMode !== 'off' ? changeToDisappearingMessageType(convo, expirationMode) : undefined; expirationMode !== 'off'
? changeToDisappearingMessageType(convo, convo.get('expireTimer'), expirationMode)
: undefined;
if (expirationMode === 'legacy' || expirationMode === 'deleteAfterSend') { if (expirationMode === 'legacy' || expirationMode === 'deleteAfterSend') {
expirationStartTimestamp = setExpirationStartTimestamp(expirationMode, sentAt); expirationStartTimestamp = setExpirationStartTimestamp(expirationMode, sentAt);
@ -327,7 +333,7 @@ async function sendAddedMembers(
members, members,
keypair: encryptionKeyPair, keypair: encryptionKeyPair,
identifier: messageId || uuidv4(), identifier: messageId || uuidv4(),
expirationType: changeToDisappearingMessageType(convo, expirationMode), expirationType: changeToDisappearingMessageType(convo, existingExpireTimer, expirationMode),
expireTimer: existingExpireTimer, expireTimer: existingExpireTimer,
}); });

@ -522,7 +522,7 @@ export async function USER_callRecipient(recipient: string) {
let expirationStartTimestamp; let expirationStartTimestamp;
if (calledConvo && expirationMode && expireTimer > 0) { if (calledConvo && expirationMode && expireTimer > 0) {
expirationType = changeToDisappearingMessageType(calledConvo, expirationMode); expirationType = changeToDisappearingMessageType(calledConvo, expireTimer, expirationMode);
if (expirationMode === 'legacy' || expirationMode === 'deleteAfterSend') { if (expirationMode === 'legacy' || expirationMode === 'deleteAfterSend') {
expirationStartTimestamp = setExpirationStartTimestamp(expirationMode, now); expirationStartTimestamp = setExpirationStartTimestamp(expirationMode, now);
@ -902,7 +902,7 @@ export async function USER_acceptIncomingCallRequest(fromSender: string) {
let expirationStartTimestamp; let expirationStartTimestamp;
if (callerConvo && expirationMode && expireTimer > 0) { if (callerConvo && expirationMode && expireTimer > 0) {
expirationType = changeToDisappearingMessageType(callerConvo, expirationMode); expirationType = changeToDisappearingMessageType(callerConvo, expireTimer, expirationMode);
if (expirationMode === 'legacy' || expirationMode === 'deleteAfterSend') { if (expirationMode === 'legacy' || expirationMode === 'deleteAfterSend') {
expirationStartTimestamp = setExpirationStartTimestamp(expirationMode, networkTimestamp); expirationStartTimestamp = setExpirationStartTimestamp(expirationMode, networkTimestamp);
@ -1254,7 +1254,11 @@ async function addMissedCallMessage(callerPubkey: string, sentAt: number) {
let expirationStartTimestamp; let expirationStartTimestamp;
if (incomingCallConversation && expirationMode && expireTimer > 0) { if (incomingCallConversation && expirationMode && expireTimer > 0) {
expirationType = changeToDisappearingMessageType(incomingCallConversation, expirationMode); expirationType = changeToDisappearingMessageType(
incomingCallConversation,
expireTimer,
expirationMode
);
if (expirationMode === 'legacy' || expirationMode === 'deleteAfterSend') { if (expirationMode === 'legacy' || expirationMode === 'deleteAfterSend') {
expirationStartTimestamp = setExpirationStartTimestamp(expirationMode, sentAt); expirationStartTimestamp = setExpirationStartTimestamp(expirationMode, sentAt);

@ -310,6 +310,7 @@ export function isLegacyDisappearingModeEnabled(
*/ */
export function changeToDisappearingMessageType( export function changeToDisappearingMessageType(
convo: ConversationModel, convo: ConversationModel,
expireTimer: number,
expirationType?: DisappearingMessageConversationType expirationType?: DisappearingMessageConversationType
): DisappearingMessageType { ): DisappearingMessageType {
if (expirationType === 'off' || expirationType === 'legacy') { if (expirationType === 'off' || expirationType === 'legacy') {
@ -317,10 +318,14 @@ export function changeToDisappearingMessageType(
return 'unknown'; return 'unknown';
} }
if (convo.isMe() || convo.isClosedGroup()) { if (expireTimer > 0) {
return 'deleteAfterSend'; if (convo.isMe() || convo.isClosedGroup()) {
return 'deleteAfterSend';
}
return 'deleteAfterRead';
} }
return 'deleteAfterRead';
return 'unknown';
} }
// TODO legacy messages support will be removed in a future release // TODO legacy messages support will be removed in a future release
@ -368,9 +373,9 @@ function checkIsLegacyDisappearingDataMessage(dataMessage: SignalService.DataMes
// TODO legacy messages support will be removed in a future release // TODO legacy messages support will be removed in a future release
export async function checkForExpireUpdateInContentMessage( export async function checkForExpireUpdateInContentMessage(
convoToUpdate: ConversationModel, content: SignalService.Content,
content: SignalService.Content convoToUpdate: ConversationModel
): Promise<DisappearingMessageUpdate | undefined> { ): Promise<DisappearingMessageUpdate> {
const dataMessage = content.dataMessage as SignalService.DataMessage; const dataMessage = content.dataMessage as SignalService.DataMessage;
// 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 ReleasedFeatures.checkIsDisappearMessageV2FeatureReleased(); const isDisappearingMessagesV2Released = await ReleasedFeatures.checkIsDisappearMessageV2FeatureReleased();
@ -382,17 +387,16 @@ export async function checkForExpireUpdateInContentMessage(
); );
const isLegacyConversationSettingMessage = isDisappearingMessagesV2Released const isLegacyConversationSettingMessage = isDisappearingMessagesV2Released
? isLegacyContentMessage && ? isLegacyContentMessage &&
isLegacyDataMessage && (isLegacyDataMessage || !content.lastDisappearingMessageChangeTimestamp) &&
dataMessage.flags === SignalService.DataMessage.Flags.EXPIRATION_TIMER_UPDATE dataMessage.flags === SignalService.DataMessage.Flags.EXPIRATION_TIMER_UPDATE
: isLegacyContentMessage && : isLegacyContentMessage &&
dataMessage.flags === SignalService.DataMessage.Flags.EXPIRATION_TIMER_UPDATE; dataMessage.flags === SignalService.DataMessage.Flags.EXPIRATION_TIMER_UPDATE;
let expirationTimer = isLegacyDataMessage const expirationTimer = isLegacyDataMessage
? Number(dataMessage.expireTimer) ? Number(dataMessage.expireTimer)
: content.expirationTimer; : content.expirationTimer;
// NOTE This starts are a DisappearingMessageConversationType but we will convert it to a DisappearingMessageType for the final return const expirationMode = changeToDisappearingMessageConversationType(
let expirationMode: any = changeToDisappearingMessageConversationType(
convoToUpdate, convoToUpdate,
DisappearingMessageMode[content.expirationType], DisappearingMessageMode[content.expirationType],
expirationTimer expirationTimer
@ -402,13 +406,14 @@ export async function checkForExpireUpdateInContentMessage(
? Number(content.lastDisappearingMessageChangeTimestamp) ? Number(content.lastDisappearingMessageChangeTimestamp)
: undefined; : undefined;
// TODO should review this const expireUpdate: DisappearingMessageUpdate = {
const shouldDisappearButIsntMessage = expirationType: changeToDisappearingMessageType(convoToUpdate, expirationTimer, expirationMode),
dataMessage.flags !== SignalService.DataMessage.Flags.EXPIRATION_TIMER_UPDATE && expirationTimer,
expirationMode === 'off' && lastDisappearingMessageChangeTimestamp,
expirationTimer === 0 && isLegacyConversationSettingMessage,
convoToUpdate.get('expirationType') !== 'off' && isLegacyDataMessage,
convoToUpdate.get('expireTimer') !== 0; isDisappearingMessagesV2Released,
};
// 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 // 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 ( if (
@ -426,15 +431,27 @@ export async function checkForExpireUpdateInContentMessage(
content, content,
convoToUpdate convoToUpdate
); );
expirationTimer = convoToUpdate.get('expireTimer');
expirationMode = changeToDisappearingMessageType( expireUpdate.expirationTimer = convoToUpdate.get('expireTimer');
expireUpdate.expirationType = changeToDisappearingMessageType(
convoToUpdate, convoToUpdate,
expireUpdate.expirationTimer,
convoToUpdate.get('expirationType') convoToUpdate.get('expirationType')
); );
expireUpdate.isLegacyDataMessage = true;
} }
} }
// 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 // TODO should review this
// NOTE this is only required for legacy disappearing message conversation settings I think?
const shouldDisappearButIsntMessage =
dataMessage.flags !== SignalService.DataMessage.Flags.EXPIRATION_TIMER_UPDATE &&
expirationMode === 'off' &&
expirationTimer === 0 &&
convoToUpdate.get('expirationType') !== 'off' &&
convoToUpdate.get('expireTimer') !== 0;
// 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 andshow the outdated client banner
if ( if (
isDisappearingMessagesV2Released && isDisappearingMessagesV2Released &&
(isLegacyDataMessage || isLegacyConversationSettingMessage || shouldDisappearButIsntMessage) (isLegacyDataMessage || isLegacyConversationSettingMessage || shouldDisappearButIsntMessage)
@ -443,24 +460,21 @@ export async function checkForExpireUpdateInContentMessage(
'WIP: Received a legacy disappearing message after v2 was released. Overriding it with the conversation settings', 'WIP: Received a legacy disappearing message after v2 was released. Overriding it with the conversation settings',
content content
); );
expirationTimer = convoToUpdate.get('expireTimer');
expirationMode = convoToUpdate.get('expirationType');
}
const expireUpdate: DisappearingMessageUpdate = { expireUpdate.expirationTimer = convoToUpdate.get('expireTimer');
expirationType: changeToDisappearingMessageType(convoToUpdate, expirationMode), expireUpdate.expirationType = changeToDisappearingMessageType(
expirationTimer, convoToUpdate,
lastDisappearingMessageChangeTimestamp, expireUpdate.expirationTimer,
isLegacyConversationSettingMessage, convoToUpdate.get('expirationType')
isLegacyDataMessage, );
isDisappearingMessagesV2Released, expireUpdate.isLegacyDataMessage = true;
}; }
return expireUpdate; return expireUpdate;
} }
// TODO legacy messages support will be removed in a future release // TODO legacy messages support will be removed in a future release
export function handleExpireUpdate( export function updateMessageModelToExpire(
converationModel: ConversationModel, converationModel: ConversationModel,
messageModel: MessageModel, messageModel: MessageModel,
expireUpdate?: DisappearingMessageUpdate expireUpdate?: DisappearingMessageUpdate
@ -470,7 +484,9 @@ export function handleExpireUpdate(
} }
if (converationModel.isPublic()) { if (converationModel.isPublic()) {
window.log.warn("updateExpireTimer() Disappearing messages aren't supported in communities"); window.log.warn(
"updateMessageModelToExpire() Disappearing messages aren't supported in communities"
);
return messageModel; return messageModel;
} }
@ -514,12 +530,14 @@ export async function checkHasOutdatedClient(
sender: ConversationModel, sender: ConversationModel,
expireUpdate: DisappearingMessageUpdate expireUpdate: DisappearingMessageUpdate
) { ) {
const isOutdated =
expireUpdate.isLegacyDataMessage || expireUpdate.isLegacyConversationSettingMessage;
const outdatedSender = const outdatedSender =
sender.get('nickname') || sender.get('displayNameInProfile') || sender.get('id'); sender.get('nickname') || sender.get('displayNameInProfile') || sender.get('id');
if (convoToUpdate.get('hasOutdatedClient')) { if (convoToUpdate.get('hasOutdatedClient')) {
// trigger notice banner // trigger notice banner
if (expireUpdate.isLegacyDataMessage || expireUpdate.isLegacyConversationSettingMessage) { if (isOutdated) {
if (convoToUpdate.get('hasOutdatedClient') !== outdatedSender) { if (convoToUpdate.get('hasOutdatedClient') !== outdatedSender) {
convoToUpdate.set({ convoToUpdate.set({
hasOutdatedClient: outdatedSender, hasOutdatedClient: outdatedSender,
@ -534,7 +552,7 @@ export async function checkHasOutdatedClient(
return; return;
} }
if (expireUpdate.isLegacyDataMessage || expireUpdate.isLegacyConversationSettingMessage) { if (isOutdated) {
convoToUpdate.set({ convoToUpdate.set({
hasOutdatedClient: outdatedSender, hasOutdatedClient: outdatedSender,
}); });

Loading…
Cancel
Save