1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set ts=2 et sw=2 tw=80: */
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
/**
* Tests the case where there are logins that cannot be decrypted.
*/
"use strict";
// Globals
/**
* Resets the token used to decrypt logins. This is equivalent to resetting the
* master password when it is not known.
*/
function resetMasterPassword()
{
let token = Cc["@mozilla.org/security/pk11tokendb;1"]
.getService(Ci.nsIPK11TokenDB).getInternalKeyToken();
token.reset();
token.changePassword("", "");
}
// Tests
/**
* Resets the master password after some logins were added to the database.
*/
add_task(function test_logins_decrypt_failure()
{
let logins = TestData.loginList();
for (let loginInfo of logins) {
Services.logins.addLogin(loginInfo);
}
// This makes the existing logins non-decryptable.
resetMasterPassword();
// These functions don't see the non-decryptable entries anymore.
do_check_eq(Services.logins.getAllLogins().length, 0);
do_check_eq(Services.logins.findLogins({}, "", "", "").length, 0);
do_check_eq(Services.logins.searchLogins({}, newPropertyBag()).length, 0);
Assert.throws(() => Services.logins.modifyLogin(logins[0], newPropertyBag()),
/No matching logins/);
Assert.throws(() => Services.logins.removeLogin(logins[0]),
/No matching logins/);
// The function that counts logins sees the non-decryptable entries also.
do_check_eq(Services.logins.countLogins("", "", ""), logins.length);
// Equivalent logins can be added.
for (let loginInfo of logins) {
Services.logins.addLogin(loginInfo);
}
LoginTestUtils.checkLogins(logins);
do_check_eq(Services.logins.countLogins("", "", ""), logins.length * 2);
// Finding logins doesn't return the non-decryptable duplicates.
do_check_eq(Services.logins.findLogins({}, "http://www.example.com",
"", "").length, 1);
let matchData = newPropertyBag({ hostname: "http://www.example.com" });
do_check_eq(Services.logins.searchLogins({}, matchData).length, 1);
// Removing single logins does not remove non-decryptable logins.
for (let loginInfo of TestData.loginList()) {
Services.logins.removeLogin(loginInfo);
}
do_check_eq(Services.logins.getAllLogins().length, 0);
do_check_eq(Services.logins.countLogins("", "", ""), logins.length);
// Removing all logins removes the non-decryptable entries also.
Services.logins.removeAllLogins();
do_check_eq(Services.logins.getAllLogins().length, 0);
do_check_eq(Services.logins.countLogins("", "", ""), 0);
});
|