@connextar/house 0.11.0 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/README.md +581 -19
  2. package/dist/auth/index.d.ts +3 -1
  3. package/dist/auth/index.d.ts.map +1 -1
  4. package/dist/auth/index.js +3 -1
  5. package/dist/auth/index.js.map +1 -1
  6. package/dist/auth/second-factor-index.d.ts +7 -0
  7. package/dist/auth/second-factor-index.d.ts.map +1 -0
  8. package/dist/auth/second-factor-index.js +7 -0
  9. package/dist/auth/second-factor-index.js.map +1 -0
  10. package/dist/auth/second-factor-next.d.ts +39 -0
  11. package/dist/auth/second-factor-next.d.ts.map +1 -0
  12. package/dist/auth/second-factor-next.js +131 -0
  13. package/dist/auth/second-factor-next.js.map +1 -0
  14. package/dist/auth/second-factor-routes.d.ts +29 -0
  15. package/dist/auth/second-factor-routes.d.ts.map +1 -0
  16. package/dist/auth/second-factor-routes.js +35 -0
  17. package/dist/auth/second-factor-routes.js.map +1 -0
  18. package/dist/auth/second-factor.d.ts +117 -0
  19. package/dist/auth/second-factor.d.ts.map +1 -0
  20. package/dist/auth/second-factor.js +127 -0
  21. package/dist/auth/second-factor.js.map +1 -0
  22. package/dist/auth/two-factor-policy.d.ts +30 -1
  23. package/dist/auth/two-factor-policy.d.ts.map +1 -1
  24. package/dist/auth/two-factor-policy.js +39 -1
  25. package/dist/auth/two-factor-policy.js.map +1 -1
  26. package/dist/jobs/health.d.ts +17 -4
  27. package/dist/jobs/health.d.ts.map +1 -1
  28. package/dist/jobs/health.js +10 -7
  29. package/dist/jobs/health.js.map +1 -1
  30. package/dist/jobs/index.d.ts +4 -3
  31. package/dist/jobs/index.d.ts.map +1 -1
  32. package/dist/jobs/index.js +3 -2
  33. package/dist/jobs/index.js.map +1 -1
  34. package/dist/jobs/job-health-list.d.ts +15 -3
  35. package/dist/jobs/job-health-list.d.ts.map +1 -1
  36. package/dist/jobs/job-health-list.js +11 -7
  37. package/dist/jobs/job-health-list.js.map +1 -1
  38. package/dist/jobs/prune.d.ts +45 -0
  39. package/dist/jobs/prune.d.ts.map +1 -0
  40. package/dist/jobs/prune.js +58 -0
  41. package/dist/jobs/prune.js.map +1 -0
  42. package/dist/jobs/registry.d.ts +19 -4
  43. package/dist/jobs/registry.d.ts.map +1 -1
  44. package/dist/jobs/registry.js +16 -1
  45. package/dist/jobs/registry.js.map +1 -1
  46. package/dist/jobs/scheduler.d.ts +12 -1
  47. package/dist/jobs/scheduler.d.ts.map +1 -1
  48. package/dist/jobs/scheduler.js +24 -9
  49. package/dist/jobs/scheduler.js.map +1 -1
  50. package/dist/jobs/store.d.ts +26 -1
  51. package/dist/jobs/store.d.ts.map +1 -1
  52. package/dist/jobs/store.js +35 -4
  53. package/dist/jobs/store.js.map +1 -1
  54. package/dist/password/common.d.ts +2 -0
  55. package/dist/password/common.d.ts.map +1 -0
  56. package/dist/password/common.js +58 -0
  57. package/dist/password/common.js.map +1 -0
  58. package/dist/password/estimate-index.d.ts +10 -0
  59. package/dist/password/estimate-index.d.ts.map +1 -0
  60. package/dist/password/estimate-index.js +10 -0
  61. package/dist/password/estimate-index.js.map +1 -0
  62. package/dist/password/estimate.d.ts +65 -0
  63. package/dist/password/estimate.d.ts.map +1 -0
  64. package/dist/password/estimate.js +612 -0
  65. package/dist/password/estimate.js.map +1 -0
  66. package/dist/password/index.d.ts +22 -0
  67. package/dist/password/index.d.ts.map +1 -0
  68. package/dist/password/index.js +22 -0
  69. package/dist/password/index.js.map +1 -0
  70. package/dist/password/password-input.d.ts +55 -0
  71. package/dist/password/password-input.d.ts.map +1 -0
  72. package/dist/password/password-input.js +54 -0
  73. package/dist/password/password-input.js.map +1 -0
  74. package/dist/password/password-strength.d.ts +59 -0
  75. package/dist/password/password-strength.d.ts.map +1 -0
  76. package/dist/password/password-strength.js +74 -0
  77. package/dist/password/password-strength.js.map +1 -0
  78. package/dist/password/reveal.d.ts +56 -0
  79. package/dist/password/reveal.d.ts.map +1 -0
  80. package/dist/password/reveal.js +109 -0
  81. package/dist/password/reveal.js.map +1 -0
  82. package/package.json +19 -1
