diff --git a/ts/RemoteConfig.ts b/ts/RemoteConfig.ts index 35cdc1795..81b82d354 100644 --- a/ts/RemoteConfig.ts +++ b/ts/RemoteConfig.ts @@ -12,17 +12,18 @@ export type ConfigKeyType = | 'desktop.disableGV1' | 'desktop.groupCallOutboundRing' | 'desktop.internalUser' - | 'desktop.messageCleanup' | 'desktop.mandatoryProfileSharing' | 'desktop.mediaQuality.levels' + | 'desktop.messageCleanup' | 'desktop.messageRequests' | 'desktop.retryReceiptLifespan' | 'desktop.retryRespondMaxAge' - | 'desktop.senderKey.send' | 'desktop.senderKey.retry' + | 'desktop.senderKey.send' + | 'desktop.senderKeyMaxAge' | 'desktop.sendSenderKey3' - | 'desktop.showUserBadges2' | 'desktop.showUserBadges.beta' + | 'desktop.showUserBadges2' | 'desktop.usernames' | 'global.calling.maxGroupCallRingSize' | 'global.groupsv2.groupSizeHardLimit' diff --git a/ts/util/sendToGroup.ts b/ts/util/sendToGroup.ts index ae2ef0cd7..9143f1288 100644 --- a/ts/util/sendToGroup.ts +++ b/ts/util/sendToGroup.ts @@ -289,7 +289,7 @@ export async function sendToGroupViaSenderKey(options: { ); // 1. Add sender key info if we have none, or clear out if it's too old - const THIRTY_DAYS = 30 * DAY; + const EXPIRE_DURATION = getSenderKeyExpireDuration(); // Note: From here on, generally need to recurse if we change senderKeyInfo const senderKeyInfo = sendTarget.getSenderKeyInfo(); @@ -310,7 +310,7 @@ export async function sendToGroupViaSenderKey(options: { recursionCount: recursionCount + 1, }); } - if (isOlderThan(senderKeyInfo.createdAtDate, THIRTY_DAYS)) { + if (isOlderThan(senderKeyInfo.createdAtDate, EXPIRE_DURATION)) { const { createdAtDate } = senderKeyInfo; log.info( `sendToGroupViaSenderKey/${logId}: Resetting sender key; ${createdAtDate} is too old` @@ -657,6 +657,30 @@ export async function sendToGroupViaSenderKey(options: { // Utility Methods +const MAX_SENDER_KEY_EXPIRE_DURATION = 90 * DAY; + +function getSenderKeyExpireDuration(): number { + try { + const parsed = parseIntOrThrow( + window.Signal.RemoteConfig.getValue('desktop.senderKeyMaxAge'), + 'getSenderKeyExpireDuration' + ); + + const duration = Math.min(parsed, MAX_SENDER_KEY_EXPIRE_DURATION); + log.info( + `getSenderKeyExpireDuration: using expire duration of ${duration}` + ); + + return duration; + } catch (error) { + log.warn( + `getSenderKeyExpireDuration: Failed to parse integer. Using default of ${MAX_SENDER_KEY_EXPIRE_DURATION}.`, + error && error.stack ? error.stack : error + ); + return MAX_SENDER_KEY_EXPIRE_DURATION; + } +} + export function _shouldFailSend(error: unknown, logId: string): boolean { const logError = (message: string) => { log.error(`_shouldFailSend/${logId}: ${message}`);