From 8b3c2cc32f6f877d8f5239a208e13fa23da3e576 Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Thu, 14 Nov 2019 16:47:02 +1100 Subject: [PATCH] Fix public chat message deletion --- Signal/src/Models/MessageActions.swift | 8 ++++++-- .../ConversationView/ConversationViewItem.m | 10 +++++----- .../Loki/API/Public Chat/LokiPublicChatPoller.swift | 11 ++++++----- .../src/Messages/Interactions/TSInteraction.h | 3 +++ 4 files changed, 20 insertions(+), 12 deletions(-) diff --git a/Signal/src/Models/MessageActions.swift b/Signal/src/Models/MessageActions.swift index 0183bf787..c90cc3aee 100644 --- a/Signal/src/Models/MessageActions.swift +++ b/Signal/src/Models/MessageActions.swift @@ -116,6 +116,8 @@ class ConversationViewItemActions: NSObject { class func mediaActions(conversationViewItem: ConversationViewItem, shouldAllowReply: Bool, delegate: MessageActionsDelegate) -> [MenuAction] { var actions: [MenuAction] = [] + let isGroup = conversationViewItem.isGroupThread; + if shouldAllowReply { let replyAction = MessageActionBuilder.reply(conversationViewItem: conversationViewItem, delegate: delegate) actions.append(replyAction) @@ -132,8 +134,10 @@ class ConversationViewItemActions: NSObject { } } - let deleteAction = MessageActionBuilder.deleteMessage(conversationViewItem: conversationViewItem, delegate: delegate) - actions.append(deleteAction) + if !isGroup || conversationViewItem.userCanDeleteGroupMessage { + let deleteAction = MessageActionBuilder.deleteMessage(conversationViewItem: conversationViewItem, delegate: delegate) + actions.append(deleteAction) + } let showDetailsAction = MessageActionBuilder.showDetails(conversationViewItem: conversationViewItem, delegate: delegate) actions.append(showDetailsAction) diff --git a/Signal/src/ViewControllers/ConversationView/ConversationViewItem.m b/Signal/src/ViewControllers/ConversationView/ConversationViewItem.m index 71ced588e..6100ec5eb 100644 --- a/Signal/src/ViewControllers/ConversationView/ConversationViewItem.m +++ b/Signal/src/ViewControllers/ConversationView/ConversationViewItem.m @@ -1269,13 +1269,13 @@ NSString *NSStringForOWSMessageCellType(OWSMessageCellType cellType) }]; if (publicChat == nil) return false; - // Only allow deletion on incoming messages if the user has moderation permission if (interationType == OWSInteractionType_IncomingMessage) { - BOOL isModerator = [LKPublicChatAPI isUserModerator:self.userHexEncodedPublicKey forGroup:publicChat.channel onServer:publicChat.server]; - if (!isModerator) return false; + // Only allow deletion on incoming messages if the user has moderation permission + return [LKPublicChatAPI isUserModerator:self.userHexEncodedPublicKey forGroup:publicChat.channel onServer:publicChat.server]; + } else { + // Only allow deletion on outgoing messages if the user was the sender (i.e. it was not sent from another linked device) + return [self.interaction.actualSenderHexEncodedPublicKey isEqual:self.userHexEncodedPublicKey]; } - - return true; } @end diff --git a/SignalServiceKit/src/Loki/API/Public Chat/LokiPublicChatPoller.swift b/SignalServiceKit/src/Loki/API/Public Chat/LokiPublicChatPoller.swift index 716bec390..dc48dfe52 100644 --- a/SignalServiceKit/src/Loki/API/Public Chat/LokiPublicChatPoller.swift +++ b/SignalServiceKit/src/Loki/API/Public Chat/LokiPublicChatPoller.swift @@ -147,17 +147,18 @@ public final class LokiPublicChatPoller : NSObject { signalLinkPreview = nil } let body = (message.body == message.timestamp.description) ? "" : message.body // Workaround for the fact that the back-end doesn't accept messages without a body - let message = TSOutgoingMessage(outgoingMessageWithTimestamp: message.timestamp, in: thread, messageBody: body, attachmentIds: NSMutableArray(array: attachmentIDs), expiresInSeconds: 0, + let signalMessage = TSOutgoingMessage(outgoingMessageWithTimestamp: message.timestamp, in: thread, messageBody: body, attachmentIds: NSMutableArray(array: attachmentIDs), expiresInSeconds: 0, expireStartedAt: 0, isVoiceMessage: false, groupMetaMessage: .deliver, quotedMessage: signalQuote, contactShare: nil, linkPreview: signalLinkPreview) + signalMessage.actualSenderHexEncodedPublicKey = message.hexEncodedPublicKey storage.dbReadWriteConnection.readWrite { transaction in - message.update(withSentRecipient: publicChat.server, wasSentByUD: false, transaction: transaction) - message.saveGroupChatServerID(messageServerID, in: transaction) - guard let messageID = message.uniqueId else { return print("[Loki] Failed to save public chat message.") } + signalMessage.update(withSentRecipient: publicChat.server, wasSentByUD: false, transaction: transaction) + signalMessage.saveGroupChatServerID(messageServerID, in: transaction) + guard let messageID = signalMessage.uniqueId else { return print("[Loki] Failed to save public chat message.") } storage.setIDForMessageWithServerID(UInt(messageServerID), to: messageID, in: transaction) } DispatchQueue.main.async { if let linkPreviewURL = OWSLinkPreview.previewUrl(forMessageBodyText: message.body, selectedRange: nil) { - message.generateLinkPreviewIfNeeded(fromURL: linkPreviewURL) + signalMessage.generateLinkPreviewIfNeeded(fromURL: linkPreviewURL) } } } diff --git a/SignalServiceKit/src/Messages/Interactions/TSInteraction.h b/SignalServiceKit/src/Messages/Interactions/TSInteraction.h index 39f0f44c0..18a9045bd 100644 --- a/SignalServiceKit/src/Messages/Interactions/TSInteraction.h +++ b/SignalServiceKit/src/Messages/Interactions/TSInteraction.h @@ -39,6 +39,9 @@ NSString *NSStringFromOWSInteractionType(OWSInteractionType value); @property (nonatomic, readonly) uint64_t timestamp; @property (nonatomic, readonly) uint64_t sortId; @property (nonatomic, readonly) uint64_t receivedAtTimestamp; +/// Used for public chats where a message sent from a slave device is interpreted as having been sent from the master device. +@property (nonatomic) NSString *actualSenderHexEncodedPublicKey; + - (NSDate *)receivedAtDate; - (OWSInteractionType)interactionType;