From 467f96acac22a72f696f81afb338ddd294291e5c Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Fri, 24 Jul 2020 14:48:56 +1000 Subject: [PATCH 1/3] substract 1 hour for control of ttl message so PN can ignore them --- ts/session/constants.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ts/session/constants.ts b/ts/session/constants.ts index eb08e2103..73f5eee1f 100644 --- a/ts/session/constants.ts +++ b/ts/session/constants.ts @@ -3,10 +3,10 @@ import { NumberUtils } from './utils'; // Default TTL export const TTL_DEFAULT = { PAIRING_REQUEST: NumberUtils.timeAsMs(2, 'minutes'), - DEVICE_UNPAIRING: NumberUtils.timeAsMs(4, 'days'), - SESSION_REQUEST: NumberUtils.timeAsMs(4, 'days'), - SESSION_ESTABLISHED: NumberUtils.timeAsMs(2, 'days'), - END_SESSION_MESSAGE: NumberUtils.timeAsMs(4, 'days'), + DEVICE_UNPAIRING: NumberUtils.timeAsMs(4 * 24 - 1, 'hours'), + SESSION_REQUEST: NumberUtils.timeAsMs(4 * 24 - 1, 'hours'), + SESSION_ESTABLISHED: NumberUtils.timeAsMs(2 * 24 - 1, 'hours'), + END_SESSION_MESSAGE: NumberUtils.timeAsMs(4 * 24 - 1, 'hours'), TYPING_MESSAGE: NumberUtils.timeAsMs(1, 'minute'), ONLINE_BROADCAST: NumberUtils.timeAsMs(1, 'minute'), REGULAR_MESSAGE: NumberUtils.timeAsMs(2, 'days'), From 48edd431da13f418965a7c11d4278c50aee22113 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Fri, 24 Jul 2020 15:29:33 +1000 Subject: [PATCH 2/3] use constants rather than string for ttl --- ts/session/constants.ts | 25 +++++++++++++++---------- ts/session/utils/Number.ts | 22 ++++------------------ 2 files changed, 19 insertions(+), 28 deletions(-) diff --git a/ts/session/constants.ts b/ts/session/constants.ts index 73f5eee1f..70fbb4ff7 100644 --- a/ts/session/constants.ts +++ b/ts/session/constants.ts @@ -1,13 +1,18 @@ -import { NumberUtils } from './utils'; +import { DAYS, HOURS, MINUTES } from './utils/Number'; +// tslint:disable: binary-expression-operand-order -// Default TTL +/** + * FIXME The -1 hours is a hack to make the PN not trigger a Notification for those control message. + * Apple devices must show a Notification if a PN is received, and for those + * control message, there is nothing to display (yet). + */ export const TTL_DEFAULT = { - PAIRING_REQUEST: NumberUtils.timeAsMs(2, 'minutes'), - DEVICE_UNPAIRING: NumberUtils.timeAsMs(4 * 24 - 1, 'hours'), - SESSION_REQUEST: NumberUtils.timeAsMs(4 * 24 - 1, 'hours'), - SESSION_ESTABLISHED: NumberUtils.timeAsMs(2 * 24 - 1, 'hours'), - END_SESSION_MESSAGE: NumberUtils.timeAsMs(4 * 24 - 1, 'hours'), - TYPING_MESSAGE: NumberUtils.timeAsMs(1, 'minute'), - ONLINE_BROADCAST: NumberUtils.timeAsMs(1, 'minute'), - REGULAR_MESSAGE: NumberUtils.timeAsMs(2, 'days'), + PAIRING_REQUEST: 2 * MINUTES, + DEVICE_UNPAIRING: 4 * DAYS - 1 * HOURS, + SESSION_REQUEST: 4 * DAYS - 1 * HOURS, + SESSION_ESTABLISHED: 2 * DAYS - 1 * HOURS, + END_SESSION_MESSAGE: 4 * DAYS - 1 * HOURS, + TYPING_MESSAGE: 1 * MINUTES, + ONLINE_BROADCAST: 1 * MINUTES, + REGULAR_MESSAGE: 2 * DAYS, }; diff --git a/ts/session/utils/Number.ts b/ts/session/utils/Number.ts index bc4f4267f..0948dcd67 100644 --- a/ts/session/utils/Number.ts +++ b/ts/session/utils/Number.ts @@ -8,24 +8,10 @@ type TimeUnit = | 'day' | 'days'; -export const timeAsMs = (value: number, unit: TimeUnit) => { - // Converts a time to milliseconds - // Valid units: second, minute, hour, day - const unitAsSingular = unit.replace(new RegExp('s?$'), ''); - - switch (unitAsSingular) { - case 'second': - return value * 1000; - case 'minute': - return value * 60 * 1000; - case 'hour': - return value * 60 * 60 * 1000; - case 'day': - return value * 24 * 60 * 60 * 1000; - default: - return value; - } -}; +export const MINUTES = 60 * 1000; // in ms +// tslint:disable: binary-expression-operand-order +export const HOURS = 60 * MINUTES; // in ms +export const DAYS = 24 * HOURS; // in ms export const msAsUnit = (value: number, unit: TimeUnit) => { // Converts milliseconds to your preferred unit From 394030b711ecb8ab6c6133d16ec34097f9c1fd9c Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Fri, 24 Jul 2020 15:37:28 +1000 Subject: [PATCH 3/3] remove getDefaultTTL and use Constants values instead --- ts/session/messages/outgoing/content/ContentMessage.ts | 8 -------- .../messages/outgoing/content/SessionRequestMessage.ts | 8 +------- ts/session/messages/outgoing/content/data/ChatMessage.ts | 3 ++- .../outgoing/content/data/ExpirationTimerUpdateMessage.ts | 3 ++- .../outgoing/content/data/GroupInvitationMessage.ts | 3 ++- .../outgoing/content/data/group/ClosedGroupChatMessage.ts | 3 ++- .../outgoing/content/data/group/ClosedGroupMessage.ts | 3 ++- .../content/data/mediumgroup/MediumGroupMessage.ts | 3 ++- .../messages/outgoing/content/receipt/ReceiptMessage.ts | 3 ++- .../messages/outgoing/content/sync/RequestSyncMessage.ts | 3 ++- ts/session/messages/outgoing/content/sync/SyncMessage.ts | 3 ++- ts/session/protocols/SessionProtocol.ts | 3 ++- ts/test/session/protocols/SessionProtocol_test.ts | 7 ++++--- 13 files changed, 25 insertions(+), 28 deletions(-) diff --git a/ts/session/messages/outgoing/content/ContentMessage.ts b/ts/session/messages/outgoing/content/ContentMessage.ts index abe7b97a1..d7cbf4677 100644 --- a/ts/session/messages/outgoing/content/ContentMessage.ts +++ b/ts/session/messages/outgoing/content/ContentMessage.ts @@ -9,12 +9,4 @@ export abstract class ContentMessage extends Message { public abstract ttl(): number; protected abstract contentProto(): SignalService.Content; - - /** - * If the message is not a message with a specific TTL, - * this value can be used in all child classes - */ - protected getDefaultTTL(): number { - return Constants.TTL_DEFAULT.REGULAR_MESSAGE; - } } diff --git a/ts/session/messages/outgoing/content/SessionRequestMessage.ts b/ts/session/messages/outgoing/content/SessionRequestMessage.ts index 765be235b..57d2c9007 100644 --- a/ts/session/messages/outgoing/content/SessionRequestMessage.ts +++ b/ts/session/messages/outgoing/content/SessionRequestMessage.ts @@ -25,14 +25,8 @@ export class SessionRequestMessage extends ContentMessage { this.preKeyBundle = params.preKeyBundle; } - public static defaultTTL(): number { - // Gets the default TTL for Session Request, as - // public static readonly ttl: number <-- cannot be assigned a non-literal - return Constants.TTL_DEFAULT.SESSION_REQUEST; - } - public ttl(): number { - return SessionRequestMessage.defaultTTL(); + return Constants.TTL_DEFAULT.SESSION_REQUEST; } protected getPreKeyBundleMessage(): SignalService.PreKeyBundleMessage { diff --git a/ts/session/messages/outgoing/content/data/ChatMessage.ts b/ts/session/messages/outgoing/content/data/ChatMessage.ts index 0ad70faa8..3f07a3de4 100644 --- a/ts/session/messages/outgoing/content/data/ChatMessage.ts +++ b/ts/session/messages/outgoing/content/data/ChatMessage.ts @@ -3,6 +3,7 @@ import { SignalService } from '../../../../../protobuf'; import { MessageParams } from '../../Message'; import { LokiProfile } from '../../../../../types/Message'; import ByteBuffer from 'bytebuffer'; +import { Constants } from '../../../..'; export interface AttachmentPointer { id?: number; @@ -75,7 +76,7 @@ export class ChatMessage extends DataMessage { } public ttl(): number { - return this.getDefaultTTL(); + return Constants.TTL_DEFAULT.REGULAR_MESSAGE; } public dataProto(): SignalService.DataMessage { diff --git a/ts/session/messages/outgoing/content/data/ExpirationTimerUpdateMessage.ts b/ts/session/messages/outgoing/content/data/ExpirationTimerUpdateMessage.ts index 93ba71770..3a25caa7b 100644 --- a/ts/session/messages/outgoing/content/data/ExpirationTimerUpdateMessage.ts +++ b/ts/session/messages/outgoing/content/data/ExpirationTimerUpdateMessage.ts @@ -4,6 +4,7 @@ import { MessageParams } from '../../Message'; import { StringUtils } from '../../../../utils'; import { DataMessage } from './DataMessage'; import { PubKey } from '../../../../types'; +import { Constants } from '../../../..'; interface ExpirationTimerUpdateMessageParams extends MessageParams { groupId?: string | PubKey; @@ -26,7 +27,7 @@ export class ExpirationTimerUpdateMessage extends DataMessage { } public ttl(): number { - return this.getDefaultTTL(); + return Constants.TTL_DEFAULT.REGULAR_MESSAGE; } public dataProto(): SignalService.DataMessage { diff --git a/ts/session/messages/outgoing/content/data/GroupInvitationMessage.ts b/ts/session/messages/outgoing/content/data/GroupInvitationMessage.ts index c80ce06e5..742b85a96 100644 --- a/ts/session/messages/outgoing/content/data/GroupInvitationMessage.ts +++ b/ts/session/messages/outgoing/content/data/GroupInvitationMessage.ts @@ -1,6 +1,7 @@ import { DataMessage } from './DataMessage'; import { SignalService } from '../../../../../protobuf'; import { MessageParams } from '../../Message'; +import { Constants } from '../../../..'; interface GroupInvitationMessageParams extends MessageParams { serverAddress: string; @@ -21,7 +22,7 @@ export class GroupInvitationMessage extends DataMessage { } public ttl(): number { - return this.getDefaultTTL(); + return Constants.TTL_DEFAULT.REGULAR_MESSAGE; } public dataProto(): SignalService.DataMessage { diff --git a/ts/session/messages/outgoing/content/data/group/ClosedGroupChatMessage.ts b/ts/session/messages/outgoing/content/data/group/ClosedGroupChatMessage.ts index 68ab5188f..4a832aa36 100644 --- a/ts/session/messages/outgoing/content/data/group/ClosedGroupChatMessage.ts +++ b/ts/session/messages/outgoing/content/data/group/ClosedGroupChatMessage.ts @@ -2,6 +2,7 @@ import { SignalService } from '../../../../../../protobuf'; import { ChatMessage } from '../ChatMessage'; import { ClosedGroupMessage } from './ClosedGroupMessage'; import { PubKey } from '../../../../../types'; +import { Constants } from '../../../../..'; interface ClosedGroupChatMessageParams { identifier?: string; @@ -22,7 +23,7 @@ export class ClosedGroupChatMessage extends ClosedGroupMessage { } public ttl(): number { - return this.getDefaultTTL(); + return Constants.TTL_DEFAULT.REGULAR_MESSAGE; } public dataProto(): SignalService.DataMessage { diff --git a/ts/session/messages/outgoing/content/data/group/ClosedGroupMessage.ts b/ts/session/messages/outgoing/content/data/group/ClosedGroupMessage.ts index 701634d4f..9b6c80704 100644 --- a/ts/session/messages/outgoing/content/data/group/ClosedGroupMessage.ts +++ b/ts/session/messages/outgoing/content/data/group/ClosedGroupMessage.ts @@ -3,6 +3,7 @@ import { SignalService } from '../../../../../../protobuf'; import { MessageParams } from '../../../Message'; import { PubKey } from '../../../../../types'; import { StringUtils } from '../../../../../utils'; +import { Constants } from '../../../../..'; export interface ClosedGroupMessageParams extends MessageParams { groupId: string | PubKey; @@ -20,7 +21,7 @@ export abstract class ClosedGroupMessage extends DataMessage { } public ttl(): number { - return this.getDefaultTTL(); + return Constants.TTL_DEFAULT.REGULAR_MESSAGE; } public dataProto(): SignalService.DataMessage { diff --git a/ts/session/messages/outgoing/content/data/mediumgroup/MediumGroupMessage.ts b/ts/session/messages/outgoing/content/data/mediumgroup/MediumGroupMessage.ts index fbef3daa6..a505d7155 100644 --- a/ts/session/messages/outgoing/content/data/mediumgroup/MediumGroupMessage.ts +++ b/ts/session/messages/outgoing/content/data/mediumgroup/MediumGroupMessage.ts @@ -3,6 +3,7 @@ import { SignalService } from '../../../../../../protobuf'; import { MessageParams } from '../../../Message'; import { PubKey } from '../../../../../types'; import { StringUtils } from '../../../../../utils'; +import { Constants } from '../../../../..'; export interface RatchetKey { chainKey: Uint8Array; @@ -26,7 +27,7 @@ export abstract class MediumGroupMessage extends DataMessage { } public ttl(): number { - return this.getDefaultTTL(); + return Constants.TTL_DEFAULT.REGULAR_MESSAGE; } public dataProto(): SignalService.DataMessage { diff --git a/ts/session/messages/outgoing/content/receipt/ReceiptMessage.ts b/ts/session/messages/outgoing/content/receipt/ReceiptMessage.ts index ccef56c38..615989bcb 100644 --- a/ts/session/messages/outgoing/content/receipt/ReceiptMessage.ts +++ b/ts/session/messages/outgoing/content/receipt/ReceiptMessage.ts @@ -1,6 +1,7 @@ import { ContentMessage } from '../ContentMessage'; import { SignalService } from '../../../../../protobuf'; import { MessageParams } from '../../Message'; +import { Constants } from '../../../..'; interface ReceiptMessageParams extends MessageParams { timestamps: Array; @@ -14,7 +15,7 @@ export abstract class ReceiptMessage extends ContentMessage { } public ttl(): number { - return this.getDefaultTTL(); + return Constants.TTL_DEFAULT.REGULAR_MESSAGE; } public abstract getReceiptType(): SignalService.ReceiptMessage.Type; diff --git a/ts/session/messages/outgoing/content/sync/RequestSyncMessage.ts b/ts/session/messages/outgoing/content/sync/RequestSyncMessage.ts index 146babc7f..85d40de0c 100644 --- a/ts/session/messages/outgoing/content/sync/RequestSyncMessage.ts +++ b/ts/session/messages/outgoing/content/sync/RequestSyncMessage.ts @@ -1,6 +1,7 @@ import { SyncMessage } from './SyncMessage'; import { SignalService } from '../../../../../protobuf'; import { MessageParams } from '../../Message'; +import { Constants } from '../../../..'; interface RequestSyncMessageParams extends MessageParams { requestType: SignalService.SyncMessage.Request.Type; @@ -15,7 +16,7 @@ export abstract class RequestSyncMessage extends SyncMessage { } public ttl(): number { - return this.getDefaultTTL(); + return Constants.TTL_DEFAULT.REGULAR_MESSAGE; } protected contentProto(): SignalService.Content { diff --git a/ts/session/messages/outgoing/content/sync/SyncMessage.ts b/ts/session/messages/outgoing/content/sync/SyncMessage.ts index 6f3a25b19..063bf55d7 100644 --- a/ts/session/messages/outgoing/content/sync/SyncMessage.ts +++ b/ts/session/messages/outgoing/content/sync/SyncMessage.ts @@ -1,10 +1,11 @@ import { ContentMessage } from '../ContentMessage'; import { SignalService } from '../../../../../protobuf'; import * as crypto from 'crypto'; +import { Constants } from '../../../..'; export abstract class SyncMessage extends ContentMessage { public ttl(): number { - return this.getDefaultTTL(); + return Constants.TTL_DEFAULT.REGULAR_MESSAGE; } protected contentProto(): SignalService.Content { diff --git a/ts/session/protocols/SessionProtocol.ts b/ts/session/protocols/SessionProtocol.ts index 8e15fa875..df98e4fbd 100644 --- a/ts/session/protocols/SessionProtocol.ts +++ b/ts/session/protocols/SessionProtocol.ts @@ -3,6 +3,7 @@ import { createOrUpdateItem, getItemById } from '../../../js/modules/data'; import { MessageSender } from '../sending'; import { MessageUtils } from '../utils'; import { PubKey } from '../types'; +import { Constants } from '..'; interface StringToNumberMap { [key: string]: number; @@ -81,7 +82,7 @@ export class SessionProtocol { const now = Date.now(); const sentTimestamps = Object.entries(this.sentSessionsTimestamp); const promises = sentTimestamps.map(async ([device, sent]) => { - const expireTime = sent + SessionRequestMessage.defaultTTL(); + const expireTime = sent + Constants.TTL_DEFAULT.SESSION_REQUEST; // Check if we need to send a session request if (now < expireTime) { return; diff --git a/ts/test/session/protocols/SessionProtocol_test.ts b/ts/test/session/protocols/SessionProtocol_test.ts index e836c4488..9ae9adec3 100644 --- a/ts/test/session/protocols/SessionProtocol_test.ts +++ b/ts/test/session/protocols/SessionProtocol_test.ts @@ -7,6 +7,7 @@ import { SessionRequestMessage } from '../../../session/messages/outgoing'; import { TextEncoder } from 'util'; import { MessageSender } from '../../../session/sending'; import { PubKey } from '../../../session/types'; +import { Constants } from '../../../session'; // tslint:disable-next-line: max-func-body-length describe('SessionProtocol', () => { @@ -124,7 +125,7 @@ describe('SessionProtocol', () => { }); // Set the time just before expiry - clock.tick(SessionRequestMessage.defaultTTL() - 100); + clock.tick(Constants.TTL_DEFAULT.SESSION_REQUEST - 100); await SessionProtocol.checkSessionRequestExpiry(); expect(getItemById.calledWith('sentSessionsTimestamp')); @@ -140,7 +141,7 @@ describe('SessionProtocol', () => { }); // Expire the request - clock.tick(SessionRequestMessage.defaultTTL() + 100); + clock.tick(Constants.TTL_DEFAULT.SESSION_REQUEST + 100); await SessionProtocol.checkSessionRequestExpiry(); expect(getItemById.calledWith('sentSessionsTimestamp')); @@ -159,7 +160,7 @@ describe('SessionProtocol', () => { sandbox.stub(SessionProtocol, 'sendSessionRequestIfNeeded').resolves(); // Expire the request - clock.tick(SessionRequestMessage.defaultTTL() + 100); + clock.tick(Constants.TTL_DEFAULT.SESSION_REQUEST + 100); await SessionProtocol.checkSessionRequestExpiry(); expect(getItemById.calledWith('sentSessionsTimestamp'));