Add missing pieces

pull/228/head
nielsandriesse 4 years ago
parent 450c100896
commit 33f754949d

@ -1 +1 @@
Subproject commit 7753c413dc4efcfdab0e5f41e3245dd547dada7c Subproject commit 6d307f51039509e814d70c48527f69f7b850e6da

@ -3922,6 +3922,12 @@ typedef enum : NSUInteger {
BOOL didAddToProfileWhitelist = [ThreadUtil addThreadToProfileWhitelistIfEmptyContactThread:self.thread]; BOOL didAddToProfileWhitelist = [ThreadUtil addThreadToProfileWhitelistIfEmptyContactThread:self.thread];
if ([self.thread isKindOfClass:TSContactThread.class]) {
[LKStorage writeSyncWithBlock:^(YapDatabaseReadWriteTransaction *transaction) {
[LKSessionManagementProtocol sendSessionRequestIfNeededToPublicKey:self.thread.contactIdentifier transaction:transaction];
} error:nil];
}
__block TSOutgoingMessage *message; __block TSOutgoingMessage *message;
[self.uiDatabaseConnection readWithBlock:^(YapDatabaseReadTransaction *_Nonnull transaction) { [self.uiDatabaseConnection readWithBlock:^(YapDatabaseReadTransaction *_Nonnull transaction) {
message = [ThreadUtil enqueueMessageWithText:messageText message = [ThreadUtil enqueueMessageWithText:messageText
@ -4507,6 +4513,12 @@ typedef enum : NSUInteger {
return; return;
} }
if ([self.thread isKindOfClass:TSContactThread.class]) {
[LKStorage writeSyncWithBlock:^(YapDatabaseReadWriteTransaction *transaction) {
[LKSessionManagementProtocol sendSessionRequestIfNeededToPublicKey:self.thread.contactIdentifier transaction:transaction];
} error:nil];
}
// Limit outgoing text messages to 16kb. // Limit outgoing text messages to 16kb.
// //
// We convert large text messages to attachments // We convert large text messages to attachments

@ -60,9 +60,11 @@ public final class SessionManagementProtocol : NSObject {
// MARK: - Sending // MARK: - Sending
@objc(shouldUseFallbackEncryptionForMessage:) @objc(shouldUseFallbackEncryptionForMessage:recipientID:transaction:)
public static func shouldUseFallbackEncryption(for message: TSOutgoingMessage) -> Bool { public static func shouldUseFallbackEncryption(for message: TSOutgoingMessage, recipientID: String, transaction: YapDatabaseReadWriteTransaction) -> Bool {
return true if message is SessionRequestMessage { return true }
else if let message = message as? DeviceLinkMessage, message.kind == .request { return true }
return !storage.containsSession(recipientID, deviceId: Int32(OWSDevicePrimaryDeviceId), protocolContext: transaction)
} }
private static func hasSentSessionRequestExpired(for publicKey: String) -> Bool { private static func hasSentSessionRequestExpired(for publicKey: String) -> Bool {
@ -71,6 +73,7 @@ public final class SessionManagementProtocol : NSObject {
return NSDate.ows_millisecondTimeStamp() > expiration return NSDate.ows_millisecondTimeStamp() > expiration
} }
@objc(sendSessionRequestIfNeededToPublicKey:transaction:)
public static func sendSessionRequestIfNeeded(to publicKey: String, using transaction: YapDatabaseReadWriteTransaction) { public static func sendSessionRequestIfNeeded(to publicKey: String, using transaction: YapDatabaseReadWriteTransaction) {
// It's never necessary to establish a session with self // It's never necessary to establish a session with self
guard publicKey != getUserHexEncodedPublicKey() else { return } guard publicKey != getUserHexEncodedPublicKey() else { return }
@ -93,9 +96,6 @@ public final class SessionManagementProtocol : NSObject {
let sessionRequestMessage = SessionRequestMessage(thread: thread) let sessionRequestMessage = SessionRequestMessage(thread: thread)
let messageSenderJobQueue = SSKEnvironment.shared.messageSenderJobQueue let messageSenderJobQueue = SSKEnvironment.shared.messageSenderJobQueue
messageSenderJobQueue.add(message: sessionRequestMessage, transaction: transaction) messageSenderJobQueue.add(message: sessionRequestMessage, transaction: transaction)
// aushfiuasfhiujoasf
// TODO: Handle failure
} }
@objc(sendNullMessageToPublicKey:transaction:) @objc(sendNullMessageToPublicKey:transaction:)

@ -1433,7 +1433,10 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
messageSend.isUDSend); messageSend.isUDSend);
@try { @try {
BOOL isSessionRequired = ![LKSessionManagementProtocol shouldUseFallbackEncryptionForMessage:messageSend.message]; __block BOOL isSessionRequired;
[LKStorage writeSyncWithBlock:^(YapDatabaseReadWriteTransaction *transaction) {
isSessionRequired = ![LKSessionManagementProtocol shouldUseFallbackEncryptionForMessage:messageSend.message recipientID:recipientID transaction:transaction];
} error:nil];
if (isSessionRequired) { if (isSessionRequired) {
BOOL hasSession = [self throws_ensureRecipientHasSessionForMessageSend:messageSend recipientID:recipientID deviceId:@(OWSDevicePrimaryDeviceId)]; BOOL hasSession = [self throws_ensureRecipientHasSessionForMessageSend:messageSend recipientID:recipientID deviceId:@(OWSDevicePrimaryDeviceId)];
@ -1634,7 +1637,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
//Alice receives this, sets up her Signal cipher session locally, and sends any subsequent messages //Alice receives this, sets up her Signal cipher session locally, and sends any subsequent messages
// using Signal encryption. // using Signal encryption.
BOOL shouldUseFallbackEncryption = [LKSessionManagementProtocol shouldUseFallbackEncryptionForMessage:message]; BOOL shouldUseFallbackEncryption = [LKSessionManagementProtocol shouldUseFallbackEncryptionForMessage:message recipientID:recipientID transaction:transaction];
serializedMessage = [secretCipher throwswrapped_encryptMessageWithRecipientPublicKey:recipientID serializedMessage = [secretCipher throwswrapped_encryptMessageWithRecipientPublicKey:recipientID
deviceID:@(OWSDevicePrimaryDeviceId).intValue deviceID:@(OWSDevicePrimaryDeviceId).intValue

@ -203,7 +203,16 @@ public class MessageSenderOperation: OWSOperation, DurableOperation {
} }
override public func didReportError(_ error: Error) { override public func didReportError(_ error: Error) {
let message = self.message
var isFailedSessionRequest = false
if message is SessionRequestMessage, let publicKey = message.thread.contactIdentifier() {
isFailedSessionRequest = (Storage.getSessionRequestSentTimestamp(for: publicKey) == message.timestamp)
}
try! Storage.writeSync { transaction in try! Storage.writeSync { transaction in
if isFailedSessionRequest, let publicKey = message.thread.contactIdentifier() {
Storage.setSessionRequestSentTimestamp(for: publicKey, to: 0, using: transaction)
}
self.durableOperationDelegate?.durableOperation(self, didReportError: error, transaction: transaction) self.durableOperationDelegate?.durableOperation(self, didReportError: error, transaction: transaction)
} }
} }
@ -225,7 +234,16 @@ public class MessageSenderOperation: OWSOperation, DurableOperation {
} }
override public func didFail(error: Error) { override public func didFail(error: Error) {
let message = self.message
var isFailedSessionRequest = false
if message is SessionRequestMessage, let publicKey = message.thread.contactIdentifier() {
isFailedSessionRequest = (Storage.getSessionRequestSentTimestamp(for: publicKey) == message.timestamp)
}
try! Storage.writeSync { transaction in try! Storage.writeSync { transaction in
if isFailedSessionRequest, let publicKey = message.thread.contactIdentifier() {
Storage.setSessionRequestSentTimestamp(for: publicKey, to: 0, using: transaction)
}
self.durableOperationDelegate?.durableOperation(self, didFailWithError: error, transaction: transaction) self.durableOperationDelegate?.durableOperation(self, didFailWithError: error, transaction: transaction)
self.message.update(sendingError: error, transaction: transaction) self.message.update(sendingError: error, transaction: transaction)

Loading…
Cancel
Save