hydra-access-controls 9.5.0 → 9.6.0
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.
- checksums.yaml +4 -4
- data/app/models/concerns/hydra/access_controls/embargoable.rb +2 -0
- data/app/models/hydra/access_controls/embargo.rb +1 -0
- data/app/models/hydra/access_controls/permission.rb +0 -3
- data/hydra-access-controls.gemspec +2 -7
- data/lib/hydra-access-controls.rb +1 -0
- data/lib/hydra/ability.rb +14 -81
- data/lib/hydra/access_controls_enforcement.rb +8 -99
- data/lib/hydra/permissions_cache.rb +3 -15
- data/lib/hydra/permissions_query.rb +5 -40
- data/lib/hydra/policy_aware_ability.rb +1 -0
- data/lib/hydra/policy_aware_access_controls_enforcement.rb +14 -2
- data/lib/hydra/user.rb +1 -6
- data/spec/support/config/{solr.yml → blacklight.yml} +3 -1
- data/spec/unit/ability_spec.rb +1 -0
- data/spec/unit/access_controls_enforcement_spec.rb +21 -37
- data/spec/unit/policy_aware_access_controls_enforcement_spec.rb +4 -1
- metadata +12 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d858683ef55ada03ab8db4ae2236c36b842895cf
|
4
|
+
data.tar.gz: 1607be72ddad76b1f526ca62181d50a7724950bc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 74f0875cd669674a81eecc48586fdb10ec1c900ece56e76611ec7258acb4d2411c2b46a2ee08c637fa06b177f9f8f149f626dcf933101f3b6ad1a94fe6115009
|
7
|
+
data.tar.gz: 41d8e8afbcc05366e4116e808b99f3c4d4c693754652426e258c72cd3357a4018bea46981d2f913ea0ec831d45cbe051ca0a1fc665a4fc98beebf43f88e74cea
|
@@ -74,6 +74,8 @@ module Hydra
|
|
74
74
|
visibility_will_change! if embargo.changed?
|
75
75
|
end
|
76
76
|
|
77
|
+
# Deactivates the embargo and logs a message to the embargo object.
|
78
|
+
# Marks this record as dirty so that it will get reindexed.
|
77
79
|
def deactivate_embargo!
|
78
80
|
embargo && embargo.deactivate!
|
79
81
|
visibility_will_change!
|
@@ -17,6 +17,7 @@ module Hydra::AccessControls
|
|
17
17
|
(embargo_release_date.present? && Date.today < embargo_release_date)
|
18
18
|
end
|
19
19
|
|
20
|
+
# Deactivates the embargo and logs a message to the embargo_history property
|
20
21
|
def deactivate!
|
21
22
|
return unless embargo_release_date
|
22
23
|
embargo_state = active? ? "active" : "expired"
|
@@ -61,9 +61,6 @@ module Hydra::AccessControls
|
|
61
61
|
Agent.new(::RDF::URI.new("#{GROUP_AGENT_URL_PREFIX}##{name}"))
|
62
62
|
when "person"
|
63
63
|
Agent.new(::RDF::URI.new("#{PERSON_AGENT_URL_PREFIX}##{name}"))
|
64
|
-
when "user"
|
65
|
-
Deprecation.warn Permission, "Passing \"user\" as the type to Permission is deprecated. Use \"person\" instead. This will be an error in ActiveFedora 9."
|
66
|
-
Agent.new(::RDF::URI.new("#{PERSON_AGENT_URL_PREFIX}##{name}"))
|
67
64
|
else
|
68
65
|
raise ArgumentError, "Unknown agent type #{type.inspect}"
|
69
66
|
end
|
@@ -22,13 +22,8 @@ Gem::Specification.new do |gem|
|
|
22
22
|
gem.add_dependency "active-fedora", '~> 9.0'
|
23
23
|
gem.add_dependency 'cancancan', '~> 1.8'
|
24
24
|
gem.add_dependency 'deprecation', '~> 0.2'
|
25
|
-
gem.add_dependency "blacklight", '
|
26
|
-
|
27
|
-
# sass-rails is typically generated into the app's gemfile by `rails new`
|
28
|
-
# In rails 3 it's put into the "assets" group and thus not available to the
|
29
|
-
# app. Blacklight 5.3 requires bootstrap-sass which requires (but does not
|
30
|
-
# declare a dependency on) sass-rails
|
31
|
-
gem.add_dependency 'sass-rails'
|
25
|
+
gem.add_dependency "blacklight", '>= 5.16'
|
26
|
+
gem.add_dependency "blacklight-access_controls", '~> 0.1'
|
32
27
|
|
33
28
|
gem.add_development_dependency "rake", '~> 10.1'
|
34
29
|
gem.add_development_dependency 'rspec', '~> 3.1'
|
data/lib/hydra/ability.rb
CHANGED
@@ -1,18 +1,19 @@
|
|
1
1
|
# Code for [CANCAN] access to Hydra models
|
2
|
-
|
2
|
+
|
3
3
|
module Hydra
|
4
4
|
module Ability
|
5
5
|
extend ActiveSupport::Concern
|
6
6
|
|
7
|
+
include Blacklight::AccessControls::Ability
|
8
|
+
|
7
9
|
# once you include Hydra::Ability you can add custom permission methods by appending to ability_logic like so:
|
8
10
|
#
|
9
11
|
# self.ability_logic +=[:setup_my_permissions]
|
10
12
|
|
11
13
|
included do
|
12
|
-
include CanCan::Ability
|
13
14
|
include Hydra::PermissionsQuery
|
14
15
|
include Blacklight::SearchHelper
|
15
|
-
|
16
|
+
|
16
17
|
self.ability_logic = [:create_permissions, :edit_permissions, :read_permissions, :discover_permissions, :download_permissions, :custom_permissions]
|
17
18
|
end
|
18
19
|
|
@@ -20,37 +21,16 @@ module Hydra
|
|
20
21
|
Hydra.config[:user_model] ? Hydra.config[:user_model].constantize : ::User
|
21
22
|
end
|
22
23
|
|
23
|
-
attr_reader :current_user, :options, :cache
|
24
|
-
|
25
24
|
def initialize(user, options = {})
|
26
25
|
@current_user = user || Hydra::Ability.user_class.new # guest user (not logged in)
|
27
26
|
@user = @current_user # just in case someone was using this in an override. Just don't.
|
28
27
|
@options = options
|
29
|
-
@cache =
|
28
|
+
@cache = Blacklight::AccessControls::PermissionsCache.new
|
30
29
|
hydra_default_permissions()
|
31
30
|
end
|
32
31
|
|
33
|
-
## You can override this method if you are using a different AuthZ (such as LDAP)
|
34
|
-
def user_groups
|
35
|
-
return @user_groups if @user_groups
|
36
|
-
|
37
|
-
@user_groups = default_user_groups
|
38
|
-
@user_groups |= current_user.groups if current_user and current_user.respond_to? :groups
|
39
|
-
@user_groups |= ['registered'] unless current_user.new_record?
|
40
|
-
@user_groups
|
41
|
-
end
|
42
|
-
|
43
|
-
def default_user_groups
|
44
|
-
# # everyone is automatically a member of the group 'public'
|
45
|
-
['public']
|
46
|
-
end
|
47
|
-
|
48
|
-
|
49
32
|
def hydra_default_permissions
|
50
|
-
|
51
|
-
self.ability_logic.each do |method|
|
52
|
-
send(method)
|
53
|
-
end
|
33
|
+
grant_permissions
|
54
34
|
end
|
55
35
|
|
56
36
|
def create_permissions
|
@@ -73,33 +53,19 @@ module Hydra
|
|
73
53
|
end
|
74
54
|
|
75
55
|
def read_permissions
|
76
|
-
|
77
|
-
test_read(id)
|
78
|
-
end
|
56
|
+
super
|
79
57
|
|
80
58
|
can :read, ActiveFedora::Base do |obj|
|
81
59
|
test_read(obj.id)
|
82
60
|
end
|
83
|
-
|
84
|
-
can :read, SolrDocument do |obj|
|
85
|
-
cache.put(obj.id, obj)
|
86
|
-
test_read(obj.id)
|
87
|
-
end
|
88
61
|
end
|
89
62
|
|
90
63
|
def discover_permissions
|
91
|
-
|
92
|
-
test_discover(id)
|
93
|
-
end
|
64
|
+
super
|
94
65
|
|
95
66
|
can :discover, ActiveFedora::Base do |obj|
|
96
67
|
test_discover(obj.id)
|
97
68
|
end
|
98
|
-
|
99
|
-
can :discover, SolrDocument do |obj|
|
100
|
-
cache.put(obj.id, obj)
|
101
|
-
test_discover(obj.id)
|
102
|
-
end
|
103
69
|
end
|
104
70
|
|
105
71
|
# Download permissions are exercised in Hydra::Controller::DownloadBehavior
|
@@ -125,20 +91,6 @@ module Hydra
|
|
125
91
|
result
|
126
92
|
end
|
127
93
|
|
128
|
-
def test_read(id)
|
129
|
-
Rails.logger.debug("[CANCAN] Checking read permissions for user: #{current_user.user_key} with groups: #{user_groups.inspect}")
|
130
|
-
group_intersection = user_groups & read_groups(id)
|
131
|
-
result = !group_intersection.empty? || read_users(id).include?(current_user.user_key)
|
132
|
-
result
|
133
|
-
end
|
134
|
-
|
135
|
-
def test_discover(id)
|
136
|
-
Rails.logger.debug("[CANCAN] Checking discover permissions for user: #{current_user.user_key} with groups: #{user_groups.inspect}")
|
137
|
-
group_intersection = user_groups & discover_groups(id)
|
138
|
-
result = !group_intersection.empty? || discover_users(id).include?(current_user.user_key)
|
139
|
-
result
|
140
|
-
end
|
141
|
-
|
142
94
|
def edit_groups(id)
|
143
95
|
doc = permissions_doc(id)
|
144
96
|
return [] if doc.nil?
|
@@ -149,20 +101,10 @@ module Hydra
|
|
149
101
|
|
150
102
|
# edit implies read, so read_groups is the union of edit and read groups
|
151
103
|
def read_groups(id)
|
152
|
-
|
153
|
-
|
154
|
-
rg = edit_groups(id) | (doc[self.class.read_group_field] || [])
|
104
|
+
rg = super
|
105
|
+
rg |= edit_groups(id)
|
155
106
|
Rails.logger.debug("[CANCAN] read_groups: #{rg.inspect}")
|
156
|
-
|
157
|
-
end
|
158
|
-
|
159
|
-
# read implies discover, so discover_groups is the union of read and discover groups
|
160
|
-
def discover_groups(id)
|
161
|
-
doc = permissions_doc(id)
|
162
|
-
return [] if doc.nil?
|
163
|
-
dg = read_groups(id) | (doc[self.class.discover_group_field] || [])
|
164
|
-
Rails.logger.debug("[CANCAN] discover_groups: #{dg.inspect}")
|
165
|
-
dg
|
107
|
+
rg
|
166
108
|
end
|
167
109
|
|
168
110
|
def edit_users(id)
|
@@ -175,21 +117,12 @@ module Hydra
|
|
175
117
|
|
176
118
|
# edit implies read, so read_users is the union of edit and read users
|
177
119
|
def read_users(id)
|
178
|
-
|
179
|
-
|
180
|
-
rp = edit_users(id) | (doc[self.class.read_user_field] || [])
|
120
|
+
rp = super
|
121
|
+
rp |= edit_users(id)
|
181
122
|
Rails.logger.debug("[CANCAN] read_users: #{rp.inspect}")
|
182
|
-
|
123
|
+
rp
|
183
124
|
end
|
184
125
|
|
185
|
-
# read implies discover, so discover_users is the union of read and discover users
|
186
|
-
def discover_users(id)
|
187
|
-
doc = permissions_doc(id)
|
188
|
-
return [] if doc.nil?
|
189
|
-
dp = read_users(id) | (doc[self.class.discover_user_field] || [])
|
190
|
-
Rails.logger.debug("[CANCAN] discover_users: #{dp.inspect}")
|
191
|
-
dp
|
192
|
-
end
|
193
126
|
|
194
127
|
module ClassMethods
|
195
128
|
def read_group_field
|
@@ -1,36 +1,9 @@
|
|
1
1
|
module Hydra::AccessControlsEnforcement
|
2
2
|
extend ActiveSupport::Concern
|
3
|
-
|
4
|
-
included do |klass|
|
5
|
-
attr_writer :current_ability
|
6
|
-
class_attribute :solr_access_filters_logic
|
7
|
-
|
8
|
-
# Set defaults. Each symbol identifies a _method_ that must be in
|
9
|
-
# this class, taking one parameter (permission_types)
|
10
|
-
# Can be changed in local apps or by plugins, eg:
|
11
|
-
# CatalogController.include ModuleDefiningNewMethod
|
12
|
-
# CatalogController.solr_access_filters_logic += [:new_method]
|
13
|
-
# CatalogController.solr_access_filters_logic.delete(:we_dont_want)
|
14
|
-
self.solr_access_filters_logic = [:apply_group_permissions, :apply_user_permissions]
|
15
|
-
|
16
|
-
end
|
17
|
-
|
18
|
-
def current_ability
|
19
|
-
@current_ability || raise("current_ability has not been set on #{self}")
|
20
|
-
end
|
3
|
+
include Blacklight::AccessControls::Enforcement
|
21
4
|
|
22
5
|
protected
|
23
6
|
|
24
|
-
def gated_discovery_filters(permission_types = discovery_permissions, ability = current_ability)
|
25
|
-
user_access_filters = []
|
26
|
-
|
27
|
-
# Grant access based on user id & group
|
28
|
-
solr_access_filters_logic.each do |method_name|
|
29
|
-
user_access_filters += send(method_name, permission_types, ability)
|
30
|
-
end
|
31
|
-
user_access_filters
|
32
|
-
end
|
33
|
-
|
34
7
|
def under_embargo?
|
35
8
|
load_permissions_from_solr
|
36
9
|
embargo_key = Hydra.config.permissions.embargo.release_date
|
@@ -41,82 +14,18 @@ module Hydra::AccessControlsEnforcement
|
|
41
14
|
false
|
42
15
|
end
|
43
16
|
|
44
|
-
#
|
45
|
-
# Action-specific enforcement
|
46
|
-
#
|
47
|
-
|
48
|
-
# Controller "before" filter for enforcing access controls on show actions
|
49
|
-
# @param [Hash] opts (optional, not currently used)
|
50
|
-
def enforce_show_permissions(opts={})
|
51
|
-
permissions = current_ability.permissions_doc(params[:id])
|
52
|
-
if permissions.under_embargo? && !can?(:edit, permissions)
|
53
|
-
raise Hydra::AccessDenied.new("This item is under embargo. You do not have sufficient access privileges to read this document.", :edit, params[:id])
|
54
|
-
end
|
55
|
-
unless can? :read, permissions
|
56
|
-
raise Hydra::AccessDenied.new("You do not have sufficient access privileges to read this document, which has been marked private.", :read, params[:id])
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
# Solr query modifications
|
61
|
-
#
|
62
|
-
|
63
|
-
# Set solr_parameters to enforce appropriate permissions
|
64
|
-
# * Applies a lucene query to the solr :q parameter for gated discovery
|
65
|
-
# * Uses public_qt search handler if user does not have "read" permissions
|
66
|
-
# @param solr_parameters the current solr parameters
|
67
|
-
#
|
68
|
-
# @example This method should be added to your CatalogController's search_params_logic
|
69
|
-
# class CatalogController < ApplicationController
|
70
|
-
# CatalogController.search_params_logic += [:add_access_controls_to_solr_params]
|
71
|
-
# end
|
72
|
-
def add_access_controls_to_solr_params(solr_parameters)
|
73
|
-
apply_gated_discovery(solr_parameters)
|
74
|
-
end
|
75
|
-
|
76
|
-
|
77
17
|
# Which permission levels (logical OR) will grant you the ability to discover documents in a search.
|
78
|
-
|
79
|
-
# Override this method if you want it to be something other than the default
|
18
|
+
# Overrides blacklight-access_controls method.
|
80
19
|
def discovery_permissions
|
81
20
|
@discovery_permissions ||= ["edit","discover","read"]
|
82
21
|
end
|
83
|
-
def discovery_permissions= (permissions)
|
84
|
-
@discovery_permissions = permissions
|
85
|
-
end
|
86
22
|
|
87
|
-
#
|
88
|
-
#
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
23
|
+
# Find the name of the solr field for this type of permission.
|
24
|
+
# e.g. "read_access_group_ssim" or "discover_access_person_ssim".
|
25
|
+
# Used by blacklight-access_controls.
|
26
|
+
def solr_field_for(permission_type, permission_category)
|
27
|
+
permissions = Hydra.config.permissions[permission_type.to_sym]
|
28
|
+
permission_category == 'group' ? permissions.group : permissions.individual
|
93
29
|
end
|
94
30
|
|
95
|
-
|
96
|
-
def apply_group_permissions(permission_types, ability = current_ability)
|
97
|
-
# for groups
|
98
|
-
user_access_filters = []
|
99
|
-
ability.user_groups.each_with_index do |group, i|
|
100
|
-
permission_types.each do |type|
|
101
|
-
user_access_filters << escape_filter(Hydra.config.permissions[type.to_sym].group, group)
|
102
|
-
end
|
103
|
-
end
|
104
|
-
user_access_filters
|
105
|
-
end
|
106
|
-
|
107
|
-
def escape_filter(key, value)
|
108
|
-
[key, value.gsub(/[ :\/]/, ' ' => '\ ', '/' => '\/', ':' => '\:')].join(':')
|
109
|
-
end
|
110
|
-
|
111
|
-
def apply_user_permissions(permission_types, ability = current_ability)
|
112
|
-
# for individual user access
|
113
|
-
user_access_filters = []
|
114
|
-
user = ability.current_user
|
115
|
-
if user && user.user_key.present?
|
116
|
-
permission_types.each do |type|
|
117
|
-
user_access_filters << escape_filter(Hydra.config.permissions[type.to_sym].individual, user.user_key)
|
118
|
-
end
|
119
|
-
end
|
120
|
-
user_access_filters
|
121
|
-
end
|
122
31
|
end
|
@@ -1,18 +1,6 @@
|
|
1
|
-
class Hydra::PermissionsCache
|
2
|
-
|
3
|
-
clear
|
4
|
-
end
|
1
|
+
class Hydra::PermissionsCache < Blacklight::AccessControls::PermissionsCache
|
2
|
+
extend Deprecation
|
5
3
|
|
6
|
-
|
7
|
-
@cache[pid]
|
8
|
-
end
|
9
|
-
|
10
|
-
def put(pid, doc)
|
11
|
-
@cache[pid] = doc
|
12
|
-
end
|
13
|
-
|
14
|
-
def clear
|
15
|
-
@cache = {}
|
16
|
-
end
|
4
|
+
Deprecation.warn Hydra::PermissionsCache, "Hydra::PermissionsCache will be removed in Hydra 10. Use Blacklight::AccessControls::PermissionsCache instead (from blacklight-access_controls gem)."
|
17
5
|
|
18
6
|
end
|
@@ -2,48 +2,13 @@ module Hydra
|
|
2
2
|
module PermissionsQuery
|
3
3
|
extend ActiveSupport::Concern
|
4
4
|
|
5
|
-
|
6
|
-
doc = cache.get(pid)
|
7
|
-
unless doc
|
8
|
-
doc = get_permissions_solr_response_for_doc_id(pid)
|
9
|
-
cache.put(pid, doc)
|
10
|
-
end
|
11
|
-
doc
|
12
|
-
end
|
13
|
-
|
14
|
-
protected
|
15
|
-
|
16
|
-
# a solr query method
|
17
|
-
# retrieve a solr document, given the doc id
|
18
|
-
# Modeled on Blacklight::SolrHelper.get_permissions_solr_response_for_doc_id
|
19
|
-
# @param [String] id of the documetn to retrieve
|
20
|
-
# @param [Hash] extra_controller_params (optional)
|
21
|
-
def get_permissions_solr_response_for_doc_id(id=nil, extra_controller_params={})
|
22
|
-
raise Blacklight::Exceptions::InvalidSolrID.new("The application is trying to retrieve permissions without specifying an asset id") if id.nil?
|
23
|
-
solr_opts = permissions_solr_doc_params(id).merge(extra_controller_params)
|
24
|
-
response = ActiveFedora::SolrService.instance.conn.get('select', params: solr_opts)
|
25
|
-
solr_response = Blacklight::Solr::Response.new(response, solr_opts)
|
5
|
+
include Blacklight::AccessControls::PermissionsQuery
|
26
6
|
|
27
|
-
|
28
|
-
|
7
|
+
# What type of solr document to create for the
|
8
|
+
# Blacklight::AccessControls::PermissionsQuery.
|
9
|
+
def permissions_document_class
|
10
|
+
Hydra::PermissionsSolrDocument
|
29
11
|
end
|
30
12
|
|
31
|
-
#
|
32
|
-
# Solr integration
|
33
|
-
#
|
34
|
-
|
35
|
-
# returns a params hash with the permissions info for a single solr document
|
36
|
-
# If the id arg is nil, then the value is fetched from params[:id]
|
37
|
-
# This method is primary called by the get_permissions_solr_response_for_doc_id method.
|
38
|
-
# Modeled on Blacklight::SolrHelper.solr_doc_params
|
39
|
-
# @param [String] id of the documetn to retrieve
|
40
|
-
def permissions_solr_doc_params(id=nil)
|
41
|
-
id ||= params[:id]
|
42
|
-
# just to be consistent with the other solr param methods:
|
43
|
-
{
|
44
|
-
qt: :permissions,
|
45
|
-
id: id # this assumes the document request handler will map the 'id' param to the unique key field
|
46
|
-
}
|
47
|
-
end
|
48
13
|
end
|
49
14
|
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
# Repeats access controls evaluation methods, but checks against a governing "Policy" object (or "Collection" object) that provides inherited access controls.
|
2
2
|
module Hydra::PolicyAwareAbility
|
3
3
|
extend ActiveSupport::Concern
|
4
|
+
include Blacklight::AccessControls::Ability
|
4
5
|
include Hydra::Ability
|
5
6
|
|
6
7
|
IS_GOVERNED_BY_SOLR_FIELD = "isGovernedBy_ssim".freeze
|
@@ -6,8 +6,7 @@ module Hydra::PolicyAwareAccessControlsEnforcement
|
|
6
6
|
# @param solr_parameters the current solr parameters
|
7
7
|
# @param user_parameters the current user-subitted parameters
|
8
8
|
def apply_gated_discovery(solr_parameters)
|
9
|
-
|
10
|
-
solr_parameters[:fq] << gated_discovery_filters.join(' OR '.freeze)
|
9
|
+
super
|
11
10
|
logger.debug("POLICY-aware Solr parameters: #{ solr_parameters.inspect }")
|
12
11
|
end
|
13
12
|
|
@@ -50,6 +49,11 @@ module Hydra::PolicyAwareAccessControlsEnforcement
|
|
50
49
|
end
|
51
50
|
end
|
52
51
|
|
52
|
+
# Override method from blacklight-access_controls
|
53
|
+
def discovery_permissions
|
54
|
+
@discovery_permissions ||= ["edit", "discover", "read"]
|
55
|
+
end
|
56
|
+
|
53
57
|
# Returns the Model used for AdminPolicy objects.
|
54
58
|
# You can set this by overriding this method or setting Hydra.config[:permissions][:policy_class]
|
55
59
|
# Defults to Hydra::AdminPolicy
|
@@ -68,4 +72,12 @@ module Hydra::PolicyAwareAccessControlsEnforcement
|
|
68
72
|
filters
|
69
73
|
end
|
70
74
|
|
75
|
+
# Find the name of the solr field for this type of permission.
|
76
|
+
# e.g. "read_access_group_ssim" or "discover_access_person_ssim".
|
77
|
+
# Used by blacklight-access_controls gem.
|
78
|
+
def solr_field_for(permission_type, permission_category)
|
79
|
+
permissions = Hydra.config.permissions[permission_type.to_sym]
|
80
|
+
permission_category == 'group' ? permissions.group : permissions.individual
|
81
|
+
end
|
82
|
+
|
71
83
|
end
|
data/lib/hydra/user.rb
CHANGED
@@ -2,18 +2,13 @@
|
|
2
2
|
# By default, this module assumes you are using the User model created by Blacklight, which uses Devise.
|
3
3
|
# To integrate your own User implementation into Hydra, override this Module or define your own User model in app/models/user.rb within your Hydra head.
|
4
4
|
module Hydra::User
|
5
|
+
include Blacklight::AccessControls::User
|
5
6
|
|
6
7
|
def self.included(klass)
|
7
8
|
# Other modules to auto-include
|
8
9
|
klass.extend(ClassMethods)
|
9
10
|
end
|
10
11
|
|
11
|
-
# This method should display the unique identifier for this user as defined by devise.
|
12
|
-
# The unique identifier is what access controls will be enforced against.
|
13
|
-
def user_key
|
14
|
-
send(Devise.authentication_keys.first)
|
15
|
-
end
|
16
|
-
|
17
12
|
def groups
|
18
13
|
RoleMapper.roles(self)
|
19
14
|
end
|
data/spec/unit/ability_spec.rb
CHANGED
@@ -1,22 +1,32 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Hydra::AccessControlsEnforcement do
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
attr_accessor :params
|
4
|
+
let(:controller) { MockController.new }
|
5
|
+
let(:method_chain) { MockController.search_params_logic }
|
6
|
+
let(:search_builder) { MockSearchBuilder.new(method_chain, controller) }
|
8
7
|
|
9
|
-
|
10
|
-
|
11
|
-
|
8
|
+
class MockController
|
9
|
+
def self.search_params_logic
|
10
|
+
[:add_access_controls_to_solr_params]
|
11
|
+
end
|
12
|
+
end
|
12
13
|
|
13
|
-
|
14
|
-
|
14
|
+
class MockSearchBuilder < Blacklight::SearchBuilder
|
15
|
+
include Blacklight::Solr::SearchBuilderBehavior
|
16
|
+
include Hydra::AccessControlsEnforcement
|
17
|
+
attr_accessor :params
|
18
|
+
|
19
|
+
def current_ability
|
20
|
+
@current_ability ||= Ability.new(current_user)
|
21
|
+
end
|
15
22
|
|
16
|
-
|
23
|
+
def session
|
17
24
|
end
|
25
|
+
|
26
|
+
delegate :logger, to: :Rails
|
18
27
|
end
|
19
|
-
|
28
|
+
|
29
|
+
subject { search_builder }
|
20
30
|
|
21
31
|
describe "When I am searching for content" do
|
22
32
|
before do
|
@@ -85,32 +95,6 @@ describe Hydra::AccessControlsEnforcement do
|
|
85
95
|
end
|
86
96
|
end
|
87
97
|
|
88
|
-
describe "enforce_show_permissions" do
|
89
|
-
it "should allow a user w/ edit permissions to view an embargoed object" do
|
90
|
-
user = User.new :uid=>'testuser@example.com'
|
91
|
-
allow(RoleMapper).to receive(:roles).with(user).and_return(["archivist"])
|
92
|
-
allow(subject).to receive(:current_user).and_return(user)
|
93
|
-
allow(subject).to receive(:can?).with(:read, nil).and_return(true)
|
94
|
-
stub_doc = Hydra::PermissionsSolrDocument.new({"edit_access_person_ssim"=>["testuser@example.com"], "embargo_release_date_dtsi"=>(Date.parse(Time.now.to_s)+2).to_s})
|
95
|
-
|
96
|
-
subject.params = {}
|
97
|
-
expect(subject).to receive(:can?).with(:edit, stub_doc).and_return(true)
|
98
|
-
expect(subject).to receive(:can?).with(:read, stub_doc).and_return(true)
|
99
|
-
expect(subject.current_ability).to receive(:get_permissions_solr_response_for_doc_id).and_return(stub_doc)
|
100
|
-
expect { subject.send(:enforce_show_permissions, {}) }.not_to raise_error
|
101
|
-
end
|
102
|
-
it "should prevent a user w/o edit permissions from viewing an embargoed object" do
|
103
|
-
user = User.new :uid=>'testuser@example.com'
|
104
|
-
allow(RoleMapper).to receive(:roles).with(user).and_return([])
|
105
|
-
allow(subject).to receive(:current_user).and_return(user)
|
106
|
-
allow(subject).to receive(:can?).with(:read, nil).and_return(true)
|
107
|
-
subject.params = {}
|
108
|
-
stub_doc = Hydra::PermissionsSolrDocument.new({"edit_access_person_ssim"=>["testuser@example.com"], "embargo_release_date_dtsi"=>(Date.parse(Time.now.to_s)+2).to_s})
|
109
|
-
expect(subject.current_ability).to receive(:get_permissions_solr_response_for_doc_id).and_return(stub_doc)
|
110
|
-
expect(subject).to receive(:can?).with(:edit, stub_doc).and_return(false)
|
111
|
-
expect {subject.send(:enforce_show_permissions, {})}.to raise_error Hydra::AccessDenied, "This item is under embargo. You do not have sufficient access privileges to read this document."
|
112
|
-
end
|
113
|
-
end
|
114
98
|
describe "apply_gated_discovery" do
|
115
99
|
before(:each) do
|
116
100
|
@stub_user = User.new :uid=>'archivist1@example.com'
|
@@ -2,7 +2,8 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Hydra::PolicyAwareAccessControlsEnforcement do
|
4
4
|
before do
|
5
|
-
class PolicyMockSearchBuilder
|
5
|
+
class PolicyMockSearchBuilder < Blacklight::SearchBuilder
|
6
|
+
include Blacklight::Solr::SearchBuilderBehavior
|
6
7
|
include Hydra::AccessControlsEnforcement
|
7
8
|
include Hydra::PolicyAwareAccessControlsEnforcement
|
8
9
|
attr_accessor :params
|
@@ -100,12 +101,14 @@ describe Hydra::PolicyAwareAccessControlsEnforcement do
|
|
100
101
|
before do
|
101
102
|
allow(RoleMapper).to receive(:roles).with(user).and_return(user.roles)
|
102
103
|
end
|
104
|
+
|
103
105
|
it "should return the policies that provide discover permissions" do
|
104
106
|
@policies_with_access.map {|p| p.id }.each do |p|
|
105
107
|
expect(subject.policies_with_access).to include(p)
|
106
108
|
end
|
107
109
|
expect(subject.policies_with_access).to_not include("test-policy_no_access")
|
108
110
|
end
|
111
|
+
|
109
112
|
it "should allow you to configure which model to use for policies" do
|
110
113
|
allow(Hydra.config.permissions).to receive(:policy_class).and_return(ModsAsset)
|
111
114
|
expect(ModsAsset).to receive(:find_with_conditions).and_return([])
|
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: 9.
|
4
|
+
version: 9.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chris Beer
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2016-01-21 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: activesupport
|
@@ -72,30 +72,30 @@ dependencies:
|
|
72
72
|
name: blacklight
|
73
73
|
requirement: !ruby/object:Gem::Requirement
|
74
74
|
requirements:
|
75
|
-
- - "
|
75
|
+
- - ">="
|
76
76
|
- !ruby/object:Gem::Version
|
77
77
|
version: '5.16'
|
78
78
|
type: :runtime
|
79
79
|
prerelease: false
|
80
80
|
version_requirements: !ruby/object:Gem::Requirement
|
81
81
|
requirements:
|
82
|
-
- - "
|
82
|
+
- - ">="
|
83
83
|
- !ruby/object:Gem::Version
|
84
84
|
version: '5.16'
|
85
85
|
- !ruby/object:Gem::Dependency
|
86
|
-
name:
|
86
|
+
name: blacklight-access_controls
|
87
87
|
requirement: !ruby/object:Gem::Requirement
|
88
88
|
requirements:
|
89
|
-
- - "
|
89
|
+
- - "~>"
|
90
90
|
- !ruby/object:Gem::Version
|
91
|
-
version: '0'
|
91
|
+
version: '0.1'
|
92
92
|
type: :runtime
|
93
93
|
prerelease: false
|
94
94
|
version_requirements: !ruby/object:Gem::Requirement
|
95
95
|
requirements:
|
96
|
-
- - "
|
96
|
+
- - "~>"
|
97
97
|
- !ruby/object:Gem::Version
|
98
|
-
version: '0'
|
98
|
+
version: '0.1'
|
99
99
|
- !ruby/object:Gem::Dependency
|
100
100
|
name: rake
|
101
101
|
requirement: !ruby/object:Gem::Requirement
|
@@ -181,9 +181,9 @@ files:
|
|
181
181
|
- spec/services/embargo_service_spec.rb
|
182
182
|
- spec/services/lease_service_spec.rb
|
183
183
|
- spec/spec_helper.rb
|
184
|
+
- spec/support/config/blacklight.yml
|
184
185
|
- spec/support/config/hydra_ip_range.yml
|
185
186
|
- spec/support/config/role_map.yml
|
186
|
-
- spec/support/config/solr.yml
|
187
187
|
- spec/support/mods_asset.rb
|
188
188
|
- spec/support/rails.rb
|
189
189
|
- spec/support/solr_document.rb
|
@@ -226,7 +226,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
226
226
|
version: '0'
|
227
227
|
requirements: []
|
228
228
|
rubyforge_project:
|
229
|
-
rubygems_version: 2.
|
229
|
+
rubygems_version: 2.5.1
|
230
230
|
signing_key:
|
231
231
|
specification_version: 4
|
232
232
|
summary: Access controls for project hydra
|
@@ -237,9 +237,9 @@ test_files:
|
|
237
237
|
- spec/services/embargo_service_spec.rb
|
238
238
|
- spec/services/lease_service_spec.rb
|
239
239
|
- spec/spec_helper.rb
|
240
|
+
- spec/support/config/blacklight.yml
|
240
241
|
- spec/support/config/hydra_ip_range.yml
|
241
242
|
- spec/support/config/role_map.yml
|
242
|
-
- spec/support/config/solr.yml
|
243
243
|
- spec/support/mods_asset.rb
|
244
244
|
- spec/support/rails.rb
|
245
245
|
- spec/support/solr_document.rb
|