• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

mozilla / blurts-server / #11485

pending completion
#11485

push

circleci

web-flow
Merge pull request #2719 from mozilla/MNTOR-954

Mntor-954: fluent error

278 of 1063 branches covered (26.15%)

Branch coverage included in aggregate %.

4 of 4 new or added lines in 2 files covered. (100.0%)

948 of 2880 relevant lines covered (32.92%)

2.6 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/src/utils/breach-resolution.js
1
import { getMessage } from './fluent.js'
2

3
/**
4
 * Equivalent of Typescript "enum"
5
 * These enum types map to HIBP's breach data types, defined in HIBP's API
6
 * Always reference enum instead of strings to avoid spelling error / typos (ie. BreachDataTypes.Passwords)
7
 */
8
const BreachDataTypes = {
×
9
  Passwords: 'passwords',
10
  Email: 'email-addresses',
11
  SSN: 'social-security-numbers',
12
  CreditCard: 'partial-credit-card-data',
13
  BankAccount: 'bank-account-numbers',
14
  PIN: 'pins',
15
  IP: 'ip-addresses',
16
  Address: 'physical-addresses',
17
  DoB: 'dates-of-birth',
18
  Phone: 'phone-numbers',
19
  SecurityQuestions: 'security-questions-and-answers',
20
  HistoricalPasswords: 'historical-passwords',
21
  General: 'general'
22
}
23

24
/**
25
 * TODO: Map from google doc: https://docs.google.com/document/d/1KoItFsTYVIBInIG2YmA7wSxkKS4vti_X0A0td_yaHVM/edit#
26
 * Hardcoded map of breach resolution data types
27
 */
28
const breachResolutionDataTypes = {
×
29
  [BreachDataTypes.Passwords]: {
30
    priority: 1,
31
    header: 'breach-checklist-pw-header',
32
    body: 'breach-checklist-pw-body'
33
  },
34
  [BreachDataTypes.Email]: {
35
    priority: 2,
36
    header: 'breach-checklist-email-header',
37
    body: 'breach-checklist-email-body'
38
  },
39
  [BreachDataTypes.SSN]: {
40
    priority: 3,
41
    header: 'breach-checklist-ssn-header',
42
    body: 'breach-checklist-ssn-body'
43
  },
44
  [BreachDataTypes.CreditCard]: {
45
    priority: 4,
46
    header: 'breach-checklist-cc-header',
47
    body: 'breach-checklist-cc-body'
48
  },
49
  [BreachDataTypes.BankAccount]: {
50
    priority: 5,
51
    header: 'breach-checklist-bank-header',
52
    body: 'breach-checklist-bank-body'
53
  },
54
  [BreachDataTypes.PIN]: {
55
    priority: 6,
56
    header: 'breach-checklist-pin-header',
57
    body: 'breach-checklist-pin-body'
58
  },
59
  [BreachDataTypes.IP]: {
60
    priority: 7,
61
    header: 'breach-checklist-ip-header',
62
    body: 'breach-checklist-ip-body'
63
  },
64
  [BreachDataTypes.Address]: {
65
    priority: 8,
66
    header: 'breach-checklist-address-header',
67
    body: 'breach-checklist-address-body'
68
  },
69
  [BreachDataTypes.DoB]: {
70
    priority: 9,
71
    header: 'breach-checklist-dob-header',
72
    body: 'breach-checklist-dob-body'
73
  },
74
  [BreachDataTypes.Phone]: {
75
    priority: 10,
76
    header: 'breach-checklist-phone-header'
77
  },
78
  [BreachDataTypes.SecurityQuestions]: {
79
    priority: 11,
80
    header: 'breach-checklist-sq-header',
81
    body: 'breach-checklist-sq-body'
82
  },
83
  [BreachDataTypes.HistoricalPasswords]: {
84
    priority: 12,
85
    header: 'breach-checklist-hp-header',
86
    body: 'breach-checklist-hp-body'
87
  },
88
  [BreachDataTypes.General]: {
89
    priority: 13,
90
    header: 'breach-checklist-general-header'
91
  }
92
}
93

94
/**
95
 * Append a field "breachChecklist" to the breaches array of each verified emails
96
 * The checklist serves the UI with relevant recommendations based on the array of datatypes leaked during a breach.
97
 * @param {Array} userBreachData contains monitored verified emails array. Each email may contain a breaches array
98
 * @returns {*} void
99
 */
100
function appendBreachResolutionChecklist (userBreachData) {
101
  const { verifiedEmails } = userBreachData
×
102
  for (const { breaches } of verifiedEmails) {
×
103
    breaches.forEach(b => {
×
104
      const dataClasses = b.DataClasses
×
105
      const args = {
×
106
        companyName: b.Name,
107
        breachedCompanyUrl: `https://${b.Domain}`
108
      }
109
      b.breachChecklist = getResolutionRecsPerBreach(dataClasses, args)
×
110
    })
111
  }
112
}
113

114
/**
115
 * Get a subset of the breach resolution data types map
116
 * based on the array of datatypes leaked during a breach
117
 * @param {Array} dataTypes datatypes leaked during the breach
118
 * @param {Object} args contains necessary variables for the fluent file
119
 *  - companyName
120
 *  - breachedCompanyUrl
121
 * @returns {Map} map of relevant breach resolution recommendations
122
 */
123
function getResolutionRecsPerBreach (dataTypes, args) {
124
  const filteredBreachRecs = {}
×
125

126
  // if datatypes is empty or null, return general only.
127
  if (!dataTypes?.length) dataTypes = [BreachDataTypes.General]
×
128

129
  // filter breachResolutionDataTypes based on relevant data types passed in
130
  for (const [key, value] of Object.entries(breachResolutionDataTypes)) {
×
131
    if (dataTypes.includes(key)) {
×
132
      // find fluent text based on fluent ids
133
      let { header, body, priority } = value
×
134
      header = header ? getMessage(header, args) : ''
×
135
      body = body ? getMessage(body, args) : ''
×
136
      filteredBreachRecs[key] = { header, body, priority }
×
137
    }
138
  }
139

140
  // loop through the breach recs
141
  return filteredBreachRecs
×
142
}
143

144
/**
145
 * Take breach DataTypes array from HIBP and filter based on BreachDataTypes enums above
146
 * @param {array} originalDataTypes breach DataTypes array from HIBP
147
 * @returns {array} filtered breach data types
148
 */
149
function filterBreachDataTypes (originalDataTypes) {
150
  const relevantDataTypes = Object.values(BreachDataTypes)
×
151
  return originalDataTypes.filter(d => relevantDataTypes.includes(d))
×
152
}
153

154
export { BreachDataTypes, appendBreachResolutionChecklist, filterBreachDataTypes }
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc