session-ios/SessionMessagingKit/Sending & Receiving/MessageReceiver.swift

55 lines
2.1 KiB
Swift
Raw Normal View History

2020-11-06 04:05:45 +01:00
import SessionUtilities
2020-11-05 23:17:05 +01:00
public enum MessageReceiver {
2020-11-05 23:17:05 +01:00
2020-11-06 06:31:56 +01:00
public enum Error : LocalizedError {
case invalidMessage
case unknownMessage
// Shared sender keys
case invalidGroupPublicKey
case noData
case noGroupPrivateKey
case sharedSecretGenerationFailed
case selfSend
2020-11-06 06:31:56 +01:00
public var errorDescription: String? {
switch self {
case .invalidMessage: return "Invalid message."
case .unknownMessage: return "Unknown message type."
// Shared sender keys
case .invalidGroupPublicKey: return "Invalid group public key."
case .noData: return "Received an empty envelope."
case .noGroupPrivateKey: return "Missing group private key."
case .sharedSecretGenerationFailed: return "Couldn't generate a shared secret."
case .selfSend: return "Message addressed at self."
2020-11-06 06:31:56 +01:00
}
}
}
public static func parse(_ ciphertext: Data) throws -> Message {
2020-11-06 06:31:56 +01:00
let plaintext = ciphertext // TODO: Decryption
2020-11-06 04:05:45 +01:00
let proto: SNProtoContent
do {
2020-11-06 06:31:56 +01:00
proto = try SNProtoContent.parseData(plaintext)
2020-11-06 04:05:45 +01:00
} catch {
SNLog("Couldn't parse proto due to error: \(error).")
throw error
2020-11-06 04:05:45 +01:00
}
2020-11-06 06:31:56 +01:00
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 { throw Error.invalidMessage }
2020-11-06 06:31:56 +01:00
return message
} else {
2020-11-07 23:03:08 +01:00
throw Error.unknownMessage
2020-11-06 06:31:56 +01:00
}
2020-11-06 04:05:45 +01:00
}
2020-11-05 23:17:05 +01:00
}