mirror of
https://github.com/bitwarden/browser
synced 2025-12-10 21:33:27 +00:00
increase minimum number of words on passphrases to 6 (#11675)
This commit is contained in:
@@ -60,7 +60,7 @@
|
|||||||
<div class="tw-grid tw-grid-cols-12 tw-gap-4">
|
<div class="tw-grid tw-grid-cols-12 tw-gap-4">
|
||||||
<bit-form-field class="tw-col-span-6">
|
<bit-form-field class="tw-col-span-6">
|
||||||
<bit-label>{{ "minimumNumberOfWords" | i18n }}</bit-label>
|
<bit-label>{{ "minimumNumberOfWords" | i18n }}</bit-label>
|
||||||
<input bitInput type="number" min="3" max="20" formControlName="minNumberWords" />
|
<input bitInput type="number" min="6" max="20" formControlName="minNumberWords" />
|
||||||
</bit-form-field>
|
</bit-form-field>
|
||||||
</div>
|
</div>
|
||||||
<bit-form-control>
|
<bit-form-control>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
function initializeBoundaries() {
|
function initializeBoundaries() {
|
||||||
const numWords = Object.freeze({
|
const numWords = Object.freeze({
|
||||||
min: 3,
|
min: 6,
|
||||||
max: 20,
|
max: 20,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import { PassphraseGenerationOptions } from "../types";
|
|||||||
/** The default options for passphrase generation. */
|
/** The default options for passphrase generation. */
|
||||||
export const DefaultPassphraseGenerationOptions: Partial<PassphraseGenerationOptions> =
|
export const DefaultPassphraseGenerationOptions: Partial<PassphraseGenerationOptions> =
|
||||||
Object.freeze({
|
Object.freeze({
|
||||||
numWords: 3,
|
numWords: 6,
|
||||||
wordSeparator: "-",
|
wordSeparator: "-",
|
||||||
capitalize: false,
|
capitalize: false,
|
||||||
includeNumber: false,
|
includeNumber: false,
|
||||||
|
|||||||
@@ -164,7 +164,7 @@ describe("Password generator options builder", () => {
|
|||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
it.each([3, 8, 18, 20])(
|
it.each([6, 8, 18, 20])(
|
||||||
"should set `numWords` (= %i) to the input value when it is within the boundaries",
|
"should set `numWords` (= %i) to the input value when it is within the boundaries",
|
||||||
(numWords) => {
|
(numWords) => {
|
||||||
expect(numWords).toBeGreaterThanOrEqual(DefaultPassphraseBoundaries.numWords.min);
|
expect(numWords).toBeGreaterThanOrEqual(DefaultPassphraseBoundaries.numWords.min);
|
||||||
|
|||||||
@@ -72,9 +72,9 @@ describe("PassphrasePolicyConstraints", () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it.each([
|
it.each([
|
||||||
[1, 3],
|
[1, 6],
|
||||||
[21, 20],
|
[21, 20],
|
||||||
])("fits numWords (=%p) within the default bounds (3 <= %p <= 20)", (value, expected) => {
|
])("fits numWords (=%p) within the default bounds (6 <= %p <= 20)", (value, expected) => {
|
||||||
const policy = new PassphrasePolicyConstraints(Policies.Passphrase.disabledValue);
|
const policy = new PassphrasePolicyConstraints(Policies.Passphrase.disabledValue);
|
||||||
|
|
||||||
const { numWords } = policy.adjust({ ...SomeSettings, numWords: value });
|
const { numWords } = policy.adjust({ ...SomeSettings, numWords: value });
|
||||||
@@ -83,7 +83,7 @@ describe("PassphrasePolicyConstraints", () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it.each([
|
it.each([
|
||||||
[1, 4, 4],
|
[1, 6, 6],
|
||||||
[21, 20, 20],
|
[21, 20, 20],
|
||||||
])(
|
])(
|
||||||
"fits numWords (=%p) within the policy bounds (%p <= %p <= 20)",
|
"fits numWords (=%p) within the policy bounds (%p <= %p <= 20)",
|
||||||
|
|||||||
@@ -98,7 +98,7 @@ describe("Passphrase generation strategy", () => {
|
|||||||
const strategy = new PassphraseGeneratorStrategy(randomizer, null);
|
const strategy = new PassphraseGeneratorStrategy(randomizer, null);
|
||||||
|
|
||||||
const result = await strategy.generate({
|
const result = await strategy.generate({
|
||||||
numWords: 4,
|
numWords: 6,
|
||||||
capitalize: true,
|
capitalize: true,
|
||||||
includeNumber: true,
|
includeNumber: true,
|
||||||
wordSeparator: "!",
|
wordSeparator: "!",
|
||||||
@@ -106,7 +106,7 @@ describe("Passphrase generation strategy", () => {
|
|||||||
|
|
||||||
expect(result).toEqual("passphrase");
|
expect(result).toEqual("passphrase");
|
||||||
expect(randomizer.randomEffLongWords).toHaveBeenCalledWith({
|
expect(randomizer.randomEffLongWords).toHaveBeenCalledWith({
|
||||||
numberOfWords: 4,
|
numberOfWords: 6,
|
||||||
capitalize: true,
|
capitalize: true,
|
||||||
number: true,
|
number: true,
|
||||||
separator: "!",
|
separator: "!",
|
||||||
@@ -135,14 +135,14 @@ describe("Passphrase generation strategy", () => {
|
|||||||
const strategy = new PassphraseGeneratorStrategy(randomizer, null);
|
const strategy = new PassphraseGeneratorStrategy(randomizer, null);
|
||||||
|
|
||||||
const result = await strategy.generate({
|
const result = await strategy.generate({
|
||||||
numWords: 4,
|
numWords: 6,
|
||||||
includeNumber: true,
|
includeNumber: true,
|
||||||
wordSeparator: "!",
|
wordSeparator: "!",
|
||||||
});
|
});
|
||||||
|
|
||||||
expect(result).toEqual("passphrase");
|
expect(result).toEqual("passphrase");
|
||||||
expect(randomizer.randomEffLongWords).toHaveBeenCalledWith({
|
expect(randomizer.randomEffLongWords).toHaveBeenCalledWith({
|
||||||
numberOfWords: 4,
|
numberOfWords: 6,
|
||||||
capitalize: DefaultPassphraseGenerationOptions.capitalize,
|
capitalize: DefaultPassphraseGenerationOptions.capitalize,
|
||||||
number: true,
|
number: true,
|
||||||
separator: "!",
|
separator: "!",
|
||||||
@@ -153,14 +153,14 @@ describe("Passphrase generation strategy", () => {
|
|||||||
const strategy = new PassphraseGeneratorStrategy(randomizer, null);
|
const strategy = new PassphraseGeneratorStrategy(randomizer, null);
|
||||||
|
|
||||||
const result = await strategy.generate({
|
const result = await strategy.generate({
|
||||||
numWords: 4,
|
numWords: 6,
|
||||||
capitalize: true,
|
capitalize: true,
|
||||||
wordSeparator: "!",
|
wordSeparator: "!",
|
||||||
});
|
});
|
||||||
|
|
||||||
expect(result).toEqual("passphrase");
|
expect(result).toEqual("passphrase");
|
||||||
expect(randomizer.randomEffLongWords).toHaveBeenCalledWith({
|
expect(randomizer.randomEffLongWords).toHaveBeenCalledWith({
|
||||||
numberOfWords: 4,
|
numberOfWords: 6,
|
||||||
capitalize: true,
|
capitalize: true,
|
||||||
number: DefaultPassphraseGenerationOptions.includeNumber,
|
number: DefaultPassphraseGenerationOptions.includeNumber,
|
||||||
separator: "!",
|
separator: "!",
|
||||||
@@ -171,14 +171,14 @@ describe("Passphrase generation strategy", () => {
|
|||||||
const strategy = new PassphraseGeneratorStrategy(randomizer, null);
|
const strategy = new PassphraseGeneratorStrategy(randomizer, null);
|
||||||
|
|
||||||
const result = await strategy.generate({
|
const result = await strategy.generate({
|
||||||
numWords: 4,
|
numWords: 6,
|
||||||
capitalize: true,
|
capitalize: true,
|
||||||
includeNumber: true,
|
includeNumber: true,
|
||||||
});
|
});
|
||||||
|
|
||||||
expect(result).toEqual("passphrase");
|
expect(result).toEqual("passphrase");
|
||||||
expect(randomizer.randomEffLongWords).toHaveBeenCalledWith({
|
expect(randomizer.randomEffLongWords).toHaveBeenCalledWith({
|
||||||
numberOfWords: 4,
|
numberOfWords: 6,
|
||||||
capitalize: true,
|
capitalize: true,
|
||||||
number: true,
|
number: true,
|
||||||
separator: DefaultPassphraseGenerationOptions.wordSeparator,
|
separator: DefaultPassphraseGenerationOptions.wordSeparator,
|
||||||
|
|||||||
@@ -350,14 +350,14 @@ describe("optionsToRandomAsciiRequest", () => {
|
|||||||
describe("optionsToEffWordListRequest", () => {
|
describe("optionsToEffWordListRequest", () => {
|
||||||
it("should map options", async () => {
|
it("should map options", async () => {
|
||||||
const result = optionsToEffWordListRequest({
|
const result = optionsToEffWordListRequest({
|
||||||
numWords: 4,
|
numWords: 6,
|
||||||
capitalize: true,
|
capitalize: true,
|
||||||
includeNumber: true,
|
includeNumber: true,
|
||||||
wordSeparator: "!",
|
wordSeparator: "!",
|
||||||
});
|
});
|
||||||
|
|
||||||
expect(result).toEqual({
|
expect(result).toEqual({
|
||||||
numberOfWords: 4,
|
numberOfWords: 6,
|
||||||
capitalize: true,
|
capitalize: true,
|
||||||
number: true,
|
number: true,
|
||||||
separator: "!",
|
separator: "!",
|
||||||
@@ -381,13 +381,13 @@ describe("optionsToEffWordListRequest", () => {
|
|||||||
|
|
||||||
it("should default capitalize", async () => {
|
it("should default capitalize", async () => {
|
||||||
const result = optionsToEffWordListRequest({
|
const result = optionsToEffWordListRequest({
|
||||||
numWords: 4,
|
numWords: 6,
|
||||||
includeNumber: true,
|
includeNumber: true,
|
||||||
wordSeparator: "!",
|
wordSeparator: "!",
|
||||||
});
|
});
|
||||||
|
|
||||||
expect(result).toEqual({
|
expect(result).toEqual({
|
||||||
numberOfWords: 4,
|
numberOfWords: 6,
|
||||||
capitalize: DefaultPassphraseGenerationOptions.capitalize,
|
capitalize: DefaultPassphraseGenerationOptions.capitalize,
|
||||||
number: true,
|
number: true,
|
||||||
separator: "!",
|
separator: "!",
|
||||||
@@ -396,13 +396,13 @@ describe("optionsToEffWordListRequest", () => {
|
|||||||
|
|
||||||
it("should default includeNumber", async () => {
|
it("should default includeNumber", async () => {
|
||||||
const result = optionsToEffWordListRequest({
|
const result = optionsToEffWordListRequest({
|
||||||
numWords: 4,
|
numWords: 6,
|
||||||
capitalize: true,
|
capitalize: true,
|
||||||
wordSeparator: "!",
|
wordSeparator: "!",
|
||||||
});
|
});
|
||||||
|
|
||||||
expect(result).toEqual({
|
expect(result).toEqual({
|
||||||
numberOfWords: 4,
|
numberOfWords: 6,
|
||||||
capitalize: true,
|
capitalize: true,
|
||||||
number: DefaultPassphraseGenerationOptions.includeNumber,
|
number: DefaultPassphraseGenerationOptions.includeNumber,
|
||||||
separator: "!",
|
separator: "!",
|
||||||
@@ -411,13 +411,13 @@ describe("optionsToEffWordListRequest", () => {
|
|||||||
|
|
||||||
it("should default wordSeparator", async () => {
|
it("should default wordSeparator", async () => {
|
||||||
const result = optionsToEffWordListRequest({
|
const result = optionsToEffWordListRequest({
|
||||||
numWords: 4,
|
numWords: 6,
|
||||||
capitalize: true,
|
capitalize: true,
|
||||||
includeNumber: true,
|
includeNumber: true,
|
||||||
});
|
});
|
||||||
|
|
||||||
expect(result).toEqual({
|
expect(result).toEqual({
|
||||||
numberOfWords: 4,
|
numberOfWords: 6,
|
||||||
capitalize: true,
|
capitalize: true,
|
||||||
number: true,
|
number: true,
|
||||||
separator: DefaultPassphraseGenerationOptions.wordSeparator,
|
separator: DefaultPassphraseGenerationOptions.wordSeparator,
|
||||||
|
|||||||
@@ -348,7 +348,7 @@ describe("LegacyPasswordGenerationService", () => {
|
|||||||
const innerPassphrase = createPassphraseGenerator(
|
const innerPassphrase = createPassphraseGenerator(
|
||||||
{},
|
{},
|
||||||
{
|
{
|
||||||
minNumberWords: 5,
|
minNumberWords: 6,
|
||||||
capitalize: true,
|
capitalize: true,
|
||||||
includeNumber: true,
|
includeNumber: true,
|
||||||
},
|
},
|
||||||
@@ -370,7 +370,7 @@ describe("LegacyPasswordGenerationService", () => {
|
|||||||
|
|
||||||
expect(result).toBe(options);
|
expect(result).toBe(options);
|
||||||
expect(result).toMatchObject({
|
expect(result).toMatchObject({
|
||||||
numWords: 5,
|
numWords: 6,
|
||||||
capitalize: true,
|
capitalize: true,
|
||||||
includeNumber: true,
|
includeNumber: true,
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user