From 52ed49d61e7563397fe3ccbe5673fb3e582014c0 Mon Sep 17 00:00:00 2001 From: nielsandriesse Date: Fri, 6 Nov 2020 16:31:56 +1100 Subject: [PATCH] Validate messages after receiving --- .../Control Message/ClosedGroupUpdate.swift | 2 +- .../ExpirationTimerUpdate.swift | 2 +- .../Control Message/ReadReceipt.swift | 2 +- .../Control Message/SessionRequest.swift | 2 +- .../Control Message/TypingIndicator.swift | 2 +- SessionMessagingKit/Messages/Message.swift | 2 +- .../Visible Message/VisibleMessage.swift | 2 +- .../Pipelines/ReceivingPipeline.swift | 39 +++++++++++++------ .../Pipelines/SendingPipeline.swift | 2 +- 9 files changed, 36 insertions(+), 19 deletions(-) diff --git a/SessionMessagingKit/Messages/Control Message/ClosedGroupUpdate.swift b/SessionMessagingKit/Messages/Control Message/ClosedGroupUpdate.swift index 0bb415a9e..7d7a595d0 100644 --- a/SessionMessagingKit/Messages/Control Message/ClosedGroupUpdate.swift +++ b/SessionMessagingKit/Messages/Control Message/ClosedGroupUpdate.swift @@ -20,7 +20,7 @@ public final class ClosedGroupUpdate : ControlMessage { } // MARK: Validation - public override var isValidForSending: Bool { kind != nil } + public override var isValid: Bool { kind != nil } // MARK: Coding public required init?(coder: NSCoder) { diff --git a/SessionMessagingKit/Messages/Control Message/ExpirationTimerUpdate.swift b/SessionMessagingKit/Messages/Control Message/ExpirationTimerUpdate.swift index 7f6f2c5a0..caafe23c5 100644 --- a/SessionMessagingKit/Messages/Control Message/ExpirationTimerUpdate.swift +++ b/SessionMessagingKit/Messages/Control Message/ExpirationTimerUpdate.swift @@ -11,7 +11,7 @@ public final class ExpirationTimerUpdate : ControlMessage { } // MARK: Validation - public override var isValidForSending: Bool { duration != nil } + public override var isValid: Bool { duration != nil } // MARK: Coding public required init?(coder: NSCoder) { diff --git a/SessionMessagingKit/Messages/Control Message/ReadReceipt.swift b/SessionMessagingKit/Messages/Control Message/ReadReceipt.swift index d01fdacc1..e91512a76 100644 --- a/SessionMessagingKit/Messages/Control Message/ReadReceipt.swift +++ b/SessionMessagingKit/Messages/Control Message/ReadReceipt.swift @@ -11,7 +11,7 @@ public final class ReadReceipt : ControlMessage { } // MARK: Validation - public override var isValidForSending: Bool { + public override var isValid: Bool { if let timestamps = timestamps, !timestamps.isEmpty { return true } return false } diff --git a/SessionMessagingKit/Messages/Control Message/SessionRequest.swift b/SessionMessagingKit/Messages/Control Message/SessionRequest.swift index db00bec5e..c80098e99 100644 --- a/SessionMessagingKit/Messages/Control Message/SessionRequest.swift +++ b/SessionMessagingKit/Messages/Control Message/SessionRequest.swift @@ -12,7 +12,7 @@ public final class SessionRequest : ControlMessage { } // MARK: Validation - public override var isValidForSending: Bool { preKeyBundle != nil } + public override var isValid: Bool { preKeyBundle != nil } // MARK: Coding public required init?(coder: NSCoder) { diff --git a/SessionMessagingKit/Messages/Control Message/TypingIndicator.swift b/SessionMessagingKit/Messages/Control Message/TypingIndicator.swift index 817beaa77..0fdec4952 100644 --- a/SessionMessagingKit/Messages/Control Message/TypingIndicator.swift +++ b/SessionMessagingKit/Messages/Control Message/TypingIndicator.swift @@ -24,7 +24,7 @@ public final class TypingIndicator : ControlMessage { } // MARK: Validation - public override var isValidForSending: Bool { kind != nil } + public override var isValid: Bool { kind != nil } // MARK: Initialization internal init(kind: Kind) { diff --git a/SessionMessagingKit/Messages/Message.swift b/SessionMessagingKit/Messages/Message.swift index 8e25ec69c..c0d1f240f 100644 --- a/SessionMessagingKit/Messages/Message.swift +++ b/SessionMessagingKit/Messages/Message.swift @@ -11,7 +11,7 @@ public class Message : NSObject, NSCoding { // Not a protocol for YapDatabase co public override init() { } // MARK: Validation - public var isValidForSending: Bool { true } + public var isValid: Bool { true } // MARK: Coding public required init?(coder: NSCoder) { diff --git a/SessionMessagingKit/Messages/Visible Message/VisibleMessage.swift b/SessionMessagingKit/Messages/Visible Message/VisibleMessage.swift index dbe9df6f2..c2277264f 100644 --- a/SessionMessagingKit/Messages/Visible Message/VisibleMessage.swift +++ b/SessionMessagingKit/Messages/Visible Message/VisibleMessage.swift @@ -13,7 +13,7 @@ public final class VisibleMessage : Message { public override init() { super.init() } // MARK: Validation - public override var isValidForSending: Bool { + public override var isValid: Bool { if !attachmentIDs.isEmpty { return true } if let text = text?.trimmingCharacters(in: .whitespacesAndNewlines), !text.isEmpty { return true } return false diff --git a/SessionMessagingKit/Pipelines/ReceivingPipeline.swift b/SessionMessagingKit/Pipelines/ReceivingPipeline.swift index 8be3cfc41..699f47a44 100644 --- a/SessionMessagingKit/Pipelines/ReceivingPipeline.swift +++ b/SessionMessagingKit/Pipelines/ReceivingPipeline.swift @@ -2,22 +2,39 @@ import SessionUtilities public enum ReceivingPipeline { - public static func parse(_ data: Data) -> Message? { - // TODO: Decryption - // TODO: Validation + public enum Error : LocalizedError { + case invalidMessage + + public var errorDescription: String? { + switch self { + case .invalidMessage: return "Invalid message." + } + } + } + + public static func parse(_ ciphertext: Data) -> Message? { + let plaintext = ciphertext // TODO: Decryption let proto: SNProtoContent do { - proto = try SNProtoContent.parseData(data) + proto = try SNProtoContent.parseData(plaintext) } catch { SNLog("Couldn't parse proto due to error: \(error).") return nil } - if let readReceipt = ReadReceipt.fromProto(proto) { return readReceipt } - if let sessionRequest = SessionRequest.fromProto(proto) { return sessionRequest } - if let typingIndicator = TypingIndicator.fromProto(proto) { return typingIndicator } - if let closedGroupUpdate = ClosedGroupUpdate.fromProto(proto) { return closedGroupUpdate } - if let expirationTimerUpdate = ExpirationTimerUpdate.fromProto(proto) { return expirationTimerUpdate } - if let visibleMessage = VisibleMessage.fromProto(proto) { return visibleMessage } - return nil + let message: Message? = { + if let readReceipt = ReadReceipt.fromProto(proto) { return readReceipt } + if let sessionRequest = SessionRequest.fromProto(proto) { return sessionRequest } + if let typingIndicator = TypingIndicator.fromProto(proto) { return typingIndicator } + if let closedGroupUpdate = ClosedGroupUpdate.fromProto(proto) { return closedGroupUpdate } + if let expirationTimerUpdate = ExpirationTimerUpdate.fromProto(proto) { return expirationTimerUpdate } + if let visibleMessage = VisibleMessage.fromProto(proto) { return visibleMessage } + return nil + }() + if let message = message { + guard message.isValid else { return nil } + return message + } else { + return nil + } } } diff --git a/SessionMessagingKit/Pipelines/SendingPipeline.swift b/SessionMessagingKit/Pipelines/SendingPipeline.swift index 8b8909685..5b3d4f1af 100644 --- a/SessionMessagingKit/Pipelines/SendingPipeline.swift +++ b/SessionMessagingKit/Pipelines/SendingPipeline.swift @@ -28,7 +28,7 @@ public enum SendingPipeline { } public static func send(_ message: Message, to destination: Destination) -> Promise { - guard message.isValidForSending else { return Promise(error: Error.invalidMessage) } + guard message.isValid else { return Promise(error: Error.invalidMessage) } guard let proto = message.toProto() else { return Promise(error: Error.protoConversionFailed) } let plaintext: Data do {