|
| 1 | +# frozen_string_literal: true |
| 2 | + |
| 3 | +module CognitoRails |
| 4 | + class PasswordGenerator |
| 5 | + NUMERIC = (0..9).to_a.freeze |
| 6 | + LOWER_CASE = ('a'..'z').to_a.freeze |
| 7 | + UPPER_CASE = ('A'..'Z').to_a.freeze |
| 8 | + SPECIAL = [ |
| 9 | + '^', '$', '*', '.', '[', ']', '{', '}', |
| 10 | + '(', ')', '?', '"', '!', '@', '#', '%', |
| 11 | + '&', '/', '\\', ',', '>', '<', "'", ':', |
| 12 | + ';', '|', '_', '~', '`', '=', '+', '-' |
| 13 | + ].freeze |
| 14 | + |
| 15 | + # Generates a random password given a length range |
| 16 | + # |
| 17 | + # @param range [Range] |
| 18 | + # @return [String] |
| 19 | + def self.generate(range = 8..16) |
| 20 | + password_length = rand(range) |
| 21 | + numeric_count = rand(1..(password_length-3)) |
| 22 | + |
| 23 | + lower_case_count = rand(1..(password_length-(numeric_count+2))) |
| 24 | + upper_case_count = rand(1..(password_length-(numeric_count + lower_case_count + 1))) |
| 25 | + special_count = password_length-(numeric_count + lower_case_count + upper_case_count) |
| 26 | + |
| 27 | + numeric_characters = numeric_count.times.map { NUMERIC.sample } |
| 28 | + lower_case_characters = lower_case_count.times.map { LOWER_CASE.sample } |
| 29 | + upper_case_characters = upper_case_count.times.map { UPPER_CASE.sample } |
| 30 | + special_characters = special_count.times.map { SPECIAL.sample } |
| 31 | + |
| 32 | + (numeric_characters + lower_case_characters + upper_case_characters + special_characters).shuffle.join |
| 33 | + end |
| 34 | + end |
| 35 | +end |
0 commit comments