Files
sousa-gecko/browser/components/backup/tests/xpcshell/test_BackupService_wrongPassword.js
T

131 lines
3.4 KiB
JavaScript

/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
ChromeUtils.defineESModuleGetters(this, {
ERRORS: "chrome://browser/content/backup/backup-constants.mjs",
});
let bs;
const correctPassword = "correcthorsebatterystaple";
const incorrectPassword = "Tr0ub4dor&3";
let testBackupDirPath;
let testBackupPath;
add_setup(async function () {
setupProfile();
bs = new BackupService({ FakeBackupResource1 });
let sandbox = sinon.createSandbox();
let fakeManifestEntry = { fake: "test" };
sandbox
.stub(FakeBackupResource1.prototype, "backup")
.resolves(fakeManifestEntry);
sandbox.stub(FakeBackupResource1.prototype, "recover").resolves();
testBackupDirPath = await IOUtils.createUniqueDirectory(
PathUtils.tempDir,
"wrongPasswordTestBackup"
);
bs = new BackupService({ FakeBackupResource1 });
await bs.enableEncryption(correctPassword);
testBackupPath = (await bs.createBackup({ profilePath: testBackupDirPath }))
.archivePath;
registerCleanupFunction(async () => {
sandbox.restore();
bs = null;
await IOUtils.remove(testBackupDirPath, { recursive: true });
});
});
/**
* Tests the case where the wrong password is given when trying to restore from
* a backup.
*
* @param {string|null} passwordToUse
* The password to decrypt with, or `null` to specify no password.
*/
async function testWrongPassword(passwordToUse) {
Services.fog.testResetFOG();
Assert.ok(await IOUtils.exists(testBackupPath), "The backup file exists");
let recoveredProfilePath = await IOUtils.createUniqueDirectory(
PathUtils.tempDir,
"wrongPasswordTestRecoveredProfile"
);
registerCleanupFunction(async () => {
await IOUtils.remove(recoveredProfilePath, { recursive: true });
});
await bs.getBackupFileInfo(testBackupPath);
const restoreID = bs.state.restoreID;
await Assert.rejects(
bs.recoverFromBackupArchive(
testBackupPath,
passwordToUse,
false,
testBackupDirPath,
recoveredProfilePath,
true
),
err => err.cause == ERRORS.UNAUTHORIZED
);
let events = Glean.browserBackup.restoreStarted.testGetValue();
Assert.equal(
events.length,
1,
"Should be a single restore started event after we start restoring a profile"
);
Assert.equal(
events[0].extra.restore_id,
restoreID,
"Restore started event should have the right restore_id"
);
Assert.equal(
events[0].extra.replace,
"true",
"Restore started event should have replace=true"
);
events = Glean.browserBackup.restoreFailed.testGetValue();
Assert.equal(
events.length,
1,
"Should be a single restore failed event after we fail to restore a profile"
);
Assert.equal(
events[0].extra.restore_id,
restoreID,
"Restore failure event should have the right restore_id"
);
Assert.equal(
events[0].extra.error_type,
"UNAUTHORIZED",
"Restore failure event should have UNAUTHORIZED error_type"
);
Assert.equal(
events[0].extra.error_detail,
"",
"Restore failure event should have empty error_detail"
);
Assert.equal(
events[0].extra.restore_step,
"EXTRACT_SNAPSHOT",
"Restore failure event should have EXTRACT_SNAPSHOT restore_step"
);
}
add_task(async function test_wrong_password() {
await testWrongPassword(incorrectPassword);
});
add_task(async function test_no_password() {
await testWrongPassword(null);
});