pull/63/head
Niels Andriesse 6 years ago
parent c368da18c1
commit 41484c2910

@ -106,10 +106,6 @@ final class NewConversationVC : OWSViewController, OWSQRScannerDelegate {
let alert = UIAlertController(title: NSLocalizedString("Invalid Public Key", comment: ""), message: NSLocalizedString("Please check the public key you entered and try again.", comment: ""), preferredStyle: .alert) let alert = UIAlertController(title: NSLocalizedString("Invalid Public Key", comment: ""), message: NSLocalizedString("Please check the public key you entered and try again.", comment: ""), preferredStyle: .alert)
alert.addAction(UIAlertAction(title: NSLocalizedString("OK", comment: ""), style: .default, handler: nil)) alert.addAction(UIAlertAction(title: NSLocalizedString("OK", comment: ""), style: .default, handler: nil))
presentAlert(alert) presentAlert(alert)
} else if OWSIdentityManager.shared().identityKeyPair()!.hexEncodedPublicKey == hexEncodedPublicKey {
let alert = UIAlertController(title: NSLocalizedString("Can't Start Conversation", comment: ""), message: NSLocalizedString("Please enter the public key of the person you'd like to message.", comment: ""), preferredStyle: .alert)
alert.addAction(UIAlertAction(title: NSLocalizedString("OK", comment: ""), style: .default, handler: nil))
presentAlert(alert)
} else { } else {
let thread = TSContactThread.getOrCreateThread(contactId: hexEncodedPublicKey) let thread = TSContactThread.getOrCreateThread(contactId: hexEncodedPublicKey)
Analytics.shared.track("New Conversation Started") Analytics.shared.track("New Conversation Started")

@ -23,7 +23,7 @@ public final class LokiDatabaseUtilities : NSObject {
// MARK: Device Links // MARK: Device Links
@objc(getLinkedDeviceHexEncodedPublicKeysFor:in:) @objc(getLinkedDeviceHexEncodedPublicKeysFor:in:)
public static func getLinkedDeviceHexEncodedPublicKeys(for hexEncodedPublicKey: String, in transaction: YapDatabaseReadWriteTransaction) -> Set<String> { public static func getLinkedDeviceHexEncodedPublicKeys(for hexEncodedPublicKey: String, in transaction: YapDatabaseReadTransaction) -> Set<String> {
let storage = OWSPrimaryStorage.shared() let storage = OWSPrimaryStorage.shared()
let masterHexEncodedPublicKey = storage.getMasterHexEncodedPublicKey(for: hexEncodedPublicKey, in: transaction) ?? hexEncodedPublicKey let masterHexEncodedPublicKey = storage.getMasterHexEncodedPublicKey(for: hexEncodedPublicKey, in: transaction) ?? hexEncodedPublicKey
var result = Set(storage.getDeviceLinks(for: masterHexEncodedPublicKey, in: transaction).flatMap { deviceLink in var result = Set(storage.getDeviceLinks(for: masterHexEncodedPublicKey, in: transaction).flatMap { deviceLink in
@ -34,10 +34,17 @@ public final class LokiDatabaseUtilities : NSObject {
} }
@objc(getLinkedDeviceThreadsFor:in:) @objc(getLinkedDeviceThreadsFor:in:)
public static func getLinkedDeviceThreads(for hexEncodedPublicKey: String, in transaction: YapDatabaseReadWriteTransaction) -> Set<TSContactThread> { public static func getLinkedDeviceThreads(for hexEncodedPublicKey: String, in transaction: YapDatabaseReadTransaction) -> Set<TSContactThread> {
return Set(getLinkedDeviceHexEncodedPublicKeys(for: hexEncodedPublicKey, in: transaction).compactMap { TSContactThread.getWithContactId($0, transaction: transaction) }) return Set(getLinkedDeviceHexEncodedPublicKeys(for: hexEncodedPublicKey, in: transaction).compactMap { TSContactThread.getWithContactId($0, transaction: transaction) })
} }
@objc(isUserLinkedDevice:in:)
public static func isUserLinkedDevice(_ hexEncodedPublicKey: String, transaction: YapDatabaseReadTransaction) -> Bool {
let userHexEncodedPublicKey = OWSIdentityManager.shared().identityKeyPair()!.hexEncodedPublicKey
let userLinkedDeviceHexEncodedPublicKeys = getLinkedDeviceHexEncodedPublicKeys(for: userHexEncodedPublicKey, in: transaction)
return userLinkedDeviceHexEncodedPublicKeys.contains(hexEncodedPublicKey)
}
@objc(getMasterHexEncodedPublicKeyFor:in:) @objc(getMasterHexEncodedPublicKeyFor:in:)
public static func objc_getMasterHexEncodedPublicKey(for slaveHexEncodedPublicKey: String, in transaction: YapDatabaseReadTransaction) -> String? { public static func objc_getMasterHexEncodedPublicKey(for slaveHexEncodedPublicKey: String, in transaction: YapDatabaseReadTransaction) -> String? {
return OWSPrimaryStorage.shared().getMasterHexEncodedPublicKey(for: slaveHexEncodedPublicKey, in: transaction) return OWSPrimaryStorage.shared().getMasterHexEncodedPublicKey(for: slaveHexEncodedPublicKey, in: transaction)

@ -674,14 +674,17 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
return failureHandler(error); return failureHandler(error);
} }
// In the "self-send" special case, we ony need to send a sync message with a delivery receipt. // Loki: Handle note to self case
if ([thread isKindOfClass:[TSContactThread class]] && if ([thread isKindOfClass:[TSContactThread class]]) {
[((TSContactThread *)thread).contactIdentifier isEqualToString:self.tsAccountManager.localNumber]) { __block BOOL isNoteToSelf;
// Send to self. [OWSPrimaryStorage.sharedManager.dbReadConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) {
OWSAssertDebug(message.recipientIds.count == 1); isNoteToSelf = [LKDatabaseUtilities isUserLinkedDevice:((TSContactThread *)thread).contactIdentifier in:transaction];
// Don't mark self-sent messages as read (or sent) until the sync transcript is sent. }];
successHandler(); if (isNoteToSelf) {
return; [self sendSyncTranscriptForMessage:message isRecipientUpdate:NO success:^{ } failure:^(NSError *error) { }];
successHandler();
return;
}
} }
if (thread.isGroupThread) { if (thread.isGroupThread) {
@ -1541,19 +1544,15 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
failure:(RetryableFailureHandler)failure failure:(RetryableFailureHandler)failure
{ {
dispatch_block_t success = ^{ dispatch_block_t success = ^{
TSThread *_Nullable thread = message.thread; [self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) {
if (thread && [thread isKindOfClass:[TSContactThread class]] && TSThread *thread = message.thread;
[thread.contactIdentifier isEqualToString:self.tsAccountManager.localNumber]) { // Loki: Handle note to self case
OWSAssertDebug(message.recipientIds.count == 1); if (thread && [thread isKindOfClass:[TSContactThread class]] && [LKDatabaseUtilities isUserLinkedDevice:thread.contactIdentifier in:transaction]) {
// Don't mark self-sent messages as read (or sent) until the sync transcript is sent.
[self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) {
for (NSString *recipientId in message.sendingRecipientIds) { for (NSString *recipientId in message.sendingRecipientIds) {
[message updateWithReadRecipientId:recipientId [message updateWithReadRecipientId:recipientId readTimestamp:message.timestamp transaction:transaction];
readTimestamp:message.timestamp
transaction:transaction];
} }
}]; }
} }];
successParam(); successParam();
}; };
@ -1647,9 +1646,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
if ([messageSend.message isKindOfClass:OWSOutgoingSyncMessage.class]) { if ([messageSend.message isKindOfClass:OWSOutgoingSyncMessage.class]) {
[OWSPrimaryStorage.sharedManager.dbReadWriteConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { [OWSPrimaryStorage.sharedManager.dbReadWriteConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) {
NSString *masterHexEncodedPublicKey = [LKDatabaseUtilities getMasterHexEncodedPublicKeyFor:userHexEncodedPublicKey in:transaction] ?: userHexEncodedPublicKey; NSString *masterHexEncodedPublicKey = [LKDatabaseUtilities getMasterHexEncodedPublicKeyFor:userHexEncodedPublicKey in:transaction] ?: userHexEncodedPublicKey;
NSMutableSet<NSString *> *linkedDeviceHexEncodedPublicKeys = [LKDatabaseUtilities getLinkedDeviceHexEncodedPublicKeysFor:userHexEncodedPublicKey in:transaction].mutableCopy; recipientIDs = [LKDatabaseUtilities getLinkedDeviceHexEncodedPublicKeysFor:userHexEncodedPublicKey in:transaction].mutableCopy;
[linkedDeviceHexEncodedPublicKeys removeObject:userHexEncodedPublicKey];
recipientIDs = [recipientIDs setByAddingObjectsFromSet:linkedDeviceHexEncodedPublicKeys].mutableCopy;
}]; }];
} }

@ -286,7 +286,12 @@ NSString *const OWSReadReceiptManagerAreReadReceiptsEnabled = @"areReadReceiptsE
self.toLinkedDevicesReadReceiptMap[threadUniqueId] = newReadReceipt; self.toLinkedDevicesReadReceiptMap[threadUniqueId] = newReadReceipt;
} }
if ([message.authorId isEqualToString:[TSAccountManager localNumber]]) { __block BOOL isNoteToSelf;
[OWSPrimaryStorage.sharedManager.dbReadConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) {
isNoteToSelf = [LKDatabaseUtilities isUserLinkedDevice:message.authorId in:transaction];
}];
if (isNoteToSelf) {
OWSLogVerbose(@"Ignoring read receipt for self-sender."); OWSLogVerbose(@"Ignoring read receipt for self-sender.");
return; return;
} }

@ -323,8 +323,16 @@ public class TypingIndicatorsImpl: NSObject, TypingIndicators {
return return
} }
// Don't send any typing indicators for groups // Don't send typing indicators in group or note to self threads
guard !thread.isGroupThread() else { return } if (thread.isGroupThread()) {
return
} else {
var isNoteToSelf = false
OWSPrimaryStorage.shared().dbReadConnection.read { transaction in
isNoteToSelf = LokiDatabaseUtilities.isUserLinkedDevice(thread.contactIdentifier()!, transaction: transaction)
}
if isNoteToSelf { return }
}
let message = TypingIndicatorMessage(thread: thread, action: action) let message = TypingIndicatorMessage(thread: thread, action: action)
messageSender.sendPromise(message: message).retainUntilComplete() messageSender.sendPromise(message: message).retainUntilComplete()

Loading…
Cancel
Save