This commit is contained in:
Niels Andriesse 2019-05-21 15:21:51 +10:00
parent 472113bccb
commit dc103c7bd6
7 changed files with 56 additions and 59 deletions

View file

@ -1355,7 +1355,7 @@
D17BB5C25D615AB49813100C /* Pods_Signal.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Signal.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D17BB5C25D615AB49813100C /* Pods_Signal.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Signal.framework; sourceTree = BUILT_PRODUCTS_DIR; };
D2179CFB16BB0B3A0006F3AB /* CoreTelephony.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreTelephony.framework; path = System/Library/Frameworks/CoreTelephony.framework; sourceTree = SDKROOT; }; D2179CFB16BB0B3A0006F3AB /* CoreTelephony.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreTelephony.framework; path = System/Library/Frameworks/CoreTelephony.framework; sourceTree = SDKROOT; };
D2179CFD16BB0B480006F3AB /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; D2179CFD16BB0B480006F3AB /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; };
D221A089169C9E5E00537ABF /* Session.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Session.app; sourceTree = BUILT_PRODUCTS_DIR; }; D221A089169C9E5E00537ABF /* Signal.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Signal.app; sourceTree = BUILT_PRODUCTS_DIR; };
D221A08D169C9E5E00537ABF /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; D221A08D169C9E5E00537ABF /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
D221A08F169C9E5E00537ABF /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; D221A08F169C9E5E00537ABF /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
D221A091169C9E5E00537ABF /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; D221A091169C9E5E00537ABF /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
@ -2625,7 +2625,7 @@
D221A08A169C9E5E00537ABF /* Products */ = { D221A08A169C9E5E00537ABF /* Products */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
D221A089169C9E5E00537ABF /* Session.app */, D221A089169C9E5E00537ABF /* Signal.app */,
D221A0AA169C9E5F00537ABF /* SignalTests.xctest */, D221A0AA169C9E5F00537ABF /* SignalTests.xctest */,
453518681FC635DD00210559 /* SignalShareExtension.appex */, 453518681FC635DD00210559 /* SignalShareExtension.appex */,
453518921FC63DBF00210559 /* SignalMessaging.framework */, 453518921FC63DBF00210559 /* SignalMessaging.framework */,
@ -2861,7 +2861,7 @@
); );
name = Signal; name = Signal;
productName = RedPhone; productName = RedPhone;
productReference = D221A089169C9E5E00537ABF /* Session.app */; productReference = D221A089169C9E5E00537ABF /* Signal.app */;
productType = "com.apple.product-type.application"; productType = "com.apple.product-type.application";
}; };
D221A0A9169C9E5F00537ABF /* SignalTests */ = { D221A0A9169C9E5F00537ABF /* SignalTests */ = {
@ -4353,12 +4353,13 @@
LLVM_LTO = NO; LLVM_LTO = NO;
OTHER_LDFLAGS = "$(inherited)"; OTHER_LDFLAGS = "$(inherited)";
PRODUCT_BUNDLE_IDENTIFIER = "com.niels-andriesse.loki-network.Loki-Messenger"; PRODUCT_BUNDLE_IDENTIFIER = "com.niels-andriesse.loki-network.Loki-Messenger";
PRODUCT_NAME = Session; PRODUCT_NAME = Signal;
PROVISIONING_PROFILE = ""; PROVISIONING_PROFILE = "";
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";
RUN_CLANG_STATIC_ANALYZER = YES; RUN_CLANG_STATIC_ANALYZER = YES;
SDKROOT = iphoneos; SDKROOT = iphoneos;
SWIFT_OBJC_BRIDGING_HEADER = "Signal/src/Signal-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Signal/src/Signal-Bridging-Header.h";
SWIFT_OBJC_INTERFACE_HEADER_NAME = "Session-Swift.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
TEST_AFTER_BUILD = YES; TEST_AFTER_BUILD = YES;
@ -4418,11 +4419,12 @@
LLVM_LTO = NO; LLVM_LTO = NO;
OTHER_LDFLAGS = "$(inherited)"; OTHER_LDFLAGS = "$(inherited)";
PRODUCT_BUNDLE_IDENTIFIER = "com.niels-andriesse.loki-network.Loki-Messenger"; PRODUCT_BUNDLE_IDENTIFIER = "com.niels-andriesse.loki-network.Loki-Messenger";
PRODUCT_NAME = Session; PRODUCT_NAME = Signal;
PROVISIONING_PROFILE = ""; PROVISIONING_PROFILE = "";
RUN_CLANG_STATIC_ANALYZER = YES; RUN_CLANG_STATIC_ANALYZER = YES;
SDKROOT = iphoneos; SDKROOT = iphoneos;
SWIFT_OBJC_BRIDGING_HEADER = "Signal/src/Signal-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Signal/src/Signal-Bridging-Header.h";
SWIFT_OBJC_INTERFACE_HEADER_NAME = "Session-Swift.h";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
TEST_AFTER_BUILD = YES; TEST_AFTER_BUILD = YES;
VALID_ARCHS = "arm64 armv7 armv7s"; VALID_ARCHS = "arm64 armv7 armv7s";

View file

@ -175,12 +175,13 @@ public class MessageFetcherJob: NSObject {
} }
private func fetchUndeliveredMessages() -> Promise<(envelopes: [SSKProtoEnvelope], more: Bool)> { private func fetchUndeliveredMessages() -> Promise<(envelopes: [SSKProtoEnvelope], more: Bool)> {
return Promise { resolver in notImplemented()
LokiAPI.getMessages().done { envelopes in // return Promise { resolver in
resolver.fulfill((envelopes: envelopes, more: false)) // LokiAPI.getMessages().done { envelopes in
}.catch { error in // resolver.fulfill((envelopes: envelopes, more: false))
resolver.reject(error) // }.catch { error in
} // resolver.reject(error)
// }
// Loki: Original code // Loki: Original code
// ======== // ========
// let request = OWSRequestFactory.getMessagesRequest() // let request = OWSRequestFactory.getMessagesRequest()
@ -203,7 +204,7 @@ public class MessageFetcherJob: NSObject {
// resolver.reject(error) // resolver.reject(error)
// }) // })
// ======== // ========
} // }
} }
private func acknowledgeDelivery(envelope: SSKProtoEnvelope) { private func acknowledgeDelivery(envelope: SSKProtoEnvelope) {

View file

@ -619,7 +619,7 @@ typedef NS_ENUM(NSInteger, HomeViewControllerSection) {
switch (self.homeViewMode) { switch (self.homeViewMode) {
case HomeViewMode_Inbox: case HomeViewMode_Inbox:
// TODO: Should our app name be translated? Probably not. // TODO: Should our app name be translated? Probably not.
self.title = NSLocalizedString(@"Session", @"Title for the home view's default mode."); self.title = NSLocalizedString(@"Signal", @"Title for the home view's default mode.");
break; break;
case HomeViewMode_Archive: case HomeViewMode_Archive:
self.title = NSLocalizedString(@"HOME_VIEW_TITLE_ARCHIVE", @"Title for the home view's 'archive' mode."); self.title = NSLocalizedString(@"HOME_VIEW_TITLE_ARCHIVE", @"Title for the home view's 'archive' mode.");

View file

@ -2578,7 +2578,7 @@
"New Message" = "New Message"; "New Message" = "New Message";
"Secure session reset in progress" = "Secure session reset in progress"; "Secure session reset in progress" = "Secure session reset in progress";
"Secure session reset done" = "Secure session reset done"; "Secure session reset done" = "Secure session reset done";
"Session" = "Session"; "Signal" = "Signal";
"You've sent %@ a friend request" = "You've sent %@ a friend request"; "You've sent %@ a friend request" = "You've sent %@ a friend request";
"You've declined %@'s friend request" = "You've declined %@'s friend request"; "You've declined %@'s friend request" = "You've declined %@'s friend request";
"You've accepted %@'s friend request" = "You've accepted %@'s friend request"; "You've accepted %@'s friend request" = "You've accepted %@'s friend request";

View file

@ -1,6 +1,7 @@
import PromiseKit import PromiseKit
@objc public final class LokiAPI : NSObject { @objc public final class LokiAPI : NSObject {
private static let storage = OWSPrimaryStorage.shared()
// MARK: Caching // MARK: Caching
private static var swarmCache: [String:Set<Target>] = [:] private static var swarmCache: [String:Set<Target>] = [:]
@ -34,7 +35,7 @@ import PromiseKit
} }
} }
public typealias MessagesPromise = Promise<[SSKProtoEnvelope]> public typealias MessagesPromise = Promise<[SSKProtoEnvelope]> // To keep the return type of getMessages() readable
// MARK: Lifecycle // MARK: Lifecycle
override private init() { } override private init() { }
@ -47,18 +48,15 @@ import PromiseKit
} }
private static func getRandomSnode() -> Promise<Target> { private static func getRandomSnode() -> Promise<Target> {
return Promise<Target> { seal in return Promise<Target> { _ in notImplemented() } // TODO: Implement
seal.fulfill(Target(address: "http://13.238.53.205", port: 8080)) // TODO: Temporary
}
} }
private static func getSwarm(for hexEncodedPublicKey: String) -> Promise<Set<Target>> { private static func getSwarm(for hexEncodedPublicKey: String) -> Promise<Set<Target>> {
if let cachedSwarm = swarmCache[hexEncodedPublicKey], cachedSwarm.count >= targetSnodeCount { if let cachedSwarm = swarmCache[hexEncodedPublicKey], cachedSwarm.count >= targetSnodeCount {
return Promise<Set<Target>> { $0.fulfill(cachedSwarm) } return Promise<Set<Target>> { $0.fulfill(cachedSwarm) }
} else { } else {
return getRandomSnode().then { invoke(.getSwarm, on: $0, with: [ "pubKey" : hexEncodedPublicKey ]) }.map { rawResponse in return getRandomSnode().then { invoke(.getSwarm, on: $0, with: [ "pubKey" : hexEncodedPublicKey ]) }
return [] // TODO: Parse targets from raw response .map { parseTargets(from: $0) }.get { swarmCache[hexEncodedPublicKey] = $0 }
}.get { swarmCache[hexEncodedPublicKey] = $0 }
} }
} }
@ -72,12 +70,12 @@ import PromiseKit
return getTargetSnodes(for: hexEncodedPublicKey).mapValues { targetSnode in return getTargetSnodes(for: hexEncodedPublicKey).mapValues { targetSnode in
let lastHash = getLastHash(for: targetSnode) ?? "" let lastHash = getLastHash(for: targetSnode) ?? ""
let parameters: [String:Any] = [ "pubKey" : hexEncodedPublicKey, "lastHash" : lastHash ] let parameters: [String:Any] = [ "pubKey" : hexEncodedPublicKey, "lastHash" : lastHash ]
return invoke(.getMessages, on: targetSnode, with: parameters).map { response in return invoke(.getMessages, on: targetSnode, with: parameters).map { rawResponse in
if let json = response as? JSON, let messages = json["messages"] as? [JSON], let lastMessage = messages.last, if let json = rawResponse as? JSON, let messages = json["messages"] as? [JSON], let lastMessage = messages.last,
let hash = lastMessage["hash"] as? String, let expiresAt = lastMessage["expiration"] as? Int { let hash = lastMessage["hash"] as? String, let expiresAt = lastMessage["expiration"] as? Int {
updateLastHash(for: targetSnode, hash: hash, expiresAt: UInt64(expiresAt)) setLastHash(for: targetSnode, hash: hash, expiresAt: UInt64(expiresAt))
} }
return parseProtoEnvelopes(from: response) return parseProtoEnvelopes(from: rawResponse)
} }
} }
} }
@ -98,7 +96,26 @@ import PromiseKit
return anyPromise return anyPromise
} }
// MARK: Convenience // MARK: Last Hash
private static func setLastHash(for target: Target, hash: String, expiresAt: UInt64) {
storage.dbReadWriteConnection.readWrite { transaction in
storage.setLastMessageHashForServiceNode(target.address, hash: hash, expiresAt: expiresAt, transaction: transaction)
}
}
private static func getLastHash(for target: Target) -> String? {
var lastHash: String?
storage.dbReadWriteConnection.readWrite { transaction in
lastHash = storage.getLastMessageHash(forServiceNode: target.address, transaction: transaction)
}
return lastHash
}
// MARK: Parsing
private static func parseTargets(from rawResponse: Any) -> Set<Target> {
notImplemented()
}
private static func parseProtoEnvelopes(from rawResponse: Any) -> [SSKProtoEnvelope] { private static func parseProtoEnvelopes(from rawResponse: Any) -> [SSKProtoEnvelope] {
guard let json = rawResponse as? JSON, let messages = json["messages"] as? [JSON] else { return [] } guard let json = rawResponse as? JSON, let messages = json["messages"] as? [JSON] else { return [] }
return messages.compactMap { message in return messages.compactMap { message in
@ -126,26 +143,3 @@ private extension Promise {
} }
} }
} }
// MARK: Last Hash
fileprivate extension LokiAPI {
private static var primaryStorage: OWSPrimaryStorage {
return OWSPrimaryStorage.shared()
}
fileprivate static func updateLastHash(for node: Target, hash: String, expiresAt: UInt64) {
primaryStorage.dbReadWriteConnection.readWrite { transaction in
self.primaryStorage.setLastMessageHash(hash, expiresAt: expiresAt, serviceNode: node.address, transaction: transaction)
}
}
fileprivate static func getLastHash(for node: Target) -> String? {
var lastHash: String? = nil
primaryStorage.dbReadWriteConnection.readWrite { transaction in
lastHash = self.primaryStorage.getLastMessageHash(forServiceNode: node.address, transaction: transaction)
}
return lastHash
}
}

