mirror of https://github.com/oxen-io/session-ios
Merge branch 'charlesmchen/syncVsProfileKeyRotation'
commit
72903105c9
@ -1,76 +0,0 @@
|
|||||||
//
|
|
||||||
// Copyright (c) 2018 Open Whisper Systems. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
import Foundation
|
|
||||||
import PromiseKit
|
|
||||||
import SignalServiceKit
|
|
||||||
import SignalMessaging
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Used to distribute our profile key to legacy linked devices, newly linked devices will have our profile key as part of provisioning.
|
|
||||||
* Syncing is accomplished via the existing contact syncing mechanism, except the only contact synced is ourself. It's incumbent on the linked device
|
|
||||||
* to treat this "self contact" record specially.
|
|
||||||
*/
|
|
||||||
@objc public class MultiDeviceProfileKeyUpdateJob: NSObject {
|
|
||||||
|
|
||||||
private let profileKey: OWSAES256Key
|
|
||||||
private let identityManager: OWSIdentityManager
|
|
||||||
private let messageSender: MessageSender
|
|
||||||
private let profileManager: OWSProfileManager
|
|
||||||
private var editingDatabaseConnection: YapDatabaseConnection {
|
|
||||||
return OWSPrimaryStorage.shared().dbReadWriteConnection
|
|
||||||
}
|
|
||||||
|
|
||||||
@objc public required init(profileKey: OWSAES256Key, identityManager: OWSIdentityManager, messageSender: MessageSender, profileManager: OWSProfileManager) {
|
|
||||||
self.profileKey = profileKey
|
|
||||||
|
|
||||||
self.identityManager = identityManager
|
|
||||||
self.messageSender = messageSender
|
|
||||||
self.profileManager = profileManager
|
|
||||||
}
|
|
||||||
|
|
||||||
@objc public class func run(profileKey: OWSAES256Key, identityManager: OWSIdentityManager, messageSender: MessageSender, profileManager: OWSProfileManager) {
|
|
||||||
return self.init(profileKey: profileKey, identityManager: identityManager, messageSender: messageSender, profileManager: profileManager).run()
|
|
||||||
}
|
|
||||||
|
|
||||||
func run(retryDelay: TimeInterval = 1) {
|
|
||||||
guard let localNumber = TSAccountManager.localNumber() else {
|
|
||||||
owsFailDebug("localNumber was unexpectedly nil")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
let localSignalAccount = SignalAccount(recipientId: localNumber)
|
|
||||||
localSignalAccount.contact = Contact()
|
|
||||||
let syncContactsMessage = OWSSyncContactsMessage(signalAccounts: [localSignalAccount],
|
|
||||||
identityManager: self.identityManager,
|
|
||||||
profileManager: self.profileManager)
|
|
||||||
|
|
||||||
var dataSource: DataSource?
|
|
||||||
self.editingDatabaseConnection.readWrite { transaction in
|
|
||||||
guard let messageData: Data = syncContactsMessage.buildPlainTextAttachmentData(with: transaction) else {
|
|
||||||
owsFailDebug("could not serialize sync contacts data")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
dataSource = DataSourceValue.dataSource(withSyncMessageData: messageData)
|
|
||||||
}
|
|
||||||
|
|
||||||
guard let attachmentDataSource = dataSource else {
|
|
||||||
owsFailDebug("dataSource was unexpectedly nil")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
self.messageSender.enqueueTemporaryAttachment(attachmentDataSource,
|
|
||||||
contentType: OWSMimeTypeApplicationOctetStream,
|
|
||||||
in: syncContactsMessage,
|
|
||||||
success: {
|
|
||||||
Logger.info("Successfully synced profile key")
|
|
||||||
},
|
|
||||||
failure: { error in
|
|
||||||
Logger.error("failed with error: \(error) retrying in \(retryDelay)s.")
|
|
||||||
after(seconds: retryDelay).done {
|
|
||||||
self.run(retryDelay: retryDelay * 2)
|
|
||||||
}.retainUntilComplete()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue