password-meter
Version:
This password meter library is inspired by pointing system in http://www.passwordmeter.com/, in which the main purpose is to help the end users to have more stronger passwords.
1 lines • 56.8 kB
Source Map (JSON)
{"version":3,"file":"index.cjs","sources":["../src/index.ts"],"sourcesContent":["export interface IRequirement {\n minLength?: number | IMessage;\n maxLength?: number | IMessage;\n uniqueLettersMinLength?: number | IMessage;\n uppercaseLettersMinLength?: number | IMessage;\n lowercaseLettersMinLength?: number | IMessage;\n numbersMinLength?: number | IMessage;\n symbolsMinLength?: number | IMessage;\n include?: string[] | IMessage;\n exclude?: string[] | IMessage;\n blackList?: string[] | IMessage;\n startsWith?: string | IMessage;\n endsWith?: string | IMessage;\n includeOne?: string[] | IMessage;\n}\n\nexport interface IMessage {\n value: number | string | string[];\n message: string;\n}\n\nexport interface IResult {\n score: number;\n status: string;\n percent: number;\n errors?: string | string[];\n}\n\nexport class PasswordMeter {\n private uppercaseLetters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';\n private lowercaseLetters = 'abcdefghijklmnopqrstuvwxyz';\n private numbers = '1234567890';\n constructor(public requirements?: IRequirement, public scoreRange?: any) {}\n\n private startsWith(str: string, word: string): boolean {\n return str.lastIndexOf(word, 0) === 0;\n }\n\n private endsWith(str: string, word: string): boolean {\n return str.indexOf(word, str.length - word.length) !== -1;\n }\n\n private chunkString(str: string, len: number): string[] {\n const _size = Math.ceil(str.length / len),\n _ret = new Array(_size);\n let _offset = 0;\n for (let _i = 0; _i < _size; _i++) {\n _offset = _i * len;\n _ret[_i] = str.substring(_offset, _offset + len);\n }\n return _ret;\n }\n private getLength(text: string): number {\n if (text) {\n return text.length;\n }\n return 0;\n }\n private doesNotContains(text: string, list: string[]): boolean {\n if (text) {\n if (list) {\n const doesnotContainsAll = list.every((x) => text.indexOf(x) == -1);\n return doesnotContainsAll;\n } else {\n return true;\n }\n } else {\n return true;\n }\n }\n private contains(text: string, list: string[]): boolean {\n if (text) {\n if (list) {\n const containsAll = list.every((x) => text.indexOf(x) >= 0);\n return containsAll;\n } else {\n return false;\n }\n } else {\n return false;\n }\n }\n private containsOne(text: string, list: string[]): boolean {\n if (text) {\n if (list) {\n const contains = list.some((x) => text.indexOf(x) >= 0);\n return contains;\n } else {\n return false;\n }\n } else {\n return false;\n }\n }\n\n private isInBlackList(text: string, list: string[]): boolean {\n if (text) {\n if (list) {\n for (let index = 0; index < list.length; index++) {\n if (text === list[index]) {\n return true;\n }\n }\n return false;\n } else {\n return false;\n }\n } else {\n return false;\n }\n }\n\n private between(x: number, min: number, max: number) {\n return x >= min && x < max;\n }\n\n private isIMessage(arg: any): arg is IMessage {\n const status = arg.message !== undefined;\n return status;\n }\n\n private isNumber(text: string): boolean {\n if (text) {\n const pattern = /^\\d+$/;\n return pattern.test(text);\n }\n return false;\n }\n\n private isLetter(text: string): boolean {\n if (text) {\n const pattern = /^[a-zA-Z]+$/;\n return pattern.test(text);\n }\n return false;\n }\n\n private isUppercaseLetter(text: string): boolean {\n if (text) {\n const pattern = /^[A-Z]+$/;\n return pattern.test(text);\n }\n return false;\n }\n\n private isLowercaseLetter(text: string): boolean {\n if (text) {\n const pattern = /^[a-z]+$/;\n return pattern.test(text);\n }\n return false;\n }\n\n private isSymbol(text: string): boolean {\n if (text) {\n return !this.isNumber(text) && !this.isLetter(text);\n }\n return false;\n }\n\n private getSymbols(text: string): string | undefined {\n let result = '';\n if (text) {\n for (let index = 0; index < text.length; index++) {\n if (this.isSymbol(text[index])) result += text[index];\n }\n }\n if (result.length === 0) return undefined;\n return result;\n }\n\n private getLengthScore(text: string): number {\n if (text) {\n // +(n*9)\n const ratio = 9;\n return this.getLength(text) * ratio;\n }\n return 0;\n }\n private getUppercaseLettersScore(text: string): number {\n if (text) {\n // +((len-n)*2)\n const ratio = 2;\n let n = 0;\n text.split('').forEach((value) => {\n if (this.isUppercaseLetter(value)) {\n n++;\n }\n });\n if (n == 0) {\n return 0;\n }\n return (this.getLength(text) - n) * ratio;\n }\n return 0;\n }\n private getLowercaseLettersScore(text: string): number {\n if (text) {\n // +((len-n)*2)\n const ratio = 2;\n let n = 0;\n text.split('').forEach((value) => {\n if (this.isLowercaseLetter(value)) {\n n++;\n }\n });\n if (n == 0) {\n return 0;\n }\n return (this.getLength(text) - n) * ratio;\n }\n return 0;\n }\n private getNumbersScore(text: string): number {\n if (text) {\n // +((len-n)*4)\n const ratio = 4;\n let n = 0;\n text.split('').forEach((value) => {\n if (this.isNumber(value)) {\n n++;\n }\n });\n if (n == 0) {\n return 0;\n }\n return (this.getLength(text) - n) * ratio;\n }\n return 0;\n }\n private getSymbolsScore(text: string): number {\n if (text) {\n // +((len-n)*6)\n const ratio = 6;\n let n = 0;\n text.split('').forEach((value) => {\n if (this.isSymbol(value)) {\n n++;\n }\n });\n if (n == 0) {\n return 0;\n }\n return (this.getLength(text) - n) * ratio;\n }\n return 0;\n }\n\n private getLettersOnlyScore(text: string): number {\n if (text) {\n // -n\n const ratio = -1;\n if (this.isLetter(text)) {\n return this.getLength(text) * ratio;\n }\n }\n return 0;\n }\n\n private getNumbersOnlyScore(text: string): number {\n if (text) {\n // -n\n const ratio = -1;\n if (this.isNumber(text)) {\n return this.getLength(text) * ratio;\n }\n }\n return 0;\n }\n\n private getConsecutiveUppercaseLettersScore(text: string): number {\n if (text) {\n const pattern = /[A-Z]+/g;\n const results = <RegExpMatchArray>text.match(pattern);\n if (!results) {\n return 0;\n }\n let score = 0;\n const ratio = -2;\n results.forEach((value) => {\n if (this.getLength(value) > 1) {\n // -(n*2)\n score +=\n (this.getLength(value) - 1) *\n /*There is no problem with a character, but the remaining repetition creates the problem.*/\n ratio;\n }\n });\n return score;\n }\n return 0;\n }\n private getConsecutiveLowercaseLettersScore(text: string): number {\n if (text) {\n const pattern = /[a-z]+/g;\n const results = <RegExpMatchArray>text.match(pattern);\n if (!results) {\n return 0;\n }\n let score = 0;\n const ratio = -2;\n results.forEach((value) => {\n if (this.getLength(value) > 1) {\n // -(n*2)\n score +=\n (this.getLength(value) - 1) *\n /*There is no problem with a character, but the remaining repetition creates the problem.*/\n ratio;\n }\n });\n return score;\n }\n return 0;\n }\n private getConsecutiveNumbersScore(text: string): number {\n if (text) {\n const pattern = /[0-9]+/g;\n const results = <RegExpMatchArray>text.match(pattern);\n if (!results) {\n return 0;\n }\n let score = 0;\n const ratio = -2;\n results.forEach((value) => {\n if (this.getLength(value) > 1) {\n // -(n*2)\n score +=\n (this.getLength(value) - 1) *\n /*There is no problem with a character, but the remaining repetition creates the problem.*/\n ratio;\n }\n });\n return score;\n }\n return 0;\n }\n private reverseString(str: string): string {\n return str.split('').reverse().join('');\n }\n\n private sequentialBuilder(text: string, minChunk: number): string[] {\n if (text) {\n const list: string[] = [];\n const len = text.split('').length - minChunk;\n for (let i = 0; i < len; i++) {\n for (let index = 0; index < len; index++) {\n const newText = text.substring(index, text.length);\n const arr = this.chunkString(newText, i + minChunk);\n for (let j = 0; j < arr.length; j++) {\n list.push(arr[j]);\n list.push(this.reverseString(arr[j]));\n }\n }\n }\n const result = this.distinctArray(this.sortByLength(list, minChunk));\n return result;\n }\n return [];\n }\n\n private distinctArray(arr: string[]): string[] {\n const a = [];\n for (let i = 0, l = arr.length; i < l; i++) if (a.indexOf(arr[i]) === -1 && arr[i] !== '') a.push(arr[i]);\n return a;\n }\n\n private sortByLength(arr: string[], limit?: number): string[] {\n arr.sort(function (a, b) {\n return b.length - a.length;\n });\n const list: string[] = [];\n for (let index = 0; index < arr.length; index++) {\n if (limit) {\n if (arr[index].length >= limit) {\n list.push(arr[index]);\n }\n } else {\n list.push(arr[index]);\n }\n }\n return list;\n }\n\n private getSequentialLettersScore(text: string): number {\n const minChunk = 3;\n if (text) {\n const uStr = this.sequentialBuilder(this.uppercaseLetters, minChunk);\n const lStr = this.sequentialBuilder(this.lowercaseLetters, minChunk);\n let score = 0;\n let uTxt = text;\n let lTxt = text;\n uStr.forEach((value) => {\n if (uTxt.indexOf(value) != -1) {\n score += value.length - (minChunk - 1);\n uTxt = uTxt.replace(value, '');\n }\n });\n lStr.forEach((value) => {\n if (lTxt.indexOf(value) != -1) {\n score += value.length - (minChunk - 1);\n lTxt = lTxt.replace(value, '');\n }\n });\n // -(n*3)\n const ratio = -3;\n return score * ratio;\n }\n return 0;\n }\n\n private getSequentialNumbersScore(text: string): number {\n const minChunk = 3;\n if (text) {\n const num = this.sequentialBuilder(this.numbers, minChunk);\n let score = 0;\n let txt = text;\n num.forEach((value) => {\n if (txt.indexOf(value) != -1) {\n score += value.length - (minChunk - 1);\n txt = txt.replace(value, '');\n }\n });\n // -(n*3)\n const ratio = -3;\n return score * ratio;\n }\n return 0;\n }\n\n private getSequentialSymbolsScore(text: string): number {\n const minChunk = 3;\n const sym = this.getSymbols(text);\n if (text && sym) {\n const num = this.sequentialBuilder(sym, minChunk);\n let score = 0;\n let txt = text;\n num.forEach((value) => {\n if (txt.indexOf(value) != -1) {\n score += value.length - (minChunk - 1);\n txt = txt.replace(value, '');\n }\n });\n // -(n*3)\n const ratio = -3;\n return score * ratio;\n }\n return 0;\n }\n\n private getRepeatCharactersScore(text: string): number {\n const pattern = /(.+)(?=.*?\\1)/g;\n if (text) {\n const matches = <RegExpMatchArray>text.match(pattern);\n if (!matches) {\n return 0;\n }\n const maxResultLength = this.sortByLength(matches)[0].length;\n let ratio = 0;\n if (maxResultLength >= 1 && maxResultLength <= 5) ratio = -8;\n if (maxResultLength >= 6 && maxResultLength <= 10) ratio = -5;\n if (maxResultLength >= 11) ratio = -2;\n // (-X * maxRegexResultLength) + (textLength - (maxRegexResultLength *2))\n const score = ratio * maxResultLength + (text.length - maxResultLength * 2);\n return score;\n }\n return 0;\n }\n\n private getRequirementsScore(text: string, ignoreCase: boolean): string[] {\n const req = this.requirements;\n const errors: string[] = [];\n if (req) {\n const minLengthMsg = 'The minimum password length is ' + req.minLength + '.';\n const maxLengthMsg = 'The maximum password length is ' + req.maxLength + '.';\n const uppercaseLettersMinLengthMsg =\n 'You must use at least ' + req.uppercaseLettersMinLength + ' uppercase letter(s).';\n const lowercaseLettersMinLengthMsg =\n 'You must use at least ' + req.lowercaseLettersMinLength + ' lowercase letter(s).';\n const numbersMinLengthMsg = 'You must use at least ' + req.numbersMinLength + ' number(s).';\n const symbolsMinLengthMsg = 'You must use at least ' + req.symbolsMinLength + ' symbol(s).';\n const includeMsg = 'The Password must include all the items specified.';\n const excludeMsg = 'The Password must exclude all the items specified.';\n const startsWithMsg = 'The password must start with ' + req.startsWith + '.';\n const endsWithMsg = 'The password must end with ' + req.endsWith + '.';\n const blackListMsg = 'Your password is in the blacklist.';\n const includeOneMsg = 'The Password must include at least one item specified [' + req.includeOne + '] .';\n\n const uniqueLettersMinLength = 'You must use at least ' + req.uniqueLettersMinLength + ' unique letter(s).';\n\n const upperCount = (text.match(/[A-Z]/g) || []).length;\n const lowerCount = (text.match(/[a-z]/g) || []).length;\n const numbersCount = (text.match(/[0-9]/g) || []).length;\n const symbolsCount = text.length - (upperCount + lowerCount + numbersCount);\n\n if (req.minLength) {\n let val: number;\n let msg = minLengthMsg;\n if (this.isIMessage(req.minLength)) {\n val = <number>req.minLength.value;\n msg = <string>req.minLength.message;\n } else {\n val = <number>req.minLength;\n }\n if (req.minLength && text.length < val) {\n errors.push(msg);\n }\n }\n if (req.maxLength) {\n let val: number;\n let msg = maxLengthMsg;\n if (this.isIMessage(req.maxLength)) {\n val = <number>req.maxLength.value;\n msg = <string>req.maxLength.message;\n } else {\n val = <number>req.maxLength;\n }\n if (req.maxLength && text.length > val) {\n errors.push(msg);\n }\n }\n if (req.startsWith) {\n let val: string;\n let msg = startsWithMsg;\n if (this.isIMessage(req.startsWith)) {\n val = <string>req.startsWith.value;\n msg = <string>req.startsWith.message;\n } else {\n val = <string>req.startsWith;\n }\n if (!this.startsWith(text, val)) {\n errors.push(msg);\n }\n }\n if (req.endsWith) {\n let val: string;\n let msg = endsWithMsg;\n if (this.isIMessage(req.endsWith)) {\n val = <string>req.endsWith.value;\n msg = <string>req.endsWith.message;\n } else {\n val = <string>req.endsWith;\n }\n if (!this.endsWith(text, val)) {\n errors.push(msg);\n }\n }\n\n if (req.uppercaseLettersMinLength) {\n let val: number;\n let msg = uppercaseLettersMinLengthMsg;\n if (this.isIMessage(req.uppercaseLettersMinLength)) {\n val = <number>req.uppercaseLettersMinLength.value;\n msg = <string>req.uppercaseLettersMinLength.message;\n } else {\n val = <number>req.uppercaseLettersMinLength;\n }\n if (val > upperCount) {\n errors.push(msg);\n }\n }\n\n if (req.lowercaseLettersMinLength) {\n let val: number;\n let msg = lowercaseLettersMinLengthMsg;\n if (this.isIMessage(req.lowercaseLettersMinLength)) {\n val = <number>req.lowercaseLettersMinLength.value;\n msg = <string>req.lowercaseLettersMinLength.message;\n } else {\n val = <number>req.lowercaseLettersMinLength;\n }\n if (val > lowerCount) {\n errors.push(msg);\n }\n }\n if (req.numbersMinLength) {\n let val: number;\n let msg = numbersMinLengthMsg;\n if (this.isIMessage(req.numbersMinLength)) {\n val = <number>req.numbersMinLength.value;\n msg = <string>req.numbersMinLength.message;\n } else {\n val = <number>req.numbersMinLength;\n }\n if (val > numbersCount) {\n errors.push(msg);\n }\n }\n if (req.symbolsMinLength) {\n let val: number;\n let msg = symbolsMinLengthMsg;\n if (this.isIMessage(req.symbolsMinLength)) {\n val = <number>req.symbolsMinLength.value;\n msg = <string>req.symbolsMinLength.message;\n } else {\n val = <number>req.symbolsMinLength;\n }\n if (val > symbolsCount) {\n errors.push(msg);\n }\n }\n if (req.uniqueLettersMinLength) {\n let val: number;\n let msg = uniqueLettersMinLength;\n if (this.isIMessage(req.uniqueLettersMinLength)) {\n val = <number>req.uniqueLettersMinLength.value;\n msg = <string>req.uniqueLettersMinLength.message;\n } else {\n val = <number>req.uniqueLettersMinLength;\n }\n const isValid = Array.from(new Set(text.split(''))).length >= val;\n if (req.uniqueLettersMinLength && !isValid) {\n errors.push(msg);\n }\n }\n if (req.include) {\n let val: string[];\n let msg = includeMsg;\n if (this.isIMessage(req.include)) {\n val = <string[]>req.include.value;\n msg = <string>req.include.message;\n } else {\n val = <string[]>req.include;\n }\n if (!this.contains(text, val)) {\n errors.push(msg);\n }\n }\n if (req.exclude) {\n let txt = text;\n let val: string[];\n let msg = excludeMsg;\n if (this.isIMessage(req.exclude)) {\n val = <string[]>req.exclude.value;\n msg = <string>req.exclude.message;\n } else {\n val = <string[]>req.exclude;\n }\n if (ignoreCase) {\n txt = text.toLowerCase();\n val = val.map((v) => v.toLowerCase());\n }\n if (!this.doesNotContains(txt, val)) {\n errors.push(msg);\n }\n }\n\n if (req.blackList) {\n let txt = text;\n let val: string[];\n let msg = blackListMsg;\n if (this.isIMessage(req.blackList)) {\n val = <string[]>req.blackList.value;\n msg = <string>req.blackList.message;\n } else {\n val = <string[]>req.blackList;\n }\n if (ignoreCase) {\n txt = text.toLowerCase();\n val = val.map((v) => v.toLowerCase());\n }\n if (this.isInBlackList(txt, val)) {\n errors.push(msg);\n }\n }\n\n if (req.includeOne) {\n let txt = text;\n let val: string[];\n let msg = includeOneMsg;\n if (this.isIMessage(req.includeOne)) {\n val = <string[]>req.includeOne.value;\n msg = <string>req.includeOne.message;\n } else {\n val = <string[]>req.includeOne;\n }\n if (ignoreCase) {\n txt = text.toLowerCase();\n val = val.map((v) => v.toLowerCase());\n }\n if (!this.containsOne(txt, val)) {\n errors.push(msg);\n }\n }\n\n return errors;\n }\n return [];\n }\n\n public getResults(passwords: string[], ignoreCase = false, skipReq = false): IResult[] {\n const results = [];\n if (passwords && passwords.length > 0) {\n for (let index = 0; index < passwords.length; index++) {\n results.push(this.getResult(passwords[index], ignoreCase, skipReq));\n }\n return results;\n }\n return [];\n }\n\n public getResult(password: string, ignoreCase = false, skipReq = false): IResult {\n if (password) {\n // Requirements\n const req = this.getRequirementsScore(password, ignoreCase);\n if (!skipReq && req.length) {\n return {\n score: -1,\n status: 'needs requirement(s)',\n errors: req,\n percent: 0,\n };\n }\n // Additions\n const len = this.getLengthScore(password);\n const upper = this.getUppercaseLettersScore(password);\n const lower = this.getLowercaseLettersScore(password);\n const num = this.getNumbersScore(password);\n const symbol = this.getSymbolsScore(password);\n // Deductions\n const letterOnly = this.getLettersOnlyScore(password);\n const numberOnly = this.getNumbersOnlyScore(password);\n const repetition = this.getRepeatCharactersScore(password);\n const consecutiveUpper = this.getConsecutiveUppercaseLettersScore(password);\n const consecutiveLower = this.getConsecutiveLowercaseLettersScore(password);\n const consecutiveNumber = this.getConsecutiveNumbersScore(password);\n const seqLetters = this.getSequentialLettersScore(password);\n const seqNumbers = this.getSequentialNumbersScore(password);\n const seqSymbols = this.getSequentialSymbolsScore(password);\n\n const score =\n len +\n upper +\n lower +\n num +\n symbol +\n letterOnly +\n numberOnly +\n repetition +\n consecutiveUpper +\n consecutiveLower +\n consecutiveNumber +\n seqLetters +\n seqNumbers +\n seqSymbols;\n\n const defaultRanges = {\n '40': 'veryWeak', // 001 <= x < 040\n '80': 'weak', // 040 <= x < 080\n '120': 'medium', // 080 <= x < 120\n '180': 'strong', // 120 <= x < 180\n '200': 'veryStrong', // 180 <= x < 200\n _: 'perfect', // >= 200\n };\n let stat = '';\n if (!this.scoreRange) {\n this.scoreRange = defaultRanges;\n }\n\n const range = Object.keys(this.scoreRange).sort(function (a: any, b: any) {\n if (isNaN(a) || isNaN(b)) {\n if (a > b) return 1;\n else return -1;\n }\n return a - b;\n });\n if (range.length < 2) {\n return {\n score: -2,\n status: 'error',\n errors: '\"scoreRange\" must have at least two members.',\n percent: 0,\n };\n }\n for (let index = 0; index < range.length; index++) {\n const key: any = range[index];\n if (key != undefined) {\n if (index == 0) {\n if (this.between(score, 1, parseFloat(range[index]))) {\n stat = this.scoreRange[range[0]];\n break;\n }\n }\n if (index === range.length - 1) {\n if (range[index] == '_') {\n if (this.between(score, parseFloat(range[index - 1]), 1000000000000000000)) {\n stat = this.scoreRange[range[range.length - 1]];\n break;\n }\n } else {\n return {\n score: -2,\n status: 'error',\n errors: 'The last member of the \"scoreRange\" must be \"_\".',\n percent: 0,\n };\n }\n }\n if (this.between(score, parseFloat(range[index - 1]), parseFloat(range[index]))) {\n stat = this.scoreRange[range[index]];\n break;\n }\n }\n }\n const percent = (score * 100) / parseFloat(range[range.length - 2]);\n\n let data = {\n score: score,\n status: stat,\n percent: percent >= 100 ? 100 : percent,\n };\n\n if (skipReq) {\n data = Object.assign(data, { errors: req });\n }\n\n return data;\n }\n return {\n score: 0,\n status: 'Empty',\n percent: 0,\n };\n }\n}\n"],"names":[],"mappings":"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