Sha256: 9c5499cd913b8880f0ed365e1a8e7157518124a947b5b2140e12026e38bd4040

Contents?: true

Size: 1.38 KB

Versions: 1

Compression:

Stored size: 1.38 KB

Contents

module DeviseRemoteUser

  #
  # The Manager class is responsible for connecting the appliation's User
  # class with remote user information in the request environment.
  #
  class Manager

    attr_reader :klass, :env

    def initialize(klass, env)
      @klass = klass
      @env = env
    end

    def find_or_create_user
      user = find_user
      if !user && DeviseRemoteUser.auto_create
        user = create_user
      end
      update_user(user) if user && DeviseRemoteUser.auto_update
      user
    end

    def find_user
      klass.where(user_criterion).first
    end

    def create_user
      unless Devise.mappings[:user].strategies.include?(:database_authenticatable)
        return klass.create(user_criterion)
      end

      random_password = SecureRandom.hex(16)
      attrs = user_criterion.merge({password: random_password, password_confirmation: random_password})
      klass.create(attrs)
    end

    def update_user(user)
      user.update_attributes(remote_user_attributes)
    end

    protected

    def remote_user_attributes
      DeviseRemoteUser.attribute_map.inject({}) { |h, (k, v)| h[k] = env[v] if env.has_key?(v); h }
    end

    def user_criterion
      {auth_key => remote_user_id}
    end

    def remote_user_id
      DeviseRemoteUser.remote_user_id(env)
    end

    def auth_key
      DeviseRemoteUser.auth_key || Devise.authentication_keys.first
    end

  end

end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
devise-remote-user-1.0.0 lib/devise_remote_user/manager.rb