Sha256: 52ed466a8792584abade589514db9b295f642a2e56087457e9072a7c89ec187f

Contents?: true

Size: 1.66 KB

Versions: 1

Compression:

Stored size: 1.66 KB

Contents

module Auther
  class Gatekeeper
    attr_reader :application, :settings

    def initialize application, settings = []
      @application = application
      @settings = settings
    end

    def call env
      session = env.fetch "rack.session"
      request_path = env["PATH_INFO"]

      if authorized?(env, request_path)
        application.call env
      else
        session[Auther::Keymaster.redirect_url_key] = request_path
        response = Rack::Response.new
        response.redirect settings[:auth_url]
        response.finish
      end
    end

    private

    def find_account env
      session = env.fetch "rack.session"
      session["auther_init"] = true # Force session to initialize.
      account_name = Auther::Keymaster.get_account_name session
      settings.fetch(:accounts).select { |account| account.fetch(:name) == account_name }.first
    end

    def blacklisted_path? path
      blacklisted_paths = settings.fetch(:accounts).map {|account| account.fetch :paths }.flatten
      blacklisted_paths.map { |blacklisted_path| path.include? blacklisted_path }.any?
    end

    def blacklisted_account? account, path
      account.fetch(:paths).include? path
    end

    def authenticated? env, account
      session = env.fetch "rack.session"
      keymaster = Auther::Keymaster.new account.fetch(:name)
      session[keymaster.login_key] == account.fetch(:login) && session[keymaster.password_key] == account.fetch(:password)
    end

    def authorized? env, path
      if blacklisted_path?(path)
        account = find_account env
        account && authenticated?(env, account) && !blacklisted_account?(account, path)
      else
        true
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
auther-0.1.0 lib/auther/gatekeeper.rb