diff --git a/SessionMessagingKit/Messages/Control Message/ClosedGroupUpdate.swift b/SessionMessagingKit/Messages/Control Message/ClosedGroupUpdate.swift index acdc3fa05..0bb415a9e 100644 --- a/SessionMessagingKit/Messages/Control Message/ClosedGroupUpdate.swift +++ b/SessionMessagingKit/Messages/Control Message/ClosedGroupUpdate.swift @@ -19,6 +19,9 @@ public final class ClosedGroupUpdate : ControlMessage { self.kind = kind } + // MARK: Validation + public override var isValidForSending: Bool { kind != nil } + // MARK: Coding public required init?(coder: NSCoder) { super.init(coder: coder) diff --git a/SessionMessagingKit/Messages/Control Message/ExpirationTimerUpdate.swift b/SessionMessagingKit/Messages/Control Message/ExpirationTimerUpdate.swift index d3bbba194..7f6f2c5a0 100644 --- a/SessionMessagingKit/Messages/Control Message/ExpirationTimerUpdate.swift +++ b/SessionMessagingKit/Messages/Control Message/ExpirationTimerUpdate.swift @@ -10,6 +10,9 @@ public final class ExpirationTimerUpdate : ControlMessage { self.duration = duration } + // MARK: Validation + public override var isValidForSending: Bool { duration != nil } + // MARK: Coding public required init?(coder: NSCoder) { super.init(coder: coder) diff --git a/SessionMessagingKit/Messages/Control Message/ReadReceipt.swift b/SessionMessagingKit/Messages/Control Message/ReadReceipt.swift index cebdf28c6..d01fdacc1 100644 --- a/SessionMessagingKit/Messages/Control Message/ReadReceipt.swift +++ b/SessionMessagingKit/Messages/Control Message/ReadReceipt.swift @@ -10,6 +10,12 @@ public final class ReadReceipt : ControlMessage { self.timestamps = timestamps } + // MARK: Validation + public override var isValidForSending: Bool { + if let timestamps = timestamps, !timestamps.isEmpty { return true } + return false + } + // MARK: Coding public required init?(coder: NSCoder) { super.init(coder: coder) diff --git a/SessionMessagingKit/Messages/Control Message/SessionRequest.swift b/SessionMessagingKit/Messages/Control Message/SessionRequest.swift index 0f0223008..db00bec5e 100644 --- a/SessionMessagingKit/Messages/Control Message/SessionRequest.swift +++ b/SessionMessagingKit/Messages/Control Message/SessionRequest.swift @@ -11,6 +11,9 @@ public final class SessionRequest : ControlMessage { self.preKeyBundle = preKeyBundle } + // MARK: Validation + public override var isValidForSending: Bool { preKeyBundle != nil } + // MARK: Coding public required init?(coder: NSCoder) { super.init(coder: coder) diff --git a/SessionMessagingKit/Messages/Control Message/TypingIndicator.swift b/SessionMessagingKit/Messages/Control Message/TypingIndicator.swift index be391c493..817beaa77 100644 --- a/SessionMessagingKit/Messages/Control Message/TypingIndicator.swift +++ b/SessionMessagingKit/Messages/Control Message/TypingIndicator.swift @@ -23,6 +23,9 @@ public final class TypingIndicator : ControlMessage { } } + // MARK: Validation + public override var isValidForSending: Bool { kind != nil } + // MARK: Initialization internal init(kind: Kind) { super.init() diff --git a/SessionMessagingKit/Messages/Message.swift b/SessionMessagingKit/Messages/Message.swift index c783be5ac..8e25ec69c 100644 --- a/SessionMessagingKit/Messages/Message.swift +++ b/SessionMessagingKit/Messages/Message.swift @@ -10,6 +10,9 @@ public class Message : NSObject, NSCoding { // Not a protocol for YapDatabase co public override init() { } + // MARK: Validation + public var isValidForSending: Bool { true } + // MARK: Coding public required init?(coder: NSCoder) { if let id = coder.decodeObject(forKey: "id") as! String? { self.id = id } diff --git a/SessionMessagingKit/Messages/Visible Message/VisibleMessage.swift b/SessionMessagingKit/Messages/Visible Message/VisibleMessage.swift index 834a992cf..dbe9df6f2 100644 --- a/SessionMessagingKit/Messages/Visible Message/VisibleMessage.swift +++ b/SessionMessagingKit/Messages/Visible Message/VisibleMessage.swift @@ -12,6 +12,13 @@ public final class VisibleMessage : Message { // MARK: Initialization public override init() { super.init() } + // MARK: Validation + public override var isValidForSending: Bool { + if !attachmentIDs.isEmpty { return true } + if let text = text?.trimmingCharacters(in: .whitespacesAndNewlines), !text.isEmpty { return true } + return false + } + // MARK: Coding public required init?(coder: NSCoder) { super.init(coder: coder) diff --git a/SessionMessagingKit/Pipelines/SendingPipeline.swift b/SessionMessagingKit/Pipelines/SendingPipeline.swift index 857ec2ca3..8b8909685 100644 --- a/SessionMessagingKit/Pipelines/SendingPipeline.swift +++ b/SessionMessagingKit/Pipelines/SendingPipeline.swift @@ -3,6 +3,7 @@ import SessionSnodeKit import SessionUtilities public enum SendingPipeline { + private static let ttl: UInt64 = 2 * 24 * 60 * 60 * 1000 public enum Destination { case contact(publicKey: String) @@ -11,12 +12,14 @@ public enum SendingPipeline { } public enum Error : LocalizedError { + case invalidMessage case protoConversionFailed case protoSerializationFailed case proofOfWorkCalculationFailed public var errorDescription: String? { switch self { + case .invalidMessage: return "Invalid message." case .protoConversionFailed: return "Couldn't convert message to proto." case .protoSerializationFailed: return "Couldn't serialize proto." case .proofOfWorkCalculationFailed: return "Proof of work calculation failed." @@ -25,19 +28,18 @@ public enum SendingPipeline { } public static func send(_ message: Message, to destination: Destination) -> Promise { + guard message.isValidForSending else { return Promise(error: Error.invalidMessage) } guard let proto = message.toProto() else { return Promise(error: Error.protoConversionFailed) } - let data: Data + let plaintext: Data do { - data = try proto.serializedData() + plaintext = try proto.serializedData() } catch { SNLog("Couldn't serialize proto due to error: \(error).") return Promise(error: Error.protoSerializationFailed) } - // TODO: Encryption - // TODO: Validation - let recipient = "" - let base64EncodedData = data.base64EncodedString() - let ttl: UInt64 = 2 * 24 * 60 * 60 * 1000 + let ciphertext = plaintext // TODO: Encryption + let recipient = message.recipient! + let base64EncodedData = ciphertext.base64EncodedString() guard let (timestamp, nonce) = ProofOfWork.calculate(ttl: ttl, publicKey: recipient, data: base64EncodedData) else { SNLog("Proof of work calculation failed.") return Promise(error: Error.proofOfWorkCalculationFailed)