Sha256: cb43b77ef6004e137ae417179742df748ebf95b3b6094e184dff7cab70dff816

Contents?: true

Size: 1.51 KB

Versions: 1

Compression:

Stored size: 1.51 KB

Contents

require 'pwm/version'

module Pwm
  # Internal: The exception raised when a requested password length is
  # too short.
  class TooShortException < Exception; end

  # Internal: The set of characters from which passwords will be assembled.
  # This could be overridden if you don't like the default.
  #
  # Returns the set of characters as an Array.
  def self.characters
    (('A'..'Z').to_a  + ('a'..'z').to_a + ('2'..'9').to_a) - %w(I O l)
  end

  # Public: Generate a password.
  #
  # length - The length of the password. Minimum is 8. Default is 16.
  #
  # Examples
  #
  #   Pwm.password
  #   # => 'SPdHeZnn9rut4AUz'
  #
  #   Pwm.password(8)
  #   # => 'oUX4fmqr'
  #
  # Returns the generated password as a String if length >= 8,
  # or raises exception if length < 8.
  def self.password(length = 16)
    fail Pwm::TooShortException, "#{length} is too short." if length < 8
    password = ''
    until acceptable?(password)
      password = (0..length - 1).reduce('') do |pw, n|
        pw + characters[rand(characters.length)]
      end
    end
    password
  end

  private

  # Private: Checks if a password is acceptable.
  #
  # password - the password to check
  #
  # Examples
  #
  #   Pwm.acceptable?('AaBbCc1234')
  #   # => true
  #
  #   Pwm.acceptable?('ABCDEFGHIJ')
  #   # => false
  #
  # Returns true if password has at least one of each required character
  # class, or false if not.
  def self.acceptable?(password)
    password.match(/[A-Z]/) &&
    password.match(/[a-z]/) &&
    password.match(/[0-9]/)
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
pwm-1.2.2 lib/pwm.rb