Skip to content

Commit 8bcfebd

Browse files
committed
fixup! Use async versions of bcrypt methods to avoid freezing browser tab (#204)
1 parent 85f64cc commit 8bcfebd

5 files changed

Lines changed: 28 additions & 3 deletions

File tree

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@
9494
"@zxcvbn-ts/language-en": "^3.0.2",
9595
"@zxing/library": "^0.21.3",
9696
"a11y-color-contrast": "^0.2.0",
97+
"abort-signal-polyfill": "^1.0.0",
9798
"aircodes": "^1.3.16",
9899
"ajv": "^8.17.1",
99100
"ajv-errors": "^3.0.0",

pnpm-lock.yaml

Lines changed: 16 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/main.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import { library } from '@fortawesome/fontawesome-svg-core';
55
import { fas } from '@fortawesome/free-solid-svg-icons';
66
import { LoadingPlugin } from 'vue-loading-overlay';
77

8+
import { installAbortSignalPolyfill } from 'abort-signal-polyfill';
9+
810
import { registerSW } from 'virtual:pwa-register';
911
import shadow from 'vue-shadow-dom';
1012
import { hideSplashScreen } from 'vite-plugin-splash-screen/runtime';
@@ -27,6 +29,8 @@ window.addEventListener('vite:preloadError', (event: Event) => {
2729
window.location.reload();
2830
});
2931

32+
installAbortSignalPolyfill();
33+
3034
// eslint-disable-next-line no-extend-native
3135
BigInt.prototype.toJSON = function () {
3236
return JSON.rawJSON ? JSON.rawJSON(this.toString()) : this.toString();

src/tools/bcrypt/bcrypt.models.test.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
import { compare, hash } from 'bcryptjs';
22
import { assert, describe, expect, test } from 'vitest';
3+
import { installAbortSignalPolyfill } from 'abort-signal-polyfill';
34
import { type Update, bcryptWithProgressUpdates } from './bcrypt.models';
45

6+
// Install the polyfill
7+
installAbortSignalPolyfill();
8+
59
// simplified polyfill for https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/fromAsync
610
async function fromAsync<T>(iter: AsyncIterable<T>) {
711
const out: T[] = [];
@@ -32,7 +36,7 @@ describe('bcrypt models', () => {
3236
const updates = await fromAsync(bcryptWithProgressUpdates(hash, ['abc', 5]));
3337
const result = checkProgressAndGetResult(updates);
3438

35-
expect(result.value).toMatch(/^\$2a\$05\$.{53}$/);
39+
expect(result.value).toMatch(/^\$2[ab]\$05\$.{53}$/);
3640
expect(result.timeTakenMs).toBeGreaterThan(0);
3741
});
3842

src/tools/htpasswd-generator/htpasswd-generator.service.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ describe('htpasswd-generator', () => {
55
it('generate correct entries', () => {
66
const commonValues = { username: 'a', password: 'a' };
77

8-
expect(generateHtpasswd({ ...commonValues, saltRounds: 10, algorithm: 'bcrypt' })).toContain('a:$2a$10$');
8+
expect(generateHtpasswd({ ...commonValues, saltRounds: 10, algorithm: 'bcrypt' })).toMatch(/a:\$2[ab]\$10\$/);
99
expect(generateHtpasswd({ ...commonValues, salt: 'k9azwE5H', algorithm: 'apr1' })).toBe('a:$apr1$k9azwE5H$zIyj4gqCWXiwB2Iof6jHf1');
1010
expect(generateHtpasswd({ ...commonValues, salt: 'xs4x6VWJ', algorithm: 'md5' })).toBe('a:$1$xs4x6VWJ$lOH0fBF6QyWdTOEeqcFnP/');
1111
expect(generateHtpasswd({ ...commonValues, salt: 'grEPbuEp', algorithm: 'sha256' })).toBe('a:$5$grEPbuEp$DUmEMT5C4TRgZCs9ZFKOJZ/IgR5FJIOUH0dasQFPw57');
@@ -16,7 +16,7 @@ describe('htpasswd-generator', () => {
1616
it('generate correct entries (unicode)', () => {
1717
const commonValues = { username: 'a', password: 'àùé' };
1818

19-
expect(generateHtpasswd({ ...commonValues, saltRounds: 10, algorithm: 'bcrypt' })).toContain('a:$2a$10$');
19+
expect(generateHtpasswd({ ...commonValues, saltRounds: 10, algorithm: 'bcrypt' })).toMatch(/a:\$2[ab]\$10\$/);
2020
expect(() => generateHtpasswd({ ...commonValues, salt: 'mL016JCr', algorithm: 'apr1' })).toThrow();
2121
expect(() => generateHtpasswd({ ...commonValues, salt: 'YshCU1p1', algorithm: 'md5' })).toThrow();
2222
expect(generateHtpasswd({ ...commonValues, salt: 'Rojf48Kp', algorithm: 'sha256' })).toBe('a:$5$Rojf48Kp$/dY3S.yDqW2ZH/YKrF85q6JszyP.bhIF/Qu31Q49Oa5');

0 commit comments

Comments
 (0)