Merge pull request #350 from oxen-io/multi-device

Multi Device Fixes
pull/354/head
Niels Andriesse 4 years ago committed by GitHub
commit e499d18aae
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -219,4 +219,4 @@ SPEC CHECKSUMS:
PODFILE CHECKSUM: bb4f6cffd6e7c08814b945e1787d01d639036b1e PODFILE CHECKSUM: bb4f6cffd6e7c08814b945e1787d01d639036b1e
COCOAPODS: 1.10.0.rc.1 COCOAPODS: 1.10.1

@ -132,10 +132,12 @@ final class JoinPublicChatVC : BaseVC, UIPageViewControllerDataSource, UIPageVie
} }
isJoining = true isJoining = true
ModalActivityIndicatorViewController.present(fromViewController: navigationController!, canCancel: false) { [weak self] _ in ModalActivityIndicatorViewController.present(fromViewController: navigationController!, canCancel: false) { [weak self] _ in
Storage.shared.write(with: { transaction in Storage.shared.write { transaction in
OpenGroupManager.shared.add(with: urlAsString, using: transaction) OpenGroupManager.shared.add(with: urlAsString, using: transaction)
.done(on: DispatchQueue.main) { [weak self] _ in .done(on: DispatchQueue.main) { [weak self] _ in
self?.presentingViewController!.dismiss(animated: true, completion: nil) self?.presentingViewController!.dismiss(animated: true, completion: nil)
let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.forceSyncConfigurationNowIfNeeded().retainUntilComplete() // FIXME: It's probably cleaner to do this inside addOpenGroup(...)
} }
.catch(on: DispatchQueue.main) { [weak self] error in .catch(on: DispatchQueue.main) { [weak self] error in
self?.dismiss(animated: true, completion: nil) // Dismiss the loader self?.dismiss(animated: true, completion: nil) // Dismiss the loader
@ -148,10 +150,7 @@ final class JoinPublicChatVC : BaseVC, UIPageViewControllerDataSource, UIPageVie
self?.isJoining = false self?.isJoining = false
self?.showError(title: title, message: message) self?.showError(title: title, message: message)
} }
}, completion: { }
let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.forceSyncConfigurationNowIfNeeded().retainUntilComplete() // FIXME: It's probably cleaner to do this inside addOpenGroup(...)
})
} }
} }

