From caa579f3b833fb07fe6928166ade07cc9fbf1287 Mon Sep 17 00:00:00 2001 From: Daniel Gasienica Date: Wed, 28 Feb 2018 20:02:17 -0500 Subject: [PATCH] Hotfix: Ignore iOS group expire timer sync resets (#2086) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Hotfix: Ignore invalid expire timer sync resets iOS omits `expireTimer` protobuf property to denote disappearing messages have been turned off. However, that doesn’t allow us to distinguish it from old clients that are not aware of this property. This change ignores these invalid values until we consistently use `0` to denote disabled disappearing messages (as Android does). - [x] Ignore non-numeric `expireTimer` values during contact sync. Long-term, we’ll use `0` to denote turning off expire timers. - [x] Log what value `expireTimer` is set to. - [x] Log changes to `expireTimer` in `handleDataMessage` until it uses `ConversationController::updateExpirationTimer`. --- js/background.js | 49 +++++++++++++++++++++++++------------- js/models/conversations.js | 2 ++ js/models/messages.js | 15 ++++++++++++ 3 files changed, 49 insertions(+), 17 deletions(-) diff --git a/js/background.js b/js/background.js index 42d74b8df..0788764ac 100644 --- a/js/background.js +++ b/js/background.js @@ -438,17 +438,24 @@ color: details.color, active_at: activeAt, })).then(function() { - // this needs to be inline to get access to conversation model - if (typeof details.expireTimer !== 'undefined') { - var source = textsecure.storage.user.getNumber(); - var receivedAt = Date.now(); - return conversation.updateExpirationTimer( - details.expireTimer, - source, - receivedAt, - {fromSync: true} + const { expireTimer } = details; + const isValidExpireTimer = typeof expireTimer === 'number'; + if (!isValidExpireTimer) { + console.log( + 'Ignore invalid expire timer.', + 'Expected numeric `expireTimer`, got:', expireTimer ); + return; } + + var source = textsecure.storage.user.getNumber(); + var receivedAt = Date.now(); + return conversation.updateExpirationTimer( + expireTimer, + source, + receivedAt, + {fromSync: true} + ); }); }) .then(function() { @@ -498,16 +505,24 @@ } return wrapDeferred(conversation.save(updates)).then(function() { - if (typeof details.expireTimer !== 'undefined') { - var source = textsecure.storage.user.getNumber(); - var receivedAt = Date.now(); - return conversation.updateExpirationTimer( - details.expireTimer, - source, - receivedAt, - {fromSync: true} + const { expireTimer } = details; + const isValidExpireTimer = typeof expireTimer === 'number'; + if (!isValidExpireTimer) { + console.log( + 'Ignore invalid expire timer.', + 'Expected numeric `expireTimer`, got:', expireTimer ); + return; } + + var source = textsecure.storage.user.getNumber(); + var receivedAt = Date.now(); + return conversation.updateExpirationTimer( + expireTimer, + source, + receivedAt, + {fromSync: true} + ); }).then(ev.confirm); }); } diff --git a/js/models/conversations.js b/js/models/conversations.js index 6ed49da82..63e244ac1 100644 --- a/js/models/conversations.js +++ b/js/models/conversations.js @@ -707,6 +707,8 @@ console.log( 'Updating expireTimer for conversation', this.idForLogging(), + 'to', + expireTimer, 'via', source ); diff --git a/js/models/messages.js b/js/models/messages.js index dbde2dd90..3e7ea0a70 100644 --- a/js/models/messages.js +++ b/js/models/messages.js @@ -457,6 +457,21 @@ message.set({expireTimer: dataMessage.expireTimer}); } + // NOTE: Remove once the above uses + // `Conversation::updateExpirationTimer`: + const { expireTimer } = dataMessage; + const shouldLogExpireTimerChange = + message.isExpirationTimerUpdate() || expireTimer; + if (shouldLogExpireTimerChange) { + console.log( + 'Updating expireTimer for conversation', + conversation.idForLogging(), + 'to', + expireTimer, + 'via `handleDataMessage`' + ); + } + if (!message.isEndSession() && !message.isGroupUpdate()) { if (dataMessage.expireTimer) { if (dataMessage.expireTimer !== conversation.get('expireTimer')) {