module Devise::Models::PamAuthenticatable::ClassMethods

Public Instance Methods

authenticate_with_pam(attributes = {}) click to toggle source
# File lib/devise_pam_authenticatable/model.rb, line 100
def authenticate_with_pam(attributes = {})
  return nil unless attributes[:password]

  return nil unless (resource = pam_get_user(attributes))

  # potential conflict detected
  resource = resource.pam_conflict(attributes) if resource.pam_conflict?

  return nil unless resource && resource.try(:pam_authentication, attributes[:password], attributes[:request])
  if resource.new_record?
    resource.pam_setup(attributes)
    resource.save!
  end
  resource
end
pam_get_user(attributes = {}) click to toggle source
# File lib/devise_pam_authenticatable/model.rb, line 65
def pam_get_user(attributes = {})
  if ::Devise.usernamefield && attributes[:username]
    resource = find_by(::Devise.usernamefield => attributes[:username])

    if resource.blank?
      resource = new(::Devise.usernamefield => attributes[:username])
    end
    resource
  elsif ::Devise.emailfield && attributes[:email]
    resource =
      if ::Devise.check_at_sign && ::Devise.usernamefield && !attributes[:email].index('@')
        find_by(::Devise.usernamefield => attributes[:email])
      else
        find_by(::Devise.emailfield => attributes[:email])
      end

    if resource.blank?
      resource = new
      if ::Devise.check_at_sign && !attributes[:email].index('@')
        if ::Devise.usernamefield
          # use email as username
          resource[::Devise.usernamefield] = attributes[:email]
        end
        if (email = Rpam2.getenv(resource.find_pam_service, attributes[:email], attributes[:password], 'email', false))
          # set email if found in pam
          resource[::Devise.emailfield] = email
        end
      else
        resource[::Devise.emailfield] = attributes[:email]
      end
    end
    resource
  end
end