Skip to content
Snippets Groups Projects
Commit 17e117a3 authored by Dariusz Rybicki's avatar Dariusz Rybicki
Browse files

Add MessengerRestoreBackup function wrapper

parent baf974c1
No related branches found
No related tags found
2 merge requests!102Release 1.0.0,!100Messenger - restore from backup
import Foundation
import XXClient
import XCTestDynamicOverlay
public struct MessengerRestoreBackup {
public var run: (Data, String) throws -> BackupParams
public func callAsFunction(
backupData: Data,
backupPassphrase: String
) throws -> BackupParams {
try run(backupData, backupPassphrase)
}
}
extension MessengerRestoreBackup {
public static func live(_ env: MessengerEnvironment) -> MessengerRestoreBackup {
MessengerRestoreBackup { backupData, backupPassphrase in
let storageDir = env.storageDir
do {
let ndfData = try env.downloadNDF(env.ndfEnvironment)
let password = env.generateSecret()
try env.passwordStorage.save(password)
try env.fileManager.removeDirectory(storageDir)
try env.fileManager.createDirectory(storageDir)
let report = try env.newCMixFromBackup(
ndfJSON: String(data: ndfData, encoding: .utf8)!,
storageDir: storageDir,
backupPassphrase: backupPassphrase,
sessionPassword: password,
backupFileContents: backupData
)
let cMix = try env.loadCMix(
storageDir: storageDir,
password: password,
cMixParamsJSON: env.getCMixParams()
)
let e2e = try env.login(
cMixId: cMix.getId(),
authCallbacks: env.authCallbacks.registered(),
identity: try cMix.makeReceptionIdentity(legacy: true),
e2eParamsJSON: env.getE2EParams()
)
let decoder = JSONDecoder()
let paramsData = report.params.data(using: .utf8)!
let params = try decoder.decode(BackupParams.self, from: paramsData)
let ud = try env.newUdManagerFromBackup(
params: NewUdManagerFromBackup.Params(
e2eId: e2e.getId(),
username: Fact(type: .username, value: params.username),
email: params.email.map { Fact(type: .email, value: $0) },
phone: params.phone.map { Fact(type: .phone, value: $0) },
cert: env.udCert ?? e2e.getUdCertFromNdf(),
contact: env.udContact ?? (try e2e.getUdContactFromNdf()),
address: env.udAddress ?? e2e.getUdAddressFromNdf()
),
follower: UdNetworkStatus { cMix.networkFollowerStatus() }
)
env.cMix.set(cMix)
env.e2e.set(e2e)
env.ud.set(ud)
return params
} catch {
try? env.fileManager.removeDirectory(storageDir)
throw error
}
}
}
}
extension MessengerRestoreBackup {
public static let unimplemented = MessengerRestoreBackup(
run: XCTUnimplemented("\(Self.self)")
)
}
......@@ -6,6 +6,7 @@ public struct Messenger {
public var ud: Stored<UserDiscovery?>
public var isCreated: MessengerIsCreated
public var create: MessengerCreate
public var restoreBackup: MessengerRestoreBackup
public var isLoaded: MessengerIsLoaded
public var load: MessengerLoad
public var registerAuthCallbacks: MessengerRegisterAuthCallbacks
......@@ -37,6 +38,7 @@ extension Messenger {
ud: env.ud,
isCreated: .live(env),
create: .live(env),
restoreBackup: .live(env),
isLoaded: .live(env),
load: .live(env),
registerAuthCallbacks: .live(env),
......@@ -69,6 +71,7 @@ extension Messenger {
ud: .unimplemented(),
isCreated: .unimplemented,
create: .unimplemented,
restoreBackup: .unimplemented,
isLoaded: .unimplemented,
load: .unimplemented,
registerAuthCallbacks: .unimplemented,
......
......@@ -20,7 +20,9 @@ public struct MessengerEnvironment {
public var multiLookupUD: MultiLookupUD
public var ndfEnvironment: NDFEnvironment
public var newCMix: NewCMix
public var newCMixFromBackup: NewCMixFromBackup
public var newOrLoadUd: NewOrLoadUd
public var newUdManagerFromBackup: NewUdManagerFromBackup
public var passwordStorage: PasswordStorage
public var registerForNotifications: RegisterForNotifications
public var searchUD: SearchUD
......@@ -58,7 +60,9 @@ extension MessengerEnvironment {
multiLookupUD: .live(),
ndfEnvironment: .mainnet,
newCMix: .live,
newCMixFromBackup: .live,
newOrLoadUd: .live,
newUdManagerFromBackup: .live,
passwordStorage: .keychain,
registerForNotifications: .live,
searchUD: .live,
......@@ -91,7 +95,9 @@ extension MessengerEnvironment {
multiLookupUD: .unimplemented,
ndfEnvironment: .unimplemented,
newCMix: .unimplemented,
newCMixFromBackup: .unimplemented,
newOrLoadUd: .unimplemented,
newUdManagerFromBackup: .unimplemented,
passwordStorage: .unimplemented,
registerForNotifications: .unimplemented,
searchUD: .unimplemented,
......
import Foundation
public struct BackupParams: Codable {
public init(
email: String?,
phone: String?,
username: String
) {
self.email = email
self.phone = phone
self.username = username
}
public var email: String?
public var phone: String?
public var username: String
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment