From 56f272df7c04db244739f62ac1e2e1eeb6ddf4a9 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Mon, 20 Apr 2020 10:10:12 +0300 Subject: [PATCH 1/6] feat(core): add generatePassword utility function #3677 --- .../src/lib/tests/generator-utils.spec.ts | 35 ++++++++++++++++++- .../core/src/lib/utils/generator-utils.ts | 28 +++++++++++++++ 2 files changed, 62 insertions(+), 1 deletion(-) diff --git a/npm/ng-packs/packages/core/src/lib/tests/generator-utils.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/generator-utils.spec.ts index e09be3fb4f..b74e0f34f6 100644 --- a/npm/ng-packs/packages/core/src/lib/tests/generator-utils.spec.ts +++ b/npm/ng-packs/packages/core/src/lib/tests/generator-utils.spec.ts @@ -1,4 +1,4 @@ -import { generateHash } from '../utils'; +import { generateHash, generatePassword } from '../utils'; describe('GeneratorUtils', () => { describe('#generateHash', () => { @@ -7,4 +7,37 @@ describe('GeneratorUtils', () => { expect(hash).toBe(1112440527); }); }); + + describe('#generatePassword', () => { + const lowers = 'abcdefghijklmnopqrstuvwxyz'; + const uppers = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; + const numbers = '0123456789'; + const specials = '!@#$%&*()_+{}<>?[]./'; + + test.each` + name | charSet | passwordLength + ${'lower'} | ${lowers} | ${7} + ${'upper'} | ${uppers} | ${6} + ${'number'} | ${numbers} | ${5} + ${'special'} | ${specials} | ${4} + `( + 'should have a $name in the password that length is $passwordLength', + ({ _, charSet, passwordLength }) => { + const password = generatePassword(passwordLength); + expect(hasChar(charSet, password)).toBe(true); + }, + ); + }); }); + +function hasChar(charSet: string, password: string): boolean { + let matched = false; + charSet.split('').forEach(char => { + if (password.indexOf(char) > -1) { + matched = true; + return; + } + }); + + return matched; +} diff --git a/npm/ng-packs/packages/core/src/lib/utils/generator-utils.ts b/npm/ng-packs/packages/core/src/lib/utils/generator-utils.ts index cc88e216d6..2ce743038a 100644 --- a/npm/ng-packs/packages/core/src/lib/utils/generator-utils.ts +++ b/npm/ng-packs/packages/core/src/lib/utils/generator-utils.ts @@ -17,3 +17,31 @@ export function generateHash(value: string): number { } return hashed; } + +export function generatePassword(length = 8) { + length = length < 4 ? 4 : length; + + const lowers = 'abcdefghijklmnopqrstuvwxyz'; + const uppers = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; + const numbers = '0123456789'; + const specials = '!@#$%&*()_+{}<>?[]./'; + const all = lowers + uppers + numbers + specials; + + const getRandom = (chrSet: string) => chrSet[Math.floor(Math.random() * chrSet.length)]; + + let password = ''; + + password += getRandom(lowers); + password += getRandom(uppers); + password += getRandom(numbers); + password += getRandom(specials); + + for (let i = 1; i <= length - 4; i++) { + password = password.concat(getRandom(all)); + } + + return password + .split('') + .sort(() => 0.5 - Math.random()) + .join(''); +} From c76fea09af2ad7128c0e8ce779e423e7f54721c2 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Mon, 20 Apr 2020 10:19:52 +0300 Subject: [PATCH 2/6] refactor(core): improve generatePassword readability --- npm/ng-packs/packages/core/src/lib/utils/generator-utils.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/npm/ng-packs/packages/core/src/lib/utils/generator-utils.ts b/npm/ng-packs/packages/core/src/lib/utils/generator-utils.ts index 2ce743038a..f29e33f2bb 100644 --- a/npm/ng-packs/packages/core/src/lib/utils/generator-utils.ts +++ b/npm/ng-packs/packages/core/src/lib/utils/generator-utils.ts @@ -30,14 +30,13 @@ export function generatePassword(length = 8) { const getRandom = (chrSet: string) => chrSet[Math.floor(Math.random() * chrSet.length)]; let password = ''; - password += getRandom(lowers); password += getRandom(uppers); password += getRandom(numbers); password += getRandom(specials); for (let i = 1; i <= length - 4; i++) { - password = password.concat(getRandom(all)); + password += getRandom(all); } return password From 748af7ac643286f12a376633aa250dfc2355bd22 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Tue, 21 Apr 2020 15:51:37 +0300 Subject: [PATCH 3/6] refactor(core): improve generatePassword code quality --- .../core/src/lib/utils/generator-utils.ts | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/npm/ng-packs/packages/core/src/lib/utils/generator-utils.ts b/npm/ng-packs/packages/core/src/lib/utils/generator-utils.ts index f29e33f2bb..9fccfb8271 100644 --- a/npm/ng-packs/packages/core/src/lib/utils/generator-utils.ts +++ b/npm/ng-packs/packages/core/src/lib/utils/generator-utils.ts @@ -29,18 +29,15 @@ export function generatePassword(length = 8) { const getRandom = (chrSet: string) => chrSet[Math.floor(Math.random() * chrSet.length)]; - let password = ''; - password += getRandom(lowers); - password += getRandom(uppers); - password += getRandom(numbers); - password += getRandom(specials); - - for (let i = 1; i <= length - 4; i++) { - password += getRandom(all); + const password = Array({ length }); + password[0] = getRandom(lowers); + password[1] = getRandom(uppers); + password[2] = getRandom(numbers); + password[3] = getRandom(specials); + + for (let i = 4; i < length; i++) { + password[i] = getRandom(all); } - return password - .split('') - .sort(() => 0.5 - Math.random()) - .join(''); + return password.sort(() => 0.5 - Math.random()).join(''); } From 5c9c7b31eba80b87c903ea2c7d643c07cfb8d173 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Tue, 21 Apr 2020 15:52:22 +0300 Subject: [PATCH 4/6] test(core): add 3 more tests for generatePassword and refactor hasChar fn --- .../core/src/lib/tests/generator-utils.spec.ts | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/npm/ng-packs/packages/core/src/lib/tests/generator-utils.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/generator-utils.spec.ts index b74e0f34f6..f8ec3e548b 100644 --- a/npm/ng-packs/packages/core/src/lib/tests/generator-utils.spec.ts +++ b/npm/ng-packs/packages/core/src/lib/tests/generator-utils.spec.ts @@ -16,14 +16,18 @@ describe('GeneratorUtils', () => { test.each` name | charSet | passwordLength + ${'lower'} | ${lowers} | ${10} ${'lower'} | ${lowers} | ${7} ${'upper'} | ${uppers} | ${6} ${'number'} | ${numbers} | ${5} ${'special'} | ${specials} | ${4} + ${'special'} | ${specials} | ${2} + ${'special'} | ${specials} | ${0} `( 'should have a $name in the password that length is $passwordLength', ({ _, charSet, passwordLength }) => { const password = generatePassword(passwordLength); + expect(password).toHaveLength(passwordLength < 4 ? 4 : passwordLength); expect(hasChar(charSet, password)).toBe(true); }, ); @@ -31,13 +35,5 @@ describe('GeneratorUtils', () => { }); function hasChar(charSet: string, password: string): boolean { - let matched = false; - charSet.split('').forEach(char => { - if (password.indexOf(char) > -1) { - matched = true; - return; - } - }); - - return matched; + return charSet.split('').some(char => password.indexOf(char) > -1); } From 07fe9960d0fb643d1be8dfdc19c7e2d2f411a478 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Tue, 21 Apr 2020 16:03:52 +0300 Subject: [PATCH 5/6] refactor(core): add max length control to generatePassword fn --- npm/ng-packs/packages/core/src/lib/utils/generator-utils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/npm/ng-packs/packages/core/src/lib/utils/generator-utils.ts b/npm/ng-packs/packages/core/src/lib/utils/generator-utils.ts index 9fccfb8271..a5fd4c9c65 100644 --- a/npm/ng-packs/packages/core/src/lib/utils/generator-utils.ts +++ b/npm/ng-packs/packages/core/src/lib/utils/generator-utils.ts @@ -19,7 +19,7 @@ export function generateHash(value: string): number { } export function generatePassword(length = 8) { - length = length < 4 ? 4 : length; + length = Math.min(Math.max(4, length), 128); const lowers = 'abcdefghijklmnopqrstuvwxyz'; const uppers = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; From faf560b67f399a5158ddf0b7e838636f2be6662a Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Tue, 21 Apr 2020 16:04:32 +0300 Subject: [PATCH 6/6] test(core): add new tests to generatePassword describe --- .../src/lib/tests/generator-utils.spec.ts | 25 +++++++++++-------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/npm/ng-packs/packages/core/src/lib/tests/generator-utils.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/generator-utils.spec.ts index f8ec3e548b..841d9e6d35 100644 --- a/npm/ng-packs/packages/core/src/lib/tests/generator-utils.spec.ts +++ b/npm/ng-packs/packages/core/src/lib/tests/generator-utils.spec.ts @@ -15,19 +15,22 @@ describe('GeneratorUtils', () => { const specials = '!@#$%&*()_+{}<>?[]./'; test.each` - name | charSet | passwordLength - ${'lower'} | ${lowers} | ${10} - ${'lower'} | ${lowers} | ${7} - ${'upper'} | ${uppers} | ${6} - ${'number'} | ${numbers} | ${5} - ${'special'} | ${specials} | ${4} - ${'special'} | ${specials} | ${2} - ${'special'} | ${specials} | ${0} + name | charSet | passedPasswordLength | actualPasswordLength + ${'lower'} | ${lowers} | ${Infinity} | ${128} + ${'lower'} | ${lowers} | ${129} | ${128} + ${'lower'} | ${lowers} | ${10} | ${10} + ${'lower'} | ${lowers} | ${7} | ${7} + ${'upper'} | ${uppers} | ${6} | ${6} + ${'number'} | ${numbers} | ${5} | ${5} + ${'special'} | ${specials} | ${4} | ${4} + ${'special'} | ${specials} | ${2} | ${4} + ${'special'} | ${specials} | ${0} | ${4} + ${'special'} | ${specials} | ${undefined} | ${8} `( 'should have a $name in the password that length is $passwordLength', - ({ _, charSet, passwordLength }) => { - const password = generatePassword(passwordLength); - expect(password).toHaveLength(passwordLength < 4 ? 4 : passwordLength); + ({ _, charSet, passedPasswordLength, actualPasswordLength }) => { + const password = generatePassword(passedPasswordLength); + expect(password).toHaveLength(actualPasswordLength); expect(hasChar(charSet, password)).toBe(true); }, );