hydra-access-controls 5.0.0.pre13 → 5.0.0.pre14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
| @@ -1,9 +1,20 @@ | |
| 1 | 
            -
            # will move to lib/hydra/access_control folder/namespace in release 5.x
         | 
| 2 1 | 
             
            module Hydra::AccessControlsEnforcement
         | 
| 3 2 | 
             
              extend ActiveSupport::Concern
         | 
| 4 | 
            -
              
         | 
| 3 | 
            +
              extend Deprecation 
         | 
| 4 | 
            +
              self.deprecation_horizon = "hydra-access-controls 6.0"
         | 
| 5 | 
            +
             | 
| 5 6 | 
             
              included do
         | 
| 6 7 | 
             
                include Hydra::AccessControlsEvaluation
         | 
| 8 | 
            +
                class_attribute :solr_access_filters_logic
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                # Set defaults. Each symbol identifies a _method_ that must be in
         | 
| 11 | 
            +
                # this class, taking one parameter (permission_types)
         | 
| 12 | 
            +
                # Can be changed in local apps or by plugins, eg:
         | 
| 13 | 
            +
                # CatalogController.include ModuleDefiningNewMethod
         | 
| 14 | 
            +
                # CatalogController.solr_access_filters_logic += [:new_method]
         | 
| 15 | 
            +
                # CatalogController.solr_access_filters_logic.delete(:we_dont_want)
         | 
| 16 | 
            +
                self.solr_access_filters_logic = [:apply_role_permissions, :apply_individual_permissions, :apply_superuser_permissions ]
         | 
| 17 | 
            +
             | 
| 7 18 | 
             
              end
         | 
| 8 19 |  | 
| 9 20 | 
             
              #
         | 
| @@ -77,6 +88,7 @@ module Hydra::AccessControlsEnforcement | |
| 77 88 | 
             
              # If someone hits the show action while their session's viewing_context is in edit mode, 
         | 
| 78 89 | 
             
              # this will redirect them to the edit action.
         | 
| 79 90 | 
             
              # If they do not have sufficient privileges to edit documents, it will silently switch their session to browse mode.
         | 
| 91 | 
            +
              # @deprecated this is a vestige of the old workflow, which is being removed from hydra-head
         | 
| 80 92 | 
             
              def enforce_viewing_context_for_show_requests
         | 
| 81 93 | 
             
                if params[:viewing_context] == "browse"
         | 
| 82 94 | 
             
                  session[:viewing_context] = params[:viewing_context]
         | 
| @@ -93,6 +105,7 @@ module Hydra::AccessControlsEnforcement | |
| 93 105 | 
             
                  end
         | 
| 94 106 | 
             
                end
         | 
| 95 107 | 
             
              end
         | 
| 108 | 
            +
              deprecation_deprecate :enforce_viewing_context_for_show_requests
         | 
| 96 109 |  | 
| 97 110 | 
             
              #
         | 
| 98 111 | 
             
              # Action-specific enforcement
         | 
| @@ -106,7 +119,7 @@ module Hydra::AccessControlsEnforcement | |
| 106 119 | 
             
                  if @permissions_solr_document["embargo_release_date_dt"] 
         | 
| 107 120 | 
             
                    embargo_date = Date.parse(@permissions_solr_document["embargo_release_date_dt"].split(/T/)[0])
         | 
| 108 121 | 
             
                    if embargo_date > Date.parse(Time.now.to_s)
         | 
| 109 | 
            -
                      unless  | 
| 122 | 
            +
                      unless can?(:edit, params[:id])
         | 
| 110 123 | 
             
                        raise Hydra::AccessDenied.new("This item is under embargo.  You do not have sufficient access privileges to read this document.", :edit, params[:id])
         | 
| 111 124 | 
             
                      end
         | 
| 112 125 | 
             
                    end
         | 
| @@ -201,10 +214,8 @@ module Hydra::AccessControlsEnforcement | |
| 201 214 | 
             
                end
         | 
| 202 215 |  | 
| 203 216 | 
             
                # Grant access based on user id & role
         | 
| 204 | 
            -
                 | 
| 205 | 
            -
                  user_access_filters +=  | 
| 206 | 
            -
                  user_access_filters += apply_individual_permissions(permission_types)
         | 
