mirror of https://github.com/oxen-io/session-ios
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
72 lines
2.6 KiB
Swift
72 lines
2.6 KiB
Swift
//
|
|
// Copyright (c) 2018 Open Whisper Systems. All rights reserved.
|
|
//
|
|
|
|
import Foundation
|
|
|
|
@objc public enum SMKMessageType: Int {
|
|
case whisper
|
|
case prekey
|
|
case fallback
|
|
}
|
|
|
|
// See:
|
|
// https://github.com/signalapp/libsignal-metadata-java/blob/0cbbbf23eaf9f46fdf2d9463f3dfab2fb3271292/java/src/main/java/org/signal/libsignal/metadata/protocol/UnidentifiedSenderMessageContent.java
|
|
@objc public class SMKUnidentifiedSenderMessageContent: NSObject {
|
|
|
|
@objc public let messageType: SMKMessageType
|
|
@objc public let senderCertificate: SMKSenderCertificate
|
|
@objc public let contentData: Data
|
|
|
|
@objc public init(messageType: SMKMessageType,
|
|
senderCertificate: SMKSenderCertificate,
|
|
contentData: Data) {
|
|
self.messageType = messageType
|
|
self.senderCertificate = senderCertificate
|
|
self.contentData = contentData
|
|
}
|
|
|
|
@objc public class func parse(data: Data) throws -> SMKUnidentifiedSenderMessageContent {
|
|
|
|
let proto = try SMKProtoUnidentifiedSenderMessageMessage.parseData(data)
|
|
|
|
// TODO: Should we have a default case in our switches? Probably.
|
|
var messageType: SMKMessageType
|
|
switch (proto.type) {
|
|
case .prekeyMessage:
|
|
messageType = .prekey
|
|
case .message:
|
|
messageType = .whisper
|
|
case .fallbackMessage:
|
|
messageType = .fallback
|
|
}
|
|
|
|
let contentData = proto.content
|
|
let senderCertificateProto = proto.senderCertificate
|
|
let senderCertificate = try SMKSenderCertificate.parse(proto: senderCertificateProto)
|
|
|
|
return SMKUnidentifiedSenderMessageContent(messageType: messageType, senderCertificate: senderCertificate, contentData: contentData)
|
|
}
|
|
|
|
@objc public func toProto() throws -> SMKProtoUnidentifiedSenderMessageMessage {
|
|
let builderType: SMKProtoUnidentifiedSenderMessageMessage.SMKProtoUnidentifiedSenderMessageMessageType
|
|
switch messageType {
|
|
case .whisper:
|
|
builderType = .message
|
|
case .prekey:
|
|
builderType = .prekeyMessage
|
|
case .fallback:
|
|
builderType = .fallbackMessage
|
|
}
|
|
|
|
let builder = SMKProtoUnidentifiedSenderMessageMessage.builder(type: builderType,
|
|
senderCertificate: try senderCertificate.toProto(),
|
|
content: contentData)
|
|
return try builder.build()
|
|
}
|
|
|
|
@objc public func serialized() throws -> Data {
|
|
return try toProto().serializedData()
|
|
}
|
|
}
|