From 1c73cf5114b18e793b8279dac47987d64f4af91e Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Tue, 21 May 2019 11:40:29 +1000 Subject: [PATCH] Re-order files --- Signal/Signal-Prefix.pch | 2 +- Signal/src/AppDelegate.m | 2 +- Signal/src/Jobs/SessionResetJob.swift | 2 +- Signal/src/Signal-Bridging-Header.h | 6 +- SignalMessaging/environment/AppSetup.m | 2 +- SignalMessaging/utils/ThreadUtil.m | 6 +- .../src/Loki/API/LokiAPI+Message.swift | 2 +- .../src/Loki/API/LokiAPI+Wrapping.swift | 10 +-- SignalServiceKit/src/Loki/API/LokiAPI.swift | 14 ++-- .../ECKeyPair.h => Crypto/ECKeyPair+Loki.h} | 0 .../ECKeyPair.m => Crypto/ECKeyPair+Loki.m} | 2 +- .../ECKeyPair+Loki.swift} | 0 .../Mnemonic/Mnemonic.swift | 0 .../Mnemonic/english.txt | 0 .../Mnemonic/japanese.txt | 0 .../Mnemonic/portuguese.txt | 0 .../Mnemonic/spanish.txt | 0 .../OWSPrimaryStorage+Loki.h | 0 .../OWSPrimaryStorage+Loki.m | 2 +- .../src/Loki/Crypto/ProofOfWork.swift | 6 +- .../SessionCipher+Loki.h | 0 .../SessionCipher+Loki.m | 0 .../{Docs => Documentation}/SessionReset.md | 0 .../FriendRequestExpirationJob.swift} | 68 ++++++++----------- ...riendRequestExpirationMessageFinder.swift} | 25 +++---- ...phemeralMessage.h => LKEphemeralMessage.h} | 4 +- .../src/Loki/Messages/LKEphemeralMessage.m | 13 ++++ ...uestMessage.h => LKFriendRequestMessage.h} | 2 +- ...uestMessage.m => LKFriendRequestMessage.m} | 4 +- .../Notification+FriendRequestStatus.swift} | 0 .../src/Loki/Messages/OWSEphemeralMessage.m | 13 ---- .../SSKProtoPrekeyBundleMessage+Loki.swift} | 0 .../NSObject+Casting.h} | 0 .../NSObject+Casting.m} | 2 +- .../src/Messages/OWSMessageManager.m | 14 ++-- .../src/Messages/OWSMessageSender.m | 6 +- SignalServiceKit/src/SSKEnvironment.h | 6 +- SignalServiceKit/src/SSKEnvironment.m | 4 +- .../src/Storage/OWSPrimaryStorage.m | 2 +- SignalServiceKit/src/TSPrefix.h | 2 +- 40 files changed, 102 insertions(+), 119 deletions(-) rename SignalServiceKit/src/Loki/{Extensions/ECKeyPair.h => Crypto/ECKeyPair+Loki.h} (100%) rename SignalServiceKit/src/Loki/{Extensions/ECKeyPair.m => Crypto/ECKeyPair+Loki.m} (97%) rename SignalServiceKit/src/Loki/{Extensions/ECKeyPair.swift => Crypto/ECKeyPair+Loki.swift} (100%) rename SignalServiceKit/src/Loki/{Utilities => Crypto}/Mnemonic/Mnemonic.swift (100%) rename SignalServiceKit/src/Loki/{Utilities => Crypto}/Mnemonic/english.txt (100%) rename SignalServiceKit/src/Loki/{Utilities => Crypto}/Mnemonic/japanese.txt (100%) rename SignalServiceKit/src/Loki/{Utilities => Crypto}/Mnemonic/portuguese.txt (100%) rename SignalServiceKit/src/Loki/{Utilities => Crypto}/Mnemonic/spanish.txt (100%) rename SignalServiceKit/src/Loki/{Extensions => Crypto}/OWSPrimaryStorage+Loki.h (100%) rename SignalServiceKit/src/Loki/{Extensions => Crypto}/OWSPrimaryStorage+Loki.m (98%) rename SignalServiceKit/src/Loki/{Extensions => Crypto}/SessionCipher+Loki.h (100%) rename SignalServiceKit/src/Loki/{Extensions => Crypto}/SessionCipher+Loki.m (100%) rename SignalServiceKit/src/Loki/{Docs => Documentation}/SessionReset.md (100%) rename SignalServiceKit/src/Loki/{Utilities/FriendRequestExpireJob.swift => Messages/FriendRequestExpirationJob.swift} (73%) rename SignalServiceKit/src/Loki/{Utilities/FriendRequestExpireMessageFinder.swift => Messages/FriendRequestExpirationMessageFinder.swift} (70%) rename SignalServiceKit/src/Loki/Messages/{OWSEphemeralMessage.h => LKEphemeralMessage.h} (53%) create mode 100644 SignalServiceKit/src/Loki/Messages/LKEphemeralMessage.m rename SignalServiceKit/src/Loki/Messages/{OWSFriendRequestMessage.h => LKFriendRequestMessage.h} (68%) rename SignalServiceKit/src/Loki/Messages/{OWSFriendRequestMessage.m => LKFriendRequestMessage.m} (92%) rename SignalServiceKit/src/Loki/{Extensions/Notification.swift => Messages/Notification+FriendRequestStatus.swift} (100%) delete mode 100644 SignalServiceKit/src/Loki/Messages/OWSEphemeralMessage.m rename SignalServiceKit/src/Loki/{Extensions/SSKProtoPrekeyBundleMessage.swift => Messages/SSKProtoPrekeyBundleMessage+Loki.swift} (100%) rename SignalServiceKit/src/Loki/{Extensions/NSObject.h => Utilities/NSObject+Casting.h} (100%) rename SignalServiceKit/src/Loki/{Extensions/NSObject.m => Utilities/NSObject+Casting.m} (83%) diff --git a/Signal/Signal-Prefix.pch b/Signal/Signal-Prefix.pch index ae5a34d10..9e89abf1e 100644 --- a/Signal/Signal-Prefix.pch +++ b/Signal/Signal-Prefix.pch @@ -19,5 +19,5 @@ #import #import #import - #import + #import #endif diff --git a/Signal/src/AppDelegate.m b/Signal/src/AppDelegate.m index 05afaae3f..5a708b109 100644 --- a/Signal/src/AppDelegate.m +++ b/Signal/src/AppDelegate.m @@ -158,7 +158,7 @@ static NSTimeInterval launchStartedAt; return AppEnvironment.shared.legacyNotificationActionHandler; } -- (OWSLokiFriendRequestExpireJob *)lokiFriendRequestExpireJob +- (LKFriendRequestExpirationJob *)lokiFriendRequestExpireJob { return SSKEnvironment.shared.lokiFriendRequestExpireJob; } diff --git a/Signal/src/Jobs/SessionResetJob.swift b/Signal/src/Jobs/SessionResetJob.swift index f23d723cb..7c771c464 100644 --- a/Signal/src/Jobs/SessionResetJob.swift +++ b/Signal/src/Jobs/SessionResetJob.swift @@ -147,7 +147,7 @@ public class SessionResetOperation: OWSOperation, DurableOperation { message.save(with: transaction) // Loki: We have initiated a session reset - Logger.debug("[Loki] Session reset has been initiated.") + Logger.debug("[Loki] Session reset initiated.") self.contactThread.sessionResetState = .initiated self.contactThread.save(with: transaction) } diff --git a/Signal/src/Signal-Bridging-Header.h b/Signal/src/Signal-Bridging-Header.h index 03087aae1..38fccf4f7 100644 --- a/Signal/src/Signal-Bridging-Header.h +++ b/Signal/src/Signal-Bridging-Header.h @@ -77,7 +77,7 @@ #import #import #import -#import +#import #import #import #import @@ -90,10 +90,10 @@ #import #import #import -#import +#import #import #import -#import +#import #import #import #import diff --git a/SignalMessaging/environment/AppSetup.m b/SignalMessaging/environment/AppSetup.m index 95cb73456..7ddb81377 100644 --- a/SignalMessaging/environment/AppSetup.m +++ b/SignalMessaging/environment/AppSetup.m @@ -127,7 +127,7 @@ NS_ASSUME_NONNULL_BEGIN attachmentDownloads:attachmentDownloads]]; // Loki - OWSLokiFriendRequestExpireJob *lokiFriendRequestExpireJob = [[OWSLokiFriendRequestExpireJob alloc] initWithPrimaryStorage:primaryStorage]; + LKFriendRequestExpirationJob *lokiFriendRequestExpireJob = [[LKFriendRequestExpirationJob alloc] initWithPrimaryStorage:primaryStorage]; SSKEnvironment.shared.lokiFriendRequestExpireJob = lokiFriendRequestExpireJob; appSpecificSingletonBlock(); diff --git a/SignalMessaging/utils/ThreadUtil.m b/SignalMessaging/utils/ThreadUtil.m index 8de72cb9b..bf5c52f55 100644 --- a/SignalMessaging/utils/ThreadUtil.m +++ b/SignalMessaging/utils/ThreadUtil.m @@ -85,9 +85,9 @@ typedef void (^BuildOutgoingMessageCompletionBlock)(TSOutgoingMessage *savedMess #pragma mark - Durable Message Enqueue -+ (OWSEphemeralMessage *)enqueueAcceptFriendRequestMessageInThread:(TSThread *)thread ++ (LKEphemeralMessage *)enqueueAcceptFriendRequestMessageInThread:(TSThread *)thread { - OWSEphemeralMessage *emptyMessage = [OWSEphemeralMessage createEmptyOutgoingMessageInThread:thread]; + LKEphemeralMessage *emptyMessage = [LKEphemeralMessage createEmptyOutgoingMessageInThread:thread]; [self.dbConnection asyncReadWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { [self.messageSenderJobQueue addMessage:emptyMessage transaction:transaction]; }]; @@ -185,7 +185,7 @@ typedef void (^BuildOutgoingMessageCompletionBlock)(TSOutgoingMessage *savedMess // Loki: If we're not friends then always set the message to a friend request message // If we're friends then the assumption is that we have the other user's prekey bundle - NSString *messageClassAsString = thread.isContactFriend ? @"TSOutgoingMessage" : @"OWSFriendRequestMessage"; + NSString *messageClassAsString = thread.isContactFriend ? @"TSOutgoingMessage" : @"LKFriendRequestMessage"; Class messageClass = NSClassFromString(messageClassAsString); TSOutgoingMessage *message = diff --git a/SignalServiceKit/src/Loki/API/LokiAPI+Message.swift b/SignalServiceKit/src/Loki/API/LokiAPI+Message.swift index 4f76f5a3f..1c3aa29d9 100644 --- a/SignalServiceKit/src/Loki/API/LokiAPI+Message.swift +++ b/SignalServiceKit/src/Loki/API/LokiAPI+Message.swift @@ -37,7 +37,7 @@ public extension LokiAPI { let destination = signalMessage["destination"] as! String let ttl = LokiAPI.defaultMessageTTL if isPoWRequired { - // Storage server takes a time interval in milliseconds + // The storage server takes a time interval in milliseconds let now = NSDate.ows_millisecondTimeStamp() if let nonce = ProofOfWork.calculate(data: data, pubKey: destination, timestamp: now, ttl: ttl) { let result = Message(destination: destination, data: data, ttl: ttl, timestamp: now, nonce: nonce) diff --git a/SignalServiceKit/src/Loki/API/LokiAPI+Wrapping.swift b/SignalServiceKit/src/Loki/API/LokiAPI+Wrapping.swift index 7478a11d0..2a47b47e2 100644 --- a/SignalServiceKit/src/Loki/API/LokiAPI+Wrapping.swift +++ b/SignalServiceKit/src/Loki/API/LokiAPI+Wrapping.swift @@ -46,7 +46,7 @@ extension LokiAPI { let envelope = webSocketMessage.request!.body! return try SSKProtoEnvelope.parseData(envelope) } catch let error { - owsFailDebug("[Loki API] Failed to unwrap data: \(error).") + owsFailDebug("[Loki] Failed to unwrap data: \(error).") throw WrappingError.failedToUnwrapData } } @@ -60,7 +60,7 @@ extension LokiAPI { messageBuilder.setRequest(try requestBuilder.build()) return try messageBuilder.build() } catch let error { - owsFailDebug("[Loki API] - Failed to wrap envelope in web socket message: \(error).") + owsFailDebug("[Loki] Failed to wrap envelope in web socket message: \(error).") throw WrappingError.failedToWrapEnvelopeInWebSocketMessage } } @@ -68,14 +68,14 @@ extension LokiAPI { /// Wrap a `SignalMessage` in an `SSKProtoEnvelope`. private static func createEnvelope(around signalMessage: SignalMessage, timestamp: UInt64) throws -> SSKProtoEnvelope { guard let keyPair = SSKEnvironment.shared.identityManager.identityKeyPair() else { - owsFailDebug("[Loki API] - Failed to wrap message in envelope: identityManager.identityKeyPair() is invalid.") + owsFailDebug("[Loki] Failed to wrap message in envelope: identityManager.identityKeyPair() is invalid.") throw WrappingError.failedToWrapMessageInEnvelope } do { let hexEncodedPublicKey = keyPair.hexEncodedPublicKey let parameters = ParamParser(dictionary: signalMessage) let rawType: Int32 = try parameters.required(key: "type") - guard let type: SSKProtoEnvelope.SSKProtoEnvelopeType = SSKProtoEnvelope.SSKProtoEnvelopeType(rawValue: rawType) else { + guard let type = SSKProtoEnvelope.SSKProtoEnvelopeType(rawValue: rawType) else { Logger.error("Invalid envelope type: \(rawType).") throw ParamParser.ParseError.invalidFormat("type") } @@ -87,7 +87,7 @@ extension LokiAPI { } return try builder.build() } catch let error { - owsFailDebug("[Loki API] Failed to wrap message in envelope: \(error).") + owsFailDebug("[Loki] Failed to wrap message in envelope: \(error).") throw WrappingError.failedToWrapMessageInEnvelope } } diff --git a/SignalServiceKit/src/Loki/API/LokiAPI.swift b/SignalServiceKit/src/Loki/API/LokiAPI.swift index 9ba0c4818..748fcf45d 100644 --- a/SignalServiceKit/src/Loki/API/LokiAPI.swift +++ b/SignalServiceKit/src/Loki/API/LokiAPI.swift @@ -54,11 +54,11 @@ import PromiseKit guard let json = rawResponse as? JSON, let messages = json["messages"] as? [JSON] else { return [] } return messages.compactMap { message in guard let base64EncodedData = message["data"] as? String, let data = Data(base64Encoded: base64EncodedData) else { - Logger.warn("[Loki API] Failed to decode data for message: \(message).") + Logger.warn("[Loki] Failed to decode data for message: \(message).") return nil } guard let envelope = try? unwrap(data: data) else { - Logger.warn("[Loki API] Failed to unwrap data for message: \(message).") + Logger.warn("[Loki] Failed to unwrap data for message: \(message).") return nil } return envelope @@ -82,7 +82,7 @@ import PromiseKit @objc public static func objc_sendSignalMessage(_ signalMessage: SignalMessage, to destination: String, timestamp: UInt64, requiringPoW isPoWRequired: Bool) -> AnyPromise { let promise = Message.from(signalMessage: signalMessage, timestamp: timestamp, requiringPoW: isPoWRequired) .then(sendMessage) - .recoverNetworkError(on: DispatchQueue.global()) + .recoverNetworkErrorIfNeeded(on: DispatchQueue.global()) let anyPromise = AnyPromise(promise) anyPromise.retainUntilComplete() return anyPromise @@ -93,13 +93,11 @@ import PromiseKit private extension Promise { - func recoverNetworkError(on queue: DispatchQueue) -> Promise { + func recoverNetworkErrorIfNeeded(on queue: DispatchQueue) -> Promise { return self.recover(on: queue) { error -> Promise in switch error { - case NetworkManagerError.taskError(_, let underlyingError): - throw underlyingError - default: - throw error + case NetworkManagerError.taskError(_, let underlyingError): throw underlyingError + default: throw error } } } diff --git a/SignalServiceKit/src/Loki/Extensions/ECKeyPair.h b/SignalServiceKit/src/Loki/Crypto/ECKeyPair+Loki.h similarity index 100% rename from SignalServiceKit/src/Loki/Extensions/ECKeyPair.h rename to SignalServiceKit/src/Loki/Crypto/ECKeyPair+Loki.h diff --git a/SignalServiceKit/src/Loki/Extensions/ECKeyPair.m b/SignalServiceKit/src/Loki/Crypto/ECKeyPair+Loki.m similarity index 97% rename from SignalServiceKit/src/Loki/Extensions/ECKeyPair.m rename to SignalServiceKit/src/Loki/Crypto/ECKeyPair+Loki.m index 2f42d4087..d64fc1a73 100644 --- a/SignalServiceKit/src/Loki/Extensions/ECKeyPair.m +++ b/SignalServiceKit/src/Loki/Crypto/ECKeyPair+Loki.m @@ -1,4 +1,4 @@ -#import "ECKeyPair.h" +#import "ECKeyPair+Loki.h" extern void curve25519_donna(unsigned char *output, const unsigned char *a, const unsigned char *b); diff --git a/SignalServiceKit/src/Loki/Extensions/ECKeyPair.swift b/SignalServiceKit/src/Loki/Crypto/ECKeyPair+Loki.swift similarity index 100% rename from SignalServiceKit/src/Loki/Extensions/ECKeyPair.swift rename to SignalServiceKit/src/Loki/Crypto/ECKeyPair+Loki.swift diff --git a/SignalServiceKit/src/Loki/Utilities/Mnemonic/Mnemonic.swift b/SignalServiceKit/src/Loki/Crypto/Mnemonic/Mnemonic.swift similarity index 100% rename from SignalServiceKit/src/Loki/Utilities/Mnemonic/Mnemonic.swift rename to SignalServiceKit/src/Loki/Crypto/Mnemonic/Mnemonic.swift diff --git a/SignalServiceKit/src/Loki/Utilities/Mnemonic/english.txt b/SignalServiceKit/src/Loki/Crypto/Mnemonic/english.txt similarity index 100% rename from SignalServiceKit/src/Loki/Utilities/Mnemonic/english.txt rename to SignalServiceKit/src/Loki/Crypto/Mnemonic/english.txt diff --git a/SignalServiceKit/src/Loki/Utilities/Mnemonic/japanese.txt b/SignalServiceKit/src/Loki/Crypto/Mnemonic/japanese.txt similarity index 100% rename from SignalServiceKit/src/Loki/Utilities/Mnemonic/japanese.txt rename to SignalServiceKit/src/Loki/Crypto/Mnemonic/japanese.txt diff --git a/SignalServiceKit/src/Loki/Utilities/Mnemonic/portuguese.txt b/SignalServiceKit/src/Loki/Crypto/Mnemonic/portuguese.txt similarity index 100% rename from SignalServiceKit/src/Loki/Utilities/Mnemonic/portuguese.txt rename to SignalServiceKit/src/Loki/Crypto/Mnemonic/portuguese.txt diff --git a/SignalServiceKit/src/Loki/Utilities/Mnemonic/spanish.txt b/SignalServiceKit/src/Loki/Crypto/Mnemonic/spanish.txt similarity index 100% rename from SignalServiceKit/src/Loki/Utilities/Mnemonic/spanish.txt rename to SignalServiceKit/src/Loki/Crypto/Mnemonic/spanish.txt diff --git a/SignalServiceKit/src/Loki/Extensions/OWSPrimaryStorage+Loki.h b/SignalServiceKit/src/Loki/Crypto/OWSPrimaryStorage+Loki.h similarity index 100% rename from SignalServiceKit/src/Loki/Extensions/OWSPrimaryStorage+Loki.h rename to SignalServiceKit/src/Loki/Crypto/OWSPrimaryStorage+Loki.h diff --git a/SignalServiceKit/src/Loki/Extensions/OWSPrimaryStorage+Loki.m b/SignalServiceKit/src/Loki/Crypto/OWSPrimaryStorage+Loki.m similarity index 98% rename from SignalServiceKit/src/Loki/Extensions/OWSPrimaryStorage+Loki.m rename to SignalServiceKit/src/Loki/Crypto/OWSPrimaryStorage+Loki.m index 0d2698e31..125679a53 100644 --- a/SignalServiceKit/src/Loki/Extensions/OWSPrimaryStorage+Loki.m +++ b/SignalServiceKit/src/Loki/Crypto/OWSPrimaryStorage+Loki.m @@ -57,7 +57,7 @@ @try { return [self throws_loadPreKey:preKeyId]; } @catch (NSException *exception) { - OWSLogWarn(@"[Loki] New prekey had to be generated for %@.", pubKey); + OWSLogWarn(@"[Loki] New prekey generated for %@.", pubKey); return [self generateAndStorePreKeyForContact:pubKey]; } } diff --git a/SignalServiceKit/src/Loki/Crypto/ProofOfWork.swift b/SignalServiceKit/src/Loki/Crypto/ProofOfWork.swift index 25e3014d8..1073318fe 100644 --- a/SignalServiceKit/src/Loki/Crypto/ProofOfWork.swift +++ b/SignalServiceKit/src/Loki/Crypto/ProofOfWork.swift @@ -43,7 +43,7 @@ private extension MutableCollection where Element == UInt8, Index == Int { * This was copied from the desktop messenger. * Ref: libloki/proof-of-work.js */ -@objc public final class ProofOfWork : NSObject { +public enum ProofOfWork { // If this changes then we also have to use something other than UInt64 to support the new length private static let nonceLength = 8 @@ -54,8 +54,6 @@ private extension MutableCollection where Element == UInt8, Index == Int { case .production: return 100 } }() - - private override init() { } /// Calculate a proof of work with the given configuration /// @@ -67,7 +65,7 @@ private extension MutableCollection where Element == UInt8, Index == Int { /// - timestamp: The timestamp /// - ttl: The message time to live /// - Returns: A nonce string or `nil` if it failed - @objc public static func calculate(data: String, pubKey: String, timestamp: UInt64, ttl: UInt64) -> String? { + public static func calculate(data: String, pubKey: String, timestamp: UInt64, ttl: UInt64) -> String? { let payload = createPayload(pubKey: pubKey, data: data, timestamp: timestamp, ttl: ttl) let target = calcTarget(ttl: ttl, payloadLength: payload.count, nonceTrials: nonceTrialCount) diff --git a/SignalServiceKit/src/Loki/Extensions/SessionCipher+Loki.h b/SignalServiceKit/src/Loki/Crypto/SessionCipher+Loki.h similarity index 100% rename from SignalServiceKit/src/Loki/Extensions/SessionCipher+Loki.h rename to SignalServiceKit/src/Loki/Crypto/SessionCipher+Loki.h diff --git a/SignalServiceKit/src/Loki/Extensions/SessionCipher+Loki.m b/SignalServiceKit/src/Loki/Crypto/SessionCipher+Loki.m similarity index 100% rename from SignalServiceKit/src/Loki/Extensions/SessionCipher+Loki.m rename to SignalServiceKit/src/Loki/Crypto/SessionCipher+Loki.m diff --git a/SignalServiceKit/src/Loki/Docs/SessionReset.md b/SignalServiceKit/src/Loki/Documentation/SessionReset.md similarity index 100% rename from SignalServiceKit/src/Loki/Docs/SessionReset.md rename to SignalServiceKit/src/Loki/Documentation/SessionReset.md diff --git a/SignalServiceKit/src/Loki/Utilities/FriendRequestExpireJob.swift b/SignalServiceKit/src/Loki/Messages/FriendRequestExpirationJob.swift similarity index 73% rename from SignalServiceKit/src/Loki/Utilities/FriendRequestExpireJob.swift rename to SignalServiceKit/src/Loki/Messages/FriendRequestExpirationJob.swift index c79e33052..03f0d24e5 100644 --- a/SignalServiceKit/src/Loki/Utilities/FriendRequestExpireJob.swift +++ b/SignalServiceKit/src/Loki/Messages/FriendRequestExpirationJob.swift @@ -1,12 +1,11 @@ /* - This class is used for settings friend requests to expired - This is modelled after `OWSDisappearingMessagesJob`. + Modeled after `OWSDisappearingMessagesJob`. */ -@objc(OWSLokiFriendRequestExpireJob) -public final class FriendRequestExpireJob : NSObject { +@objc(LKFriendRequestExpirationJob) +public final class FriendRequestExpirationJob : NSObject { private let databaseConnection: YapDatabaseConnection - private let messageFinder = FriendRequestExpireMessageFinder() + private let messageFinder = FriendRequestExpirationMessageFinder() // These properties should only be accessed on the main thread. private var hasStarted = false @@ -18,26 +17,21 @@ public final class FriendRequestExpireJob : NSObject { fileprivate static let serialQueue = DispatchQueue(label: "network.loki.friendrequest.expire") /// Create a `FriendRequestExpireJob`. - /// This will create a auto-running job which will set friend requests to expired. - /// - /// - Parameter primaryStorage: The primary storage. + /// This will create an auto-running job which will set friend requests to expired. @objc public init(withPrimaryStorage primaryStorage: OWSPrimaryStorage) { databaseConnection = primaryStorage.newDatabaseConnection() super.init() - // This makes sure we only ever have one instance of this class + // This ensures we only ever have one instance of this class SwiftSingletons.register(self) - // Setup a timer that runs periodically to check for new friend request messages that will soon expire + // Set up a timer that runs periodically to check for new friend request messages that will soon expire AppReadiness.runNowOrWhenAppDidBecomeReady { if CurrentAppContext().isMainApp { let fallbackInterval = 5 * kMinuteInterval self.fallbackTimer = WeakTimer.scheduledTimer(timeInterval: fallbackInterval, target: self, userInfo: nil, repeats: true) { [weak self] _ in AssertIsOnMainThread() - - guard let strongSelf = self else { return } - - strongSelf.timerDidFire(mainTimer: false) + self?.timerDidFire(isMainTimer: false) } } } @@ -50,19 +44,19 @@ public final class FriendRequestExpireJob : NSObject { NotificationCenter.default.removeObserver(self) } - /// Start the job if we haven't done it yet + /// Start the job if we haven't done so yet. @objc public func startIfNecessary() { DispatchQueue.main.async { guard !self.hasStarted else { return } self.hasStarted = true; - FriendRequestExpireJob.serialQueue.async { + FriendRequestExpirationJob.serialQueue.async { self.runLoop() } } } - /// The main loop + /// The main loop. private func runLoop() { AssertIsOnFriendRequestExpireQueue(); @@ -83,27 +77,19 @@ public final class FriendRequestExpireJob : NSObject { // Schedule the next timer to run private func scheduleRun(by date: Date) { DispatchQueue.main.async { - guard CurrentAppContext().isMainAppAndActive else { - // Don't schedule run when inactive or not in main app. - return - } + guard CurrentAppContext().isMainAppAndActive else { return } // Don't schedule run when inactive or not in main app let minDelaySeconds: TimeInterval = 1 let delaySeconds = max(minDelaySeconds, date.timeIntervalSinceNow) let newTimerScheduleDate = Date(timeIntervalSinceNow: delaySeconds) - // check that we only set the date if needed - if let previousDate = self.nextExpireDate, previousDate < date { - // If the date is later than the one we have stored then just ignore - return - } + // Check that we only set the date if needed + if let previousDate = self.nextExpireDate, previousDate < date { return } // If the date is later than the one we have stored then just ignore self.resetNextExpireTimer() self.nextExpireDate = newTimerScheduleDate self.nextExpireTimer = WeakTimer.scheduledTimer(timeInterval: delaySeconds, target: self, userInfo: nil, repeats: false) { [weak self] _ in - guard let strongSelf = self else { return } - - strongSelf.timerDidFire(mainTimer: true) + self?.timerDidFire(isMainTimer: true) } } } @@ -125,15 +111,15 @@ public final class FriendRequestExpireJob : NSObject { // Sanity check guard message.friendRequestExpiresAt <= now else { - owsFailDebug("Refusing to expire friend request which doesn't expire until: \(message.friendRequestExpiresAt)") - return; + owsFailDebug("Refusing to expire friend request which doesn't expire until: \(message.friendRequestExpiresAt).") + return } // Check that we only expire sent friend requests guard message is TSOutgoingMessage && message.friendRequestStatus == .pending else { // Set message to not expire, so our other logic works correctly message.saveFriendRequestExpires(at: 0, with: transaction) - return; + return } // Loki: Expire the friend request message @@ -151,16 +137,16 @@ public final class FriendRequestExpireJob : NSObject { nextExpireDate = nil } - private func timerDidFire(mainTimer: Bool) { + private func timerDidFire(isMainTimer: Bool) { guard CurrentAppContext().isMainAppAndActive else { - let infoString = mainTimer ? "Main timer fired while main app is inactive" : "Ignoring fallbacktimer for app which is not main and active." - Logger.info("[Loki Friend Request Expire Job] \(infoString)") + let infoString = isMainTimer ? "Main timer fired while main app is inactive." : "Ignoring fallback timer for app which is not main and active." + Logger.info("[Loki] Friend request expiration job: \(infoString)") return } - if (mainTimer) { self.resetNextExpireTimer() } + if (isMainTimer) { self.resetNextExpireTimer() } - FriendRequestExpireJob.serialQueue.async { + FriendRequestExpirationJob.serialQueue.async { self.runLoop() } } @@ -168,12 +154,12 @@ public final class FriendRequestExpireJob : NSObject { } // MARK: Events -private extension FriendRequestExpireJob { +private extension FriendRequestExpirationJob { @objc func didBecomeActive() { AssertIsOnMainThread() AppReadiness.runNowOrWhenAppDidBecomeReady { - FriendRequestExpireJob.serialQueue.async { + FriendRequestExpirationJob.serialQueue.async { self.runLoop() } } @@ -187,12 +173,12 @@ private extension FriendRequestExpireJob { } // MARK: Asserts -private extension FriendRequestExpireJob { +private extension FriendRequestExpirationJob { func AssertIsOnFriendRequestExpireQueue() { #if DEBUG guard #available(iOS 10.0, *) else { return } - dispatchPrecondition(condition: .onQueue(FriendRequestExpireJob.serialQueue)) + dispatchPrecondition(condition: .onQueue(FriendRequestExpirationJob.serialQueue)) #endif } } diff --git a/SignalServiceKit/src/Loki/Utilities/FriendRequestExpireMessageFinder.swift b/SignalServiceKit/src/Loki/Messages/FriendRequestExpirationMessageFinder.swift similarity index 70% rename from SignalServiceKit/src/Loki/Utilities/FriendRequestExpireMessageFinder.swift rename to SignalServiceKit/src/Loki/Messages/FriendRequestExpirationMessageFinder.swift index 5dfcf600f..800cabe35 100644 --- a/SignalServiceKit/src/Loki/Utilities/FriendRequestExpireMessageFinder.swift +++ b/SignalServiceKit/src/Loki/Messages/FriendRequestExpirationMessageFinder.swift @@ -1,18 +1,19 @@ /* - This class is used for finding friend request messages which are expired. - This is modelled after `OWSDisappearingMessagesFinder`. + This class is used for finding friend request messages which are pending expiration. + Modeled after `OWSDisappearingMessagesFinder`. */ -@objc(OWSLokiFriendRequestExpireMessageFinder) -public class FriendRequestExpireMessageFinder : NSObject { - public static let friendRequestExpireColumn = "friend_request_expires_at" - public static let friendRequestExpireIndex = "loki_index_friend_request_expires_at" +@objc(LKFriendRequestExpirationMessageFinder) +public final class FriendRequestExpirationMessageFinder : NSObject { + + private static let friendRequestExpireColumn = "friend_request_expires_at" + private static let friendRequestExpireIndex = "loki_index_friend_request_expires_at" public func nextExpirationTimestamp(with transaction: YapDatabaseReadTransaction) -> UInt64? { - let query = "WHERE \(FriendRequestExpireMessageFinder.friendRequestExpireColumn) > 0 ORDER BY \(FriendRequestExpireMessageFinder.friendRequestExpireColumn) ASC" + let query = "WHERE \(FriendRequestExpirationMessageFinder.friendRequestExpireColumn) > 0 ORDER BY \(FriendRequestExpirationMessageFinder.friendRequestExpireColumn) ASC" let dbQuery = YapDatabaseQuery(string: query, parameters: []) - let ext = transaction.ext(FriendRequestExpireMessageFinder.friendRequestExpireIndex) as? YapDatabaseSecondaryIndexTransaction + let ext = transaction.ext(FriendRequestExpirationMessageFinder.friendRequestExpireIndex) as? YapDatabaseSecondaryIndexTransaction var firstMessage: TSMessage? = nil ext?.enumerateKeysAndObjects(matching: dbQuery) { (collection, key, object, stop) in firstMessage = object as? TSMessage @@ -35,10 +36,10 @@ public class FriendRequestExpireMessageFinder : NSObject { var messageIds = [String]() let now = NSDate.ows_millisecondTimeStamp() - let query = "WHERE \(FriendRequestExpireMessageFinder.friendRequestExpireColumn) > 0 AND \(FriendRequestExpireMessageFinder.friendRequestExpireColumn) <= \(now)" + let query = "WHERE \(FriendRequestExpirationMessageFinder.friendRequestExpireColumn) > 0 AND \(FriendRequestExpirationMessageFinder.friendRequestExpireColumn) <= \(now)" // When (friendRequestExpiresAt == 0) then the friend request SHOULD NOT be set to expired let dbQuery = YapDatabaseQuery(string: query, parameters: []) - if let ext = transaction.ext(FriendRequestExpireMessageFinder.friendRequestExpireIndex) as? YapDatabaseSecondaryIndexTransaction { + if let ext = transaction.ext(FriendRequestExpirationMessageFinder.friendRequestExpireIndex) as? YapDatabaseSecondaryIndexTransaction { ext.enumerateKeys(matching: dbQuery) { (_, key, _) in messageIds.append(key) } @@ -49,9 +50,9 @@ public class FriendRequestExpireMessageFinder : NSObject { } -// MARK: YapDatabaseExtension +// MARK: Database Extension -public extension FriendRequestExpireMessageFinder { +public extension FriendRequestExpirationMessageFinder { @objc public static var indexDatabaseExtension: YapDatabaseSecondaryIndex { let setup = YapDatabaseSecondaryIndexSetup() diff --git a/SignalServiceKit/src/Loki/Messages/OWSEphemeralMessage.h b/SignalServiceKit/src/Loki/Messages/LKEphemeralMessage.h similarity index 53% rename from SignalServiceKit/src/Loki/Messages/OWSEphemeralMessage.h rename to SignalServiceKit/src/Loki/Messages/LKEphemeralMessage.h index ed4ec12ce..16e318f75 100644 --- a/SignalServiceKit/src/Loki/Messages/OWSEphemeralMessage.h +++ b/SignalServiceKit/src/Loki/Messages/LKEphemeralMessage.h @@ -3,10 +3,10 @@ NS_ASSUME_NONNULL_BEGIN NS_SWIFT_NAME(EphemeralMessage) -@interface OWSEphemeralMessage : TSOutgoingMessage +@interface LKEphemeralMessage : TSOutgoingMessage /// Used to establish sessions. -+ (OWSEphemeralMessage *)createEmptyOutgoingMessageInThread:(TSThread *)thread; ++ (LKEphemeralMessage *)createEmptyOutgoingMessageInThread:(TSThread *)thread; @end diff --git a/SignalServiceKit/src/Loki/Messages/LKEphemeralMessage.m b/SignalServiceKit/src/Loki/Messages/LKEphemeralMessage.m new file mode 100644 index 000000000..658e9b795 --- /dev/null +++ b/SignalServiceKit/src/Loki/Messages/LKEphemeralMessage.m @@ -0,0 +1,13 @@ +#import "LKEphemeralMessage.h" +#import + +@implementation LKEphemeralMessage + ++ (LKEphemeralMessage *)createEmptyOutgoingMessageInThread:(TSThread *)thread { + return [[LKEphemeralMessage alloc] initOutgoingMessageWithTimestamp:NSDate.ows_millisecondTimeStamp inThread:thread messageBody:@"" attachmentIds:[NSMutableArray new] + expiresInSeconds:0 expireStartedAt:0 isVoiceMessage:NO groupMetaMessage:TSGroupMetaMessageUnspecified quotedMessage:nil contactShare:nil linkPreview:nil]; +} + +- (BOOL)shouldBeSaved { return NO; } + +@end diff --git a/SignalServiceKit/src/Loki/Messages/OWSFriendRequestMessage.h b/SignalServiceKit/src/Loki/Messages/LKFriendRequestMessage.h similarity index 68% rename from SignalServiceKit/src/Loki/Messages/OWSFriendRequestMessage.h rename to SignalServiceKit/src/Loki/Messages/LKFriendRequestMessage.h index 432706588..d1d626582 100644 --- a/SignalServiceKit/src/Loki/Messages/OWSFriendRequestMessage.h +++ b/SignalServiceKit/src/Loki/Messages/LKFriendRequestMessage.h @@ -3,7 +3,7 @@ NS_ASSUME_NONNULL_BEGIN NS_SWIFT_NAME(FriendRequestMessage) -@interface OWSFriendRequestMessage : TSOutgoingMessage +@interface LKFriendRequestMessage : TSOutgoingMessage @end diff --git a/SignalServiceKit/src/Loki/Messages/OWSFriendRequestMessage.m b/SignalServiceKit/src/Loki/Messages/LKFriendRequestMessage.m similarity index 92% rename from SignalServiceKit/src/Loki/Messages/OWSFriendRequestMessage.m rename to SignalServiceKit/src/Loki/Messages/LKFriendRequestMessage.m index dff9ae003..eed1204c2 100644 --- a/SignalServiceKit/src/Loki/Messages/OWSFriendRequestMessage.m +++ b/SignalServiceKit/src/Loki/Messages/LKFriendRequestMessage.m @@ -1,9 +1,9 @@ -#import "OWSFriendRequestMessage.h" +#import "LKFriendRequestMessage.h" #import "OWSPrimaryStorage+Loki.h" #import "SignalRecipient.h" #import -@implementation OWSFriendRequestMessage +@implementation LKFriendRequestMessage -(BOOL)isFriendRequest { return YES; } diff --git a/SignalServiceKit/src/Loki/Extensions/Notification.swift b/SignalServiceKit/src/Loki/Messages/Notification+FriendRequestStatus.swift similarity index 100% rename from SignalServiceKit/src/Loki/Extensions/Notification.swift rename to SignalServiceKit/src/Loki/Messages/Notification+FriendRequestStatus.swift diff --git a/SignalServiceKit/src/Loki/Messages/OWSEphemeralMessage.m b/SignalServiceKit/src/Loki/Messages/OWSEphemeralMessage.m deleted file mode 100644 index d3bb6e7be..000000000 --- a/SignalServiceKit/src/Loki/Messages/OWSEphemeralMessage.m +++ /dev/null @@ -1,13 +0,0 @@ -#import "OWSEphemeralMessage.h" -#import - -@implementation OWSEphemeralMessage - -+ (OWSEphemeralMessage *)createEmptyOutgoingMessageInThread:(TSThread *)thread { - return [[OWSEphemeralMessage alloc] initOutgoingMessageWithTimestamp:NSDate.ows_millisecondTimeStamp inThread:thread messageBody:@"" attachmentIds:[NSMutableArray new] - expiresInSeconds:0 expireStartedAt:0 isVoiceMessage:NO groupMetaMessage:TSGroupMetaMessageUnspecified quotedMessage:nil contactShare:nil linkPreview:nil]; -} - -- (BOOL)shouldBeSaved { return NO; } - -@end diff --git a/SignalServiceKit/src/Loki/Extensions/SSKProtoPrekeyBundleMessage.swift b/SignalServiceKit/src/Loki/Messages/SSKProtoPrekeyBundleMessage+Loki.swift similarity index 100% rename from SignalServiceKit/src/Loki/Extensions/SSKProtoPrekeyBundleMessage.swift rename to SignalServiceKit/src/Loki/Messages/SSKProtoPrekeyBundleMessage+Loki.swift diff --git a/SignalServiceKit/src/Loki/Extensions/NSObject.h b/SignalServiceKit/src/Loki/Utilities/NSObject+Casting.h similarity index 100% rename from SignalServiceKit/src/Loki/Extensions/NSObject.h rename to SignalServiceKit/src/Loki/Utilities/NSObject+Casting.h diff --git a/SignalServiceKit/src/Loki/Extensions/NSObject.m b/SignalServiceKit/src/Loki/Utilities/NSObject+Casting.m similarity index 83% rename from SignalServiceKit/src/Loki/Extensions/NSObject.m rename to SignalServiceKit/src/Loki/Utilities/NSObject+Casting.m index 0bdd83304..cdd16015a 100644 --- a/SignalServiceKit/src/Loki/Extensions/NSObject.m +++ b/SignalServiceKit/src/Loki/Utilities/NSObject+Casting.m @@ -1,4 +1,4 @@ -#import "NSObject.h" +#import "NSObject+Casting.h" @implementation NSObject (Casting) diff --git a/SignalServiceKit/src/Messages/OWSMessageManager.m b/SignalServiceKit/src/Messages/OWSMessageManager.m index d87770167..72a37a24b 100644 --- a/SignalServiceKit/src/Messages/OWSMessageManager.m +++ b/SignalServiceKit/src/Messages/OWSMessageManager.m @@ -19,7 +19,7 @@ #import "OWSDisappearingConfigurationUpdateInfoMessage.h" #import "OWSDisappearingMessagesConfiguration.h" #import "OWSDisappearingMessagesJob.h" -#import "OWSEphemeralMessage.h" +#import "LKEphemeralMessage.h" #import "OWSIdentityManager.h" #import "OWSIncomingMessageFinder.h" #import "OWSIncomingSentMessageTranscript.h" @@ -51,7 +51,7 @@ #import "TSQuotedMessage.h" #import #import -#import +#import #import #import #import @@ -1022,10 +1022,10 @@ NS_ASSUME_NONNULL_BEGIN [thread saveWithTransaction:transaction]; /// Loki: Send an empty message to trigger the session reset code for both parties - OWSEphemeralMessage *emptyMessage = [OWSEphemeralMessage createEmptyOutgoingMessageInThread:thread]; + LKEphemeralMessage *emptyMessage = [LKEphemeralMessage createEmptyOutgoingMessageInThread:thread]; [self.messageSenderJobQueue addMessage:emptyMessage transaction:transaction]; - OWSLogDebug(@"[Loki] Session reset has been received from %@.", envelope.source); + OWSLogDebug(@"[Loki] Session reset received from %@.", envelope.source); /* Loki: Original code * ================ @@ -1481,7 +1481,7 @@ NS_ASSUME_NONNULL_BEGIN [existingFriendRequestMessage saveFriendRequestStatus:TSMessageFriendRequestStatusAccepted withTransaction:transaction]; } // The two lines below are equivalent to calling [ThreadUtil enqueueAcceptFriendRequestMessageInThread:thread] - OWSEphemeralMessage *emptyMessage = [OWSEphemeralMessage createEmptyOutgoingMessageInThread:thread]; + LKEphemeralMessage *emptyMessage = [LKEphemeralMessage createEmptyOutgoingMessageInThread:thread]; [self.messageSenderJobQueue addMessage:emptyMessage transaction:transaction]; } else if (!thread.isContactFriend) { // Checking that the sender of the message isn't already a friend is necessary because otherwise @@ -1707,13 +1707,13 @@ NS_ASSUME_NONNULL_BEGIN TSContactThread *_Nullable thread = [TSContactThread getThreadWithContactId:pubKey transaction:transaction]; if (!thread) { - OWSLogDebug(@"[Loki] New session was adopted but we failed to get the thread for %@.", pubKey); + OWSLogDebug(@"[Loki] A new session was adopted but we failed to get the thread for %@.", pubKey); return; } // If we were the ones to initiate the reset then we need to send back an empty message if (thread.sessionResetState == TSContactThreadSessionResetStateInitiated) { - OWSEphemeralMessage *emptyMessage = [OWSEphemeralMessage createEmptyOutgoingMessageInThread:thread]; + LKEphemeralMessage *emptyMessage = [LKEphemeralMessage createEmptyOutgoingMessageInThread:thread]; [self.messageSenderJobQueue addMessage:emptyMessage transaction:transaction]; } diff --git a/SignalServiceKit/src/Messages/OWSMessageSender.m b/SignalServiceKit/src/Messages/OWSMessageSender.m index a0c8355c7..419102baa 100644 --- a/SignalServiceKit/src/Messages/OWSMessageSender.m +++ b/SignalServiceKit/src/Messages/OWSMessageSender.m @@ -43,7 +43,7 @@ #import "TSRequest.h" #import "TSSocketManager.h" #import "TSThread.h" -#import "OWSFriendRequestMessage.h" +#import "LKFriendRequestMessage.h" #import #import #import @@ -1573,7 +1573,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; // A friend request means we don't have a session with the person // There's no point to check for it - Boolean isFriendRequest = [messageSend.message isKindOfClass:OWSFriendRequestMessage.class]; + Boolean isFriendRequest = [messageSend.message isKindOfClass:LKFriendRequestMessage.class]; if (!isFriendRequest) { [self throws_ensureRecipientHasSessionForMessageSend:messageSend deviceId:deviceId]; } @@ -1818,7 +1818,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; OWSAssertDebug(recipientId.length > 0); // Loki: Handle friend requests differently - Boolean isFriendRequest = [messageSend.message isKindOfClass:OWSFriendRequestMessage.class]; + Boolean isFriendRequest = [messageSend.message isKindOfClass:LKFriendRequestMessage.class]; if (isFriendRequest) { return [self throws_encryptedFriendMessageForMessageSend:messageSend deviceId:deviceId plainText:plainText]; } diff --git a/SignalServiceKit/src/SSKEnvironment.h b/SignalServiceKit/src/SSKEnvironment.h index 4fa20ec41..983925ad3 100644 --- a/SignalServiceKit/src/SSKEnvironment.h +++ b/SignalServiceKit/src/SSKEnvironment.h @@ -28,7 +28,7 @@ NS_ASSUME_NONNULL_BEGIN @class YapDatabaseConnection; // Loki -@class OWSLokiFriendRequestExpireJob; +@class LKFriendRequestExpirationJob; @protocol ContactsManagerProtocol; @protocol NotificationsProtocol; @@ -115,8 +115,8 @@ NS_ASSUME_NONNULL_BEGIN @property (atomic, readonly) YapDatabaseConnection *analyticsDBConnection; // Loki -@property (nonatomic, readonly) OWSLokiFriendRequestExpireJob *lokiFriendRequestExpireJob; -- (void)setLokiFriendRequestExpireJob:(OWSLokiFriendRequestExpireJob *)lokiFriendRequestExpireJob; +@property (nonatomic, readonly) LKFriendRequestExpirationJob *lokiFriendRequestExpireJob; +- (void)setLokiFriendRequestExpireJob:(LKFriendRequestExpirationJob *)lokiFriendRequestExpireJob; - (BOOL)isComplete; diff --git a/SignalServiceKit/src/SSKEnvironment.m b/SignalServiceKit/src/SSKEnvironment.m index f586f1e4e..14e77587b 100644 --- a/SignalServiceKit/src/SSKEnvironment.m +++ b/SignalServiceKit/src/SSKEnvironment.m @@ -38,7 +38,7 @@ static SSKEnvironment *sharedSSKEnvironment; @property (nonatomic) OWSAttachmentDownloads *attachmentDownloads; // Loki -@property (nonatomic) OWSLokiFriendRequestExpireJob *lokiFriendRequestExpireJob; +@property (nonatomic) LKFriendRequestExpirationJob *lokiFriendRequestExpireJob; @end @@ -199,7 +199,7 @@ static SSKEnvironment *sharedSSKEnvironment; } } -- (void)setLokiFriendRequestExpireJob:(OWSLokiFriendRequestExpireJob *)lokiFriendRequestExpireJob { +- (void)setLokiFriendRequestExpireJob:(LKFriendRequestExpirationJob *)lokiFriendRequestExpireJob { @synchronized(self) { OWSAssertDebug(lokiFriendRequestExpireJob); OWSAssertDebug(!_lokiFriendRequestExpireJob); diff --git a/SignalServiceKit/src/Storage/OWSPrimaryStorage.m b/SignalServiceKit/src/Storage/OWSPrimaryStorage.m index eebbcaa39..52cc1b3b3 100644 --- a/SignalServiceKit/src/Storage/OWSPrimaryStorage.m +++ b/SignalServiceKit/src/Storage/OWSPrimaryStorage.m @@ -215,7 +215,7 @@ void VerifyRegistrationsForPrimaryStorage(OWSStorage *storage) [TSDatabaseView asyncRegisterLazyRestoreAttachmentsDatabaseView:self]; [SSKJobRecordFinder asyncRegisterDatabaseExtensionObjCWithStorage:self]; - [OWSLokiFriendRequestExpireMessageFinder asyncRegisterDatabaseExtensions:self]; + [LKFriendRequestExpirationMessageFinder asyncRegisterDatabaseExtensions:self]; [self.database flushExtensionRequestsWithCompletionQueue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) diff --git a/SignalServiceKit/src/TSPrefix.h b/SignalServiceKit/src/TSPrefix.h index 13e393f57..c1e862c4a 100644 --- a/SignalServiceKit/src/TSPrefix.h +++ b/SignalServiceKit/src/TSPrefix.h @@ -12,7 +12,7 @@ static const NSUInteger ddLogLevel = DDLogLevelAll; static const NSUInteger ddLogLevel = DDLogLevelInfo; #endif #import "OWSAnalytics.h" -#import "NSObject.h" +#import "NSObject+Casting.h" #import "SSKAsserts.h" #import "TSConstants.h" #import