hydra-access-controls 9.5.0 → 9.6.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|