Class: Omnizip::Password::PasswordValidator

Inherits:
Object
  • Object
show all
Defined in:
lib/omnizip/password/password_validator.rb

Overview

Validates password strength and requirements

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(min_length: 8, require_uppercase: false, require_lowercase: false, require_numbers: false, require_special: false) ⇒ PasswordValidator

Initialize password validator

Parameters:

  • min_length (Integer) (defaults to: 8)

    Minimum password length

  • require_uppercase (Boolean) (defaults to: false)

    Require uppercase letters

  • require_lowercase (Boolean) (defaults to: false)

    Require lowercase letters

  • require_numbers (Boolean) (defaults to: false)

    Require numbers

  • require_special (Boolean) (defaults to: false)

    Require special characters



16
17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/omnizip/password/password_validator.rb', line 16

def initialize(
  min_length: 8,
  require_uppercase: false,
  require_lowercase: false,
  require_numbers: false,
  require_special: false
)
  @min_length = min_length
  @require_uppercase = require_uppercase
  @require_lowercase = require_lowercase
  @require_numbers = require_numbers
  @require_special = require_special
end

Instance Attribute Details

#min_lengthObject (readonly)

Returns the value of attribute min_length.



7
8
9
# File 'lib/omnizip/password/password_validator.rb', line 7

def min_length
  @min_length
end

#require_lowercaseObject (readonly)

Returns the value of attribute require_lowercase.



7
8
9
# File 'lib/omnizip/password/password_validator.rb', line 7

def require_lowercase
  @require_lowercase
end

#require_numbersObject (readonly)

Returns the value of attribute require_numbers.



7
8
9
# File 'lib/omnizip/password/password_validator.rb', line 7

def require_numbers
  @require_numbers
end

#require_specialObject (readonly)

Returns the value of attribute require_special.



7
8
9
# File 'lib/omnizip/password/password_validator.rb', line 7

def require_special
  @require_special
end

#require_uppercaseObject (readonly)

Returns the value of attribute require_uppercase.



7
8
9
# File 'lib/omnizip/password/password_validator.rb', line 7

def require_uppercase
  @require_uppercase
end

Instance Method Details

#strength(password) ⇒ Integer

Get password strength score (0-100)

Parameters:

  • password (String)

    Password to score

Returns:

  • (Integer)

    Strength score



60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/omnizip/password/password_validator.rb', line 60

def strength(password)
  return 0 if password.nil? || password.empty?

  score = 0

  # Length score (up to 40 points)
  score += [password.length * 4, 40].min

  # Character variety (up to 60 points)
  score += 15 if /[a-z]/.match?(password)
  score += 15 if /[A-Z]/.match?(password)
  score += 15 if /[0-9]/.match?(password)
  score += 15 if /[^a-zA-Z0-9]/.match?(password)

  [score, 100].min
end

#strength_label(password) ⇒ Symbol

Get password strength label

Parameters:

  • password (String)

    Password to evaluate

Returns:

  • (Symbol)

    Strength label (:weak, :fair, :good, :strong)



80
81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/omnizip/password/password_validator.rb', line 80

def strength_label(password)
  score = strength(password)

  case score
  when 0...30
    :weak
  when 30...50
    :fair
  when 50...75
    :good
  else
    :strong
  end
end

#valid?(password) ⇒ Boolean

Check if password is valid (without raising)

Parameters:

  • password (String)

    Password to check

Returns:

  • (Boolean)

    True if valid



50
51
52
53
54
55
# File 'lib/omnizip/password/password_validator.rb', line 50

def valid?(password)
  validate(password)
  true
rescue ArgumentError
  false
end

#validate(password) ⇒ Boolean

Validate password

Parameters:

  • password (String)

    Password to validate

Returns:

  • (Boolean)

    True if valid

Raises:

  • (ArgumentError)

    If password is invalid



34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/omnizip/password/password_validator.rb', line 34

def validate(password)
  raise ArgumentError, "Password cannot be nil" if password.nil?
  raise ArgumentError, "Password cannot be empty" if password.empty?

  check_length(password)
  check_uppercase(password) if require_uppercase
  check_lowercase(password) if require_lowercase
  check_numbers(password) if require_numbers
  check_special(password) if require_special

  true
end