Merge pull request #873 from mozilla/fix-v2-emails

Resurrect emails and update breach alert with new FAQs.
This commit is contained in:
luke crouch 2019-04-26 15:20:46 -05:00 коммит произвёл GitHub
Родитель 74fd687149 d62a6c67a1
Коммит 856d840348
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
23 изменённых файлов: 304 добавлений и 127 удалений

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

@ -1,7 +1,5 @@
"use strict";
const HBSHelpers = require("../template-helpers/hbs-helpers");
function getEmailMockUps(req, res) {
const unsafeBreachesForEmail = [];
@ -44,7 +42,6 @@ function getEmailMockUps(req, res) {
unsafeBreachesForEmail: unsafeBreachesForEmail,
supportedLocales: req.supportedLocales,
whichPartial: `email_partials/${req.query.partial}`,
date: HBSHelpers.prettyDate(req.supportedLocales, new Date()),
buttonValue,
breachAlert,
emailSubject,

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

@ -7,7 +7,6 @@ const DB = require("../db/DB");
const EmailUtils = require("../email-utils");
const HIBP = require("../hibp");
const { LocaleUtils } = require ("../locale-utils");
const HBSHelpers = require("../template-helpers/hbs-helpers");
const mozlog = require("../log");
@ -74,7 +73,6 @@ async function notify (req, res) {
{
email,
supportedLocales,
date: HBSHelpers.prettyDate(supportedLocales, new Date()),
breachAlert,
SERVER_URL: req.app.locals.SERVER_URL,
scanAnotherEmailHref: scanAnotherEmailHref,

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

@ -8,7 +8,6 @@ const DB = require("../db/DB");
const EmailUtils = require("../email-utils");
const { FluentError } = require("../locale-utils");
const FXA = require("../lib/fxa");
const HBSHelpers = require("../template-helpers/emails");
const HIBP = require("../hibp");
const sha1 = require("../sha1-utils");
@ -160,7 +159,6 @@ async function _verify(req) {
{
email: verifiedEmailHash.email,
supportedLocales: req.supportedLocales,
date: HBSHelpers.e_prettyDate(req.supportedLocales, new Date()),
unsafeBreachesForEmail: unsafeBreachesForEmail,
scanAnotherEmailHref: EmailUtils.getScanAnotherEmailUrl(utmID),
unsubscribeUrl: EmailUtils.getUnsubscribeUrl(verifiedEmailHash, utmID),

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

@ -27,8 +27,6 @@ error-hibp-throttled = Too many connections to {-brand-HIBP}.
error-hibp-connect = Error connecting to {-brand-HIBP}.
error-hibp-load-breaches = Could not load breaches.
hibp-notify-email-subject = {-product-name} Alert: Your account was involved in a breach.
home-title = {-product-name}
home-not-found = Page not found.
@ -432,8 +430,8 @@ what-data= What data was compromised:
overview= Overview:
sensitive-sites= How does Firefox Monitor treat sensitive sites?
sensitive-sites-copy= Firefox Monitor reveals accounts associated with these
sensitive-sites= How does {-product-name} treat sensitive sites?
sensitive-sites-copy= {-product-name} reveals accounts associated with these
types of breaches after an email address has been verified. This means you're
the only person who can see if your information was in this breach.
@ -509,3 +507,35 @@ manage-email-addresses= Manage Email Addresses
latest-breach-link= See if you were in this breach
welcome-back= Welcome back { $userName }!
breach-alert-subject= {-product-name} found your email in a new data breach.
your-info-was-discovered-headline=Your information was discovered in a new data breach.
your-info-was-discovered-blurb=Youre signed up to receive {-product-name} alerts
when your email appears in a data breach. Heres what we know about this breach.
what-to-do-after-breach=What to do after a data breach
ba-next-step-1= Change your password to a strong, unique password.
ba-next-step-blurb-1=
A strong password uses a combination of upper and lowercase letters,
special characters, and numbers. It doesnt contain personal info like
your address, birthday, or family names.
ba-next-step-2= Stop using that exposed password entirely.
ba-next-step-blurb-2=
Cyber criminals could find your password on the dark web and use it
to log in to your other accounts. The best way to protect your accounts
is to use unique passwords for each one.
ba-next-step-3= Get help creating better passwords and keeping them safe.
ba-next-step-blurb-3=
Use a password manager to create strong, unique passwords. Password managers securely store all your
logins so you can access them across all your devices.
faq1= I dont recognize this company or website. Why am I in this breach?
faq2= Why did it take so long to notify me of this breach?
faq3= How do I know this is a legitimate email from {-product-name}?

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

@ -1,19 +0,0 @@
"use strict";
// Mapping for Password Tips & What To Do Next string IDs
// that have been updated with FxA integration.
const modifiedStrings = {
"pwt-summary-2" : "fxa-pwt-summary-2",
"pwt-summary-4" : "fxa-pwt-summary-4",
"pwt-summary-6" : "fxa-pwt-summary-6",
"what-to-do-subhead-2" : "fxa-what-to-do-subhead-2",
"what-to-do-subhead-4" : "fxa-what-to-do-subhead-4",
"what-to-do-blurb-1" : "fxa-what-to-do-blurb-1",
"what-to-do-blurb-2" : "fxa-wtd-blurb-2",
"what-to-do-blurb-3" : "fxa-what-to-do-blurb-3",
"what-to-do-blurb-4" : "fxa-what-to-do-blurb-4",
};
module.exports = modifiedStrings;

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

@ -175,3 +175,25 @@ p.body-copy.medium span,
p.body-copy.medium a {
font-weight: 300;
}
.email-faq-link a {
color: var(--blue60);
font-size: 14px;
}
.email-faq-link a:hover {
color: var(--blue70);
text-decoration: underline;
}
tr.email-faq-link {
margin-top: 10px !important;
}
tr.email-faq {
padding-top: 30px;
}
p.body-copy {
padding-top: 10px;
}

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

@ -1,25 +1,157 @@
"use strict";
const e_localeString = (locales, string) => {
// console.log(`localeString ${string}`);
};
const { URL } = require("url");
const e_localizedBreachDataClasses = (locales, string) => {
// console.log(`localizedBreachDataClasses ${string}`);
};
const { LocaleUtils } = require("./../locale-utils");
const e_prettyDate = (locales, string) => {
// console.log(`prettyDate ${string}`);
const { makeBreachCards } = require("./breaches");
const { prettyDate } = require("./hbs-helpers");
const modifiedStrings = {
"pwt-summary-2" : "fxa-pwt-summary-2",
"pwt-summary-4" : "fxa-pwt-summary-4",
"pwt-summary-6" : "fxa-pwt-summary-6",
"what-to-do-subhead-2" : "fxa-what-to-do-subhead-2",
"what-to-do-subhead-4" : "fxa-what-to-do-subhead-4",
"what-to-do-blurb-1" : "fxa-what-to-do-blurb-1",
"what-to-do-blurb-2" : "fxa-wtd-blurb-2",
"what-to-do-blurb-3" : "fxa-what-to-do-blurb-3",
"what-to-do-blurb-4" : "fxa-what-to-do-blurb-4",
};
const getEmailString = (locales, stringId) => {
// console.log(stringId);
};
function getUnsafeBreachesForEmailReport(args) {
const locales = args.data.root.supportedLocales;
const foundBreaches = args.data.root.unsafeBreachesForEmail;
return makeBreachCards(foundBreaches, locales);
}
function makeFaqLink(target, campaign) {
const url = new URL(`https://support.mozilla.org/kb/firefox-monitor-faq${target}`);
const utmParameters = {
utm_source: "fx-monitor-email",
utm_medium: "email",
utm_campaign: campaign,
};
for (const param in utmParameters) {
url.searchParams.append(param, utmParameters[param]);
}
return url;
}
function getBreachAlertFaqs(args) {
const supportedLocales = args.data.root.supportedLocales;
const faqs = [
{
"linkTitle" : LocaleUtils.fluentFormat(supportedLocales, "faq1", args),
"stringDescription": "I don't recognize this website. Why am I in this breach?",
"href": makeFaqLink("#w_i-donaot-recognize-this-company-or-website-why-am-i-receiving-notifications-about-this-breach", "faq1"),
},
{
"linkTitle" : LocaleUtils.fluentFormat(supportedLocales, "faq2", args),
"stringDescription": "Why did it take so long to notify me of this breach?",
"href": makeFaqLink("#w_why-did-it-take-so-long-to-notify-me-of-this-breach", "faq2"),
},
{
"linkTitle" : LocaleUtils.fluentFormat(supportedLocales, "faq3", args),
"stringDescription": "How do I know this is a legitimate email from Firefox Monitor?",
"href": makeFaqLink("#w_how-do-i-know-these-emails-are-really-from-firefox-and-not-from-a-hacker", "faq3"),
},
];
const functionedFaqs = faqs.map(faq => args.fn(faq));
return "".concat(...functionedFaqs);
}
function getReportHeader(args) {
const locales = args.data.root.supportedLocales;
const reportHeader = {
date: prettyDate(new Date(), locales),
strings: {
"email": "email-address",
"reportDate": "report-date",
"fxmReport" : "firefox-monitor-report",
},
};
for (const stringId in reportHeader.strings) {
const newString = LocaleUtils.fluentFormat(locales, reportHeader.strings[stringId]);
reportHeader.strings[stringId] = newString;
}
return args.fn(reportHeader);
}
function getWhatToDos(args) {
const locales = args.data.root.supportedLocales;
let headlineId = "what-to-do-next";
let subheadId = "what-to-do-subhead";
let blurbId = "what-to-do-blurb";
let numTips = 4;
// grab different strings for breach alert emails
if (args.data.root.breachAlert) {
headlineId = "what-to-do-after";
subheadId = "ba-next-step";
blurbId = "ba-next-step-blurb";
numTips = 3;
}
const whatToDoNext = {
headline: LocaleUtils.fluentFormat(locales, headlineId),
steps: createTips(numTips, subheadId, blurbId, locales),
};
return args.fn(whatToDoNext);
}
function getPasswordTips(args) {
const locales = args.data.root.supportedLocales;
const passwordTips = createTips(4, "report-pwt-headline", "report-pwt-summary", locales);
return passwordTips;
}
function checkForNewStringId(locales, stringId) {
if (modifiedStrings[stringId]) {
stringId = modifiedStrings[stringId];
}
return LocaleUtils.fluentFormat(locales, stringId);
}
function createTips(numTips, subheadIdPrefix, blurbIdPrefix, locales) {
const tips = [];
let x = 0;
while (x < numTips) {
tips.push({
idx: x + 1,
subhead: checkForNewStringId(locales, `${subheadIdPrefix}-${x+1}`),
blurb: checkForNewStringId(locales, `${blurbIdPrefix}-${x+1}`),
});
x++;
}
return tips;
}
function getBreachAlert(args) {
const locales = args.data.root.supportedLocales;
const breachAlert = [args.data.root.breachAlert];
const breachAlertCard = makeBreachCards(breachAlert, locales);
return args.fn(breachAlertCard[0]);
}
module.exports = {
e_localeString,
e_localizedBreachDataClasses,
e_prettyDate,
getEmailString,
getBreachAlert,
getBreachAlertFaqs,
getPasswordTips,
getReportHeader,
getUnsafeBreachesForEmailReport,
getWhatToDos,
};

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

@ -9,6 +9,9 @@ const log = mozlog("template-helpers/hbs-helpers");
function getSupportedLocales(args) {
if (args.data) {
if (args.data.root.supportedLocales) {
return args.data.root.supportedLocales;
}
return args.data.root.req.supportedLocales;
}
if (args.this) {

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

@ -9,7 +9,7 @@
body {
text-align: center;
font-family: 'Fira Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
font-family: sans-serif;
font-weight: 400;
color: #333333;
background: #ededf0;
@ -54,6 +54,11 @@
border-width: 0px;
}
p,
a {
font-family: sans-serif;
}
@media screen and (max-width: 500px) {
br.break-line {
display: none;

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

@ -2,8 +2,8 @@
<html lang="{{ locale }}">
<head>
<meta charset="utf-8" />
<link rel="stylesheet" href="/dist/app.min.css">
<link rel="stylesheet" href="/dist/email_l10n_testing.min.css">
<link rel="stylesheet" href="/css/legacy/app.css">
<link rel="stylesheet" href="/css/legacy/email_l10n_testing.css">
<link rel="stylesheet" href="https://code.cdn.mozilla.net/fonts/fira.css">
<meta name="partialport" content="width=device-width, initial-scale=1.0, partialport-fit=cover" />
<title>Firefox Monitor: Email L10n</title>

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

@ -1,14 +0,0 @@
<tr>
<td class="email-breach-image" valign="top" style="padding-top: 3px; padding-bottom: 10px; width: 55px;">
<img src="{{ SERVER_URL }}/img/email_images/missing-logo-icon.png" width="40" style="width: 40px;" />
</td>
<td valign="top" style="vertical-align: top; padding-top: 0px; padding-right: 20px; padding-bottom: 10px;">
<p class="body-copy medium" style="padding: 0px; margin: 0px; color: #333333; margin: 0px; font-weight: 500; font-size: 16px;">{{ breachAlert.Title }}</p>
<p class="body-copy medium" style="padding: 2px 0px 2px 0px; margin: 0px; color: #333333; font-weight: 400; font-size: 14px;">{{getEmailString supportedLocales "breach-date"}}<span class="body-copy" style="font-weight:300; padding-left: 6px; color: #333333">{{e_prettyDate supportedLocales breachAlert.BreachDate }}</span></p>
<p class="body-copy medium" style="padding: 2px 0px 2px 0px; margin: 0px; color: #333333; font-weight: 400; font-size: 14px;">{{getEmailString supportedLocales "compromised-accounts"}}<span class="body-copy" style="font-weight:300; padding-left: 6px; color: #333333">{{e_localeString supportedLocales breachAlert.PwnCount }}</span></p>
{{#if breachAlert.DataClasses }}
<p class="body-copy medium" style="padding: 2px 0px 2px 0px; margin: 0px; color: #333333; font-weight: 400; font-size: 14px;">{{getEmailString supportedLocales "compromised-data"}}<span class="body-copy" style="font-weight:300; padding-left: 6px; color: #333333">{{e_localizedBreachDataClasses supportedLocales breachAlert.DataClasses }}</span></p>
{{/if}}
</td>
</tr>

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

@ -4,9 +4,9 @@
<td>
<table>
<tr>
<td class="email-button-wrapper" align="center" bgcolor="#0060df" style="width: 100%; max-width: 530px; border-radius: 2px;">
<td class="email-button-wrapper" align="center" bgcolor="#0060df" style="width: 100%; max-width: 530px; border-radius: 2px; font-family: sans-serif;">
<a class="email-button" href="{{ href }}" rel="noopener" style="text-align: center; text-decoration: none; color: #ffffff; padding-top: 12px; padding-right: 30px; padding-left: 30px; padding-bottom: 12px; border: 1px solid #0060df; display: inline-block; font-size: 13px;">
{{getEmailString supportedLocales fluentStringID}}
{{ getString fluentStringID }}
</a>
</td>
</tr>

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

@ -0,0 +1,19 @@
<tr class="email-faq" style="padding-top: 15px; font-family: sans-serif;">
<td colspan="2" valign="top" style="padding-top: 10px;">
<p class="body-copy email-sub-head" style="color: #333333; font-weight: 300; font-size: 22px; padding-top: 30px; margin: 0px; ">
{{ getString "frequently-asked-questions" }}
</p>
</td>
</tr>
{{#getBreachAlertFaqs}}
<tr class="email-faq-link">
<td valign="top" style="width: 60px;">
</td>
<td valign="top" style="padding-top: 10px;">
<a href="{{ href }}" style="color: #0060df; font-weight: 400; font-size: 14px; padding: 0px; margin: 0px; ">
{{ linkTitle }}
</a>
</td>
</tr>
{{/getBreachAlertFaqs}}
<tr style="padding-top: 30px;"></tr>

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

@ -1,15 +1,15 @@
<table class="footer" align="center" width="100%" border="0" cellspacing="0" cellpadding="0" style="text-align: center; max-width: 603px; font-size: 13px; padding: 0px 15px; margin: 0px;">
<tr>
<td>
<td style="font-family: sans-serif;">
<p class="footer-copy legal-copy" style="margin-top: 0px; font-weight: 300; color: #738597;">
{{getEmailString supportedLocales "automated-message"}}
{{ getString "automated-message" }}
</p>
<p class="footer-copy" style="margin-top: 0px; font-weight: 300; color: #738597;">
{{{getEmailString supportedLocales "we-sent-this-alert" userEmail=email}}}
{{{ getString "we-sent-this-alert" userEmail=email }}}
</p>
<p class="footer-copy" style="padding: 0px 0px 3px 0px; margin: 0px; font-weight: 300; color: #738597 ;">
<a class="footer-link" style="color: #0060df;" href="{{ unsubscribeUrl }}" rel="noreferrer noopener">
{{getEmailString supportedLocales "unsubscribe-email-link"}}
{{ getString "unsubscribe-email-link" }}
</a>
</p>
</td>
@ -22,11 +22,11 @@
</td>
</tr>
<tr>
<td valign="top">
<td valign="top" style="font-family: sans-serif;">
<p class="footer-copy" style="padding: 0px 0px 3px 0px; margin: 0px; font-weight: 300; color: #738597;">Mozilla</p>
<p class="footer-copy" style="padding: 0px 0px 3px 0px; margin: 0px; font-weight: 300; color: #738597 ;">331 E. Evelyn Avenue Mountain View CA 94041</p>
<p class="footer-copy" style="padding: 0px; margin: 0px;">
<a class="footer-link" href="https://www.mozilla.org/about/legal/{{> email_partials/utm_email_footer }}" rel="noopener" style="color: #0060df;">{{getEmailString supportedLocales "legal"}}</a><span style="color:#738597;"> &#8226;</span> <a class="footer-link" href="https://www.mozilla.org/privacy/firefox-monitor/{{> email_partials/utm_email_footer }}" rel="noopener" style="color: #0060df;">{{getEmailString supportedLocales "terms-and-privacy"}}</a>
<a class="footer-link" href="https://www.mozilla.org/about/legal/{{> email_partials/utm_email_footer }}" rel="noopener" style="color: #0060df;">{{ getString "legal" }}</a><span style="color:#738597;"> &#8226;</span> <a class="footer-link" href="https://www.mozilla.org/privacy/firefox-monitor/{{> email_partials/utm_email_footer }}" rel="noopener" style="color: #0060df;">{{ getString "terms-and-privacy" }}</a>
</p>
</td>
</tr>

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

@ -1,6 +1,6 @@
<tr>
<td><!--empty cell to align HIBP attribution with other table items--></td>
<td>
<span class="source-info">{{{getEmailString supportedLocales "hibp-attribution" hibp-link='<a id="hibp-link" href="https://www.haveibeenpwned.com" target="_blank" rel="noopener noreferrer">Have I Been Pwned</a>'}}}</span>
<td style="font-family: sans-serif;">
<span class="source-info">{{{ getString "hibp-attribution" hibp-link='<a id="hibp-link" href="https://www.haveibeenpwned.com" target="_blank" rel="noopener noreferrer">Have I Been Pwned</a>' }}}</span>
</td>
</tr>

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

@ -4,7 +4,7 @@
<td class="logomark-wrapper" valign="top" style="text-align: left; padding-top: 5px; width: 70px;">
<img class="firefox-monitor-logomark" width="60" style="width: 60px;" src="{{ SERVER_URL }}/img/firefox-monitor-logo.png" />
</td>
<td valign="center" style="text-align: left;">
<td valign="center" style="text-align: left; font-family: sans-serif;">
<h1 class="firefox-monitor-logotype" style="color: #ffffff; padding: 0px; margin: 0px; font-size: 30px; font-weight: 400;">Firefox <span style="color:#ffffff; font-weight: 300;">Monitor</span></h1>
</td>
</tr>

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

@ -1,13 +1,13 @@
{{!-- <tr class="email-breach-listing">
<tr class="email-breach-listing">
<td class="email-breach-image" valign="top" style="padding-top: 13px; padding-bottom: 10px; width: 55px;">
<img src="{{ SERVER_URL }}/img/logos/{{ this.LogoPath }}" width="40" style="width: 40px" />
<img src="{{ SERVER_URL }}/img/logos/{{ LogoPath }}" width="40" style="width: 40px" />
</td>
<td valign="top" style="vertical-align: top; padding-top: 7px; padding-right: 20px; padding-bottom: 10px;">
<p class="body-copy medium" style="padding: 0px; margin: 0px; color: #333333; margin: 0px; font-weight: 500; font-size: 16px;">{{ this.Title }}</p>
<p class="body-copy medium" style="padding: 2px 0px 2px 0px; margin: 0px; color: #333333; font-weight: 400; font-size: 14px;">{{getString supportedLocales "breach-date"}}<span class="body-copy" style="font-weight:300; padding-left: 6px; color: #333333">{{prettyDate supportedLocales this.BreachDate }}</span></p>
<p class="body-copy medium" style="padding: 2px 0px 2px 0px; margin: 0px; color: #333333; font-weight: 400; font-size: 14px;">{{getString supportedLocales "compromised-accounts"}}<span class="body-copy" style="font-weight:300; padding-left: 6px; color: #333333">{{localeString supportedLocales this.PwnCount }}</span></p>
{{#if this.DataClasses }}
<p class="body-copy medium" style="padding: 2px 0px 2px 0px; margin: 0px; color: #333333; font-weight: 400; font-size: 14px;">{{getString supportedLocales "compromised-data"}}<span class="body-copy" style="font-weight:300; padding-left: 6px; color: #333333">{{localizedBreachDataClasses supportedLocales this.DataClasses }}</span></p>
<td valign="top" style="vertical-align: top; padding-top: 7px; padding-right: 20px; padding-bottom: 10px; font-family: sans-serif;">
<p class="body-copy medium" style="padding: 0px; margin: 0px; color: #333333; margin: 0px; font-weight: 500; font-size: 16px;">{{ Title }}</p>
<p class="body-copy medium" style="padding: 2px 0px 2px 0px; margin: 0px; color: #333333; font-weight: 400; font-size: 14px;">{{ String.AddedDate }}<span class="body-copy" style="font-weight:300; padding-left: 6px; color: #333333">{{ AddedDate }}</span></p>
<p class="body-copy medium" style="padding: 2px 0px 2px 0px; margin: 0px; color: #333333; font-weight: 400; font-size: 14px;">{{ String.CompromisedAccounts }}<span class="body-copy" style="font-weight:300; padding-left: 6px; color: #333333">{{ PwnCount }}</span></p>
{{#if DataClasses }}
<p class="body-copy medium" style="padding: 2px 0px 2px 0px; margin: 0px; color: #333333; font-weight: 400; font-size: 14px;">{{ String.CompromisedData }}<span class="body-copy" style="font-weight:300; padding-left: 6px; color: #333333">{{ DataClasses }}</span></p>
{{/if}}
</td>
</tr> --}}
</tr>

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

@ -2,9 +2,9 @@
<table align="center" class="verify-email" border="0" cellspacing="0" cellpadding="0" width="100%" style="text-align: center; margin: 0px; outline: none; border-width: 0px;">
<tr>
<td valign="top" style="padding-top: 30px; padding-bottom: 10px;">
<td valign="top" style="padding-top: 30px; padding-bottom: 10px; font-family: sans-serif;">
<p class="body-copy" style="font-weight: 300; width: 100%; font-size: 17px; margin: 0px; color: #333333;">
{{getEmailString supportedLocales "click-to-verify"}}
{{ getString "click-to-verify" }}
</p>
</td>
</tr>
@ -12,7 +12,7 @@
<table border="0" cellspacing="0" cellpadding="0" width="100%" style="width: 100%; padding-top: 30px; padding-bottom: 30px;">
<tr>
<td>
{{>email_partials/email_button href=verificationHref fluentStringID="verify-my-email"}}
{{> email_partials/email_button href=verificationHref fluentStringID="verify-my-email" }}
</td>
</tr>
</table>

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

@ -1,35 +1,38 @@
{{!-- {{!< default_email}}
{{!< default_email}}
<div style="width: 100%; max-width: 603px;">
<table border="0" cellpadding="0" cellspacing="0" style="text-align: left; width: 100%;">
<tr>
<td>
{{> email_partials/report_header_details}}
<td style="font-family: sans-serif">
{{> email_partials/report_header_details }}
</td>
</tr>
</table>
<table class="email-headline-copy" border="0" cellpadding="0" cellspacing="0" style="text-align: left; padding-top: 10px; width: 100%;">
<tr>
<td>
{{> email_partials/report_list_headline}}
{{> email_partials/report_list_headline }}
</td>
</tr>
</table>
<table class="email-main-copy" border="0" cellpadding="0" cellspacing="0" style="text-align: left; padding-top: 10px;">
{{#if breachAlert}}
{{> email_partials/breach_alert supportedLocales=supportedLocales}}
{{> email_partials/email_hibp_attribution}}
{{> email_partials/report_what_to_do_next}}
{{#getBreachAlert}}
{{> email_partials/email_single_breach SERVER_URL=../SERVER_URL}}
{{/getBreachAlert}}
{{> email_partials/email_hibp_attribution }}
{{> email_partials/email_faqs}}
{{> email_partials/report_what_to_do_next }}
{{else}}
{{#ifCompare unsafeBreachesForEmail.length ">" 0}}
{{#each unsafeBreachesForEmail}}
{{> email_partials/email_single_breach SERVER_URL=../SERVER_URL supportedLocales=../supportedLocales}}
{{#each (getUnsafeBreachesForEmailReport)}}
{{> email_partials/email_single_breach SERVER_URL=../SERVER_URL}}
{{/each}}
{{> email_partials/email_hibp_attribution}}
{{> email_partials/report_what_to_do_next}}
{{> email_partials/email_hibp_attribution }}
{{> email_partials/report_what_to_do_next }}
{{else}}
{{> email_partials/report_password_tips}}
{{> email_partials/report_password_tips }}
{{/ifCompare}}
{{/if}}<!--breachAlert-->
@ -37,8 +40,8 @@
<table class="table-button" border="0" cellpadding="0" cellspacing="0" width="100%" style="padding-top: 20px; padding-bottom: 20px; margin: 0px;">
<tr>
<td>
{{> email_partials/email_button href=scanAnotherEmailHref fluentStringID="report-scan-another-email"}}
{{> email_partials/email_button href=scanAnotherEmailHref fluentStringID="report-scan-another-email" }}
</td>
</tr>
</table>
</div> --}}
</div>

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

@ -1,6 +1,7 @@
<div style="width: 100%; padding-bottom: 20px;">
<p class="body-copy medium" style="color:#333333; padding: 0px; margin: 0px; font-weight: 500; font-size: 14px;">{{getEmailString supportedLocales "firefox-monitor-report"}}</p>
<p class="body-copy medium" style="color:#333333; padding: 2px 0px; margin: 0px; font-weight: 500; font-size: 14px;">{{getEmailString supportedLocales "report-date"}} <span class="body-copy" style="font-weight:300; color: #333333;">{{ date }}</span></p>
<p class="body-copy medium" style="color:#333333; padding: 2px 0px; margin: 0px; font-weight: 500; font-size: 14px;">{{getEmailString supportedLocales "email-address"}} <a class="body-copy" href="mailto:{{ email }}" style="font-weight: 300; color: #333333;">{{ email }}</a></p>
</div>
{{#getReportHeader}}
<div style="width: 100%; padding-bottom: 20px;">
<p class="body-copy medium" style="color:#333333; padding: 0px; margin: 0px; font-weight: 500; font-size: 14px;">{{ strings.fxmReport }}</p>
<p class="body-copy medium" style="color:#333333; padding: 2px 0px; margin: 0px; font-weight: 500; font-size: 14px;">{{ strings.reportDate }} <span class="body-copy" style="font-weight:300; color: #333333;">{{ date }}</span></p>
<p class="body-copy medium" style="color:#333333; padding: 2px 0px; margin: 0px; font-weight: 500; font-size: 14px;">{{ strings.email }} <a class="body-copy" href="mailto:{{ ./../email }}" style="font-weight: 300; color: #333333;">{{ ./../email }}</a></p>
</div>
{{/getReportHeader}}

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

@ -1,26 +1,26 @@
<h2 class="body-copy" style="color: #333333; font-size: 22px; font-weight: 300;">
{{#if breachAlert}}
{{getEmailString supportedLocales "breach-alert-headline"}}
{{ getString "your-info-was-discovered-headline" }}
{{else}}
{{getEmailString supportedLocales "report-headline" breachCount=unsafeBreachesForEmail.length}}
{{ getString "report-headline" breachCount=unsafeBreachesForEmail.length }}
{{/if}}
</h2>
<p class="body-copy" style="color: #333333; font-size: 15px; font-weight: 300;">
{{#if breachAlert}}
{{getEmailString supportedLocales "breach-alert-subhead"}}
{{ getString "your-info-was-discovered-blurb" }}
{{else}}
{{#ifCompare unsafeBreachesForEmail.length "===" 0}}
{{getEmailString supportedLocales "report-subhead-no-breaches"}}
{{ getString "report-subhead-no-breaches" }}
{{else}}
{{getEmailString supportedLocales "report-subhead-found-breaches" breachCount=unsafeBreachesForEmail.length}}
{{ getString "report-subhead-found-breaches" breachCount=unsafeBreachesForEmail.length }}
{{/ifCompare}}
</p>
{{#ifCompare unsafeBreachesForEmail.length "===" 0}}
<h2 class="body-copy" style="color: #333333; font-size: 22px; font-weight: 300;">
{{getEmailString supportedLocales "pwt-section-headline"}}
{{ getString "pwt-section-headline" }}
</h2>
<p class="body-copy" style="color: #333333; font-size: 15px; font-weight: 300;">{{getEmailString supportedLocales "report-pwt-blurb"}}</p>
<p class="body-copy" style="color: #333333; font-size: 15px; font-weight: 300;">{{ getString "report-pwt-blurb" }}</p>
{{/ifCompare}}
{{/if}} <!--breachAlert-->

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

@ -1,12 +1,12 @@
{{#loop 1 4 1}}
{{#each (getPasswordTips 4)}}
<tr class="email-wtd-step">
<td class="email-pwt-image" valign="top" style="width: 80px; padding-top: 10px;">
<img src="{{ ../SERVER_URL }}/img/password_tip_icons/password-tip-{{ this }}.png" alt="" width="60" style="width: 60px;" />
<img src="{{ ../SERVER_URL }}/img/password_tip_icons/password-tip-{{ idx }}.png" alt="" width="60" style="width: 60px;" />
</td>
<td valign="top" style="padding-top: 10px;">
<p class="body-copy" style="color: #333333; font-weight: 500; font-size: 16px; padding: 0px; margin: 0px; ">{{{getStringID "report-pwt-headline-" this}}}</p>
<p class="body-copy" style="color: #333333; font-weight: 300; font-size: 14px; padding: 3px 0px 10px 0px; margin-top: 0px; ">{{{getStringID "report-pwt-summary-" this}}}</p>
<td valign="top" style="padding-top: 10px; font-family: sans-serif;">
<p class="body-copy" style="color: #333333; font-weight: 500; font-size: 16px; padding: 0px; margin: 0px; ">{{ subhead }}</p>
<p class="body-copy" style="color: #333333; font-weight: 300; font-size: 14px; padding: 3px 0px 10px 0px; margin-top: 0px; ">{{ blurb }}</p>
</td>
</tr>
{{/loop}}
{{/each}}

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

@ -1,23 +1,25 @@
{{#getWhatToDos}}
<tr class="email-wtd">
<td colspan="2" valign="top" style="padding-top: 10px;">
<td colspan="2" valign="top" style="padding-top: 10px; font-family: sans-serif;">
<p class="body-copy email-sub-head" style="color: #333333; font-weight: 300; font-size: 22px; padding-top: 30px; margin: 0px; ">
{{getEmailString supportedLocales "what-to-do-next"}}
{{ headline }}
</p>
</td>
</tr>
{{!--
{{#loop 1 4 1 this}}
{{#each steps }}
<tr class="email-wtd">
<td valign="top" width="60" style="width: 60px; padding-top: 15px;">
<img width="45" src="{{ ../SERVER_URL }}/img/email_images/wtd-{{ this }}.png" alt="{{ this }}" />
<img width="45" src="{{ ../SERVER_URL }}/img/email_images/wtd-{{ idx }}.png" alt="{{ idx }}" />
</td>
<td valign="top" style="padding-top: 10px;">
<td valign="top" style="padding-top: 10px; font-family: sans-serif;">
<p class="body-copy medium" style="color: #333333; font-weight: 400; font-size: 16px; padding: 0px; margin: 0px; ">
{{getStringID ../supportedLocales "what-to-do-subhead-" this}}
{{ subhead }}
</p>
<p class="body-copy" style="color: #333333; font-weight: 300; font-size: 14px; padding: 3px 0px 10px 0px; margin-top: 0px; ">
{{getStringID ../supportedLocales "what-to-do-blurb-" this}}
{{ blurb }}
</p>
</td>
</tr>
{{/loop}} --}}
{{/each}}
{{/getWhatToDos}}