Firefox Monitor arms you with tools to keep your personal information safe. Find out what hackers already know about you and learn how to stay a step ahead of them.
Перейти к файлу
Amri Toufali d3d6d6f47b
add workspace to switch between v1/v2
2022-10-10 12:45:47 -07:00
.circleci Update to node 16.17.x 2022-09-22 16:01:22 -05:00
.github Create dependabot.yml 2022-08-31 11:16:00 -05:00
__mocks__ add ESLint auto-fixable changes (quotes, semi...) 2022-05-10 16:40:26 -07:00
controllers Merge branch 'main' into MNTOR-806/update-existing-emails 2022-10-05 20:56:01 -07:00
db delete pre-fxa and other obsolete code 2022-09-14 23:08:22 -07:00
dist update folder structure 2022-10-07 15:14:18 -07:00
docs remove protocol design system 2022-05-26 10:50:39 -07:00
lib add ESLint auto-fixable changes (quotes, semi...) 2022-05-10 16:40:26 -07:00
locales Merge pull request #2665 from mozilla/main 2022-10-06 10:24:12 -07:00
public Add breach logos (#2667) 2022-10-07 09:43:28 -07:00
routes add CSP object directive for email-l10n route 2022-10-03 20:56:12 -07:00
scripts Merge branch 'main' into MNTOR-806/update-existing-emails 2022-10-05 20:56:01 -07:00
src add workspace to switch between v1/v2 2022-10-10 12:45:47 -07:00
template-helpers HTML-escape breached email 2022-10-05 20:53:14 -07:00
tests add tests for second HIBP fluentFormatCall 2022-10-04 20:44:14 -07:00
views fix email template duplicate header logo 2022-10-06 11:20:56 -07:00
.dockerignore Removes version.json from the .dockerignore file. 2018-06-08 16:21:54 -04:00
.env-dist Merge branch 'main' into MNTOR-792/main-template 2022-10-07 15:22:17 -07:00
.eslintignore update paths and remove obsolete code 2022-05-28 16:06:05 -07:00
.eslintrc.json change ESLint "new-cap" to warning 2022-05-10 22:15:35 -07:00
.git-blame-ignore-revs update git-blame-ignore-revs 2022-06-15 22:44:20 -07:00
.gitignore remove protocol design system 2022-05-26 10:50:39 -07:00
.htmllintrc Add attr-bans to .htmllintrc 2018-03-08 11:22:13 -06:00
.npmignore fix #24: add Travis and Coveralls 2018-02-09 07:37:47 -06:00
.npmrc add npmrc to strictly enforce node engine before install 2020-11-05 15:53:26 -06:00
.stylelintrc update Stylelint config 2022-06-15 22:39:57 -07:00
CODE_OF_CONDUCT.md Add Mozilla Code of Conduct file 2019-03-30 00:10:15 -07:00
Dockerfile Bump node from 16.17.0-alpine to 16.17.1-alpine 2022-10-03 11:38:44 +00:00
LICENSE Add LICENSE file and update package.json license 2018-06-07 14:49:16 -07:00
Procfile Migrate the database on deploy 2022-08-23 10:28:18 -05:00
README.md add workspace to switch between v1/v2 2022-10-10 12:45:47 -07:00
app-constants.js Test monthly email script, add limit 2022-09-12 09:35:15 -05:00
email-utils.js refactor email-l10n preview 2022-09-14 23:19:08 -07:00
esbuild.js update esbuild, js and css files 2022-05-28 15:25:47 -07:00
hibp.js remove noisy logs 2022-06-01 21:34:15 -07:00
ip-location-service.js add ESLint auto-fixable changes (quotes, semi...) 2022-05-10 16:40:26 -07:00
l10n.toml Update l10n linter to moz-l10n-lint 2019-05-09 15:20:06 -07:00
locale-utils.js fix locale-utils unsupported lang uncaught err 2022-08-26 09:40:25 -07:00
log.js add ESLint auto-fixable changes (quotes, semi...) 2022-05-10 16:40:26 -07:00
middleware.js Merge branch 'main' into MNTOR-697/monthly-email 2022-08-28 16:29:30 -07:00
package-lock.json add workspace to switch between v1/v2 2022-10-10 12:45:47 -07:00
package.json add workspace to switch between v1/v2 2022-10-10 12:45:47 -07:00
scan-results.js add cron and breach stats lookup/update 2022-08-21 23:02:37 -07:00
server.js chore: style lint 2022-10-04 10:51:57 -07:00
sha1-utils.js add ESLint auto-fixable changes (quotes, semi...) 2022-05-10 16:40:26 -07:00

README.md

Firefox Monitor Server

Summary

Firefox Monitor notifies users when their credentials have been compromised in a data breach.

This code is for the monitor.firefox.com service & website.

Breach data is powered by haveibeenpwned.com.

See the Have I Been Pwned about page for the "what" and "why" of data breach alerts.

Architecture

Image of Monitor architecture

Development

Requirements

Code style

Linting and formatting is enforced via ESLint and Stylelint for JS and CSS. Both are installed as dev-dependencies and can be run with npm run lint. A push to origin will also trigger linting.

ESLint rules are based on eslint-config-standard. To fix all auto-fixable problems, run npx eslint . --fix

Stylelint rules are based on stylelint-config-standard. To fix all auto-fixable problems, run npx stylelint public/css/ --fix

To run linting/formatting as you type or upon save, add the ESLint and Stylelint extensions and configure both to be the default formatter. For VS Code, you may want to add properties to your personal settings.json file, similar to:

"[javascript]": {
   "editor.defaultFormatter": "dbaeumer.vscode-eslint",
   "editor.codeActionsOnSave": {
      "source.fixAll.eslint": true
   }
},
"[css]": {
   "editor.defaultFormatter": "stylelint.vscode-stylelint",
   "editor.codeActionsOnSave": {
      "source.fixAll.stylelint": true
   }
}

See here for more on Stylelint config with VSCode: https://github.com/stylelint/vscode-stylelint#editorcodeactionsonsave

Install

  1. Clone and change to the directory:

    git clone https://github.com/mozilla/blurts-server.git
    cd blurts-server
    
  2. Install dependencies:

    npm install
    
  3. Copy the .env-dist file to .env:

    cp .env-dist .env
    

Run

  1. Run the server:

    npm start
    

Note: You might run the server using npm run dev instead, which uses nodemon to detect file changes, re-compile static assets, and restart the express process.

  1. Navigate to localhost:6060/

Database

To create the database tables ...

  1. Create the blurts database:

    createdb blurts
    createdb test-blurts # for tests
    
  2. Update the DATABASE_URL value in your .env file with your local db credentials:

    DATABASE_URL="postgres://<username>:<password>@localhost:<port>/blurts"
    
  3. Run the migrations:

    npm run db:migrate
    

Trigger Breach Alert Email

Breach alert emails are triggered via HIBP. For dev purposes, we can trigger them ourselves to send to a Mailinator email address.

To set up your environment for email testing with Mailinator:

  1. In your .env file, confirm or add values for SMTP_URL, EMAIL_FROM, HIBP_KANON_API_TOKEN, and HIBP_API_TOKEN (Ask for values in #fx-monitor-engineering)

  2. If you don't have a local FxA account, sign up on localhost. You'll need to ensure FXA_ENABLED=true and confirm/add the value for OAUTH_CLIENT_SECRET in your .env file. (Ask in #fx-monitor-engineering)

  3. Start/restart your server

  4. Login to your Monitor account at http://localhost:6060/, and scroll to the bottom of your dashboard to add localmonitor20200827@mailinator.com to your list of monitored email addresses

  5. In your Monitor settings, make sure notification preferences specify "Send breach alerts to the affected email address" (should be default). This will send the alert to the Mailinator account.

    You could set it to forward to your main email address/account (e.g. Gmail), but localhost images will be broken. The Mailinator account displays existing images automagically.

  6. To trigger a breach alert email, you need to make a POST /hibp/notify request:

    • Authorization: Bearer header token value that matches HIBP_NOTIFY_TOKEN
    • Content-Type: application/json header
    • JSON body with breachName, hashPrefix, and hashSuffix values
      • breachName - string of a breach name in Monitor
      • hashPrefix - string of first 6 chars of a subscriber's primary_sha1
      • hashSuffix - array of strings of the remaining chars of the sha1 hash

    e.g., a localhost curl command that triggers a breach alert email for the Adobe breach to the localmonitor20200827@mailinator.com subscriber:

    curl -v -H "Authorization: Bearer unsafe-default-token-for-dev" -H "Content-Type: application/json" -d '{"breachName": "Adobe", "hashPrefix": "365050", "hashSuffixes": ["53cbb89874fc738c0512daf12bc4d91765"]}' http://localhost:6060/hibp/notify
    
  7. Visit https://www.mailinator.com/v4/public/inboxes.jsp?to=localmonitor20200827# to view the email

Firefox Accounts

Subscribe with a Firefox Account is controlled via the FXA_ENABLED environment variable. (See .env-dist)

The repo comes with a development FxA oauth app pre-configured in .env, which should work fine running the app on http://localhost:6060. You'll need to get the OAUTH_CLIENT_SECRET value from someone in #fxmonitor-engineering.

Testing

The full test suite can be run via npm test.

At the beginning of a test suite run, the test-blurts database will be populated with test tables and seed data found in db/seeds/

At the end of a test suite run, coverage info will be sent to Coveralls to assess coverage changes and provide a neat badge. For this step to complete locally, you need a root .coveralls.yml which contains a token – get this from another member of the Monitor team. Alternatively, without the token you can simply ignore the coveralls error.

TODO: Disable Coveralls step for local testing?

Individual tests

To run individual tests, use NODE_ENV=tests and jest:

NODE_ENV=tests jest --runInBand tests/home.test.js

To run tests with interactive debugger lines enabled:

NODE_ENV=tests node inspect --harmony ./node_modules/.bin/jest tests/home.test.js

Test Firefox Integration

Firefox's internal about:protections page ("Protections Dashboard") fetches and displays breach stats for Firefox users who are signed into their FXA.

To test this part of Monitor:

  1. Set a Firefox profile to use the staging Firefox Accounts server.
  2. In the same profile, go to about:config and replace all https://monitor.firefox.com values with http://localhost:6060
  3. Restart Firefox with that profile.
  4. Go to about:protections
  5. Everything should be using your localhost instance of Monitor.

Lint

After installing the dependencies, you can lint the code by calling:

npm run lint

Localization

This repo includes a dedicated branch for localization called... localization. To add localized text, add or update the relevant .ftl file under locales/en. Be sure to reference the localization documentation for best practices.

To trigger translations, open a pull request against localization. Please be mindful that Mozilla localizers are volunteers, and translations come from different locales at different times – usually after a week or more. It's best to initiate a PR when your strings are more-or-less final. Your PR should be automatically tagged with a reviewer from the Mozilla L10n team to approve your request.

After your updates are merged into localization, you will start to see commits from Pontoon, Mozilla's localization platform. You can also check translation status via the Pontoon site.

When enough translations have been commited, you should merge localization into main, or back into your feature branch if it's not yet merged to main. Note it's unlikely to have 100% of locales translated. You might discuss with stakeholders which locales are priority.

Important: Do not use "Squash" or "Rebase" to merge localization into main or vice versa. Doing so creates new commit hashes and the branches will appear out of sync.

TODO: auto-sync localization with main

Deployment

Firefox Monitor Breach Alerts is designed with 12-factor methodology.

Deploy on Heroku

We use Heroku apps for dev review only – official stage and production apps are built by the Dockerfile and CircleCI config, with deploy overseen by the Site Reliability Engineering team.

Deploys from the main branch to Heroku are automatic. We also employ Heroku's "Review Apps" to check Pull Requests. These are currently set to auto-deploy: you can find the app link in your GitHub Pull Request. Review apps auto-destroy after 2 days of inactivity.

If you encounter issues with Heroku deploys, be sure to check your environment variables, including those required in app-constants.js. Review apps also share a database and you should not assume good data integrity if testing db-related features.

VPN Banner

A banner has been added to inform users whether their IP address is being masked by Mozilla VPN. It also uses their IP address to demonstrate geolocation. This can inform users why they might use Mozilla VPN for privacy.

The IP location data includes GeoLite2 data created by MaxMind, available from https://www.maxmind.com. For localhost, a test MaxMind database with limited data is included with this repo. For the Heroku Dev site, the following buildpack is used to enable geolocation: https://github.com/HiMamaInc/heroku-buildpack-geoip-geolite2. For stage and prod environments, a shared database is set via env vars.