mirror of
https://github.com/XFox111/PasswordGeneratorExtension.git
synced 2026-04-22 08:08:01 +03:00
7e7b6f71a4
* Major 3.0: Complete overhaul of the codebase, new features, bugfixes and more (#223)
Complete overhaul for v3.0 (see related PR)
* Fix for workflows matrix
* Reverted PR workflow to manual node setup
* Revert "Reverted PR workflow to manual node setup"
This reverts commit 491afd58ab.
* Replaced web-ext lint action
* Workflow fix
* Deprecated autocopy feature
* Zero-day patch: Batch 1 (#231)
* Bump @types/react-dom from 18.2.8 to 18.2.15 (#230)
Bumps [@types/react-dom](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react-dom) from 18.2.8 to 18.2.15.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react-dom)
---
updated-dependencies:
- dependency-name: "@types/react-dom"
dependency-type: direct:development
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* Bump typescript from 4.9.5 to 5.2.2 (#228)
Bumps [typescript](https://github.com/Microsoft/TypeScript) from 4.9.5 to 5.2.2.
- [Release notes](https://github.com/Microsoft/TypeScript/releases)
- [Commits](https://github.com/Microsoft/TypeScript/compare/v4.9.5...v5.2.2)
---
updated-dependencies:
- dependency-name: typescript
dependency-type: direct:development
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* Bump @fluentui/react-icons from 2.0.218 to 2.0.222 (#227)
Bumps [@fluentui/react-icons](https://github.com/microsoft/fluentui-system-icons) from 2.0.218 to 2.0.222.
- [Commits](https://github.com/microsoft/fluentui-system-icons/commits)
---
updated-dependencies:
- dependency-name: "@fluentui/react-icons"
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* Bump dev-build-deploy/release-me from 0.14.0 to 0.15.0 (#225)
Bumps [dev-build-deploy/release-me](https://github.com/dev-build-deploy/release-me) from 0.14.0 to 0.15.0.
- [Release notes](https://github.com/dev-build-deploy/release-me/releases)
- [Changelog](https://github.com/dev-build-deploy/release-me/blob/main/docs/get-release.md)
- [Commits](https://github.com/dev-build-deploy/release-me/compare/v0.14.0...v0.15.0)
---
updated-dependencies:
- dependency-name: dev-build-deploy/release-me
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* Bump sass from 1.69.0 to 1.69.5 (#229)
Bumps [sass](https://github.com/sass/dart-sass) from 1.69.0 to 1.69.5.
- [Release notes](https://github.com/sass/dart-sass/releases)
- [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/dart-sass/compare/1.69.0...1.69.5)
---
updated-dependencies:
- dependency-name: sass
dependency-type: direct:development
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Eugene Fox <eugene.xfox@outlook.com>
* Bump @types/webextension-polyfill from 0.10.4 to 0.10.6 (#226)
Bumps [@types/webextension-polyfill](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/webextension-polyfill) from 0.10.4 to 0.10.6.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/webextension-polyfill)
---
updated-dependencies:
- dependency-name: "@types/webextension-polyfill"
dependency-type: direct:development
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Eugene Fox <eugene.xfox@outlook.com>
---------
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* Zero-day patch: Batch 2 (#236)
* Bump @fluentui/react-components from 9.34.0 to 9.39.0 (#235)
Bumps [@fluentui/react-components](https://github.com/microsoft/fluentui) from 9.34.0 to 9.39.0.
- [Release notes](https://github.com/microsoft/fluentui/releases)
- [Changelog](https://github.com/microsoft/fluentui/blob/master/azure-pipelines.release-fluentui.yml)
- [Commits](https://github.com/microsoft/fluentui/compare/@fluentui/react-components_v9.34.0...@fluentui/react-components_v9.39.0)
---
updated-dependencies:
- dependency-name: "@fluentui/react-components"
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* Bump @vitejs/plugin-react-swc from 3.4.0 to 3.4.1 (#234)
Bumps [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) from 3.4.0 to 3.4.1.
- [Release notes](https://github.com/vitejs/vite-plugin-react-swc/releases)
- [Changelog](https://github.com/vitejs/vite-plugin-react-swc/blob/main/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite-plugin-react-swc/compare/v3.4.0...v3.4.1)
---
updated-dependencies:
- dependency-name: "@vitejs/plugin-react-swc"
dependency-type: direct:development
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* Bump @types/react from 18.2.24 to 18.2.37 (#233)
Bumps [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react) from 18.2.24 to 18.2.37.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react)
---
updated-dependencies:
- dependency-name: "@types/react"
dependency-type: direct:development
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* Bump vite from 4.4.10 to 4.5.0 (#232)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 4.4.10 to 4.5.0.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v4.5.0/packages/vite)
---
updated-dependencies:
- dependency-name: vite
dependency-type: direct:development
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---------
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---------
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
130 lines
3.7 KiB
TypeScript
130 lines
3.7 KiB
TypeScript
import GeneratorOptions from "../Models/GeneratorOptions";
|
|
import { GetLocaleString as loc } from "./Localization";
|
|
|
|
const Characters =
|
|
{
|
|
Uppercase: "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
|
|
Lowercase: "abcdefghijklmnopqrstuvwxyz",
|
|
Numeric: "1234567890",
|
|
Special: "!#$%&*+-=?@^_"
|
|
};
|
|
|
|
const Similar: string = "iIl1Lo0O";
|
|
const Ambiguous: string = "{}[]()/\\'\"`~,;:.<>";
|
|
|
|
export const CharacterHints = { ...Characters, Similar, Ambiguous };
|
|
|
|
/**
|
|
* Generates a random password
|
|
* @param options Options for password generation
|
|
* @returns Randomly generated password
|
|
* @throws Error if options are invalid
|
|
*/
|
|
export function GeneratePassword(options: GeneratorOptions): string
|
|
{
|
|
ValidateOptions(options);
|
|
|
|
let password: string = GetRequiredCharacters(options);
|
|
const availableCharacters: string = GetAvailableCharacters(options);
|
|
|
|
for (let i = password.length; i < options.Length; i++)
|
|
{
|
|
const character: string = PickRandomFromArray(availableCharacters);
|
|
|
|
if (options.ExcludeRepeating && password.includes(character))
|
|
i--;
|
|
else
|
|
password += character;
|
|
}
|
|
|
|
password = ShuffleString(password);
|
|
return password;
|
|
}
|
|
|
|
/**
|
|
* Validates options for password generation
|
|
* @param options Options for password generation
|
|
* @throws Error if options are invalid
|
|
*/
|
|
export function ValidateOptions(options: GeneratorOptions): void
|
|
{
|
|
if (options.Length < 4)
|
|
throw new Error(loc("error@moreCharacters"));
|
|
|
|
const availableCharacters: string = GetAvailableCharacters(options);
|
|
|
|
if (availableCharacters.length < 1)
|
|
throw new Error(loc("error@noCharacters"));
|
|
|
|
if (options.ExcludeRepeating && options.Length > availableCharacters.length)
|
|
throw new Error(loc("error@tooLong"));
|
|
}
|
|
|
|
// Returns a string containing all characters that are available for password generation
|
|
function GetAvailableCharacters(options: GeneratorOptions): string
|
|
{
|
|
let availableCharacters: string = "";
|
|
|
|
for (const [key, value] of Object.entries(Characters))
|
|
if (options[key as keyof GeneratorOptions])
|
|
availableCharacters += value;
|
|
|
|
if (options.ExcludeSimilar)
|
|
availableCharacters = availableCharacters.replace(new RegExp(`[${Similar}]`, "g"), "");
|
|
|
|
if (options.Special && !options.ExcludeAmbiguous)
|
|
availableCharacters += Ambiguous;
|
|
|
|
return availableCharacters;
|
|
}
|
|
|
|
// Returns a string containing all characters from every available set that are required for password generation
|
|
function GetRequiredCharacters(options: GeneratorOptions): string
|
|
{
|
|
let result: string = "";
|
|
const characters: Record<string, string> = Object.assign({}, Characters);
|
|
|
|
if (!options.ExcludeAmbiguous)
|
|
characters.Special += Ambiguous;
|
|
|
|
if (options.ExcludeSimilar)
|
|
for (const key of Object.keys(characters))
|
|
characters[key] = characters[key].replace(new RegExp(`[${Similar}]`, "g"), "");
|
|
|
|
for (const [key, value] of Object.entries(characters))
|
|
if (options[key as keyof GeneratorOptions])
|
|
result += PickRandomFromArray(value);
|
|
|
|
return result;
|
|
}
|
|
|
|
// Picks a random character from a string
|
|
function PickRandomFromArray(array: string): string
|
|
{
|
|
return array[GetRandomInt(0, array.length)];
|
|
}
|
|
|
|
// See https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Math/random
|
|
// min is inclusive, max is exclusive
|
|
function GetRandomInt(min: number, max: number): number
|
|
{
|
|
const arr = new Uint16Array(1);
|
|
crypto.getRandomValues(arr); // Using crypto instead of Math.random() as a CSPRNG
|
|
return Math.floor((arr[0] / 65_536) * (max - min)) + min;
|
|
}
|
|
|
|
// Shuffles a string using Fisher-Yates algorithm and CSPRNG
|
|
// See https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle
|
|
function ShuffleString(str: string): string
|
|
{
|
|
const arr = str.split("");
|
|
|
|
for (let i = arr.length - 1; i > 0; i--)
|
|
{
|
|
const j = GetRandomInt(0, i + 1);
|
|
[arr[i], arr[j]] = [arr[j], arr[i]];
|
|
}
|
|
|
|
return arr.join("");
|
|
}
|