From 9f7ee9ae7957406d6c71f29ebfaf6f5b5aaea794 Mon Sep 17 00:00:00 2001 From: Josh Perez <60019601+josh-signal@users.noreply.github.com> Date: Mon, 11 Apr 2022 17:28:01 -0400 Subject: [PATCH] Force set expirationStartTimestamp on story messages --- ts/background.ts | 13 ++++++++++++- ts/models/messages.ts | 14 ++++++++++++++ ts/services/storyLoader.ts | 31 +++++++++++++++++++++++++++++++ ts/textsecure/MessageReceiver.ts | 4 +++- 4 files changed, 60 insertions(+), 2 deletions(-) diff --git a/ts/background.ts b/ts/background.ts index ec59cd105..cf3bb46ca 100644 --- a/ts/background.ts +++ b/ts/background.ts @@ -38,7 +38,11 @@ import { normalizeUuid } from './util/normalizeUuid'; import { filter } from './util/iterables'; import { isNotNil } from './util/isNotNil'; import { IdleDetector } from './IdleDetector'; -import { loadStories, getStoriesForRedux } from './services/storyLoader'; +import { + getStoriesForRedux, + loadStories, + repairUnexpiredStories, +} from './services/storyLoader'; import { senderCertificateService } from './services/senderCertificate'; import { GROUP_CREDENTIALS_KEY } from './services/groupCredentialFetcher'; import * as KeyboardLayout from './services/keyboardLayout'; @@ -707,6 +711,13 @@ export async function startApp(): Promise { window.storage.remove('remoteBuildExpiration'); } + if ( + window.isBeforeVersion(lastVersion, 'v5.40.0') && + window.isAfterVersion(lastVersion, 'v5.36.0') + ) { + await repairUnexpiredStories(); + } + if (window.isBeforeVersion(lastVersion, 'v1.29.2-beta.1')) { // Stickers flags await Promise.all([ diff --git a/ts/models/messages.ts b/ts/models/messages.ts index fb3690dfa..23f8b3c38 100644 --- a/ts/models/messages.ts +++ b/ts/models/messages.ts @@ -2790,6 +2790,20 @@ export class MessageModel extends window.Backbone.Model { } } + if ( + isStory(message.attributes) && + !message.get('expirationStartTimestamp') + ) { + message.set( + 'expirationStartTimestamp', + Math.min( + message.get('serverTimestamp') || message.get('timestamp'), + Date.now() + ) + ); + changed = true; + } + // Does this message have any pending, previously-received associated reactions? const reactions = Reactions.getSingleton().forMessage(message); await Promise.all( diff --git a/ts/services/storyLoader.ts b/ts/services/storyLoader.ts index 4264c2620..fdc5e3e71 100644 --- a/ts/services/storyLoader.ts +++ b/ts/services/storyLoader.ts @@ -65,3 +65,34 @@ export function getStoriesForRedux(): Array { return stories; } + +export async function repairUnexpiredStories(): Promise { + if (!storyData) { + await loadStories(); + } + + strictAssert(storyData, 'Could not load stories'); + + const storiesWithExpiry = storyData + .filter(story => !story.expirationStartTimestamp) + .map(story => ({ + ...story, + expirationStartTimestamp: Math.min( + story.serverTimestamp || story.timestamp, + Date.now() + ), + })); + + log.info( + 'repairUnexpiredStories: repairing number of stories', + storiesWithExpiry.length + ); + + await Promise.all( + storiesWithExpiry.map(messageAttributes => { + return window.Signal.Data.saveMessage(messageAttributes, { + ourUuid: window.textsecure.storage.user.getCheckedUuid().toString(), + }); + }) + ); +} diff --git a/ts/textsecure/MessageReceiver.ts b/ts/textsecure/MessageReceiver.ts index 0a08ce3eb..479a1d971 100644 --- a/ts/textsecure/MessageReceiver.ts +++ b/ts/textsecure/MessageReceiver.ts @@ -1814,7 +1814,9 @@ export default class MessageReceiver } const expireTimer = Math.min( - (envelope.serverTimestamp + durations.DAY - Date.now()) / 1000, + Math.floor( + (envelope.serverTimestamp + durations.DAY - Date.now()) / 1000 + ), durations.DAY / 1000 );