@ -11,12 +11,7 @@ public final class ClosedGroupControlMessage : ControlMessage {
} }
} }
public override var isSelfSendValid: Bool { public override var isSelfSendValid: Bool { true }
switch kind {
case .new: return false
default: return true
}
}
// MARK: Kind // MARK: Kind
public enum Kind : CustomStringConvertible { public enum Kind : CustomStringConvertible {

@ -144,7 +144,7 @@ extension MessageReceiver {
} }
private static func handleConfigurationMessage(_ message: ConfigurationMessage, using transaction: Any) { private static func handleConfigurationMessage(_ message: ConfigurationMessage, using transaction: Any) {
guard message.sender == getUserHexEncodedPublicKey() else { return } guard message.sender == getUserHexEncodedPublicKey(), !UserDefaults.standard[.hasSyncedConfiguration] else { return }
let storage = SNMessagingKitConfiguration.shared.storage let storage = SNMessagingKitConfiguration.shared.storage
let allClosedGroupPublicKeys = storage.getUserClosedGroupPublicKeys() let allClosedGroupPublicKeys = storage.getUserClosedGroupPublicKeys()
for closedGroup in message.closedGroups { for closedGroup in message.closedGroups {
@ -157,6 +157,7 @@ extension MessageReceiver {
guard !allOpenGroups.contains(openGroupURL) else { continue } guard !allOpenGroups.contains(openGroupURL) else { continue }
OpenGroupManager.shared.add(with: openGroupURL, using: transaction).retainUntilComplete() OpenGroupManager.shared.add(with: openGroupURL, using: transaction).retainUntilComplete()
} }
UserDefaults.standard[.hasSyncedConfiguration] = true
} }
@discardableResult @discardableResult
@ -279,6 +280,9 @@ extension MessageReceiver {
} else { } else {
thread = TSGroupThread.getOrCreateThread(with: group, transaction: transaction) thread = TSGroupThread.getOrCreateThread(with: group, transaction: transaction)
thread.save(with: transaction) thread.save(with: transaction)
// Notify the user
let infoMessage = TSInfoMessage(timestamp: NSDate.ows_millisecondTimeStamp(), in: thread, messageType: .typeGroupUpdate)
infoMessage.save(with: transaction)
} }
// Add the group to the user's set of public keys to poll for // Add the group to the user's set of public keys to poll for
Storage.shared.addClosedGroupPublicKey(groupPublicKey, using: transaction) Storage.shared.addClosedGroupPublicKey(groupPublicKey, using: transaction)
@ -288,9 +292,6 @@ extension MessageReceiver {
Storage.shared.setClosedGroupFormationTimestamp(to: messageSentTimestamp, for: groupPublicKey, using: transaction) Storage.shared.setClosedGroupFormationTimestamp(to: messageSentTimestamp, for: groupPublicKey, using: transaction)
// Notify the PN server // Notify the PN server
let _ = PushNotificationAPI.performOperation(.subscribe, for: groupPublicKey, publicKey: getUserHexEncodedPublicKey()) let _ = PushNotificationAPI.performOperation(.subscribe, for: groupPublicKey, publicKey: getUserHexEncodedPublicKey())
// Notify the user
let infoMessage = TSInfoMessage(timestamp: NSDate.ows_millisecondTimeStamp(), in: thread, messageType: .typeGroupUpdate)
infoMessage.save(with: transaction)
} }
private static func handleClosedGroupEncryptionKeyPair(_ message: ClosedGroupControlMessage, using transaction: Any) { private static func handleClosedGroupEncryptionKeyPair(_ message: ClosedGroupControlMessage, using transaction: Any) {
@ -423,10 +424,6 @@ extension MessageReceiver {
let members: Set<String> = didAdminLeave ? [] : Set(group.groupMemberIds).subtracting([ message.sender! ]) // If the admin leaves the group is disbanded let members: Set<String> = didAdminLeave ? [] : Set(group.groupMemberIds).subtracting([ message.sender! ]) // If the admin leaves the group is disbanded
let userPublicKey = getUserHexEncodedPublicKey() let userPublicKey = getUserHexEncodedPublicKey()
let isCurrentUserAdmin = group.groupAdminIds.contains(userPublicKey) let isCurrentUserAdmin = group.groupAdminIds.contains(userPublicKey)
// Guard against self-sends
guard message.sender != getUserHexEncodedPublicKey() else {
return SNLog("Ignoring invalid closed group update.")
}
// If a regular member left: // If a regular member left:
// Distribute a new encryption key pair if we're the admin of the group // Distribute a new encryption key pair if we're the admin of the group
// If the admin left: // If the admin left:

@ -24,7 +24,6 @@ extension MessageSender {
// Send a closed group update message to all members individually // Send a closed group update message to all members individually
var promises: [Promise<Void>] = [] var promises: [Promise<Void>] = []
for member in members { for member in members {
guard member != userPublicKey else { continue }
let thread = TSContactThread.getOrCreateThread(withContactId: member, transaction: transaction) let thread = TSContactThread.getOrCreateThread(withContactId: member, transaction: transaction)
thread.save(with: transaction) thread.save(with: transaction)
let closedGroupControlMessageKind = ClosedGroupControlMessage.Kind.new(publicKey: Data(hex: groupPublicKey), name: name, let closedGroupControlMessageKind = ClosedGroupControlMessage.Kind.new(publicKey: Data(hex: groupPublicKey), name: name,

@ -137,8 +137,12 @@ public final class MessageSender : NSObject {
} }
// Validate the message // Validate the message
guard message.isValid else { handleFailure(with: Error.invalidMessage, using: transaction); return promise } guard message.isValid else { handleFailure(with: Error.invalidMessage, using: transaction); return promise }
// Stop here if this is a self-send (unless it's a configuration message or a sync message) // Stop here if this is a self-send, unless it's:
guard !isSelfSend || message is ConfigurationMessage || isSyncMessage else { // a configuration message
// a sync message
// a closed group control message of type `new`
let isNewClosedGroupControlMessage = given(message as? ClosedGroupControlMessage) { if case .new = $0.kind { return true } else { return false } } ?? false
guard !isSelfSend || message is ConfigurationMessage || isSyncMessage || isNewClosedGroupControlMessage else {
storage.write(with: { transaction in storage.write(with: { transaction in
MessageSender.handleSuccessfulMessageSend(message, to: destination, using: transaction) MessageSender.handleSuccessfulMessageSend(message, to: destination, using: transaction)
seal.fulfill(()) seal.fulfill(())
@ -364,6 +368,7 @@ public final class MessageSender : NSObject {
OWSDisappearingMessagesJob.shared().startAnyExpiration(for: tsMessage, expirationStartedAt: NSDate.millisecondTimestamp(), transaction: transaction) OWSDisappearingMessagesJob.shared().startAnyExpiration(for: tsMessage, expirationStartedAt: NSDate.millisecondTimestamp(), transaction: transaction)
// Sync the message if: // Sync the message if:
// it's a visible message // it's a visible message
// the destination was a contact
// we didn't sync it already // we didn't sync it already
let userPublicKey = getUserHexEncodedPublicKey() let userPublicKey = getUserHexEncodedPublicKey()
if case .contact(let publicKey) = destination, !isSyncMessage, let message = message as? VisibleMessage { if case .contact(let publicKey) = destination, !isSyncMessage, let message = message as? VisibleMessage {

@ -5,6 +5,7 @@ public enum SNUserDefaults {
public enum Bool : Swift.String { public enum Bool : Swift.String {
case hasLaunchedOnce case hasLaunchedOnce
case hasSeenGIFMetadataWarning case hasSeenGIFMetadataWarning
case hasSyncedConfiguration
case hasViewedSeed case hasViewedSeed
case isUsingFullAPNs case isUsingFullAPNs
case isMigratingToV2KeyPair case isMigratingToV2KeyPair

Loading…
Cancel
Save