Delete for Everyone: Don't allow unrestricted deletes in Note to Self

This commit is contained in:
Scott Nonnenberg 2024-01-03 08:46:39 -08:00 committed by GitHub
parent 677ab64335
commit 0cc6228ede
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 25 additions and 15 deletions

View file

@ -727,7 +727,7 @@ export const getPropsForMessage = (
payment,
canCopy: canCopy(message),
canEditMessage: canEditMessage(message),
canDeleteForEveryone: canDeleteForEveryone(message),
canDeleteForEveryone: canDeleteForEveryone(message, conversation.isMe),
canDownload: canDownload(message, conversationSelector),
canReact: canReact(message, ourConversationId, conversationSelector),
canReply: canReply(message, ourConversationId, conversationSelector),
@ -1872,26 +1872,31 @@ export function canDeleteForEveryone(
message: Pick<
MessageWithUIFieldsType,
'type' | 'deletedForEveryone' | 'sent_at' | 'sendStateByConversationId'
>
>,
isMe: boolean
): boolean {
return (
// Is this a message I sent?
isOutgoing(message) &&
// Has the message already been deleted?
!message.deletedForEveryone &&
// Is it too old to delete?
isMoreRecentThan(message.sent_at, DAY) &&
// Is it too old to delete? (we relax that requirement in Note to Self)
(isMoreRecentThan(message.sent_at, DAY) || isMe) &&
// Is it sent to anyone?
someSendStatus(message.sendStateByConversationId, isSent)
);
}
export const canDeleteMessagesForEveryone = createSelector(
[getMessages, (_state, messageIds: ReadonlyArray<string>) => messageIds],
(messagesLookup, messageIds) => {
return messageIds.every(messageId => {
[
getMessages,
(_state, options: { messageIds: ReadonlyArray<string>; isMe: boolean }) =>
options,
],
(messagesLookup, options) => {
return options.messageIds.every(messageId => {
const message = getOwn(messagesLookup, messageId);
return message != null && canDeleteForEveryone(message);
return message != null && canDeleteForEveryone(message, options.isMe);
});
}
);