View file

@ -77,11 +77,11 @@ NS_ASSUME_NONNULL_BEGIN
/** /**
Get the last message hash for the given service node. Get the last message hash for the given service node.
This function will check the stored last hash and remove it if the `expireAt` has already passed. This function will check the stored last hash and remove it if the `expiresAt` has already passed.
@param serviceNode The service node id @param serviceNode The service node ID.
@param transaction A read write transaction @param transaction A read write transaction.
@return The last hash or nil if it doesn't exist @return The last hash or `nil` if it doesn't exist.
*/ */
- (NSString *_Nullable)getLastMessageHashForServiceNode:(NSString *)serviceNode transaction:(YapDatabaseReadWriteTransaction *)transaction; - (NSString *_Nullable)getLastMessageHashForServiceNode:(NSString *)serviceNode transaction:(YapDatabaseReadWriteTransaction *)transaction;
@ -89,12 +89,12 @@ NS_ASSUME_NONNULL_BEGIN
Set the last message hash for the given service node. Set the last message hash for the given service node.
This will override any previous hashes stored for the given service node. This will override any previous hashes stored for the given service node.
@param hash The last message hash @param serviceNode The service node ID.
@param expiresAt The time the message expires on the server @param hash The last message hash.
@param serviceNode The service node @param expiresAt The time the message expires on the server.
@param transaction A read write transaction @param transaction A read write transaction.
*/ */
- (void)setLastMessageHash:(NSString *)hash expiresAt:(u_int64_t)expiresAt serviceNode:(NSString *)serviceNode transaction:(YapDatabaseReadWriteTransaction *)transaction; - (void)setLastMessageHashForServiceNode:(NSString *)serviceNode hash:(NSString *)hash expiresAt:(u_int64_t)expiresAt transaction:(YapDatabaseReadWriteTransaction *)transaction;
@end @end

View file

@ -143,7 +143,7 @@
return hash; return hash;
} }
- (void)setLastMessageHash:(NSString *)hash expiresAt:(u_int64_t)expiresAt serviceNode:(NSString *)serviceNode transaction:(YapDatabaseReadWriteTransaction *)transaction { - (void)setLastMessageHashForServiceNode:(NSString *)serviceNode hash:(NSString *)hash expiresAt:(u_int64_t)expiresAt transaction:(YapDatabaseReadWriteTransaction *)transaction {
NSDictionary *dict = @{ NSDictionary *dict = @{
@"hash": hash, @"hash": hash,
@"expiresAt": @(expiresAt) @"expiresAt": @(expiresAt)