Make syncing strategy consistent with Android

pull/228/head
nielsandriesse 5 years ago
parent e5f8dd277e
commit 42cd30cf23

@ -194,9 +194,6 @@ final class DeviceLinkingModal : Modal, DeviceLinkingSessionDelegate {
// to the AFR mechanism // to the AFR mechanism
let _ = SSKEnvironment.shared.syncManager.syncAllContacts() let _ = SSKEnvironment.shared.syncManager.syncAllContacts()
} }
let blockedContacts = SSKEnvironment.shared.blockingManager.blockedPhoneNumbers()
let blockedContactsSyncMessage = OWSBlockedPhoneNumbersMessage(phoneNumbers: blockedContacts, groupIds: [])
SSKEnvironment.shared.messageSender.send(blockedContactsSyncMessage, success: { }) { _ in }
let _ = SSKEnvironment.shared.syncManager.syncAllOpenGroups() let _ = SSKEnvironment.shared.syncManager.syncAllOpenGroups()
DispatchQueue.main.async { DispatchQueue.main.async {
self?.dismiss(animated: true, completion: nil) self?.dismiss(animated: true, completion: nil)

@ -1,14 +1,14 @@
@objc public final class ContactParser : NSObject { public final class ContactParser {
private let data: Data private let data: Data
@objc public init(data: Data) { public init(data: Data) {
self.data = data self.data = data
} }
@objc public func parseHexEncodedPublicKeys() -> [String] { public func parse() -> [(publicKey: String, isBlocked: Bool)] {
var index = 0 var index = 0
var result: [String] = [] var result: [(String, Bool)] = []
while index < data.endIndex { while index < data.endIndex {
var uncheckedSize: UInt32? = try? data[index..<(index+4)].withUnsafeBytes { $0.pointee } var uncheckedSize: UInt32? = try? data[index..<(index+4)].withUnsafeBytes { $0.pointee }
if let size = uncheckedSize, size >= data.count, let intermediate = try? data[index..<(index+4)].reversed() { if let size = uncheckedSize, size >= data.count, let intermediate = try? data[index..<(index+4)].reversed() {
@ -21,7 +21,7 @@
let protoAsData = data[index..<(index+sizeAsInt)] let protoAsData = data[index..<(index+sizeAsInt)]
guard let proto = try? SSKProtoContactDetails.parseData(protoAsData) else { break } guard let proto = try? SSKProtoContactDetails.parseData(protoAsData) else { break }
index += sizeAsInt index += sizeAsInt
result.append(proto.number) result.append((publicKey: proto.number, isBlocked: proto.blocked))
} }
return result return result
} }

@ -233,18 +233,26 @@ 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 publicKeys = parser.parseHexEncodedPublicKeys() let tuples = parser.parse()
let blockedPublicKeys = tuples.filter { $0.isBlocked }.map { $0.publicKey }
let userPublicKey = getUserHexEncodedPublicKey() let userPublicKey = getUserHexEncodedPublicKey()
let userLinkedDevices = LokiDatabaseUtilities.getLinkedDeviceHexEncodedPublicKeys(for: userPublicKey, in: transaction) let userLinkedDevices = LokiDatabaseUtilities.getLinkedDeviceHexEncodedPublicKeys(for: userPublicKey, in: transaction)
// Try to establish sessions // Try to establish sessions
for publicKey in publicKeys { for (publicKey, isBlocked) in tuples {
guard !userLinkedDevices.contains(publicKey) else { continue } // Skip self and linked devices guard !userLinkedDevices.contains(publicKey) else { continue } // Skip self and linked devices
let thread = TSContactThread.getOrCreateThread(withContactId: publicKey, transaction: transaction) let thread = TSContactThread.getOrCreateThread(withContactId: publicKey, transaction: transaction)
thread.shouldThreadBeVisible = true thread.shouldThreadBeVisible = true
thread.save(with: transaction) thread.save(with: transaction)
if !isBlocked {
SessionManagementProtocol.sendSessionRequestIfNeeded(to: publicKey, using: transaction) SessionManagementProtocol.sendSessionRequestIfNeeded(to: publicKey, using: transaction)
} }
} }
// Update the blocked contacts list
transaction.addCompletionQueue(DispatchQueue.main) {
SSKEnvironment.shared.blockingManager.setBlockedPhoneNumbers(blockedPublicKeys, sendSyncMessage: false)
NotificationCenter.default.post(name: .blockedContactsUpdated, object: nil)
}
}
/// - Note: Deprecated. /// - Note: Deprecated.
@objc(handleClosedGroupSyncMessageIfNeeded:wrappedIn:transaction:) @objc(handleClosedGroupSyncMessageIfNeeded:wrappedIn:transaction:)

Loading…
Cancel
Save