Unbreak friend requests, session reset & device linking

pull/214/head
nielsandriesse 4 years ago
parent 136f9d9aec
commit aeb17e5905

@ -1394,12 +1394,15 @@ static NSTimeInterval launchStartedAt;
NSString *userHexEncodedPublicKey = OWSIdentityManager.sharedManager.identityKeyPair.hexEncodedPublicKey;
if (userHexEncodedPublicKey == nil) { return; }
self.lokiPoller = [[LKPoller alloc] initOnMessagesReceived:^(NSArray<SSKProtoEnvelope *> *messages) {
if (messages.count != 0) {
[LKLogger print:@"[Loki] Received new messages."];
}
for (SSKProtoEnvelope *message in messages) {
NSData *data = [message serializedDataAndReturnError:nil];
if (data != nil) {
[SSKEnvironment.shared.messageReceiver handleReceivedEnvelopeData:data];
} else {
NSLog(@"[Loki] Failed to deserialize envelope.");
[LKLogger print:@"[Loki] Failed to deserialize envelope."];
}
}
}];

@ -17,7 +17,7 @@
#pragma mark Building
- (SSKProtoContentBuilder *)prepareCustomContentBuilder:(SignalRecipient *)recipient {
SSKProtoContentBuilder *contentBuilder = SSKProtoContent.builder;
SSKProtoContentBuilder *contentBuilder = [super prepareCustomContentBuilder:recipient];
// Attach the pre key bundle for the contact in question
PreKeyBundle *preKeyBundle = [OWSPrimaryStorage.sharedManager generatePreKeyBundleForContact:recipient.recipientId];
SSKProtoPrekeyBundleMessageBuilder *preKeyBundleMessageBuilder = [SSKProtoPrekeyBundleMessage builderFromPreKeyBundle:preKeyBundle];

@ -27,7 +27,7 @@
#pragma mark Building
- (SSKProtoContentBuilder *)prepareCustomContentBuilder:(SignalRecipient *)recipient {
SSKProtoContentBuilder *contentBuilder = SSKProtoContent.builder;
SSKProtoContentBuilder *contentBuilder = [super prepareCustomContentBuilder:recipient];
SSKProtoLokiAddressMessageBuilder *addressMessageBuilder = SSKProtoLokiAddressMessage.builder;
[addressMessageBuilder setPtpAddress:self.address];
uint32_t portAsUInt32 = self.port;

@ -35,7 +35,7 @@
#pragma mark Building
- (SSKProtoContentBuilder *)prepareCustomContentBuilder:(SignalRecipient *)recipient {
SSKProtoContentBuilder *contentBuilder = SSKProtoContent.builder;
SSKProtoContentBuilder *contentBuilder = [super prepareCustomContentBuilder:recipient];
NSError *error;
if (self.kind == LKDeviceLinkMessageKindRequest) {
// The slave device attaches a pre key bundle with the request it sends, so that a

@ -9,9 +9,6 @@ import PromiseKit
// Document the expected cases for everything.
// Express those cases in tests.
// FIXME: We're manually attaching the sender certificate and UD recipient access to message sends in a lot of places. It'd be great
// to clean this up and just do it in one spot.
@objc(LKMultiDeviceProtocol)
public final class MultiDeviceProtocol : NSObject {
@ -49,15 +46,9 @@ public final class MultiDeviceProtocol : NSObject {
storage.dbReadConnection.read { transaction in
recipient = SignalRecipient.getOrBuildUnsavedRecipient(forRecipientId: destination.hexEncodedPublicKey, transaction: transaction)
}
let udManager = SSKEnvironment.shared.udManager
let senderCertificate = udManager.getSenderCertificate()
var recipientUDAccess: OWSUDAccess?
if let senderCertificate = senderCertificate {
recipientUDAccess = udManager.udAccess(forRecipientId: destination.hexEncodedPublicKey, requireSyncAccess: true) // Starts a new write transaction internally
}
// TODO: Why is it okay that the thread doesn't get changed?
// TODO: Why is it okay that the thread, sender certificate, etc. don't get changed?
return OWSMessageSend(message: messageSend.message, thread: messageSend.thread, recipient: recipient,
senderCertificate: senderCertificate, udAccess: recipientUDAccess, localNumber: messageSend.localNumber, success: {
senderCertificate: messageSend.senderCertificate, udAccess: messageSend.udAccess, localNumber: messageSend.localNumber, success: {
seal.fulfill(())
}, failure: { error in
seal.reject(error)
@ -76,7 +67,7 @@ public final class MultiDeviceProtocol : NSObject {
threadPromiseSeal.fulfill(thread)
}
}
return threadPromise.then(on: DispatchQueue.main) { thread -> Promise<Void> in // Intentionally the main queue
return threadPromise.then(on: OWSDispatch.sendingQueue()) { thread -> Promise<Void> in
let message = messageSend.message
let messageSender = SSKEnvironment.shared.messageSender
let (promise, seal) = Promise<Void>.pending()
@ -85,9 +76,7 @@ public final class MultiDeviceProtocol : NSObject {
&& message.shouldBeSaved() // shouldBeSaved indicates it isn't a transient message
if !shouldSendAutoGeneratedFR {
let messageSendCopy = copy(messageSend, for: destination, with: seal)
OWSDispatch.sendingQueue().async {
messageSender.sendMessage(messageSendCopy)
}
messageSender.sendMessage(messageSendCopy)
} else {
Storage.write { transaction in
getAutoGeneratedMultiDeviceFRMessageSend(for: destination.hexEncodedPublicKey, in: transaction, seal: seal)
@ -142,20 +131,10 @@ public final class MultiDeviceProtocol : NSObject {
messageSend.failure(errors.first!)
}
}
}.catch(on: DispatchQueue.main) { error in // Intentionally the main queue
}.catch(on: OWSDispatch.sendingQueue()) { error in
// Proceed even if updating the recipient's device links failed, so that message sending
// is independent of whether the file server is online
let udManager = SSKEnvironment.shared.udManager
let senderCertificate = udManager.getSenderCertificate()
var recipientUDAccess: OWSUDAccess?
if let senderCertificate = senderCertificate {
recipientUDAccess = udManager.udAccess(forRecipientId: recipientID, requireSyncAccess: true) // Starts a new write transaction internally
}
messageSend.senderCertificate = senderCertificate
messageSend.udAccess = recipientUDAccess
OWSDispatch.sendingQueue().async {
messageSender.sendMessage(messageSend)
}
messageSender.sendMessage(messageSend)
}
}

@ -51,7 +51,7 @@ NS_ASSUME_NONNULL_BEGIN
}
- (SSKProtoContentBuilder *)prepareCustomContentBuilder:(SignalRecipient *)recipient {
SSKProtoContentBuilder *builder = SSKProtoContent.builder;
SSKProtoContentBuilder *builder = [super prepareCustomContentBuilder:recipient];
PreKeyBundle *bundle = [OWSPrimaryStorage.sharedManager generatePreKeyBundleForContact:recipient.recipientId];
SSKProtoPrekeyBundleMessageBuilder *preKeyBuilder = [SSKProtoPrekeyBundleMessage builderFromPreKeyBundle:bundle];

@ -928,7 +928,6 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
{
OWSAssertDebug(messageSend);
OWSAssertDebug(messageSend.thread || [messageSend.message isKindOfClass:[OWSOutgoingSyncMessage class]]);
OWSAssertDebug(messageSend.isUDSend);
TSOutgoingMessage *message = messageSend.message;
SignalRecipient *recipient = messageSend.recipient;

Loading…
Cancel
Save