From 82127bfe4d9b079736cb737328d3a51054c7ffb8 Mon Sep 17 00:00:00 2001 From: nielsandriesse Date: Tue, 10 Nov 2020 15:48:47 +1100 Subject: [PATCH] Clean --- SessionMessagingKit/Configuration.swift | 24 +++++++++++++++++-- SessionMessagingKit/Jobs/Job.swift | 1 + SessionMessagingKit/Jobs/JobDelegate.swift | 1 + SessionMessagingKit/Jobs/JobQueue.swift | 9 +++---- SessionMessagingKit/Jobs/MessageSendJob.swift | 4 ++++ .../Visible Message/VisibleMessage.swift | 12 +++++----- .../MessageReceiver+Decryption.swift | 6 ++--- .../Sending & Receiving/MessageReceiver.swift | 1 + .../MessageSender+Encryption.swift | 6 ++--- .../Sending & Receiving/MessageSender.swift | 6 +++++ SessionMessagingKit/Storage.swift | 2 +- .../AnyPromise+Retaining.swift | 6 ++--- 12 files changed, 55 insertions(+), 23 deletions(-) diff --git a/SessionMessagingKit/Configuration.swift b/SessionMessagingKit/Configuration.swift index 4ad275f03..020a21d3a 100644 --- a/SessionMessagingKit/Configuration.swift +++ b/SessionMessagingKit/Configuration.swift @@ -2,6 +2,8 @@ import SessionProtocolKit public struct Configuration { public let storage: SessionMessagingKitStorageProtocol + public let signalStorage: SessionStore & PreKeyStore & SignedPreKeyStore + public let identityKeyStore: IdentityKeyStore public let sessionRestorationImplementation: SessionRestorationProtocol public let certificateValidator: SMKCertificateValidator public let openGroupAPIDelegate: OpenGroupAPIDelegate @@ -13,7 +15,25 @@ public struct Configuration { public enum SessionMessagingKit { // Just to make the external API nice - public static func configure(with configuration: Configuration) { - Configuration.shared = configuration + public static func configure( + storage: SessionMessagingKitStorageProtocol, + signalStorage: SessionStore & PreKeyStore & SignedPreKeyStore, + identityKeyStore: IdentityKeyStore, + sessionRestorationImplementation: SessionRestorationProtocol, + certificateValidator: SMKCertificateValidator, + openGroupAPIDelegate: OpenGroupAPIDelegate, + pnServerURL: String, + pnServerPublicKey: String + ) { + Configuration.shared = Configuration( + storage: storage, + signalStorage: signalStorage, + identityKeyStore: identityKeyStore, + sessionRestorationImplementation: sessionRestorationImplementation, + certificateValidator: certificateValidator, + openGroupAPIDelegate: openGroupAPIDelegate, + pnServerURL: pnServerURL, + pnServerPublicKey: pnServerPublicKey + ) } } diff --git a/SessionMessagingKit/Jobs/Job.swift b/SessionMessagingKit/Jobs/Job.swift index a6cce33ed..1abe7b996 100644 --- a/SessionMessagingKit/Jobs/Job.swift +++ b/SessionMessagingKit/Jobs/Job.swift @@ -1,4 +1,5 @@ +@objc(SNJob) public protocol Job : class { var delegate: JobDelegate? { get set } var failureCount: UInt { get set } diff --git a/SessionMessagingKit/Jobs/JobDelegate.swift b/SessionMessagingKit/Jobs/JobDelegate.swift index db6eadfc4..461433e85 100644 --- a/SessionMessagingKit/Jobs/JobDelegate.swift +++ b/SessionMessagingKit/Jobs/JobDelegate.swift @@ -1,4 +1,5 @@ +@objc(SNJobDelegate) public protocol JobDelegate { func handleJobSucceeded(_ job: Job) diff --git a/SessionMessagingKit/Jobs/JobQueue.swift b/SessionMessagingKit/Jobs/JobQueue.swift index 410b925b9..366a78502 100644 --- a/SessionMessagingKit/Jobs/JobQueue.swift +++ b/SessionMessagingKit/Jobs/JobQueue.swift @@ -1,10 +1,11 @@ import SessionUtilitiesKit -public final class JobQueue : JobDelegate { +@objc(SNJobQueue) +public final class JobQueue : NSObject, JobDelegate { - public static let shared = JobQueue() + @objc public static let shared = JobQueue() - public func add(_ job: Job, using transaction: Any) { + @objc public func add(_ job: Job, using transaction: Any) { Configuration.shared.storage.persist(job, using: transaction) job.delegate = self job.execute() @@ -32,7 +33,7 @@ public final class JobQueue : JobDelegate { }) } else { let retryInterval = self.getRetryInterval(for: job) - Timer.weakScheduledTimer(withTimeInterval: retryInterval, target: self, selector: #selector(retry(_:)), userInfo: job, repeats: false) + Timer.weakScheduledTimer(withTimeInterval: retryInterval, target: self, selector: #selector(self.retry(_:)), userInfo: job, repeats: false) } }) } diff --git a/SessionMessagingKit/Jobs/MessageSendJob.swift b/SessionMessagingKit/Jobs/MessageSendJob.swift index 9e364c33a..53290e7fb 100644 --- a/SessionMessagingKit/Jobs/MessageSendJob.swift +++ b/SessionMessagingKit/Jobs/MessageSendJob.swift @@ -1,5 +1,6 @@ import SessionUtilitiesKit +@objc(SNMessageSendJob) public final class MessageSendJob : NSObject, Job, NSCoding { // NSObject/NSCoding conformance is needed for YapDatabase compatibility public var delegate: JobDelegate? private let message: Message @@ -10,6 +11,9 @@ public final class MessageSendJob : NSObject, Job, NSCoding { // NSObject/NSCodi public static let maxFailureCount: UInt = 20 // MARK: Initialization + @objc public convenience init(message: Message, publicKey: String) { self.init(message: message, destination: .contact(publicKey: publicKey)) } + @objc public convenience init(message: Message, groupPublicKey: String) { self.init(message: message, destination: .closedGroup(groupPublicKey: groupPublicKey)) } + init(message: Message, destination: Message.Destination) { self.message = message self.destination = destination diff --git a/SessionMessagingKit/Messages/Visible Message/VisibleMessage.swift b/SessionMessagingKit/Messages/Visible Message/VisibleMessage.swift index abed616f5..bd7f28b83 100644 --- a/SessionMessagingKit/Messages/Visible Message/VisibleMessage.swift +++ b/SessionMessagingKit/Messages/Visible Message/VisibleMessage.swift @@ -2,12 +2,12 @@ import SessionUtilitiesKit @objc(SNVisibleMessage) public final class VisibleMessage : Message { - public var text: String? - public var attachmentIDs: [String] = [] - public var quote: Quote? - public var linkPreview: LinkPreview? - public var contact: Contact? - public var profile: Profile? + @objc public var text: String? + @objc public var attachmentIDs: [String] = [] + @objc public var quote: Quote? + @objc public var linkPreview: LinkPreview? + @objc public var contact: Contact? + @objc public var profile: Profile? // MARK: Initialization public override init() { super.init() } diff --git a/SessionMessagingKit/Sending & Receiving/MessageReceiver+Decryption.swift b/SessionMessagingKit/Sending & Receiving/MessageReceiver+Decryption.swift index f73cfb5f7..1ab2b7570 100644 --- a/SessionMessagingKit/Sending & Receiving/MessageReceiver+Decryption.swift +++ b/SessionMessagingKit/Sending & Receiving/MessageReceiver+Decryption.swift @@ -5,12 +5,12 @@ import SessionUtilitiesKit internal extension MessageReceiver { static func decryptWithSignalProtocol(envelope: SNProtoEnvelope, using transaction: Any) throws -> (plaintext: Data, senderPublicKey: String) { - let storage = Configuration.shared.storage + let storage = Configuration.shared.signalStorage let certificateValidator = Configuration.shared.certificateValidator guard let data = envelope.content else { throw Error.noData } - guard let userPublicKey = storage.getUserPublicKey() else { throw Error.noUserPublicKey } + guard let userPublicKey = Configuration.shared.storage.getUserPublicKey() else { throw Error.noUserPublicKey } let cipher = try SMKSecretSessionCipher(sessionResetImplementation: Configuration.shared.sessionRestorationImplementation, - sessionStore: storage, preKeyStore: storage, signedPreKeyStore: storage, identityStore: storage) + sessionStore: storage, preKeyStore: storage, signedPreKeyStore: storage, identityStore: Configuration.shared.identityKeyStore) let result = try cipher.throwswrapped_decryptMessage(certificateValidator: certificateValidator, cipherTextData: data, timestamp: envelope.timestamp, localRecipientId: userPublicKey, localDeviceId: 1, protocolContext: transaction) return (result.paddedPayload, result.senderRecipientId) diff --git a/SessionMessagingKit/Sending & Receiving/MessageReceiver.swift b/SessionMessagingKit/Sending & Receiving/MessageReceiver.swift index 00f4ade7d..759136062 100644 --- a/SessionMessagingKit/Sending & Receiving/MessageReceiver.swift +++ b/SessionMessagingKit/Sending & Receiving/MessageReceiver.swift @@ -59,6 +59,7 @@ internal enum MessageReceiver { return nil }() if let message = message { + message.receivedTimestamp = NSDate.millisecondTimestamp() guard message.isValid else { throw Error.invalidMessage } return message } else { diff --git a/SessionMessagingKit/Sending & Receiving/MessageSender+Encryption.swift b/SessionMessagingKit/Sending & Receiving/MessageSender+Encryption.swift index 2f6794d32..44bea6225 100644 --- a/SessionMessagingKit/Sending & Receiving/MessageSender+Encryption.swift +++ b/SessionMessagingKit/Sending & Receiving/MessageSender+Encryption.swift @@ -4,12 +4,12 @@ import SessionUtilitiesKit internal extension MessageSender { static func encryptWithSignalProtocol(_ plaintext: Data, associatedWith message: Message, for publicKey: String, using transaction: Any) throws -> Data { - let storage = Configuration.shared.storage + let storage = Configuration.shared.signalStorage let cipher = try SMKSecretSessionCipher(sessionResetImplementation: Configuration.shared.sessionRestorationImplementation, - sessionStore: storage, preKeyStore: storage, signedPreKeyStore: storage, identityStore: storage) + sessionStore: storage, preKeyStore: storage, signedPreKeyStore: storage, identityStore: Configuration.shared.identityKeyStore) let useFallbackEncryption: Bool = { if (message is SessionRequest) { return true } - return !Configuration.shared.storage.containsSession(publicKey, deviceId: 1, protocolContext: transaction) + return !storage.containsSession(publicKey, deviceId: 1, protocolContext: transaction) }() let certificate = Configuration.shared.storage.getSenderCertificate(for: publicKey) return try cipher.throwswrapped_encryptMessage(recipientPublicKey: publicKey, deviceID: 1, paddedPlaintext: (plaintext as NSData).paddedMessageBody(), diff --git a/SessionMessagingKit/Sending & Receiving/MessageSender.swift b/SessionMessagingKit/Sending & Receiving/MessageSender.swift index 958f287cf..abd9799d8 100644 --- a/SessionMessagingKit/Sending & Receiving/MessageSender.swift +++ b/SessionMessagingKit/Sending & Receiving/MessageSender.swift @@ -28,6 +28,12 @@ internal enum MessageSender { } internal static func sendToSnodeDestination(_ destination: Message.Destination, message: Message, using transaction: Any) -> Promise { + message.sentTimestamp = NSDate.millisecondTimestamp() + switch destination { + case .contact(let publicKey): message.recipient = publicKey + case .closedGroup(let groupPublicKey): message.recipient = groupPublicKey + case .openGroup(_, _): preconditionFailure() + } // Validate the message guard message.isValid else { return Promise(error: Error.invalidMessage) } // Convert it to protobuf diff --git a/SessionMessagingKit/Storage.swift b/SessionMessagingKit/Storage.swift index 5c988246e..5d050fad6 100644 --- a/SessionMessagingKit/Storage.swift +++ b/SessionMessagingKit/Storage.swift @@ -1,6 +1,6 @@ import SessionProtocolKit -public protocol SessionMessagingKitStorageProtocol : SessionStore, PreKeyStore, SignedPreKeyStore, IdentityKeyStore { +public protocol SessionMessagingKitStorageProtocol { func with(_ work: (Any) -> Void) func withAsync(_ work: (Any) -> Void, completion: () -> Void) diff --git a/SessionUtilitiesKit/AnyPromise+Retaining.swift b/SessionUtilitiesKit/AnyPromise+Retaining.swift index a708a85da..377e44434 100644 --- a/SessionUtilitiesKit/AnyPromise+Retaining.swift +++ b/SessionUtilitiesKit/AnyPromise+Retaining.swift @@ -2,10 +2,8 @@ import PromiseKit public extension AnyPromise { - /** - * Sometimes there isn't a straightforward candidate to retain a promise. In that case we tell the - * promise to self retain until it completes, to avoid the risk it's GC'd before completion. - */ + /// Sometimes there isn't a straightforward candidate to retain a promise. In that case we tell the + /// promise to self retain until it completes, to avoid the risk it's GC'd before completion. @objc func retainUntilComplete() { var retainCycle: AnyPromise? = self