This commit is contained in:
nielsandriesse 2020-05-05 15:43:05 +10:00
parent 8fa7f66774
commit 62dbbf7d57
7 changed files with 23 additions and 34 deletions

View File

@ -108,8 +108,8 @@ public final class FriendRequestProtocol : NSObject {
print("[Loki] Invalid Session ID: \(hexEncodedPublicKey).")
return
}
let ourHexEncodedPublicKey = getUserHexEncodedPublicKey()
let ourDevices = LokiDatabaseUtilities.getLinkedDeviceHexEncodedPublicKeys(for: ourHexEncodedPublicKey, in: transaction)
let userHexEncodedPublicKey = getUserHexEncodedPublicKey()
let userLinkedDevices = LokiDatabaseUtilities.getLinkedDeviceHexEncodedPublicKeys(for: userHexEncodedPublicKey, in: transaction)
// 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.
let linkedDevices = LokiDatabaseUtilities.getLinkedDeviceHexEncodedPublicKeys(for: hexEncodedPublicKey, in: transaction)
@ -119,13 +119,13 @@ public final class FriendRequestProtocol : NSObject {
storage.setFriendRequestStatus(.friends, for: device, transaction: transaction)
sendFriendRequestAcceptanceMessage(to: device, using: transaction)
// 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 syncManager = SSKEnvironment.shared.syncManager
syncManager.syncContact(masterHexEncodedPublicKey, transaction: transaction)
} else if friendRequestStatus == .requestSent {
// 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
MultiDeviceProtocol.getAutoGeneratedMultiDeviceFRMessageSend(for: device, in: transaction)
.done(on: OWSDispatch.sendingQueue()) { autoGeneratedFRMessageSend in
@ -169,10 +169,10 @@ public final class FriendRequestProtocol : NSObject {
@objc(shouldUpdateFriendRequestStatusFromMessage:)
public static func shouldUpdateFriendRequestStatus(from message: TSOutgoingMessage) -> Bool {
let isFriendRequestMessage = message is FriendRequestMessage
let isSessionRequestMessage = message is SessionRequestMessage
let isDeviceLinkRequestMessage = message is DeviceLinkMessage && (message as! DeviceLinkMessage).kind == .request
return (isFriendRequestMessage && !isSessionRequestMessage) || isDeviceLinkRequestMessage;
// The order of these checks matters
if (message as? DeviceLinkMessage)?.kind == .request { return true }
if message is SessionRequestMessage { return false }
return message is FriendRequestMessage
}
@objc(setFriendRequestStatusToSendingIfNeededForHexEncodedPublicKey:transaction:)

View File

@ -428,7 +428,7 @@ class FriendRequestProtocolTests : XCTestCase {
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
messageSender.sendMessageWasCalledBlock = { sentMessage in
@ -451,15 +451,16 @@ class FriendRequestProtocolTests : XCTestCase {
let statuses: [LKFriendRequestStatus] = [ .none, .requestExpired ]
for status in statuses {
let ourDevice = LokiTestUtilities.getCurrentUserHexEncodedPublicKey()
storage.dbReadWriteConnection.readWrite { transaction in
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
messageSender.sendMessageWasCalledBlock = { sentMessage in
XCTFail("Expected message to not be sent")
XCTFail("Expected message not to be sent.")
}
storage.dbReadWriteConnection.readWrite { transaction in
@ -625,7 +626,7 @@ class FriendRequestProtocolTests : XCTestCase {
let thread = LokiTestUtilities.createContactThread(for: LokiTestUtilities.generateHexEncodedPublicKey())
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)
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() }

View File

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

View File

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

View File

@ -151,7 +151,7 @@ public final class MultiDeviceProtocol : NSObject {
@objc(getAutoGeneratedMultiDeviceFRMessageForHexEncodedPublicKey:in:)
public static func getAutoGeneratedMultiDeviceFRMessage(for hexEncodedPublicKey: String, in transaction: YapDatabaseReadWriteTransaction) -> FriendRequestMessage {
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?
return result
}

View File

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

View File

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