@@ -0,0 +1,612 @@
1
+ /**
2
+ * How long a password would take to guess, as a score from 0 to 4 and one plain
3
+ * sentence — the same answer in the browser and on the server.
4
+ *
5
+ * This is zxcvbn's method, written small. A password is read as the cheapest
6
+ * sequence of patterns an attacker's cracker would try — a common word, a word
7
+ * from the person's own name or email, a keyboard walk, a sequence, a repeat, a
8
+ * date or year, and plain characters for whatever is left — and its strength is
9
+ * the number of guesses that sequence costs. Counting character classes, which
10
+ * is what most meters do, is exactly wrong: it rates "Password1!" as strong
11
+ * because it has one of everything, when it is the first thing any list tries.
12
+ *
13
+ * What is left out of the full zxcvbn is its frequency lists (most of its several
14
+ * hundred kilobytes). The dictionary here is the head of the leaked-password
15
+ * lists and the words those passwords are built from, so an unusual word scores
16
+ * as unusual characters and the estimate errs a little generous on rare
17
+ * vocabulary — never on the patterns people actually lean on.
18
+ *
19
+ * Pure and dependency-free: no React, no DOM, safe to import in a route handler.
20
+ * It never decides whether a password is allowed. That is the app's rule (a
21
+ * minimum length, a server check that refuses a score below 2); this only says
22
+ * how guessable it is.
23
+ */
24
+ import { COMMON_WORDS } from "./common.js";
25
+ export const PASSWORD_STRENGTH_MESSAGES = {
26
+ labels: ["Very weak", "Weak", "Fair", "Strong", "Very strong"],
27
+ weakness: {
28
+ "user-input": "It contains your name or email address, which is the first thing anyone would try.",
29
+ common: "This is one of the most commonly used passwords, so it would be guessed almost at once.",
30
+ "common-decorated": "A common word with capitals, numbers or symbols added is still easy to guess — try a few unrelated words instead.",
31
+ keyboard: "Keys next to each other on the keyboard are easy to guess — try a few unrelated words instead.",
32
+ repeat: "Repeated characters and patterns are easy to guess — try a few unrelated words instead.",
33
+ sequence: "Sequences like abc or 1234 are easy to guess — try a few unrelated words instead.",
34
+ date: "Dates and years are easy to guess, especially ones connected to you.",
35
+ short: "Short passwords are quick to guess — a longer one of three or four unrelated words is stronger.",
36
+ },
37
+ weak: "This would be easy to guess — a few unrelated words together are longer and easier to remember.",
38
+ fair: "This would take some effort to guess — another word or two would make it much stronger.",
39
+ strong: "This would be hard to guess.",
40
+ veryStrong: "This would be very hard to guess.",
41
+ tooShort: (minLength) => `Use at least ${minLength} characters.`,
42
+ };
43
+ /**
44
+ * Only the first 100 characters are analysed. Past that the estimate is already
45
+ * as high as it goes for anything but a repeat, and the search is cubic in
46
+ * length, so a pasted essay must not stall a keystroke.
47
+ */
48
+ export const MAX_ANALYSED_LENGTH = 100;
49
+ /** Score boundaries in guesses, zxcvbn's: 10³, 10⁶, 10⁸, 10¹⁰. */
50
+ const THRESHOLDS = [3, 6, 8, 10].map((exponent) => Math.log10(10 ** exponent + 5));
51
+ /** A sequence of k patterns costs k! orderings, plus this per extra pattern. */
52
+ const GROWING_SEQUENCE_LOG = 4;
53
+ /** Guesses for a given year's distance from now, never fewer than 20 years' worth. */
54
+ const MIN_YEAR_SPACE = 20;
55
+ const COMMON = new Map(COMMON_WORDS.map((word, index) => [word, index + 1]));
56
+ function userDictionary(inputs) {
57
+ const ranked = new Map();
58
+ const add = (word) => {
59
+ if (word.length >= 3 && !ranked.has(word))
60
+ ranked.set(word, ranked.size + 1);
61
+ };
62
+ for (const input of inputs) {
63
+ if (!input)
64
+ continue;
65
+ const lower = input.toLowerCase().trim();
66
+ const parts = lower.split(/[^\p{L}\p{N}]+/u).filter(Boolean);
67
+ add(lower);
68
+ add(parts.join(""));
69
+ for (const part of parts)
70
+ add(part);
71
+ }
72
+ return ranked;
73
+ }
74
+ const SEPARATORS = " -_.,";
75
+ const L33T = {
76
+ "4": ["a"],
77
+ "@": ["a"],
78
+ "8": ["b"],
79
+ "(": ["c"],
80
+ "{": ["c"],
81
+ "[": ["c"],
82
+ "<": ["c"],
83
+ "3": ["e"],
84
+ "6": ["g"],
85
+ "9": ["g"],
86
+ "1": ["i", "l"],
87
+ "!": ["i"],
88
+ "|": ["i", "l"],
89
+ "7": ["t", "l"],
90
+ "0": ["o"],
91
+ $: ["s"],
92
+ "5": ["s"],
93
+ "+": ["t"],
94
+ "%": ["x"],
95
+ "2": ["z"],
96
+ };
97
+ // ── Small arithmetic ───────────────────────────────────────────────────────────
98
+ function nCk(n, k) {
99
+ if (k > n)
100
+ return 0;
101
+ let result = 1;
102
+ for (let d = 1; d <= k; d++)
103
+ result = (result * (n - k + d)) / d;
104
+ return result;
105
+ }
106
+ const log10Factorial = (n) => {
107
+ let sum = 0;
108
+ for (let k = 2; k <= n; k++)
109
+ sum += Math.log10(k);
110
+ return sum;
111
+ };
112
+ /** log10(10^a + 10^b) without leaving log space. */
113
+ function logAdd(a, b) {
114
+ const high = Math.max(a, b);
115
+ const low = Math.min(a, b);
116
+ return high + Math.log10(1 + 10 ** (low - high));
117
+ }
118
+ /** How many ways the capitals could have been placed: "Password" ×2, "pAssWord" more. */
119
+ function uppercaseVariations(token) {
120
+ if (!/[A-Z]/.test(token) || token.toLowerCase() === token)
121
+ return 1;
122
+ if (/^[A-Z][^A-Z]+$/.test(token) || /^[^A-Z]+[A-Z]$/.test(token) || !/[a-z]/.test(token))
123
+ return 2;
124
+ const upper = token.replace(/[^A-Z]/g, "").length;
125
+ const lower = token.replace(/[^a-z]/g, "").length;
126
+ let variations = 0;
127
+ for (let k = 1; k <= Math.min(upper, lower); k++)
128
+ variations += nCk(upper + lower, k);
129
+ return variations;
130
+ }
131
+ function l33tVariations(token, decoded) {
132
+ let variations = 1;
133
+ const subbed = new Map();
134
+ for (let k = 0; k < token.length; k++) {
135
+ const from = token[k] ?? "";
136
+ const to = decoded[k] ?? "";
137
+ if (from.toLowerCase() !== to)
138
+ subbed.set(from, to);
139
+ }
140
+ for (const [from, to] of subbed) {
141
+ const s = [...token].filter((c) => c === from).length;
142
+ const u = [...token].filter((c) => c.toLowerCase() === to).length;
143
+ if (u === 0)
144
+ variations *= 2;
145
+ else {
146
+ let possibilities = 0;
147
+ for (let k = 1; k <= Math.min(s, u); k++)
148
+ possibilities += nCk(s + u, k);
149
+ variations *= possibilities;
150
+ }
151
+ }
152
+ return variations;
153
+ }
154
+ // ── Matchers ───────────────────────────────────────────────────────────────────
155
+ /** Every de-l33ted reading of the password, ambiguous characters tried both ways. */
156
+ function l33tReadings(lower) {
157
+ const ambiguous = [...new Set([...lower].filter((c) => (L33T[c]?.length ?? 0) > 1))];
158
+ let choices = [{}];
159
+ for (const c of ambiguous) {
160
+ choices = choices.flatMap((choice) => (L33T[c] ?? []).map((letter) => ({ ...choice, [c]: letter })));
161
+ }
162
+ const readings = choices.map((choice) => [...lower].map((c) => choice[c] ?? (L33T[c]?.length === 1 ? L33T[c][0] : c)).join(""));
163
+ return [...new Set(readings)].filter((reading) => reading !== lower);
164
+ }
165
+ function dictionaryMatches(password, dictionaries) {
166
+ const matches = [];
167
+ const lower = password.toLowerCase();
168
+ const n = password.length;
169
+ const readings = l33tReadings(lower);
170
+ for (const { words, fromUser } of dictionaries) {
171
+ if (words.size === 0)
172
+ continue;
173
+ let longest = 0;
174
+ for (const word of words.keys())
175
+ longest = Math.max(longest, word.length);
176
+ for (let i = 0; i < n; i++) {
177
+ for (let j = i + 2; j < Math.min(n, i + longest); j++) {
178
+ const token = password.slice(i, j + 1);
179
+ const word = lower.slice(i, j + 1);
180
+ const push = (rank, factor) => matches.push({
181
+ i,
182
+ j,
183
+ pattern: "dictionary",
184
+ guessesLog: Math.log10(rank * factor * uppercaseVariations(token)),
185
+ fromUser,
186
+ });
187
+ const rank = words.get(word);
188
+ if (rank !== undefined) {
189
+ push(rank, 1);
190
+ // "correct-horse", "amir.connextar": a separator after a word is one of a handful, not a new piece.
191
+ const next = password[j + 1];
192
+ if (next !== undefined && SEPARATORS.includes(next)) {
193
+ matches.push({
194
+ ...matches[matches.length - 1],
195
+ j: j + 1,
196
+ guessesLog: matches[matches.length - 1].guessesLog + Math.log10(SEPARATORS.length),
197
+ });
198
+ }
199
+ }
200
+ const reversed = [...word].reverse().join("");
201
+ const reversedRank = reversed === word ? undefined : words.get(reversed);
202
+ if (reversedRank !== undefined)
203
+ push(reversedRank, 2);
204
+ for (const reading of readings) {
205
+ const decoded = reading.slice(i, j + 1);
206
+ if (decoded === word)
207
+ continue;
208
+ const l33tRank = words.get(decoded);
209
+ if (l33tRank !== undefined)
210
+ push(l33tRank, l33tVariations(token, decoded));
211
+ }
212
+ }
213
+ }
214
+ }
215
+ return matches;
216
+ }
217
+ function slantedKeyboard(unshifted, shifted) {
218
+ const keys = new Map();
219
+ const neighbours = new Map();
220
+ const at = (r, c) => unshifted[r]?.[c];
221
+ unshifted.forEach((row, r) => {
222
+ [...row].forEach((key, c) => {
223
+ keys.set(key, [key, false]);
224
+ const upper = shifted[r]?.[c];
225
+ if (upper && upper !== key)
226
+ keys.set(upper, [key, true]);
227
+ // Each row sits half a key to the right of the one above it.
228
+ neighbours.set(key, [at(r, c - 1), at(r, c + 1), at(r - 1, c), at(r - 1, c + 1), at(r + 1, c - 1), at(r + 1, c)]);
229
+ });
230
+ });
231
+ return finish(keys, neighbours);
232
+ }
233
+ function alignedKeypad(rows) {
234
+ const keys = new Map();
235
+ const neighbours = new Map();
236
+ const at = (r, c) => {
237
+ const key = rows[r]?.[c];
238
+ return key && key !== " " ? key : undefined;
239
+ };
240
+ rows.forEach((row, r) => {
241
+ [...row].forEach((key, c) => {
242
+ if (key === " ")
243
+ return;
244
+ keys.set(key, [key, false]);
245
+ const around = [];
246
+ for (const dr of [-1, 0, 1])
247
+ for (const dc of [-1, 0, 1])
248
+ if (dr || dc)
249
+ around.push(at(r + dr, c + dc));
250
+ neighbours.set(key, around);
251
+ });
252
+ });
253
+ return finish(keys, neighbours);
254
+ }
255
+ function finish(keys, neighbours) {
256
+ let degrees = 0;
257
+ for (const around of neighbours.values())
258
+ degrees += around.filter(Boolean).length;
259
+ return { keys, neighbours, startingPositions: keys.size, averageDegree: degrees / neighbours.size };
260
+ }
261
+ const GRAPHS = [
262
+ slantedKeyboard(["`1234567890-=", "qwertyuiop[]\\", "asdfghjkl;'", "zxcvbnm,./"], ["~!@#$%^&*()_+", "QWERTYUIOP{}|", 'ASDFGHJKL:"', "ZXCVBNM<>?"]),
263
+ alignedKeypad(["789", "456", "123", " 0 "]),
264
+ ];
265
+ function spatialMatches(password) {
266
+ const matches = [];
267
+ const n = password.length;
268
+ for (const graph of GRAPHS) {
269
+ let i = 0;
270
+ while (i < n - 1) {
271
+ let j = i + 1;
272
+ let lastDirection = -1;
273
+ let turns = 0;
274
+ let shifted = graph.keys.get(password[i] ?? "")?.[1] ? 1 : 0;
275
+ while (j < n) {
276
+ const previous = graph.keys.get(password[j - 1] ?? "");
277
+ const current = graph.keys.get(password[j] ?? "");
278
+ const direction = previous && current ? (graph.neighbours.get(previous[0]) ?? []).indexOf(current[0]) : -1;
279
+ if (direction === -1)
280
+ break;
281
+ if (direction !== lastDirection) {
282
+ turns++;
283
+ lastDirection = direction;
284
+ }
285
+ if (current?.[1])
286
+ shifted++;
287
+ j++;
288
+ }
289
+ const length = j - i;
290
+ if (length >= 3) {
291
+ let guesses = 0;
292
+ for (let k = 2; k <= length; k++) {
293
+ for (let t = 1; t <= Math.min(turns, k - 1); t++) {
294
+ guesses += nCk(k - 1, t - 1) * graph.startingPositions * graph.averageDegree ** t;
295
+ }
296
+ }
297
+ const unshifted = length - shifted;
298
+ if (shifted > 0) {
299
+ if (unshifted === 0)
300
+ guesses *= 2;
301
+ else {
302
+ let variations = 0;
303
+ for (let k = 1; k <= Math.min(shifted, unshifted); k++)
304
+ variations += nCk(length, k);
305
+ guesses *= variations;
306
+ }
307
+ }
308
+ matches.push({ i, j: j - 1, pattern: "spatial", guessesLog: Math.log10(guesses) });
309
+ }
310
+ i = j;
311
+ }
312
+ }
313
+ return matches;
314
+ }
315
+ function characterClass(c) {
316
+ if (/[a-z]/.test(c))
317
+ return "lower";
318
+ if (/[A-Z]/.test(c))
319
+ return "upper";
320
+ if (/[0-9]/.test(c))
321
+ return "digit";
322
+ return null;
323
+ }
324
+ function sequenceMatches(password) {
325
+ const matches = [];
326
+ const n = password.length;
327
+ const code = (k) => password.charCodeAt(k);
328
+ let i = 0;
329
+ while (i < n - 1) {
330
+ const delta = code(i + 1) - code(i);
331
+ let j = i + 1;
332
+ while (j + 1 < n && code(j + 1) - code(j) === delta)
333
+ j++;
334
+ const token = password.slice(i, j + 1);
335
+ const kind = characterClass(token[0] ?? "");
336
+ const oneClass = kind !== null && [...token].every((c) => characterClass(c) === kind);
337
+ if (delta !== 0 && Math.abs(delta) <= 5 && token.length >= 3 && oneClass) {
338
+ const first = token[0] ?? "";
339
+ let base = "aAzZ019".includes(first) ? 4 : kind === "digit" ? 10 : 26;
340
+ if (delta < 0)
341
+ base *= 2;
342
+ matches.push({ i, j, pattern: "sequence", guessesLog: Math.log10(base * token.length) });
343
+ }
344
+ i = j;
345
+ }
346
+ return matches;
347
+ }
348
+ function repeatMatches(password, context) {
349
+ const matches = [];
350
+ const greedy = /(.+)\1+/gu;
351
+ const lazy = /(.+?)\1+/gu;
352
+ const lazyAnchored = /^(.+?)\1+$/u;
353
+ let last = 0;
354
+ while (last < password.length) {
355
+ greedy.lastIndex = last;
356
+ lazy.lastIndex = last;
357
+ const g = greedy.exec(password);
358
+ const l = lazy.exec(password);
359
+ if (!g || !l)
360
+ break;
361
+ const [match, base] = g[0].length > l[0].length ? [g, lazyAnchored.exec(g[0])?.[1] ?? g[1]] : [l, l[1]];
362
+ if (!base)
363
+ break;
364
+ const i = match.index;
365
+ const j = i + match[0].length - 1;
366
+ const baseGuessesLog = minimumGuessesLog(base, context).guessesLog;
367
+ matches.push({ i, j, pattern: "repeat", guessesLog: baseGuessesLog + Math.log10(match[0].length / base.length) });
368
+ last = j + 1;
369
+ }
370
+ return matches;
371
+ }
372
+ function yearSpaceLog(year, referenceYear) {
373
+ return Math.log10(Math.max(Math.abs(year - referenceYear), MIN_YEAR_SPACE));
374
+ }
375
+ function toFullYear(year, digits) {
376
+ if (digits === 4)
377
+ return year;
378
+ return year > 50 ? 1900 + year : 2000 + year;
379
+ }
380
+ const plausibleDay = (d, m) => m >= 1 && m <= 12 && d >= 1 && d <= 31;
381
+ function dateMatches(password, referenceYear) {
382
+ const matches = [];
383
+ const n = password.length;
384
+ for (let i = 0; i + 4 <= n; i++) {
385
+ const year = /^(19\d\d|20\d\d)/.exec(password.slice(i, i + 4));
386
+ if (year) {
387
+ matches.push({ i, j: i + 3, pattern: "date", guessesLog: yearSpaceLog(Number(year[1]), referenceYear) });
388
+ }
389
+ }
390
+ // With separators: 1/2/87, 01-02-1987, 1987.02.01
391
+ for (let i = 0; i < n; i++) {
392
+ for (let j = i + 5; j < Math.min(n, i + 10); j++) {
393
+ const token = password.slice(i, j + 1);
394
+ const parts = /^(\d{1,4})([\s/\\_.-])(\d{1,2})\2(\d{1,4})$/.exec(token);
395
+ if (!parts)
396
+ continue;
397
+ const [a = "", , b = "", c = ""] = parts.slice(1);
398
+ const readings = [
399
+ [Number(a), Number(b), c],
400
+ [Number(b), Number(a), c],
401
+ [Number(c), Number(b), a],
402
+ ];
403
+ for (const [day, month, yearText] of readings) {
404
+ if ((yearText.length === 2 || yearText.length === 4) && plausibleDay(day, month)) {
405
+ const year = toFullYear(Number(yearText), yearText.length);
406
+ matches.push({
407
+ i,
408
+ j,
409
+ pattern: "date",
410
+ guessesLog: Math.log10(365 * 4) + yearSpaceLog(year, referenceYear),
411
+ });
412
+ break;
413
+ }
414
+ }
415
+ }
416
+ }
417
+ // Without: 010287, 19870201
418
+ for (let i = 0; i < n; i++) {
419
+ for (const length of [6, 8]) {
420
+ const token = password.slice(i, i + length);
421
+ if (token.length !== length || !/^\d+$/.test(token))
422
+ continue;
423
+ const y = length - 4;
424
+ const splits = length === 6
425
+ ? [
426
+ [token.slice(0, 2), token.slice(2, 4), token.slice(4)],
427
+ [token.slice(2, 4), token.slice(0, 2), token.slice(4)],
428
+ [token.slice(4), token.slice(2, 4), token.slice(0, 2)],
429
+ ]
430
+ : [
431
+ [token.slice(0, 2), token.slice(2, 4), token.slice(4)],
432
+ [token.slice(2, 4), token.slice(0, 2), token.slice(4)],
433
+ [token.slice(6), token.slice(4, 6), token.slice(0, 4)],
434
+ ];
435
+ for (const [day, month, yearText] of splits) {
436
+ const fullYear = toFullYear(Number(yearText), yearText.length);
437
+ const recent = y === 4 ? fullYear >= 1900 && fullYear <= 2099 : true;
438
+ if (recent && plausibleDay(Number(day), Number(month))) {
439
+ matches.push({
440
+ i,
441
+ j: i + length - 1,
442
+ pattern: "date",
443
+ guessesLog: Math.log10(365) + yearSpaceLog(fullYear, referenceYear),
444
+ });
445
+ break;
446
+ }
447
+ }
448
+ }
449
+ }
450
+ return matches;
451
+ }
452
+ /** A match costs at least this many guesses unless it is the whole password. */
453
+ function boundedGuessesLog(match, passwordLength) {
454
+ const length = match.j - match.i + 1;
455
+ let floor = length === passwordLength ? 0 : length === 1 ? 1 : Math.log10(50);
456
+ if (match.pattern === "bruteforce")
457
+ floor = Math.max(floor, Math.log10(length === 1 ? 11 : 51));
458
+ return Math.max(match.guessesLog, floor);
459
+ }
460
+ /**
461
+ * Pieces an attacker's rules add for almost nothing, so they do not make the
462
+ * sequence any harder to structure: the person's own words, dates and years,
463
+ * and up to four digits or symbols tacked on to either end. Without this,
464
+ * "Summer2024!" and "amir-connextar-2026" earn zxcvbn's allowance for an
465
+ * unpredictable sequence of pieces, when "word, year, !" is the first mangling
466
+ * rule any cracker applies.
467
+ */
468
+ function isFree(match, passwordLength) {
469
+ if (match.fromUser || match.pattern === "date")
470
+ return true;
471
+ const atAnEnd = match.i === 0 || match.j === passwordLength - 1;
472
+ return atAnEnd && match.pattern !== "dictionary" && match.pattern !== "spatial" && match.j - match.i < 4;
473
+ }
474
+ /**
475
+ * The cheapest way to read `password` as a sequence of patterns, by dynamic
476
+ * programming over where each pattern ends and how many there are — zxcvbn's
477
+ * `most_guessable_match_sequence`.
478
+ */
479
+ function minimumGuessesLog(password, context) {
480
+ const n = password.length;
481
+ if (n === 0)
482
+ return { guessesLog: 0, sequence: [] };
483
+ const matches = [
484
+ ...dictionaryMatches(password, context.dictionaries),
485
+ ...spatialMatches(password),
486
+ ...sequenceMatches(password),
487
+ ...repeatMatches(password, context),
488
+ ...dateMatches(password, context.referenceYear),
489
+ ];
490
+ const endingAt = Array.from({ length: n }, () => []);
491
+ for (const match of matches)
492
+ endingAt[match.j]?.push(match);
493
+ // best[k].get(count) — the cheapest sequence of `count` matches covering 0..k.
494
+ const best = Array.from({ length: n }, () => new Map());
495
+ const consider = (match) => {
496
+ const guessesLog = boundedGuessesLog(match, n);
497
+ const target = best[match.j];
498
+ const added = isFree(match, n) ? 0 : 1;
499
+ const offer = (previousCount, productLog) => {
500
+ const count = previousCount + added;
501
+ const current = target.get(count);
502
+ if (!current || productLog < current.productLog)
503
+ target.set(count, { productLog, match, count, previousCount });
504
+ };
505
+ if (match.i === 0)
506
+ offer(0, guessesLog);
507
+ else {
508
+ for (const [count, step] of best[match.i - 1]) {
509
+ // Two plain-character runs side by side are one longer run, already considered.
510
+ if (match.pattern === "bruteforce" && step.match.pattern === "bruteforce")
511
+ continue;
512
+ offer(count, step.productLog + guessesLog);
513
+ }
514
+ }
515
+ };
516
+ for (let k = 0; k < n; k++) {
517
+ for (const match of endingAt[k])
518
+ consider(match);
519
+ for (let i = 0; i <= k; i++)
520
+ consider({ i, j: k, pattern: "bruteforce", guessesLog: k - i + 1 });
521
+ }
522
+ let chosen;
523
+ let chosenLog = Infinity;
524
+ for (const step of best[n - 1].values()) {
525
+ const total = step.count === 0
526
+ ? step.productLog
527
+ : logAdd(log10Factorial(step.count) + step.productLog, GROWING_SEQUENCE_LOG * (step.count - 1));
528
+ if (total < chosenLog) {
529
+ chosenLog = total;
530
+ chosen = step;
531
+ }
532
+ }
533
+ const sequence = [];
534
+ let cursor = chosen;
535
+ while (cursor) {
536
+ sequence.unshift(cursor.match);
537
+ const before = cursor.match.i - 1;
538
+ cursor = before >= 0 ? best[before]?.get(cursor.previousCount) : undefined;
539
+ }
540
+ return { guessesLog: chosenLog, sequence };
541
+ }
542
+ function scoreFor(guessesLog) {
543
+ const index = THRESHOLDS.findIndex((threshold) => guessesLog < threshold);
544
+ return (index === -1 ? 4 : index);
545
+ }
546
+ const WEAKNESS_OF = {
547
+ spatial: "keyboard",
548
+ repeat: "repeat",
549
+ sequence: "sequence",
550
+ date: "date",
551
+ dictionary: "common-decorated",
552
+ };
553
+ function weaknessOf(sequence, length) {
554
+ if (sequence.some((match) => match.fromUser))
555
+ return "user-input";
556
+ const only = sequence.length === 1 ? sequence[0] : undefined;
557
+ if (only?.pattern === "dictionary")
558
+ return "common";
559
+ const covered = (match) => match.j - match.i + 1;
560
+ const dictionaryLength = sequence.filter((m) => m.pattern === "dictionary").reduce((sum, m) => sum + covered(m), 0);
561
+ if (dictionaryLength * 2 >= length)
562
+ return "common-decorated";
563
+ const widest = sequence.filter((match) => match.pattern !== "bruteforce").sort((a, b) => covered(b) - covered(a))[0];
564
+ return (widest && WEAKNESS_OF[widest.pattern]) ?? "short";
565
+ }
566
+ /**
567
+ * Estimate how guessable `password` is.
568
+ *
569
+ * ```ts
570
+ * estimatePasswordStrength("Password1!").score; // 1 — "A common word with capitals, numbers or symbols added…"
571
+ * estimatePasswordStrength("amir-connextar-2026", { userInputs: ["amir@connextar.com"] }).weakness; // "user-input"
572
+ * ```
573
+ *
574
+ * On the server, the same call lets an app refuse what the meter calls very weak
575
+ * — `if (estimate.score < 2) …` — with the sentence as the error message. Whether
576
+ * to do that is the app's decision; nothing here refuses anything.
577
+ */
578
+ export function estimatePasswordStrength(password, options = {}) {
579
+ const messages = { ...PASSWORD_STRENGTH_MESSAGES, ...options.messages };
580
+ const belowMinLength = options.minLength !== undefined && [...password].length < options.minLength;
581
+ if (password.length === 0) {
582
+ return { score: 0, label: "", sentence: "", weakness: null, belowMinLength, guessesLog10: 0 };
583
+ }
584
+ const analysed = password.slice(0, MAX_ANALYSED_LENGTH);
585
+ const context = {
586
+ dictionaries: [
587
+ { words: userDictionary(options.userInputs ?? []), fromUser: true },
588
+ { words: COMMON, fromUser: false },
589
+ ],
590
+ referenceYear: new Date().getFullYear(),
591
+ };
592
+ const { guessesLog, sequence } = minimumGuessesLog(analysed, context);
593
+ const score = scoreFor(guessesLog);
594
+ const weakness = score <= 2 ? weaknessOf(sequence, analysed.length) : null;
595
+ // A fair password whose only fault is being plain characters has nothing worth naming.
596
+ const named = weakness === "short" && score === 2 ? null : weakness;
597
+ let sentence;
598
+ if (belowMinLength && options.minLength !== undefined)
599
+ sentence = messages.tooShort(options.minLength);
600
+ else if (named)
601
+ sentence = messages.weakness[named];
602
+ else if (score <= 1)
603
+ sentence = messages.weak;
604
+ else if (score === 2)
605
+ sentence = messages.fair;
606
+ else if (score === 3)
607
+ sentence = messages.strong;
608
+ else
609
+ sentence = messages.veryStrong;
610
+ return { score, label: messages.labels[score], sentence, weakness: named, belowMinLength, guessesLog10: guessesLog };
611
+ }
612
+ //# sourceMappingURL=estimate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"estimate.js","sourceRoot":"","sources":["../../src/password/estimate.ts"],"names":[],"mappings":"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"}