pull/184/head
nielsandriesse 5 years ago
parent 8fa7f66774
commit 62dbbf7d57

@ -108,8 +108,8 @@ public final class FriendRequestProtocol : NSObject {
print("[Loki] Invalid Session ID: \(hexEncodedPublicKey).") print("[Loki] Invalid Session ID: \(hexEncodedPublicKey).")
return return
} }
let ourHexEncodedPublicKey = getUserHexEncodedPublicKey() let userHexEncodedPublicKey = getUserHexEncodedPublicKey()
let ourDevices = LokiDatabaseUtilities.getLinkedDeviceHexEncodedPublicKeys(for: ourHexEncodedPublicKey, in: transaction) let userLinkedDevices = LokiDatabaseUtilities.getLinkedDeviceHexEncodedPublicKeys(for: userHexEncodedPublicKey, in: transaction)
// Accept all outstanding friend requests associated with this user and try to establish sessions with the // Accept all outstanding friend requests associated with this user and try to establish sessions with the
// subset of their devices that haven't sent a friend request. // subset of their devices that haven't sent a friend request.
let linkedDevices = LokiDatabaseUtilities.getLinkedDeviceHexEncodedPublicKeys(for: hexEncodedPublicKey, in: transaction) let linkedDevices = LokiDatabaseUtilities.getLinkedDeviceHexEncodedPublicKeys(for: hexEncodedPublicKey, in: transaction)
@ -119,13 +119,13 @@ public final class FriendRequestProtocol : NSObject {
storage.setFriendRequestStatus(.friends, for: device, transaction: transaction) storage.setFriendRequestStatus(.friends, for: device, transaction: transaction)
sendFriendRequestAcceptanceMessage(to: device, using: transaction) sendFriendRequestAcceptanceMessage(to: device, using: transaction)
// Send a contact sync message if needed // Send a contact sync message if needed
guard !ourDevices.contains(hexEncodedPublicKey) else { return } guard !userLinkedDevices.contains(hexEncodedPublicKey) else { return }
let masterHexEncodedPublicKey = storage.getMasterHexEncodedPublicKey(for: hexEncodedPublicKey, in: transaction) ?? hexEncodedPublicKey let masterHexEncodedPublicKey = storage.getMasterHexEncodedPublicKey(for: hexEncodedPublicKey, in: transaction) ?? hexEncodedPublicKey
let syncManager = SSKEnvironment.shared.syncManager let syncManager = SSKEnvironment.shared.syncManager
syncManager.syncContact(masterHexEncodedPublicKey, transaction: transaction) syncManager.syncContact(masterHexEncodedPublicKey, transaction: transaction)
} else if friendRequestStatus == .requestSent { } else if friendRequestStatus == .requestSent {
// We sent a friend request to this device before, how can we be sure that it hasn't expired? // We sent a friend request to this device before, how can we be sure that it hasn't expired?
} else if friendRequestStatus == .none || friendRequestStatus == .requestExpired && !ourDevices.contains(device) { } else if friendRequestStatus == .none || friendRequestStatus == .requestExpired {
// TODO: We should track these so that we can expire them and resend if needed // TODO: We should track these so that we can expire them and resend if needed
MultiDeviceProtocol.getAutoGeneratedMultiDeviceFRMessageSend(for: device, in: transaction) MultiDeviceProtocol.getAutoGeneratedMultiDeviceFRMessageSend(for: device, in: transaction)
.done(on: OWSDispatch.sendingQueue()) { autoGeneratedFRMessageSend in .done(on: OWSDispatch.sendingQueue()) { autoGeneratedFRMessageSend in
@ -169,10 +169,10 @@ public final class FriendRequestProtocol : NSObject {
@objc(shouldUpdateFriendRequestStatusFromMessage:) @objc(shouldUpdateFriendRequestStatusFromMessage:)
public static func shouldUpdateFriendRequestStatus(from message: TSOutgoingMessage) -> Bool { public static func shouldUpdateFriendRequestStatus(from message: TSOutgoingMessage) -> Bool {
let isFriendRequestMessage = message is FriendRequestMessage // The order of these checks matters
let isSessionRequestMessage = message is SessionRequestMessage if (message as? DeviceLinkMessage)?.kind == .request { return true }
let isDeviceLinkRequestMessage = message is DeviceLinkMessage && (message as! DeviceLinkMessage).kind == .request if message is SessionRequestMessage { return false }
return (isFriendRequestMessage && !isSessionRequestMessage) || isDeviceLinkRequestMessage; return message is FriendRequestMessage
} }
@objc(setFriendRequestStatusToSendingIfNeededForHexEncodedPublicKey:transaction:) @objc(setFriendRequestStatusToSendingIfNeededForHexEncodedPublicKey:transaction:)

@ -428,7 +428,7 @@ class FriendRequestProtocolTests : XCTestCase {
self.storage.setFriendRequestStatus(status, for: bob, transaction: transaction) self.storage.setFriendRequestStatus(status, for: bob, transaction: transaction)
} }
let expectation = self.expectation(description: "sent message") let expectation = self.expectation(description: "Send message")
let messageSender = self.messageSender let messageSender = self.messageSender
messageSender.sendMessageWasCalledBlock = { sentMessage in messageSender.sendMessageWasCalledBlock = { sentMessage in
@ -451,15 +451,16 @@ class FriendRequestProtocolTests : XCTestCase {
let statuses: [LKFriendRequestStatus] = [ .none, .requestExpired ] let statuses: [LKFriendRequestStatus] = [ .none, .requestExpired ]
for status in statuses { for status in statuses {
let ourDevice = LokiTestUtilities.getCurrentUserHexEncodedPublicKey() let ourDevice = LokiTestUtilities.getCurrentUserHexEncodedPublicKey()
storage.dbReadWriteConnection.readWrite { transaction in storage.dbReadWriteConnection.readWrite { transaction in
self.storage.setFriendRequestStatus(status, for: ourDevice, transaction: transaction) self.storage.setFriendRequestStatus(status, for: ourDevice, transaction: transaction)
} }
let expectation = self.expectation(description: "sent message") let expectation = self.expectation(description: "Send message")
let messageSender = self.messageSender let messageSender = self.messageSender
messageSender.sendMessageWasCalledBlock = { sentMessage in messageSender.sendMessageWasCalledBlock = { sentMessage in
XCTFail("Expected message to not be sent") XCTFail("Expected message not to be sent.")
} }
storage.dbReadWriteConnection.readWrite { transaction in storage.dbReadWriteConnection.readWrite { transaction in
@ -625,7 +626,7 @@ class FriendRequestProtocolTests : XCTestCase {
let thread = LokiTestUtilities.createContactThread(for: LokiTestUtilities.generateHexEncodedPublicKey()) let thread = LokiTestUtilities.createContactThread(for: LokiTestUtilities.generateHexEncodedPublicKey())
let message = TSOutgoingMessage(in: thread, messageBody: nil, attachmentId: nil) let message = TSOutgoingMessage(in: thread, messageBody: nil, attachmentId: nil)
let friendRequest = FriendRequestMessage(outgoingMessageWithTimestamp: 1, in: thread, messageBody: "") let friendRequest = FriendRequestMessage(timestamp: 1, thread: thread, body: "")
let sessionRequest = SessionRequestMessage(thread: thread) let sessionRequest = SessionRequestMessage(thread: thread)
guard let deviceLinkRequest = DeviceLinkMessage(in: thread, masterHexEncodedPublicKey: "", slaveHexEncodedPublicKey: "", masterSignature: nil, slaveSignature: Data(capacity: 0)), guard let deviceLinkRequest = DeviceLinkMessage(in: thread, masterHexEncodedPublicKey: "", slaveHexEncodedPublicKey: "", masterSignature: nil, slaveSignature: Data(capacity: 0)),
let deviceLinkAuthorisation = DeviceLinkMessage(in: thread, masterHexEncodedPublicKey: "", slaveHexEncodedPublicKey: "", masterSignature: Data(capacity: 0), slaveSignature: Data(capacity: 0)) else { return XCTFail() } let deviceLinkAuthorisation = DeviceLinkMessage(in: thread, masterHexEncodedPublicKey: "", slaveHexEncodedPublicKey: "", masterSignature: Data(capacity: 0), slaveSignature: Data(capacity: 0)) else { return XCTFail() }

@ -4,8 +4,6 @@
NS_SWIFT_NAME(FriendRequestMessage) NS_SWIFT_NAME(FriendRequestMessage)
@interface LKFriendRequestMessage : TSOutgoingMessage @interface LKFriendRequestMessage : TSOutgoingMessage
- (_Nonnull instancetype)initOutgoingMessageWithTimestamp:(uint64_t)timestamp - (_Nonnull instancetype)initWithTimestamp:(uint64_t)timestamp thread:(nullable TSThread *)thread body:(nullable NSString *)body;
inThread:(nullable TSThread *)thread
messageBody:(nullable NSString *)body;
@end @end

@ -9,19 +9,10 @@
@implementation LKFriendRequestMessage @implementation LKFriendRequestMessage
- (instancetype)initOutgoingMessageWithTimestamp:(uint64_t)timestamp #pragma mark Initialization
inThread:(nullable TSThread *)thread - (instancetype)initWithTimestamp:(uint64_t)timestamp thread:(nullable TSThread *)thread body:(nullable NSString *)body {
messageBody:(nullable NSString *)body { return [self initOutgoingMessageWithTimestamp:timestamp inThread:thread messageBody:body attachmentIds:@[] expiresInSeconds:0 expireStartedAt:0
return [self initOutgoingMessageWithTimestamp:timestamp isVoiceMessage:false groupMetaMessage:TSGroupMetaMessageUnspecified quotedMessage:nil contactShare:nil linkPreview:nil];
inThread:thread
messageBody:body
attachmentIds:@[]
expiresInSeconds:0 expireStartedAt:0
isVoiceMessage:false
groupMetaMessage:TSGroupMetaMessageUnspecified
quotedMessage:nil
contactShare:nil
linkPreview:nil];
} }
#pragma mark Building #pragma mark Building

@ -151,7 +151,7 @@ public final class MultiDeviceProtocol : NSObject {
@objc(getAutoGeneratedMultiDeviceFRMessageForHexEncodedPublicKey:in:) @objc(getAutoGeneratedMultiDeviceFRMessageForHexEncodedPublicKey:in:)
public static func getAutoGeneratedMultiDeviceFRMessage(for hexEncodedPublicKey: String, in transaction: YapDatabaseReadWriteTransaction) -> FriendRequestMessage { public static func getAutoGeneratedMultiDeviceFRMessage(for hexEncodedPublicKey: String, in transaction: YapDatabaseReadWriteTransaction) -> FriendRequestMessage {
let thread = TSContactThread.getOrCreateThread(withContactId: hexEncodedPublicKey, transaction: transaction) let thread = TSContactThread.getOrCreateThread(withContactId: hexEncodedPublicKey, transaction: transaction)
let result = FriendRequestMessage(outgoingMessageWithTimestamp: NSDate.ows_millisecondTimeStamp(), in: thread, messageBody: "Please accept to enable messages to be synced across devices") let result = FriendRequestMessage(timestamp: NSDate.ows_millisecondTimeStamp(), thread: thread, body: "Please accept to enable messages to be synced across devices")
result.skipSave = true // TODO: Why is this necessary again? result.skipSave = true // TODO: Why is this necessary again?
return result return result
} }

@ -163,7 +163,6 @@ public final class SyncMessagesProtocol : NSObject {
} }
public static func handleContactSyncMessageData(_ data: Data, using transaction: YapDatabaseReadWriteTransaction) { public static func handleContactSyncMessageData(_ data: Data, using transaction: YapDatabaseReadWriteTransaction) {
let parser = ContactParser(data: data) let parser = ContactParser(data: data)
let hexEncodedPublicKeys = parser.parseHexEncodedPublicKeys() let hexEncodedPublicKeys = parser.parseHexEncodedPublicKeys()
// Try to establish sessions // Try to establish sessions

@ -1178,13 +1178,13 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
uint64_t ttl = ((NSNumber *)signalMessageInfo[@"ttl"]).unsignedIntegerValue; uint64_t ttl = ((NSNumber *)signalMessageInfo[@"ttl"]).unsignedIntegerValue;
BOOL isPing = ((NSNumber *)signalMessageInfo[@"isPing"]).boolValue; BOOL isPing = ((NSNumber *)signalMessageInfo[@"isPing"]).boolValue;
LKSignalMessage *signalMessage = [[LKSignalMessage alloc] initWithType:type timestamp:timestamp senderID:senderID senderDeviceID:senderDeviceID content:content recipientID:recipientID ttl:ttl isPing:isPing]; LKSignalMessage *signalMessage = [[LKSignalMessage alloc] initWithType:type timestamp:timestamp senderID:senderID senderDeviceID:senderDeviceID content:content recipientID:recipientID ttl:ttl isPing:isPing];
BOOL shouldUpdateFriendRequest = [LKFriendRequestProtocol shouldUpdateFriendRequestStatusFromMessage:message]; BOOL shouldUpdateFriendRequestStatus = [LKFriendRequestProtocol shouldUpdateFriendRequestStatusFromMessage:message];
[self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { [self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) {
if (!message.skipSave) { if (!message.skipSave) {
// Update the PoW calculation status // Update the PoW calculation status
[message saveIsCalculatingProofOfWork:YES withTransaction:transaction]; [message saveIsCalculatingProofOfWork:YES withTransaction:transaction];
} }
if (shouldUpdateFriendRequest) { if (shouldUpdateFriendRequestStatus) {
[LKFriendRequestProtocol setFriendRequestStatusToSendingIfNeededForHexEncodedPublicKey:recipientID transaction:transaction]; [LKFriendRequestProtocol setFriendRequestStatusToSendingIfNeededForHexEncodedPublicKey:recipientID transaction:transaction];
} }
}]; }];
@ -1196,7 +1196,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
// Update the PoW calculation status // Update the PoW calculation status
[message saveIsCalculatingProofOfWork:NO withTransaction:transaction]; [message saveIsCalculatingProofOfWork:NO withTransaction:transaction];
} }
if (shouldUpdateFriendRequest) { if (shouldUpdateFriendRequestStatus) {
[LKFriendRequestProtocol setFriendRequestStatusToFailedIfNeededForHexEncodedPublicKey:recipientID transaction:transaction]; [LKFriendRequestProtocol setFriendRequestStatusToFailedIfNeededForHexEncodedPublicKey:recipientID transaction:transaction];
} }
}]; }];
@ -1216,7 +1216,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
if (isSuccess) { return; } // Succeed as soon as the first promise succeeds if (isSuccess) { return; } // Succeed as soon as the first promise succeeds
[NSNotificationCenter.defaultCenter postNotificationName:NSNotification.messageSent object:[[NSNumber alloc] initWithUnsignedLongLong:signalMessage.timestamp]]; [NSNotificationCenter.defaultCenter postNotificationName:NSNotification.messageSent object:[[NSNumber alloc] initWithUnsignedLongLong:signalMessage.timestamp]];
isSuccess = YES; isSuccess = YES;
if (shouldUpdateFriendRequest) { if (shouldUpdateFriendRequestStatus) {
[self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { [self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) {
if (!message.skipSave) { if (!message.skipSave) {
// Update the message // Update the message

Loading…
Cancel
Save