| 207 | 
            -
                  user_access_filters += apply_superuser_permissions(permission_types)
         | 
| 217 | 
            +
                solr_access_filters_logic.each do |method_name|
         | 
| 218 | 
            +
                  user_access_filters += send(method_name, permission_types)
         | 
| 208 219 | 
             
                end
         | 
| 209 220 | 
             
                solr_parameters[:fq] << user_access_filters.join(" OR ")
         | 
| 210 221 | 
             
                logger.debug("Solr parameters: #{ solr_parameters.inspect }")
         | 
| @@ -213,7 +224,7 @@ module Hydra::AccessControlsEnforcement | |
| 213 224 | 
             
              def apply_role_permissions(permission_types)
         | 
| 214 225 | 
             
                  # for roles
         | 
| 215 226 | 
             
                  user_access_filters = []
         | 
| 216 | 
            -
                   | 
| 227 | 
            +
                  current_ability.user_groups(current_user, session).each_with_index do |role, i|
         | 
| 217 228 | 
             
                    permission_types.each do |type|
         | 
| 218 229 | 
             
                      user_access_filters << "#{type}_access_group_t:#{role}"
         | 
| 219 230 | 
             
                    end
         | 
| @@ -12,7 +12,7 @@ module Hydra::PolicyAwareAccessControlsEnforcement | |
| 12 12 | 
             
                end
         | 
| 13 13 | 
             
              end
         | 
| 14 14 |  | 
| 15 | 
            -
              # returns solr query for finding all objects whose policies grant discover access to  | 
| 15 | 
            +
              # returns solr query for finding all objects whose policies grant discover access to current_user
         | 
| 16 16 | 
             
              def policy_clauses 
         | 
| 17 17 | 
             
                policy_pids = policies_with_access
         | 
| 18 18 | 
             
                return nil if policy_pids.empty?
         | 
| @@ -23,13 +23,11 @@ module Hydra::PolicyAwareAccessControlsEnforcement | |
| 23 23 | 
             
              # find all the policies that grant discover/read/edit permissions to this user or any of it's groups
         | 
| 24 24 | 
             
              def policies_with_access
         | 
| 25 25 | 
             
                #### TODO -- Memoize this and put it in the session?
         | 
| 26 | 
            -
                return [] unless  | 
| 26 | 
            +
                return [] unless current_user
         | 
| 27 27 | 
             
                user_access_filters = []
         | 
| 28 28 | 
             
                # Grant access based on user id & role
         | 
| 29 | 
            -
                 | 
| 30 | 
            -
             | 
| 31 | 
            -
                  user_access_filters += apply_policy_individual_permissions(discovery_permissions)
         | 
| 32 | 
            -
                end
         | 
| 29 | 
            +
                user_access_filters += apply_policy_role_permissions(discovery_permissions)
         | 
| 30 | 
            +
                user_access_filters += apply_policy_individual_permissions(discovery_permissions)
         | 
| 33 31 | 
             
                result = policy_class.find_with_conditions( user_access_filters.join(" OR "), :fl => "id" )
         | 
| 34 32 | 
             
                logger.debug "get policies: #{result}\n\n"
         | 
| 35 33 | 
             
                result.map {|h| h['id']}
         | 
| @@ -39,7 +37,7 @@ module Hydra::PolicyAwareAccessControlsEnforcement | |
| 39 37 | 
             
              def apply_policy_role_permissions(permission_types)
         | 
| 40 38 | 
             
                  # for roles
         | 
| 41 39 | 
             
                  user_access_filters = []
         | 
| 42 | 
            -
                   | 
| 40 | 
            +
                  current_ability.user_groups(current_user, session).each_with_index do |role, i|
         | 
| 43 41 | 
             
                    discovery_permissions.each do |type|
         | 
| 44 42 | 
             
                      user_access_filters << "inheritable_#{type}_access_group_t:#{role}"
         | 
| 45 43 | 
             
                    end
         | 
    
        data/spec/support/user.rb
    CHANGED
    
    
| @@ -1,5 +1,6 @@ | |
| 1 1 | 
             
            require 'spec_helper'
         | 
| 2 | 
            -
            # Need way to find way to stub  | 
| 2 | 
            +
            # Need way to find way to stub current_user and RoleMapper in order to run these tests
         | 
| 3 | 
            +
            require 'ability'
         | 
| 3 4 |  | 
| 4 5 | 
             
            describe Hydra::AccessControlsEnforcement do
         | 
| 5 6 | 
             
              before(:all) do
         | 
| @@ -7,8 +8,12 @@ describe Hydra::AccessControlsEnforcement do | |
| 7 8 | 
             
                  include Hydra::AccessControlsEnforcement
         | 
| 8 9 | 
             
                  attr_accessor :params
         | 
| 9 10 |  | 
| 11 | 
            +
                  def current_ability
         | 
| 12 | 
            +
                    @current_ability ||= Ability.new(current_user)
         | 
| 13 | 
            +
                  end
         | 
| 14 | 
            +
             | 
| 10 15 | 
             
                  def user_key
         | 
| 11 | 
            -
                     | 
| 16 | 
            +
                    current_user.user_key
         | 
| 12 17 | 
             
                  end
         | 
| 13 18 |  | 
| 14 19 | 
             
                  def session
         | 
| @@ -24,7 +29,7 @@ describe Hydra::AccessControlsEnforcement do | |
| 24 29 | 
             
                end
         | 
| 25 30 | 
             
                context "Given I am not logged in" do
         | 
| 26 31 | 
             
                  before do
         | 
| 27 | 
            -
                    subject.stub(: | 
| 32 | 
            +
                    subject.stub(:current_user).and_return(User.new(:new_record=>true))
         | 
| 28 33 | 
             
                    subject.send(:apply_gated_discovery, @solr_parameters, @user_parameters)
         | 
| 29 34 | 
             
                  end
         | 
| 30 35 | 
             
                  it "Then I should be treated as a member of the 'public' group" do
         | 
| @@ -44,7 +49,7 @@ describe Hydra::AccessControlsEnforcement do | |
| 44 49 | 
             
                    User.stub(:find_by_user_key).and_return(@user)
         | 
| 45 50 | 
             
                    # This is a pretty fragile way to stub it...
         | 
| 46 51 | 
             
                    RoleMapper.stub(:byname).and_return(@user.user_key=>["faculty", "africana-faculty"])
         | 
| 47 | 
            -
                    subject.stub(: | 
| 52 | 
            +
                    subject.stub(:current_user).and_return(@user)
         | 
| 48 53 | 
             
                    subject.send(:apply_gated_discovery, @solr_parameters, @user_parameters)
         | 
| 49 54 | 
             
                  end
         | 
| 50 55 | 
             
                  it "Then I should be treated as a member of the 'public' and 'registered' groups" do
         | 
| @@ -86,7 +91,7 @@ describe Hydra::AccessControlsEnforcement do | |
| 86 91 | 
             
                it "should allow a user w/ edit permissions to view an embargoed object" do
         | 
| 87 92 | 
             
                  user = User.new :uid=>'testuser@example.com'
         | 
| 88 93 | 
             
                  RoleMapper.stub(:roles).with(user.user_key).and_return(["archivist"])
         | 
| 89 | 
            -
                  subject.stub(: | 
| 94 | 
            +
                  subject.stub(:current_user).and_return(user)
         | 
| 90 95 | 
             
                  subject.should_receive(:can?).with(:edit, nil).and_return(true)
         | 
| 91 96 | 
             
                  subject.stub(:can?).with(:read, nil).and_return(true)
         | 
| 92 97 | 
             
                  subject.instance_variable_set :@permissions_solr_document, SolrDocument.new({"edit_access_person_t"=>["testuser@example.com"], "embargo_release_date_dt"=>(Date.parse(Time.now.to_s)+2).to_s})
         | 
| @@ -98,7 +103,7 @@ describe Hydra::AccessControlsEnforcement do | |
| 98 103 | 
             
                it "should prevent a user w/o edit permissions from viewing an embargoed object" do
         | 
| 99 104 | 
             
                  user = User.new :uid=>'testuser@example.com'
         | 
| 100 105 | 
             
                  RoleMapper.stub(:roles).with(user.user_key).and_return([])
         | 
| 101 | 
            -
                  subject.stub(: | 
| 106 | 
            +
                  subject.stub(:current_user).and_return(user)
         | 
| 102 107 | 
             
                  subject.should_receive(:can?).with(:edit, nil).and_return(false)
         | 
| 103 108 | 
             
                  subject.stub(:can?).with(:read, nil).and_return(true)
         | 
| 104 109 | 
             
                  subject.params = {}
         | 
| @@ -111,7 +116,7 @@ describe Hydra::AccessControlsEnforcement do | |
| 111 116 | 
             
                before(:each) do
         | 
| 112 117 | 
             
                  @stub_user = User.new :uid=>'archivist1@example.com'
         | 
| 113 118 | 
             
                  RoleMapper.stub(:roles).with(@stub_user.user_key).and_return(["archivist","researcher"])
         | 
| 114 | 
            -
                  subject.stub(: | 
| 119 | 
            +
                  subject.stub(:current_user).and_return(@stub_user)
         | 
| 115 120 | 
             
                  @solr_parameters = {}
         | 
| 116 121 | 
             
                  @user_parameters = {}
         | 
| 117 122 | 
             
                end
         | 
| @@ -133,7 +138,7 @@ describe Hydra::AccessControlsEnforcement do | |
| 133 138 | 
             
              describe "exclude_unwanted_models" do
         | 
| 134 139 | 
             
                before(:each) do
         | 
| 135 140 | 
             
                  stub_user = User.new :uid=>'archivist1@example.com'
         | 
| 136 | 
            -
                  subject.stub(: | 
| 141 | 
            +
                  subject.stub(:current_user).and_return(stub_user)
         | 
| 137 142 | 
             
                  @solr_parameters = {}
         | 
| 138 143 | 
             
                  @user_parameters = {}
         | 
| 139 144 | 
             
                end
         | 
| @@ -147,7 +152,7 @@ describe Hydra::AccessControlsEnforcement do | |
| 147 152 | 
             
                describe "when the user is a guest user (user key nil)" do
         | 
| 148 153 | 
             
                  before do
         | 
| 149 154 | 
             
                    stub_user = User.new
         | 
| 150 | 
            -
                    subject.stub(: | 
| 155 | 
            +
                    subject.stub(:current_user).and_return(stub_user)
         | 
| 151 156 | 
             
                  end
         | 
| 152 157 | 
             
                  it "should not create filters" do
         | 
| 153 158 | 
             
                    subject.send(:apply_individual_permissions, ["edit","discover","read"]).should == []
         | 
| @@ -8,7 +8,7 @@ describe Hydra::PolicyAwareAccessControlsEnforcement do | |
| 8 8 | 
             
                  attr_accessor :params
         | 
| 9 9 |  | 
| 10 10 | 
             
                  def user_key
         | 
| 11 | 
            -
                     | 
| 11 | 
            +
                    current_user.user_key
         | 
| 12 12 | 
             
                  end
         | 
| 13 13 |  | 
| 14 14 | 
             
                  def session
         | 
| @@ -71,7 +71,7 @@ describe Hydra::PolicyAwareAccessControlsEnforcement do | |
| 71 71 | 
             
                @user_parameters = {}
         | 
| 72 72 | 
             
                @user = FactoryGirl.build(:sara_student)
         | 
| 73 73 | 
             
                RoleMapper.stub(:roles).with(@user.user_key).and_return(@user.roles)
         | 
| 74 | 
            -
                subject.stub(: | 
| 74 | 
            +
                subject.stub(:current_user).and_return(@user)
         | 
| 75 75 | 
             
              end
         | 
| 76 76 |  | 
| 77 77 | 
             
              describe "policies_with_access" do
         | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: hydra-access-controls
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 5.0.0. | 
| 4 | 
            +
              version: 5.0.0.pre14
         | 
| 5 5 | 
             
              prerelease: 6
         | 
| 6 6 | 
             
            platform: ruby
         | 
| 7 7 | 
             
            authors:
         | 
| @@ -11,7 +11,7 @@ authors: | |
| 11 11 | 
             
            autorequire: 
         | 
| 12 12 | 
             
            bindir: bin
         | 
| 13 13 | 
             
            cert_chain: []
         | 
| 14 | 
            -
            date: 2012-11- | 
| 14 | 
            +
            date: 2012-11-29 00:00:00.000000000 Z
         | 
| 15 15 | 
             
            dependencies:
         | 
| 16 16 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 17 17 | 
             
              name: activesupport
         |