Sha256: ff02ec67dd0ee45cae006b7179eb31e576f12baa1640b80e13d9c7cf8388965c

Contents?: true

Size: 1.89 KB

Versions: 6

Compression:

Stored size: 1.89 KB

Contents

# frozen_string_literal: true

require 'bcrypt'
require 'ditty/models/base'
require 'omniauth-identity'
require 'active_support'
require 'active_support/core_ext/object/blank'

module Ditty
  class Identity < ::Sequel::Model
    include ::Ditty::Base
    many_to_one :user

    attr_accessor :password, :password_confirmation

    # OmniAuth Related
    include OmniAuth::Identity::Model

    def self.locate(conditions)
      where(conditions).first
    end

    def authenticate(unencrypted)
      return false if crypted_password.blank?
      self if ::BCrypt::Password.new(crypted_password) == unencrypted
    end

    def persisted?
      !new? && @destroyed != true
    end

    # Return whatever we want to pass to the omniauth hash here
    def info
      {
        email: username
      }
    end

    # Validation
    def validate
      validates_presence :username
      unless username.blank?
        validates_unique :username
        validates_format(/\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i, :username)
      end

      if password_required
        validates_presence :password
        validates_presence :password_confirmation
        validates_format(
          # 1 Uppercase
          # 1 lowercase
          # 1 Special Character
          # 1 Number
          # At least 8 characters
          %r[\A(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#&$*)(}{%^=_+|\\:";'<>,.\-\/?\[\]])(?=.*[0-9]).{8,}\Z],
          :password,
          message: 'is not strong enough'
        )
      end

      errors.add(:password_confirmation, 'must match password') if !password.blank? && password != password_confirmation
    end

    # Callbacks
    def before_save
      encrypt_password unless password == '' || password.nil?
    end

    private

    def encrypt_password
      self.crypted_password = ::BCrypt::Password.create(password)
    end

    def password_required
      crypted_password.blank? || !password.blank?
    end
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
ditty-0.7.2 lib/ditty/models/identity.rb
ditty-0.7.1 lib/ditty/models/identity.rb
ditty-0.7.0 lib/ditty/models/identity.rb
ditty-0.7.0.pre.rc1 lib/ditty/models/identity.rb
ditty-0.6.0 lib/ditty/models/identity.rb
ditty-0.4.1 lib/ditty/models/identity.rb