Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
Size: Mime:
# frozen_string_literal: true

module Sinatra
  module Impersonate
    # Delegator to an RBAC::User class
    class Impersonator < SimpleDelegator
      attr_reader :actual_user

      def initialize(session)
        @session = session
        @actual_user = RBAC.user(@session[:username])
        @valid_targets = []
        super(@actual_user)
      end

      def valid_targets(valid_targets)
        @valid_targets = valid_targets
        if impersonating? && can_impersonate?(impersonating)
          __setobj__ RBAC.user(impersonating)
        else
          stop_impersonating
        end
      end

      def impersonating?
        return false if @valid_targets.empty?

        @session.key? :impersonating
      end

      def impersonating
        @session[:impersonating] if impersonating?
      end

      def impersonate(username)
        @session[:impersonating] = username if can_impersonate?(username)
      end

      def can_impersonate?(username = nil)
        has_permission = @actual_user.allowed_to? Sinatra::Impersonate.configuration.permission
        return has_permission if username.nil? || !has_permission

        @valid_targets.include? username
      end

      def stop_impersonating
        @session.delete(:impersonating)
      end
    end
  end
end