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

Update MessengerRestoreBackup

Do not try to clean up after failure
parent 04d8ce0c
No related branches found
No related tags found
2 merge requests!105Backup restoration fixes,!102Release 1.0.0
...@@ -30,58 +30,53 @@ extension MessengerRestoreBackup { ...@@ -30,58 +30,53 @@ extension MessengerRestoreBackup {
public static func live(_ env: MessengerEnvironment) -> MessengerRestoreBackup { public static func live(_ env: MessengerEnvironment) -> MessengerRestoreBackup {
MessengerRestoreBackup { backupData, backupPassphrase in MessengerRestoreBackup { backupData, backupPassphrase in
let storageDir = env.storageDir let storageDir = env.storageDir
do { let ndfData = try env.downloadNDF(env.ndfEnvironment)
let ndfData = try env.downloadNDF(env.ndfEnvironment) let password = env.generateSecret()
let password = env.generateSecret() try env.passwordStorage.save(password)
try env.passwordStorage.save(password) try env.fileManager.removeDirectory(storageDir)
try env.fileManager.removeDirectory(storageDir) try env.fileManager.createDirectory(storageDir)
try env.fileManager.createDirectory(storageDir) let report = try env.newCMixFromBackup(
let report = try env.newCMixFromBackup( ndfJSON: String(data: ndfData, encoding: .utf8)!,
ndfJSON: String(data: ndfData, encoding: .utf8)!, storageDir: storageDir,
storageDir: storageDir, backupPassphrase: backupPassphrase,
backupPassphrase: backupPassphrase, sessionPassword: password,
sessionPassword: password, backupFileContents: backupData
backupFileContents: backupData )
) let cMix = try env.loadCMix(
let cMix = try env.loadCMix( storageDir: storageDir,
storageDir: storageDir, password: password,
password: password, cMixParamsJSON: env.getCMixParams()
cMixParamsJSON: env.getCMixParams() )
) env.cMix.set(cMix)
try cMix.startNetworkFollower(timeoutMS: 30_000) try cMix.startNetworkFollower(timeoutMS: 30_000)
let e2e = try env.login( let e2e = try env.login(
cMixId: cMix.getId(), cMixId: cMix.getId(),
authCallbacks: env.authCallbacks.registered(), authCallbacks: env.authCallbacks.registered(),
identity: try cMix.makeReceptionIdentity(legacy: true), identity: try cMix.makeReceptionIdentity(legacy: true),
e2eParamsJSON: env.getE2EParams() e2eParamsJSON: env.getE2EParams()
) )
let decoder = JSONDecoder() env.e2e.set(e2e)
let paramsData = report.params.data(using: .utf8)! env.isListeningForMessages.set(false)
let params = try decoder.decode(BackupParams.self, from: paramsData) let decoder = JSONDecoder()
let ud = try env.newUdManagerFromBackup( let paramsData = report.params.data(using: .utf8)!
params: NewUdManagerFromBackup.Params( let params = try decoder.decode(BackupParams.self, from: paramsData)
e2eId: e2e.getId(), let ud = try env.newUdManagerFromBackup(
username: Fact(type: .username, value: params.username), params: NewUdManagerFromBackup.Params(
email: params.email.map { Fact(type: .email, value: $0) }, e2eId: e2e.getId(),
phone: params.phone.map { Fact(type: .phone, value: $0) }, username: Fact(type: .username, value: params.username),
cert: env.udCert ?? e2e.getUdCertFromNdf(), email: params.email.map { Fact(type: .email, value: $0) },
contact: env.udContact ?? (try e2e.getUdContactFromNdf()), phone: params.phone.map { Fact(type: .phone, value: $0) },
address: env.udAddress ?? e2e.getUdAddressFromNdf() cert: env.udCert ?? e2e.getUdCertFromNdf(),
), contact: env.udContact ?? (try e2e.getUdContactFromNdf()),
follower: UdNetworkStatus { cMix.networkFollowerStatus() } address: env.udAddress ?? e2e.getUdAddressFromNdf()
) ),
env.cMix.set(cMix) follower: UdNetworkStatus { cMix.networkFollowerStatus() }
env.e2e.set(e2e) )
env.ud.set(ud) env.ud.set(ud)
env.isListeningForMessages.set(false) return Result(
return Result( restoredParams: params,
restoredParams: params, restoredContacts: report.restoredContacts
restoredContacts: report.restoredContacts )
)
} catch {
try? env.fileManager.removeDirectory(storageDir)
throw error
}
} }
} }
} }
......
...@@ -136,6 +136,7 @@ final class MessengerRestoreBackupTests: XCTestCase { ...@@ -136,6 +136,7 @@ final class MessengerRestoreBackupTests: XCTestCase {
password: password, password: password,
cMixParams: cMixParams cMixParams: cMixParams
), ),
.didSetCMix,
.cMixDidStartNetworkFollower( .cMixDidStartNetworkFollower(
timeoutMS: 30_000 timeoutMS: 30_000
), ),
...@@ -148,6 +149,10 @@ final class MessengerRestoreBackupTests: XCTestCase { ...@@ -148,6 +149,10 @@ final class MessengerRestoreBackupTests: XCTestCase {
identity: receptionIdentity, identity: receptionIdentity,
e2eParamsJSON: e2eParams e2eParamsJSON: e2eParams
), ),
.didSetE2E,
.didSetIsListeningForMessages(
isListening: false
),
.didNewUdManagerFromBackup(params: .init( .didNewUdManagerFromBackup(params: .init(
e2eId: e2eId, e2eId: e2eId,
username: Fact(type: .username, value: backupParams.username), username: Fact(type: .username, value: backupParams.username),
...@@ -157,12 +162,7 @@ final class MessengerRestoreBackupTests: XCTestCase { ...@@ -157,12 +162,7 @@ final class MessengerRestoreBackupTests: XCTestCase {
contact: udContactFromNdf, contact: udContactFromNdf,
address: udAddressFromNdf address: udAddressFromNdf
)), )),
.didSetCMix,
.didSetE2E,
.didSetUD, .didSetUD,
.didSetIsListeningForMessages(
isListening: false
),
]) ])
XCTAssertNoDifference(result, MessengerRestoreBackup.Result( XCTAssertNoDifference(result, MessengerRestoreBackup.Result(
...@@ -175,19 +175,13 @@ final class MessengerRestoreBackupTests: XCTestCase { ...@@ -175,19 +175,13 @@ final class MessengerRestoreBackupTests: XCTestCase {
struct Failure: Error, Equatable {} struct Failure: Error, Equatable {}
let failure = Failure() let failure = Failure()
var actions: [CaughtAction] = []
var env: MessengerEnvironment = .unimplemented var env: MessengerEnvironment = .unimplemented
env.downloadNDF.run = { _ in throw failure } env.downloadNDF.run = { _ in throw failure }
env.fileManager.removeDirectory = { actions.append(.didRemoveDirectory(path: $0)) }
let restore: MessengerRestoreBackup = .live(env) let restore: MessengerRestoreBackup = .live(env)
XCTAssertThrowsError(try restore(backupData: Data(), backupPassphrase: "")) { error in XCTAssertThrowsError(try restore(backupData: Data(), backupPassphrase: "")) { error in
XCTAssertNoDifference(error as? Failure, failure) XCTAssertNoDifference(error as? Failure, failure)
} }
XCTAssertNoDifference(actions, [
.didRemoveDirectory(path: env.storageDir)
])
} }
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment