Delete right away if we already have the message

This commit is contained in:
Josh Perez 2020-07-27 14:15:32 -04:00 committed by Scott Nonnenberg
parent dfa846e4f3
commit 1ad2b175dc
10 changed files with 194 additions and 27 deletions

114
ts/model-types.d.ts vendored Normal file
View file

@ -0,0 +1,114 @@
import * as Backbone from 'backbone';
import { ColorType, LocalizerType } from './types/Util';
import { SendOptionsType } from './textsecure/SendMessage';
import { ConversationType } from './state/ducks/conversations';
import { SyncMessageClass } from './textsecure.d';
interface ModelAttributesInterface {
[key: string]: any;
}
type DeletesAttributesType = {
fromId: string;
serverTimestamp: number;
targetSentTimestamp: number;
};
declare class DeletesModelType extends Backbone.Model<DeletesAttributesType> {
forMessage(message: MessageModelType): Array<DeletesModelType>;
onDelete(doe: DeletesAttributesType): Promise<void>;
}
type TaskResultType = any;
type MessageAttributesType = {
id: string;
serverTimestamp: number;
};
declare class MessageModelType extends Backbone.Model<MessageAttributesType> {
id: string;
static updateTimers(): void;
getContact(): ConversationModelType | undefined | null;
getConversation(): ConversationModelType | undefined | null;
getPropsForSearchResult(): any;
getPropsForBubble(): any;
cleanup(): Promise<void>;
handleDeleteForEveryone(
doe: DeletesModelType,
shouldPersist: boolean
): Promise<void>;
}
type ConversationTypeType = 'private' | 'group';
type ConversationAttributesType = {
id: string;
uuid?: string;
e164?: string;
active_at?: number | null;
draft?: string;
groupId?: string;
isArchived?: boolean;
lastMessage?: string;
members?: Array<string>;
needsVerification?: boolean;
profileFamilyName?: string | null;
profileKey?: string | null;
profileName?: string | null;
profileSharing: boolean;
storageID?: string;
type: ConversationTypeType;
unreadCount?: number;
verified?: number;
version: number;
};
declare class ConversationModelType extends Backbone.Model<
ConversationAttributesType
> {
id: string;
cachedProps: ConversationType;
initialPromise: Promise<any>;
applyMessageRequestResponse(
response: number,
options?: { fromSync: boolean }
): void;
cleanup(): Promise<void>;
disableProfileSharing(): void;
getAccepted(): boolean;
getAvatarPath(): string | undefined;
getColor(): ColorType | undefined;
getIsAddedByContact(): boolean;
getName(): string | undefined;
getNumber(): string;
getProfileName(): string | undefined;
getProfiles(): Promise<Array<Promise<void>>>;
getRecipients: () => Array<string>;
getSendOptions(options?: any): SendOptionsType | undefined;
getTitle(): string;
idForLogging(): string;
isVerified(): boolean;
safeGetVerified(): Promise<number>;
setProfileKey(profileKey?: string | null): Promise<void>;
toggleVerified(): Promise<TaskResultType>;
unblock(): boolean | undefined;
updateE164: (e164?: string) => void;
updateLastMessage: () => Promise<void>;
updateUuid: (uuid?: string) => void;
wrapSend: (sendPromise: Promise<any>) => Promise<any>;
}
declare class ConversationModelCollectionType extends Backbone.Collection<
ConversationModelType
> {
resetLookups(): void;
}
declare class MessageModelCollectionType extends Backbone.Collection<
MessageModelType
> {}

View file

@ -0,0 +1,26 @@
import { DeletesModelType, MessageModelType } from '../model-types.d';
const ONE_DAY = 24 * 60 * 60 * 1000;
export async function deleteForEveryone(
message: MessageModelType,
doe: DeletesModelType,
shouldPersist: boolean = true
): Promise<void> {
// Make sure the server timestamps for the DOE and the matching message
// are less than one day apart
const delta = Math.abs(
doe.get('serverTimestamp') - message.get('serverTimestamp')
);
if (delta > ONE_DAY) {
window.log.info('Received late DOE. Dropping.', {
fromId: doe.get('fromId'),
targetSentTimestamp: doe.get('targetSentTimestamp'),
messageServerTimestamp: message.get('serverTimestamp'),
deleteServerTimestamp: doe.get('serverTimestamp'),
});
return;
}
await message.handleDeleteForEveryone(doe, shouldPersist);
}

View file

@ -4,6 +4,7 @@ import { arrayBufferToObjectURL } from './arrayBufferToObjectURL';
import { combineNames } from './combineNames';
import { createBatcher } from './batcher';
import { createWaitBatcher } from './waitBatcher';
import { deleteForEveryone } from './deleteForEveryone';
import { downloadAttachment } from './downloadAttachment';
import { hasExpired } from './hasExpired';
import { isFileDangerous } from './isFileDangerous';
@ -17,6 +18,7 @@ export {
combineNames,
createBatcher,
createWaitBatcher,
deleteForEveryone,
downloadAttachment,
GoogleChrome,
hasExpired,