Bug 1559365: UI indication of breached logins r=jaws

Differential Revision: https://phabricator.services.mozilla.com/D35105

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Luke Crouch 2019-07-05 20:31:06 +00:00
Родитель 02b8c2bbc7
Коммит 7c07097b69
6 изменённых файлов: 56 добавлений и 2 удалений

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

@ -103,6 +103,7 @@ let LEGACY_ACTORS = {
},
messages: [
"AboutLogins:AllLogins",
"AboutLogins:UpdateBreaches",
"AboutLogins:LoginAdded",
"AboutLogins:LoginModified",
"AboutLogins:LoginRemoved",

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

@ -111,6 +111,9 @@ class AboutLoginsChild extends ActorChild {
case "AboutLogins:AllLogins":
this.sendToContent("AllLogins", message.data);
break;
case "AboutLogins:UpdateBreaches":
this.sendToContent("UpdateBreaches", message.data);
break;
case "AboutLogins:LoginAdded":
this.sendToContent("LoginAdded", message.data);
break;

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

@ -24,6 +24,11 @@ ChromeUtils.defineModuleGetter(
"MigrationUtils",
"resource:///modules/MigrationUtils.jsm"
);
ChromeUtils.defineModuleGetter(
this,
"RemoteSettings",
"resource://services-settings/remote-settings.js"
);
ChromeUtils.defineModuleGetter(
this,
"Services",
@ -175,9 +180,12 @@ var AboutLoginsParent = {
this._subscribers.add(message.target);
let messageManager = message.target.messageManager;
const logins = await this.getAllLogins();
messageManager.sendAsyncMessage("AboutLogins:AllLogins", logins);
const breachesByLoginGUID = await this.getBreachesForLogins(logins);
messageManager.sendAsyncMessage(
"AboutLogins:AllLogins",
await this.getAllLogins()
"AboutLogins:UpdateBreaches",
breachesByLoginGUID
);
break;
}
@ -363,4 +371,24 @@ var AboutLoginsParent = {
throw e;
}
},
async getBreachesForLogins(logins) {
const breaches = await RemoteSettings("fxmonitor-breaches").get();
const breachHostMap = new Map();
for (const breach of breaches) {
breachHostMap.set(breach.Domain, breach);
}
const breachesByLoginGUID = new Map();
for (const login of logins) {
const loginURI = Services.io.newURI(login.origin);
const breach = breachHostMap.get(loginURI.host) || false;
if (
breach &&
login.timePasswordChanged < new Date(breach.BreachDate).getTime()
) {
breachesByLoginGUID.set(login.guid, breach);
}
}
return breachesByLoginGUID;
},
};

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

@ -39,6 +39,10 @@ window.addEventListener("AboutLoginsChromeToContent", event => {
gElements.loginList.setLogins(event.detail.value);
break;
}
case "UpdateBreaches": {
gElements.loginList.updateBreaches(event.detail.value);
break;
}
case "LoginAdded": {
gElements.loginList.loginAdded(event.detail.value);
gElements.loginItem.loginAdded(event.detail.value);

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

@ -29,6 +29,10 @@
background-color: var(--in-content-box-background-hover);
}
:host(.breached) {
border-inline-start-color: var(--in-content-border-invalid);
}
.title {
font-weight: bold;
}

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

@ -79,6 +79,12 @@ export default class LoginList extends HTMLElement {
listItem.setAttribute("aria-selected", "true");
this._list.setAttribute("aria-activedescendant", listItem.id);
}
if (
this._breachesByLoginGUID &&
this._breachesByLoginGUID.has(login.guid)
) {
listItem.classList.add("breached");
}
this._list.append(listItem);
}
@ -162,6 +168,14 @@ export default class LoginList extends HTMLElement {
}
}
/**
* @param {Map} breachesByLoginGUID A Map of breaches by login GUIDs used for displaying breached login indicators.
*/
updateBreaches(breachesByLoginGUID) {
this._breachesByLoginGUID = breachesByLoginGUID;
this.render();
}
/**
* @param {login} login A login that was added to storage.
*/