From 0a81376ca09cf27bdeb3887cb73c843678527c30 Mon Sep 17 00:00:00 2001 From: Josh Perez <60019601+josh-signal@users.noreply.github.com> Date: Thu, 11 Aug 2022 18:03:22 -0400 Subject: [PATCH] Do not accept stories without a name and no deletedAtTimestamp --- ts/services/storageRecordOps.ts | 16 +++++++++++++--- ts/sql/Client.ts | 26 ++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/ts/services/storageRecordOps.ts b/ts/services/storageRecordOps.ts index bcaad6ff1..b41f2952f 100644 --- a/ts/services/storageRecordOps.ts +++ b/ts/services/storageRecordOps.ts @@ -1305,12 +1305,14 @@ export async function mergeStoryDistributionListRecord( details.push('adding unknown fields'); } + const deletedAtTimestamp = getTimestampFromLong( + storyDistributionListRecord.deletedAtTimestamp + ); + const storyDistribution: StoryDistributionWithMembersType = { id: listId, name: String(storyDistributionListRecord.name), - deletedAtTimestamp: isMyStories - ? undefined - : getTimestampFromLong(storyDistributionListRecord.deletedAtTimestamp), + deletedAtTimestamp: isMyStories ? undefined : deletedAtTimestamp, allowsReplies: Boolean(storyDistributionListRecord.allowsReplies), isBlockList: Boolean(storyDistributionListRecord.isBlockList), members: remoteListMembers, @@ -1352,6 +1354,14 @@ export async function mergeStoryDistributionListRecord( details.push('clearing unknown fields'); } + const isBadRemoteData = !deletedAtTimestamp && !storyDistribution.name; + if (isBadRemoteData) { + Object.assign(storyDistribution, { + name: localStoryDistributionList.name, + members: localStoryDistributionList.members, + }); + } + const { hasConflict, details: conflictDetails } = doRecordsConflict( toStoryDistributionListRecord(storyDistribution), storyDistributionListRecord diff --git a/ts/sql/Client.ts b/ts/sql/Client.ts index 8744b58aa..9f164c955 100644 --- a/ts/sql/Client.ts +++ b/ts/sql/Client.ts @@ -1746,6 +1746,10 @@ async function _deleteAllStoryDistributions(): Promise { async function createNewStoryDistribution( distribution: StoryDistributionWithMembersType ): Promise { + strictAssert( + distribution.name, + 'Distribution list does not have a valid name' + ); await channels.createNewStoryDistribution(distribution); } async function getAllStoryDistributionsWithMembers(): Promise< @@ -1761,6 +1765,17 @@ async function getStoryDistributionWithMembers( async function modifyStoryDistribution( distribution: StoryDistributionType ): Promise { + if (distribution.deletedAtTimestamp) { + strictAssert( + !distribution.name, + 'Attempt to delete distribution list but still has a name' + ); + } else { + strictAssert( + distribution.name, + 'Cannot clear distribution list name without deletedAtTimestamp set' + ); + } await channels.modifyStoryDistribution(distribution); } async function modifyStoryDistributionMembers( @@ -1779,6 +1794,17 @@ async function modifyStoryDistributionWithMembers( toRemove: Array; } ): Promise { + if (distribution.deletedAtTimestamp) { + strictAssert( + !distribution.name, + 'Attempt to delete distribution list but still has a name' + ); + } else { + strictAssert( + distribution.name, + 'Cannot clear distribution list name without deletedAtTimestamp set' + ); + } await channels.modifyStoryDistributionWithMembers(distribution, options); } async function deleteStoryDistribution(id: UUIDStringType): Promise {