Bug 1846036, replace usage of findLogins with searchLoginsAsync, r=credential-management-reviewers,sync-reviewers,joschmidt,markh

One caller in modifyLogin is switched to synchronous searchLogins, we can switch this later to add an asyncronous version of modifyLogin

Differential Revision: https://phabricator.services.mozilla.com/D184840
This commit is contained in:
Neil Deakin 2023-08-15 00:21:05 +00:00
Родитель 997351a55d
Коммит 5fae98f0e4
19 изменённых файлов: 214 добавлений и 181 удалений

Просмотреть файл

@ -9,8 +9,8 @@ const OLD_HOST = "http://mozilla.org";
const NEW_HOST = "http://mozilla.com";
const FXA_HOST = "chrome://FirefoxAccounts";
function checkLoginExists(host, shouldExist) {
const logins = Services.logins.findLogins(host, "", null);
async function checkLoginExists(origin, shouldExist) {
const logins = await Services.logins.searchLoginsAsync({ origin });
equal(
logins.length,
shouldExist ? 1 : 0,
@ -19,7 +19,7 @@ function checkLoginExists(host, shouldExist) {
}
async function addLogin(host, timestamp) {
checkLoginExists(host, false);
await checkLoginExists(host, false);
let login = Cc["@mozilla.org/login-manager/loginInfo;1"].createInstance(
Ci.nsILoginInfo
);
@ -27,7 +27,7 @@ async function addLogin(host, timestamp) {
login.QueryInterface(Ci.nsILoginMetaInfo);
login.timePasswordChanged = timestamp;
await Services.logins.addLoginAsync(login);
checkLoginExists(host, true);
await checkLoginExists(host, true);
}
async function setupPasswords() {
@ -62,27 +62,27 @@ add_task(async function testPasswords() {
extension.sendMessage(method, {});
await extension.awaitMessage("passwordsRemoved");
checkLoginExists(OLD_HOST, false);
checkLoginExists(NEW_HOST, false);
checkLoginExists(FXA_HOST, true);
await checkLoginExists(OLD_HOST, false);
await checkLoginExists(NEW_HOST, false);
await checkLoginExists(FXA_HOST, true);
// Clear passwords with recent since value.
await setupPasswords();
extension.sendMessage(method, { since: REFERENCE_DATE - 1000 });
await extension.awaitMessage("passwordsRemoved");
checkLoginExists(OLD_HOST, true);
checkLoginExists(NEW_HOST, false);
checkLoginExists(FXA_HOST, true);
await checkLoginExists(OLD_HOST, true);
await checkLoginExists(NEW_HOST, false);
await checkLoginExists(FXA_HOST, true);
// Clear passwords with old since value.
await setupPasswords();
extension.sendMessage(method, { since: REFERENCE_DATE - 20000 });
await extension.awaitMessage("passwordsRemoved");
checkLoginExists(OLD_HOST, false);
checkLoginExists(NEW_HOST, false);
checkLoginExists(FXA_HOST, true);
await checkLoginExists(OLD_HOST, false);
await checkLoginExists(NEW_HOST, false);
await checkLoginExists(FXA_HOST, true);
}
await extension.startup();

Просмотреть файл

@ -244,13 +244,13 @@ class TestFirefoxRefresh(MarionetteTestCase):
)
def checkPassword(self):
loginInfo = self.marionette.execute_script(
loginInfo = self.runAsyncCode(
"""
let ary = Services.logins.findLogins(
"test.marionette.mozilla.com",
"http://test.marionette.mozilla.com/some/form/",
null, {});
return ary.length ? ary : {username: "null", password: "null"};
let [resolve] = arguments;
Services.logins.searchLoginsAsync({
origin: "test.marionette.mozilla.com",
formActionOrigin: "http://test.marionette.mozilla.com/some/form/",
}).then(ary => resolve(ary.length ? ary : {username: "null", password: "null"}));
"""
)
self.assertEqual(len(loginInfo), 1)

Просмотреть файл

@ -498,11 +498,10 @@ LoginManagerStorage.prototype = {
if (!this._isLoggedIn) {
return false;
}
let logins = Services.logins.findLogins(
FXA_PWDMGR_HOST,
null,
FXA_PWDMGR_REALM
);
let logins = await Services.logins.searchLoginsAsync({
origin: FXA_PWDMGR_HOST,
httpRealm: FXA_PWDMGR_REALM,
});
for (let login of logins) {
Services.logins.removeLogin(login);
}
@ -554,11 +553,10 @@ LoginManagerStorage.prototype = {
""
); // aPasswordField
let existingLogins = Services.logins.findLogins(
FXA_PWDMGR_HOST,
null,
FXA_PWDMGR_REALM
);
let existingLogins = await Services.logins.searchLoginsAsync({
origin: FXA_PWDMGR_HOST,
httpRealm: FXA_PWDMGR_REALM,
});
if (existingLogins.length) {
Services.logins.modifyLogin(existingLogins[0], login);
} else {
@ -590,11 +588,10 @@ LoginManagerStorage.prototype = {
throw new this.STORAGE_LOCKED();
}
let logins = Services.logins.findLogins(
FXA_PWDMGR_HOST,
null,
FXA_PWDMGR_REALM
);
let logins = await Services.logins.searchLoginsAsync({
origin: FXA_PWDMGR_HOST,
httpRealm: FXA_PWDMGR_REALM,
});
if (!logins.length) {
// This could happen if the MP was locked when we wrote the data.
log.info("Can't find any credentials in the login manager");

Просмотреть файл

@ -29,12 +29,11 @@ function setLoginMgrLoggedInState(loggedIn) {
initTestLogging("Trace");
function getLoginMgrData() {
let logins = Services.logins.findLogins(
FXA_PWDMGR_HOST,
null,
FXA_PWDMGR_REALM
);
async function getLoginMgrData() {
let logins = await Services.logins.searchLoginsAsync({
origin: FXA_PWDMGR_HOST,
httpRealm: FXA_PWDMGR_REALM,
});
if (!logins.length) {
return null;
}
@ -114,7 +113,7 @@ add_task(async function test_simple() {
"scopedKeys not stored in clear text"
);
let login = getLoginMgrData();
let login = await getLoginMgrData();
Assert.strictEqual(login.username, creds.uid, "uid used for username");
let loginData = JSON.parse(login.password);
Assert.strictEqual(
@ -139,7 +138,7 @@ add_task(async function test_simple() {
await fxa.signOut(/* localOnly = */ true);
Assert.strictEqual(
getLoginMgrData(),
await getLoginMgrData(),
null,
"login mgr data deleted on logout"
);
@ -158,7 +157,11 @@ add_task(async function test_MPLocked() {
verified: true,
};
Assert.strictEqual(getLoginMgrData(), null, "no login mgr at the start");
Assert.strictEqual(
await getLoginMgrData(),
null,
"no login mgr at the start"
);
// tell the storage that the MP is locked.
setLoginMgrLoggedInState(false);
await fxa._internal.setSignedInUser(creds);
@ -189,7 +192,11 @@ add_task(async function test_MPLocked() {
"scopedKeys not stored in clear text"
);
Assert.strictEqual(getLoginMgrData(), null, "login mgr data doesn't exist");
Assert.strictEqual(
await getLoginMgrData(),
null,
"login mgr data doesn't exist"
);
await fxa.signOut(/* localOnly = */ true);
});
@ -235,7 +242,7 @@ add_task(async function test_consistentWithMPEdgeCases() {
await fxa._internal.setSignedInUser(creds2);
// We should still have creds1 data in the login manager.
let login = getLoginMgrData();
let login = await getLoginMgrData();
Assert.strictEqual(login.username, creds1.uid);
// and that we do have the first scopedKeys in the login manager.
Assert.deepEqual(
@ -264,7 +271,11 @@ add_task(async function test_consistentWithMPEdgeCases() {
// the login manager.
add_task(async function test_uidMigration() {
setLoginMgrLoggedInState(true);
Assert.strictEqual(getLoginMgrData(), null, "expect no logins at the start");
Assert.strictEqual(
await getLoginMgrData(),
null,
"expect no logins at the start"
);
// create the login entry using email as a key.
let contents = {

Просмотреть файл

@ -14,8 +14,6 @@ import {
} from "resource://services-sync/engines.sys.mjs";
import { Svc, Utils } from "resource://services-sync/util.sys.mjs";
import { Async } from "resource://services-common/async.sys.mjs";
// These are valid fields the server could have for a logins record
// we mainly use this to detect if there are any unknownFields and
// store (but don't process) those fields to roundtrip them back
@ -164,13 +162,11 @@ PasswordEngine.prototype = {
return null;
}
let logins = this._store.storage.findLogins(
login.origin,
login.formActionOrigin,
login.httpRealm
);
await Async.promiseYield(); // Yield back to main thread after synchronous operation.
let logins = await this._store.storage.searchLoginsAsync({
origin: login.origin,
formActionOrigin: login.formActionOrigin,
httpRealm: login.httpRealm,
});
// Look for existing logins that match the origin, but ignore the password.
for (let local of logins) {

Просмотреть файл

@ -168,7 +168,9 @@ add_task(async function test_password_engine() {
);
await Services.logins.addLoginAsync(login);
let logins = Services.logins.findLogins("https://example.com", "", "");
let logins = await Services.logins.searchLoginsAsync({
origin: "https://example.com",
});
equal(logins.length, 1, "Should find new login in login manager");
newLogin = logins[0].QueryInterface(Ci.nsILoginMetaInfo);
@ -208,7 +210,9 @@ add_task(async function test_password_engine() {
props.setProperty("timePasswordChanged", localPasswordChangeTime);
Services.logins.modifyLogin(login, props);
let logins = Services.logins.findLogins("https://mozilla.com", "", "");
let logins = await Services.logins.searchLoginsAsync({
origin: "https://mozilla.com",
});
equal(logins.length, 1, "Should find old login in login manager");
oldLogin = logins[0].QueryInterface(Ci.nsILoginMetaInfo);
equal(oldLogin.timePasswordChanged, localPasswordChangeTime);
@ -240,7 +244,9 @@ add_task(async function test_password_engine() {
"Should update remote password for newer login"
);
let logins = Services.logins.findLogins("https://mozilla.com", "", "");
let logins = await Services.logins.searchLoginsAsync({
origin: "https://mozilla.com",
});
equal(
logins[0].password,
"n3wpa55",
@ -372,7 +378,6 @@ add_task(async function test_sync_outgoing() {
_("Remove the login");
equal(collection.count(), 1);
equal(Services.logins.countLogins("", "", ""), 2);
equal(Services.logins.findLogins("", "", "").length, 2);
equal((await Services.logins.getAllLogins()).length, 2);
ok(await engine._store.itemExists(guid));
@ -401,7 +406,6 @@ add_task(async function test_sync_outgoing() {
// All of these should not include the deleted login. Only the FxA password should exist.
equal(Services.logins.countLogins("", "", ""), 1);
equal(Services.logins.findLogins("", "", "").length, 1);
equal((await Services.logins.getAllLogins()).length, 1);
ok(!(await engine._store.itemExists(guid)));
@ -457,7 +461,9 @@ add_task(async function test_sync_incoming() {
_("Perform sync when remote login has been added");
await sync_engine_and_validate_telem(engine, false);
let logins = Services.logins.findLogins("https://www.example.com", "", "");
let logins = await Services.logins.searchLoginsAsync({
origin: "https://www.example.com",
});
equal(logins.length, 1);
equal(logins[0].QueryInterface(Ci.nsILoginMetaInfo).guid, guid1);
@ -482,7 +488,9 @@ add_task(async function test_sync_incoming() {
await engine.setLastSync(newTime / 1000 - 30);
await sync_engine_and_validate_telem(engine, false);
logins = Services.logins.findLogins("https://www.example.com", "", "");
logins = await Services.logins.searchLoginsAsync({
origin: "https://www.example.com",
});
equal(logins.length, 1);
details.password = "alpaca";
@ -508,7 +516,9 @@ add_task(async function test_sync_incoming() {
await engine.setLastSync(newTime / 1000 - 30);
await sync_engine_and_validate_telem(engine, false);
logins = Services.logins.findLogins("https://www.example.com", "", "");
logins = await Services.logins.searchLoginsAsync({
origin: "https://www.example.com",
});
equal(logins.length, 1);
details.username = "guanaco";
@ -534,7 +544,9 @@ add_task(async function test_sync_incoming() {
await engine.setLastSync(newTime / 1000 - 30);
await sync_engine_and_validate_telem(engine, false);
logins = Services.logins.findLogins("https://www.example.com", "", "");
logins = await Services.logins.searchLoginsAsync({
origin: "https://www.example.com",
});
equal(logins.length, 0);
} finally {
await cleanup(engine, server);
@ -574,7 +586,9 @@ add_task(async function test_sync_incoming_deleted() {
_("Perform sync when remote login has been deleted");
await sync_engine_and_validate_telem(engine, false);
let logins = Services.logins.findLogins("https://www.example.org", "", "");
let logins = await Services.logins.searchLoginsAsync({
origin: "https://www.example.com",
});
equal(logins.length, 0);
ok(!(await engine._store.getAllIDs())[guid1]);
ok(!(await engine._store.itemExists(guid1)));
@ -631,7 +645,9 @@ add_task(async function test_sync_incoming_deleted_localchanged_remotenewer() {
);
await sync_engine_and_validate_telem(engine, false);
let logins = Services.logins.findLogins("http://mozilla.com", "", "");
let logins = await Services.logins.searchLoginsAsync({
origin: "https://mozilla.com",
});
equal(logins.length, 0);
ok(await engine._store.getAllIDs());
} finally {
@ -687,7 +703,9 @@ add_task(async function test_sync_incoming_deleted_localchanged_localnewer() {
);
await sync_engine_and_validate_telem(engine, false);
let logins = Services.logins.findLogins("http://www.mozilla.com", "", "");
let logins = await Services.logins.searchLoginsAsync({
origin: "http://www.mozilla.com",
});
equal(logins.length, 1);
equal(logins[0].password, "cheetah");
equal(logins[0].syncCounter, 0);
@ -734,7 +752,9 @@ add_task(async function test_password_dupe() {
_("Perform sync");
await sync_engine_and_validate_telem(engine, true);
let logins = Services.logins.findLogins("https://www.example.com", "", "");
let logins = await Services.logins.searchLoginsAsync({
origin: "https://www.example.com",
});
equal(logins.length, 1);
equal(logins[0].QueryInterface(Ci.nsILoginMetaInfo).guid, guid2);
@ -788,11 +808,9 @@ add_task(async function test_updated_null_password_sync() {
_("Perform sync");
await sync_engine_and_validate_telem(engine, false);
let logins = Services.logins.findLogins(
"https://www.nullupdateexample.com",
"",
""
);
let logins = await Services.logins.searchLoginsAsync({
origin: "https://www.nullupdateexample.com",
});
equal(logins.length, 1);
equal(logins[0].QueryInterface(Ci.nsILoginMetaInfo).guid, guid1);
@ -845,11 +863,9 @@ add_task(async function test_updated_undefined_password_sync() {
_("Perform sync");
await sync_engine_and_validate_telem(engine, false);
let logins = Services.logins.findLogins(
"https://www.undefinedupdateexample.com",
"",
""
);
let logins = await Services.logins.searchLoginsAsync({
origin: "https://www.undefinedupdateexample.com",
});
equal(logins.length, 1);
equal(logins[0].QueryInterface(Ci.nsILoginMetaInfo).guid, guid1);
@ -887,7 +903,9 @@ add_task(async function test_new_null_password_sync() {
_("Perform sync");
await sync_engine_and_validate_telem(engine, false);
let logins = Services.logins.findLogins("https://www.example.com", "", "");
let logins = await Services.logins.searchLoginsAsync({
origin: "https://www.example.com",
});
equal(logins.length, 1);
notEqual(logins[0].QueryInterface(Ci.nsILoginMetaInfo).username, null);
@ -927,7 +945,9 @@ add_task(async function test_new_undefined_password_sync() {
_("Perform sync");
await sync_engine_and_validate_telem(engine, false);
let logins = Services.logins.findLogins("https://www.example.com", "", "");
let logins = await Services.logins.searchLoginsAsync({
origin: "https://www.example.com",
});
equal(logins.length, 1);
notEqual(logins[0].QueryInterface(Ci.nsILoginMetaInfo).username, null);
@ -1002,7 +1022,9 @@ add_task(async function test_roundtrip_unknown_fields() {
props.setProperty("timePasswordChanged", localPasswordChangeTime);
Services.logins.modifyLogin(login, props);
let logins = Services.logins.findLogins("https://mozilla.com", "", "");
let logins = await Services.logins.searchLoginsAsync({
origin: "https://mozilla.com",
});
equal(logins.length, 1, "Should find old login in login manager");
oldLogin = logins[0].QueryInterface(Ci.nsILoginMetaInfo);
equal(oldLogin.timePasswordChanged, localPasswordChangeTime);
@ -1032,7 +1054,9 @@ add_task(async function test_roundtrip_unknown_fields() {
try {
await sync_engine_and_validate_telem(engine, false);
let logins = Services.logins.findLogins("https://mozilla.com", "", "");
let logins = await Services.logins.searchLoginsAsync({
origin: "https://mozilla.com",
});
equal(
logins[0].password,
"n3wpa55",

Просмотреть файл

@ -24,11 +24,10 @@ async function checkRecord(
let engine = Service.engineManager.get("passwords");
let store = engine._store;
let logins = Services.logins.findLogins(
record.hostname,
record.formSubmitURL,
null
);
let logins = await Services.logins.searchLoginsAsync({
origin: record.hostname,
formActionOrigin: record.formSubmitURL,
});
_("Record" + name + ":" + JSON.stringify(logins));
_("Count" + name + ":" + logins.length);
@ -350,16 +349,15 @@ add_task(async function run_test() {
);
// Only the good record makes it to Services.logins.
let badLogins = Services.logins.findLogins(
recordA.hostname,
recordA.formSubmitURL,
recordA.httpRealm
);
let goodLogins = Services.logins.findLogins(
recordB.hostname,
recordB.formSubmitURL,
null
);
let badLogins = await Services.logins.searchLoginsAsync({
origin: recordA.hostname,
formActionOrigin: recordA.formSubmitURL,
httpRealm: recordA.httpRealm,
});
let goodLogins = await Services.logins.searchLoginsAsync({
origin: recordB.hostname,
formActionOrigin: recordB.formSubmitURL,
});
_("Bad: " + JSON.stringify(badLogins));
_("Good: " + JSON.stringify(goodLogins));

Просмотреть файл

@ -112,12 +112,12 @@ Password.prototype = {
*
* @return the guid of the password if found, otherwise -1
*/
Find() {
let logins = Services.logins.findLogins(
this.props.hostname,
this.props.submitURL,
this.props.realm
);
async Find() {
let logins = await Services.logins.searchLoginsAsync({
origin: this.props.hostname,
formActionOrigin: this.props.submitURL,
httpRealm: this.props.realm,
});
for (var i = 0; i < logins.length; i++) {
if (
logins[i].username == this.props.username &&

Просмотреть файл

@ -464,19 +464,19 @@ export var TPS = {
break;
case ACTION_VERIFY:
lazy.Logger.AssertTrue(
passwordOb.Find() != -1,
(await passwordOb.Find()) != -1,
"password not found"
);
break;
case ACTION_VERIFY_NOT:
lazy.Logger.AssertTrue(
passwordOb.Find() == -1,
(await passwordOb.Find()) == -1,
"password found, but it shouldn't exist"
);
break;
case ACTION_DELETE:
lazy.Logger.AssertTrue(
passwordOb.Find() != -1,
(await passwordOb.Find()) != -1,
"password not found"
);
passwordOb.Remove();
@ -484,7 +484,7 @@ export var TPS = {
case ACTION_MODIFY:
if (passwordOb.updateProps != null) {
lazy.Logger.AssertTrue(
passwordOb.Find() != -1,
(await passwordOb.Find()) != -1,
"password not found"
);
passwordOb.Update();

Просмотреть файл

@ -108,7 +108,7 @@ function check_disabled_host(aHost, aIsDisabled) {
* The host to add the login for.
*/
async function add_login(aHost) {
check_login_exists(aHost, false);
await check_login_exists(aHost, false);
let login = Cc["@mozilla.org/login-manager/loginInfo;1"].createInstance(
Ci.nsILoginInfo
);
@ -122,7 +122,7 @@ async function add_login(aHost) {
LOGIN_PASSWORD_FIELD
);
await Services.logins.addLoginAsync(login);
check_login_exists(aHost, true);
await check_login_exists(aHost, true);
}
/**
@ -133,8 +133,8 @@ async function add_login(aHost) {
* @param aExists
* True if the login should exist, false otherwise.
*/
function check_login_exists(aHost, aExists) {
let logins = Services.logins.findLogins(aHost, "", null);
async function check_login_exists(aHost, aExists) {
let logins = await Services.logins.searchLoginsAsync({ origin: aHost });
Assert.equal(logins.length, aExists ? 1 : 0);
}
@ -314,24 +314,24 @@ async function test_login_manager_logins_cleared_with_direct_match() {
const TEST_HOST = "http://mozilla.org";
await add_login(TEST_HOST);
await ForgetAboutSite.removeDataFromDomain("mozilla.org");
check_login_exists(TEST_HOST, true);
await check_login_exists(TEST_HOST, true);
}
async function test_login_manager_logins_cleared_with_subdomain() {
const TEST_HOST = "http://www.mozilla.org";
await add_login(TEST_HOST);
await ForgetAboutSite.removeDataFromDomain("mozilla.org");
check_login_exists(TEST_HOST, true);
await check_login_exists(TEST_HOST, true);
}
async function test_login_manager_logins_not_cleared_with_uri_contains_domain() {
const TEST_HOST = "http://ilovemozilla.org";
await add_login(TEST_HOST);
await ForgetAboutSite.removeDataFromDomain("mozilla.org");
check_login_exists(TEST_HOST, true);
await check_login_exists(TEST_HOST, true);
Services.logins.removeAllUserFacingLogins();
check_login_exists(TEST_HOST, false);
await check_login_exists(TEST_HOST, false);
}
async function test_login_manager_disabled_hosts_cleared_base_domain() {

Просмотреть файл

@ -171,14 +171,14 @@ class ImportRowProcessor {
* A login object.
* @returns {boolean} True if the entry is similar or identical to another previously processed entry, false otherwise.
*/
checkConflictingWithExistingLogins(login) {
async checkConflictingWithExistingLogins(login) {
// While here we're passing formActionOrigin and httpRealm, they could be empty/null and get
// ignored in that case, leading to multiple logins for the same username.
let existingLogins = Services.logins.findLogins(
login.origin,
login.formActionOrigin,
login.httpRealm
);
let existingLogins = await Services.logins.searchLoginsAsync({
origin: login.origin,
httpRealm: login.httpRealm,
});
// Check for an existing login that matches *including* the password.
// If such a login exists, we do not need to add a new login.
if (
@ -1498,7 +1498,7 @@ export const LoginHelper = {
if (processor.checkConflictingOriginWithPreviousRows(login)) {
continue;
}
if (processor.checkConflictingWithExistingLogins(login)) {
if (await processor.checkConflictingWithExistingLogins(login)) {
continue;
}
processor.addLoginToSummary(login, "added");

Просмотреть файл

@ -417,7 +417,13 @@ LoginManagerAuthPrompter.prototype = {
}
// Look for existing logins.
foundLogins = Services.logins.findLogins(origin, null, realm);
// We don't use searchLoginsAsync here and in asyncPromptPassword
// because of bug 1848682
let matchData = lazy.LoginHelper.newPropertyBag({
origin,
httpRealm: realm,
});
foundLogins = Services.logins.searchLogins(matchData);
// XXX Like the original code, we can't deal with multiple
// account selection. (bug 227632)
@ -531,7 +537,11 @@ LoginManagerAuthPrompter.prototype = {
Services.logins.getLoginSavingEnabled(origin);
if (!aPassword.value) {
// Look for existing logins.
var foundLogins = Services.logins.findLogins(origin, null, realm);
let matchData = lazy.LoginHelper.newPropertyBag({
origin,
httpRealm: realm,
});
let foundLogins = Services.logins.searchLogins(matchData);
// XXX Like the original code, we can't deal with multiple
// account selection (bug 227632). We can deal with finding the

Просмотреть файл

@ -195,7 +195,8 @@ interface nsILoginManager : nsISupports {
* Search for logins matching the specified criteria. Called when looking
* for logins that might be applicable to a form or authentication request.
*
* @deprecated Use `searchLoginsAsync` instead.
* @deprecated Use `searchLoginsAsync` instead. This function is retained
* for Thunderbird compatibility.
*
* @param aOrigin
* The origin to restrict searches to. For example: "http://www.site.com".

Просмотреть файл

@ -286,12 +286,12 @@ export class LoginManagerStorage_json {
const resultLogins = [];
for (const [login, encryptedLogin] of encryptedLogins) {
// check for duplicates
const { origin, formActionOrigin, httpRealm } = login;
const existingLogins = this.findLogins(
origin,
formActionOrigin,
httpRealm
);
let loginData = {
origin: login.origin,
httpRealm: login.httpRealm,
};
const existingLogins = await Services.logins.searchLoginsAsync(loginData);
const matchingLogin = existingLogins.find(l => login.matches(l, true));
if (matchingLogin) {
if (continueOnDuplicates) {
@ -372,10 +372,13 @@ export class LoginManagerStorage_json {
// Look for an existing entry in case key properties changed.
if (!newLogin.matches(oldLogin, true)) {
let logins = this.findLogins(
newLogin.origin,
newLogin.formActionOrigin,
newLogin.httpRealm
let loginData = {
origin: newLogin.origin,
httpRealm: newLogin.httpRealm,
};
let logins = this.searchLogins(
lazy.LoginHelper.newPropertyBag(loginData)
);
let matchingLogin = logins.find(login => newLogin.matches(login, true));

Просмотреть файл

@ -63,8 +63,8 @@ let chromeScript = runInParent(() => {
};
});
addMessageListener("getTimeLastUsed", () => {
let logins = Services.logins.findLogins(mozproxyURL, null, "Proxy Realm");
addMessageListener("getTimeLastUsed", async () => {
let logins = await Services.logins.searchLoginsAsync({ origin: mozproxyURL, httpRealm: "Proxy Realm"});
return logins[0].QueryInterface(Ci.nsILoginMetaInfo).timeLastUsed;
});

Просмотреть файл

@ -65,7 +65,7 @@ add_task(async function test_addLogin_wildcard() {
});
/**
* Verifies that findLogins, searchLogins, and countLogins include all logins
* Verifies that searchLogins and countLogins include all logins
* that have an empty formActionOrigin in the store, even when a formActionOrigin is
* specified.
*/
@ -76,11 +76,6 @@ add_task(function test_search_all_wildcard() {
});
Assert.equal(Services.logins.searchLogins(matchData).length, 2);
Assert.equal(
Services.logins.findLogins("", "http://www.example.com", null).length,
2
);
Assert.equal(
Services.logins.countLogins("", "http://www.example.com", null),
2
@ -90,15 +85,6 @@ add_task(function test_search_all_wildcard() {
matchData.setProperty("origin", "http://any.example.com");
Assert.equal(Services.logins.searchLogins(matchData).length, 1);
Assert.equal(
Services.logins.findLogins(
"http://any.example.com",
"http://www.example.com",
null
).length,
1
);
Assert.equal(
Services.logins.countLogins(
"http://any.example.com",

Просмотреть файл

@ -35,9 +35,8 @@ add_task(async function test_logins_decrypt_failure() {
// These functions don't see the non-decryptable entries anymore.
let savedLogins = await Services.logins.getAllLogins();
Assert.equal(savedLogins.length, 0);
Assert.equal(savedLogins.length, 0, "getAllLogins length");
Assert.equal(Services.logins.findLogins("", "", "").length, 0);
await Assert.rejects(Services.logins.searchLoginsAsync({}), /is required/);
Assert.equal(Services.logins.searchLogins(newPropertyBag()).length, 0);
Assert.throws(
() => Services.logins.modifyLogin(logins[0], newPropertyBag()),
@ -63,7 +62,11 @@ add_task(async function test_logins_decrypt_failure() {
// Finding logins doesn't return the non-decryptable duplicates.
Assert.equal(
Services.logins.findLogins("http://www.example.com", "", "").length,
(
await Services.logins.searchLoginsAsync({
origin: "http://www.example.com",
})
).length,
1
);
let matchData = newPropertyBag({ origin: "http://www.example.com" });

Просмотреть файл

@ -17,8 +17,8 @@ const gLooksLikeUUIDRegex = /^\{\w{8}-\w{4}-\w{4}-\w{4}-\w{12}\}$/;
* the given nsILoginInfo. In case there is more than one login for the
* origin, the test fails.
*/
function retrieveLoginMatching(aLoginInfo) {
let logins = Services.logins.findLogins(aLoginInfo.origin, "", "");
async function retrieveOriginMatching(origin) {
let logins = await Services.logins.searchLoginsAsync({ origin });
Assert.equal(logins.length, 1);
return logins[0].QueryInterface(Ci.nsILoginMetaInfo);
}
@ -94,7 +94,7 @@ add_task(async function test_addLogin_metainfo() {
Assert.equal(gLoginInfo1.timesUsed, 0);
// A login with valid metadata should have been stored.
gLoginMetaInfo1 = retrieveLoginMatching(gLoginInfo1);
gLoginMetaInfo1 = await retrieveOriginMatching(gLoginInfo1.origin);
Assert.ok(gLooksLikeUUIDRegex.test(gLoginMetaInfo1.guid));
let creationTime = gLoginMetaInfo1.timeCreated;
LoginTestUtils.assertTimeIsAboutNow(creationTime);
@ -110,12 +110,12 @@ add_task(async function test_addLogin_metainfo() {
assertMetaInfoEqual(gLoginInfo2, originalLogin);
// A login with the provided metadata should have been stored.
gLoginMetaInfo2 = retrieveLoginMatching(gLoginInfo2);
gLoginMetaInfo2 = await retrieveOriginMatching(gLoginInfo2.origin);
assertMetaInfoEqual(gLoginMetaInfo2, gLoginInfo2);
// Add an authentication login to the database before continuing.
await Services.logins.addLoginAsync(gLoginInfo3);
gLoginMetaInfo3 = retrieveLoginMatching(gLoginInfo3);
gLoginMetaInfo3 = await retrieveOriginMatching(gLoginInfo3.origin);
await LoginTestUtils.checkLogins([gLoginInfo1, gLoginInfo2, gLoginInfo3]);
});
@ -140,7 +140,7 @@ add_task(async function test_addLogin_metainfo_duplicate() {
* Tests that the existing metadata is not changed when modifyLogin is called
* with an nsILoginInfo argument.
*/
add_task(function test_modifyLogin_nsILoginInfo_metainfo_ignored() {
add_task(async function test_modifyLogin_nsILoginInfo_metainfo_ignored() {
let newLoginInfo = gLoginInfo1.clone().QueryInterface(Ci.nsILoginMetaInfo);
newLoginInfo.guid = Services.uuid.generateUUID().toString();
newLoginInfo.timeCreated = Date.now();
@ -149,14 +149,14 @@ add_task(function test_modifyLogin_nsILoginInfo_metainfo_ignored() {
newLoginInfo.timesUsed = 12;
Services.logins.modifyLogin(gLoginInfo1, newLoginInfo);
newLoginInfo = retrieveLoginMatching(gLoginInfo1);
newLoginInfo = await retrieveOriginMatching(gLoginInfo1.origin);
assertMetaInfoEqual(newLoginInfo, gLoginMetaInfo1);
});
/**
* Tests the modifyLogin function with an nsIProperyBag argument.
*/
add_task(function test_modifyLogin_nsIProperyBag_metainfo() {
add_task(async function test_modifyLogin_nsIProperyBag_metainfo() {
// Use a new reference time that is two minutes from now.
let newTimeMs = Date.now() + 120000;
let newUUIDValue = Services.uuid.generateUUID().toString();
@ -173,7 +173,7 @@ add_task(function test_modifyLogin_nsIProperyBag_metainfo() {
})
);
gLoginMetaInfo1 = retrieveLoginMatching(gLoginInfo1);
gLoginMetaInfo1 = await retrieveOriginMatching(gLoginInfo1.origin);
Assert.equal(gLoginMetaInfo1.guid, newUUIDValue);
Assert.equal(gLoginMetaInfo1.timeCreated, newTimeMs);
Assert.equal(gLoginMetaInfo1.timeLastUsed, newTimeMs + 2);
@ -190,7 +190,7 @@ add_task(function test_modifyLogin_nsIProperyBag_metainfo() {
);
gLoginInfo2.password = "new password";
gLoginMetaInfo2 = retrieveLoginMatching(gLoginInfo2);
gLoginMetaInfo2 = await retrieveOriginMatching(gLoginInfo2.origin);
Assert.equal(gLoginMetaInfo2.password, gLoginInfo2.password);
Assert.equal(gLoginMetaInfo2.timeCreated, originalLogin.timeCreated);
Assert.equal(gLoginMetaInfo2.timeLastUsed, originalLogin.timeLastUsed);
@ -207,7 +207,7 @@ add_task(function test_modifyLogin_nsIProperyBag_metainfo() {
);
gLoginInfo2.password = "other password";
gLoginMetaInfo2 = retrieveLoginMatching(gLoginInfo2);
gLoginMetaInfo2 = await retrieveOriginMatching(gLoginInfo2.origin);
Assert.equal(gLoginMetaInfo2.password, gLoginInfo2.password);
Assert.equal(gLoginMetaInfo2.timeCreated, originalLogin.timeCreated);
Assert.equal(gLoginMetaInfo2.timeLastUsed, originalLogin.timeLastUsed);
@ -221,7 +221,7 @@ add_task(function test_modifyLogin_nsIProperyBag_metainfo() {
})
);
gLoginMetaInfo2 = retrieveLoginMatching(gLoginInfo2);
gLoginMetaInfo2 = await retrieveOriginMatching(gLoginInfo2.origin);
Assert.equal(gLoginMetaInfo2.timeCreated, originalLogin.timeCreated);
Assert.equal(gLoginMetaInfo2.timeLastUsed, originalLogin.timeLastUsed);
Assert.equal(gLoginMetaInfo2.timePasswordChanged, newTimeMs);
@ -289,7 +289,16 @@ add_task(async function test_storage_metainfo() {
await LoginTestUtils.reloadData();
await LoginTestUtils.checkLogins([gLoginInfo1, gLoginInfo2, gLoginInfo3]);
assertMetaInfoEqual(retrieveLoginMatching(gLoginInfo1), gLoginMetaInfo1);
assertMetaInfoEqual(retrieveLoginMatching(gLoginInfo2), gLoginMetaInfo2);
assertMetaInfoEqual(retrieveLoginMatching(gLoginInfo3), gLoginMetaInfo3);
assertMetaInfoEqual(
await retrieveOriginMatching(gLoginInfo1.origin),
gLoginMetaInfo1
);
assertMetaInfoEqual(
await retrieveOriginMatching(gLoginInfo2.origin),
gLoginMetaInfo2
);
assertMetaInfoEqual(
await retrieveOriginMatching(gLoginInfo3.origin),
gLoginMetaInfo3
);
});

Просмотреть файл

@ -1,6 +1,5 @@
/**
* Tests methods that find specific logins in the store (findLogins,
* searchLogins, and countLogins).
* Tests methods that find specific logins in the store (searchLogins and countLogins).
*
* The getAllLogins method is not tested explicitly here, because it is used by
* all tests to verify additions, removals and modifications to the login store.
@ -47,11 +46,11 @@ function checkSearchLogins(aQuery, aExpectedCount) {
}
/**
* Tests findLogins, searchLogins, and countLogins with the same query.
* Tests searchLogins, and countLogins with the same query.
*
* @param aQuery
* The "origin", "formActionOrigin", and "httpRealm" properties of this
* object are passed as parameters to findLogins and countLogins. The
* object are passed as parameters to countLogins. The
* same object is then passed to the checkSearchLogins function.
* @param aExpectedCount
* Number of logins from the test data that should be found. The actual
@ -65,7 +64,7 @@ function checkAllSearches(aQuery, aExpectedCount) {
let expectedLogins = buildExpectedLogins(aQuery);
Assert.equal(expectedLogins.length, aExpectedCount);
// The findLogins and countLogins functions support wildcard matches by
// The countLogins function support wildcard matches by
// specifying empty strings as parameters, while searchLogins requires
// omitting the property entirely.
let origin = "origin" in aQuery ? aQuery.origin : "";
@ -73,10 +72,6 @@ function checkAllSearches(aQuery, aExpectedCount) {
"formActionOrigin" in aQuery ? aQuery.formActionOrigin : "";
let httpRealm = "httpRealm" in aQuery ? aQuery.httpRealm : "";
// Test findLogins.
let logins = Services.logins.findLogins(origin, formActionOrigin, httpRealm);
LoginTestUtils.assertLoginListsEqual(logins, expectedLogins);
// Test countLogins.
let count = Services.logins.countLogins(origin, formActionOrigin, httpRealm);
Assert.equal(count, expectedLogins.length);
@ -95,7 +90,7 @@ add_setup(async () => {
});
/**
* Tests findLogins, searchLogins, and countLogins with basic queries.
* Tests searchLogins, and countLogins with basic queries.
*/
add_task(function test_search_all_basic() {
// Find all logins, using no filters in the search functions.
@ -217,7 +212,7 @@ add_task(function test_search_all_full_case_sensitive() {
});
/**
* Tests findLogins, searchLogins, and countLogins with queries that should
* Tests searchLogins, and countLogins with queries that should
* return no values.
*/
add_task(function test_search_all_empty() {