Do not accept stories without a name and no deletedAtTimestamp

This commit is contained in:
Josh Perez 2022-08-11 18:03:22 -04:00 committed by GitHub
parent f09b214016
commit 0a81376ca0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 39 additions and 3 deletions

View File

@ -1305,12 +1305,14 @@ export async function mergeStoryDistributionListRecord(
details.push('adding unknown fields'); details.push('adding unknown fields');
} }
const deletedAtTimestamp = getTimestampFromLong(
storyDistributionListRecord.deletedAtTimestamp
);
const storyDistribution: StoryDistributionWithMembersType = { const storyDistribution: StoryDistributionWithMembersType = {
id: listId, id: listId,
name: String(storyDistributionListRecord.name), name: String(storyDistributionListRecord.name),
deletedAtTimestamp: isMyStories deletedAtTimestamp: isMyStories ? undefined : deletedAtTimestamp,
? undefined
: getTimestampFromLong(storyDistributionListRecord.deletedAtTimestamp),
allowsReplies: Boolean(storyDistributionListRecord.allowsReplies), allowsReplies: Boolean(storyDistributionListRecord.allowsReplies),
isBlockList: Boolean(storyDistributionListRecord.isBlockList), isBlockList: Boolean(storyDistributionListRecord.isBlockList),
members: remoteListMembers, members: remoteListMembers,
@ -1352,6 +1354,14 @@ export async function mergeStoryDistributionListRecord(
details.push('clearing unknown fields'); 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( const { hasConflict, details: conflictDetails } = doRecordsConflict(
toStoryDistributionListRecord(storyDistribution), toStoryDistributionListRecord(storyDistribution),
storyDistributionListRecord storyDistributionListRecord

View File

@ -1746,6 +1746,10 @@ async function _deleteAllStoryDistributions(): Promise<void> {
async function createNewStoryDistribution( async function createNewStoryDistribution(
distribution: StoryDistributionWithMembersType distribution: StoryDistributionWithMembersType
): Promise<void> { ): Promise<void> {
strictAssert(
distribution.name,
'Distribution list does not have a valid name'
);
await channels.createNewStoryDistribution(distribution); await channels.createNewStoryDistribution(distribution);
} }
async function getAllStoryDistributionsWithMembers(): Promise< async function getAllStoryDistributionsWithMembers(): Promise<
@ -1761,6 +1765,17 @@ async function getStoryDistributionWithMembers(
async function modifyStoryDistribution( async function modifyStoryDistribution(
distribution: StoryDistributionType distribution: StoryDistributionType
): Promise<void> { ): Promise<void> {
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); await channels.modifyStoryDistribution(distribution);
} }
async function modifyStoryDistributionMembers( async function modifyStoryDistributionMembers(
@ -1779,6 +1794,17 @@ async function modifyStoryDistributionWithMembers(
toRemove: Array<UUIDStringType>; toRemove: Array<UUIDStringType>;
} }
): Promise<void> { ): Promise<void> {
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); await channels.modifyStoryDistributionWithMembers(distribution, options);
} }
async function deleteStoryDistribution(id: UUIDStringType): Promise<void> { async function deleteStoryDistribution(id: UUIDStringType): Promise<void> {