99 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			99 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
	
	
| "use strict";
 | |
| 
 | |
| Object.defineProperty(exports, "__esModule", {
 | |
|   value: true
 | |
| });
 | |
| exports.default = isStrongPassword;
 | |
| var _merge = _interopRequireDefault(require("./util/merge"));
 | |
| var _assertString = _interopRequireDefault(require("./util/assertString"));
 | |
| function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
 | |
| var upperCaseRegex = /^[A-Z]$/;
 | |
| var lowerCaseRegex = /^[a-z]$/;
 | |
| var numberRegex = /^[0-9]$/;
 | |
| var symbolRegex = /^[-#!$@£%^&*()_+|~=`{}\[\]:";'<>?,.\/\\ ]$/;
 | |
| var defaultOptions = {
 | |
|   minLength: 8,
 | |
|   minLowercase: 1,
 | |
|   minUppercase: 1,
 | |
|   minNumbers: 1,
 | |
|   minSymbols: 1,
 | |
|   returnScore: false,
 | |
|   pointsPerUnique: 1,
 | |
|   pointsPerRepeat: 0.5,
 | |
|   pointsForContainingLower: 10,
 | |
|   pointsForContainingUpper: 10,
 | |
|   pointsForContainingNumber: 10,
 | |
|   pointsForContainingSymbol: 10
 | |
| };
 | |
| 
 | |
| /* Counts number of occurrences of each char in a string
 | |
|  * could be moved to util/ ?
 | |
| */
 | |
| function countChars(str) {
 | |
|   var result = {};
 | |
|   Array.from(str).forEach(function (char) {
 | |
|     var curVal = result[char];
 | |
|     if (curVal) {
 | |
|       result[char] += 1;
 | |
|     } else {
 | |
|       result[char] = 1;
 | |
|     }
 | |
|   });
 | |
|   return result;
 | |
| }
 | |
| 
 | |
| /* Return information about a password */
 | |
| function analyzePassword(password) {
 | |
|   var charMap = countChars(password);
 | |
|   var analysis = {
 | |
|     length: password.length,
 | |
|     uniqueChars: Object.keys(charMap).length,
 | |
|     uppercaseCount: 0,
 | |
|     lowercaseCount: 0,
 | |
|     numberCount: 0,
 | |
|     symbolCount: 0
 | |
|   };
 | |
|   Object.keys(charMap).forEach(function (char) {
 | |
|     /* istanbul ignore else */
 | |
|     if (upperCaseRegex.test(char)) {
 | |
|       analysis.uppercaseCount += charMap[char];
 | |
|     } else if (lowerCaseRegex.test(char)) {
 | |
|       analysis.lowercaseCount += charMap[char];
 | |
|     } else if (numberRegex.test(char)) {
 | |
|       analysis.numberCount += charMap[char];
 | |
|     } else if (symbolRegex.test(char)) {
 | |
|       analysis.symbolCount += charMap[char];
 | |
|     }
 | |
|   });
 | |
|   return analysis;
 | |
| }
 | |
| function scorePassword(analysis, scoringOptions) {
 | |
|   var points = 0;
 | |
|   points += analysis.uniqueChars * scoringOptions.pointsPerUnique;
 | |
|   points += (analysis.length - analysis.uniqueChars) * scoringOptions.pointsPerRepeat;
 | |
|   if (analysis.lowercaseCount > 0) {
 | |
|     points += scoringOptions.pointsForContainingLower;
 | |
|   }
 | |
|   if (analysis.uppercaseCount > 0) {
 | |
|     points += scoringOptions.pointsForContainingUpper;
 | |
|   }
 | |
|   if (analysis.numberCount > 0) {
 | |
|     points += scoringOptions.pointsForContainingNumber;
 | |
|   }
 | |
|   if (analysis.symbolCount > 0) {
 | |
|     points += scoringOptions.pointsForContainingSymbol;
 | |
|   }
 | |
|   return points;
 | |
| }
 | |
| function isStrongPassword(str) {
 | |
|   var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
 | |
|   (0, _assertString.default)(str);
 | |
|   var analysis = analyzePassword(str);
 | |
|   options = (0, _merge.default)(options || {}, defaultOptions);
 | |
|   if (options.returnScore) {
 | |
|     return scorePassword(analysis, options);
 | |
|   }
 | |
|   return analysis.length >= options.minLength && analysis.lowercaseCount >= options.minLowercase && analysis.uppercaseCount >= options.minUppercase && analysis.numberCount >= options.minNumbers && analysis.symbolCount >= options.minSymbols;
 | |
| }
 | |
| module.exports = exports.default;
 | |
| module.exports.default = exports.default; |