hydra-access-controls 9.2.2 → 9.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.textile +1 -1
- data/app/indexers/hydra/access_controls/embargo_indexer.rb +11 -0
- data/app/indexers/hydra/access_controls/lease_indexer.rb +12 -0
- data/app/models/concerns/hydra/access_controls/embargoable.rb +12 -4
- data/lib/hydra/ability.rb +49 -1
- data/lib/hydra/role_mapper_behavior.rb +11 -8
- data/spec/indexers/embargo_indexer_spec.rb +20 -0
- data/spec/indexers/lease_indexer_spec.rb +20 -0
- data/spec/spec_helper.rb +2 -0
- data/spec/unit/ability_spec.rb +40 -0
- data/spec/unit/embargoable_spec.rb +62 -13
- data/spec/unit/role_mapper_spec.rb +1 -1
- metadata +9 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 48df5495189420a7fcd2badef2493179edcc1560
|
4
|
+
data.tar.gz: 6b69996bbca5b1f33f233c4327fb58678bb118a8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 77f673207dda70cfc5401f7418cb8af5675cbec3b46afdf896bb04ac2b13cf69954e3b9a3d924ac597d3adb77897d20fb2158f53af085e468430ea37d6c14154
|
7
|
+
data.tar.gz: 8b9f3925485f1a3725815432bff9d63cf4a2cd8335ea59276c716b842b28b47e45e0d117993f7e263c8db44d727982eb8c78ce75dc5ffd8f4694a3eb3ef9f2be
|
data/README.textile
CHANGED
@@ -23,7 +23,7 @@ The hydra generator handles part of this for you - it sets up the CatalogControl
|
|
23
23
|
Beyond enabling gated discovery, *everything is done using "CanCan":https://github.com/ryanb/cancan*. For more information on CanCan, how to use it, and how to define access controls policies (aka "abilities":https://github.com/ryanb/cancan/wiki/Defining-Abilities), refer to the "CanCan documentation":https://github.com/ryanb/cancan/blob/master/README.rdoc.
|
24
24
|
|
25
25
|
Within your CanCan ability definitions, app/models/ability.rb, the "Hydra::Ability":https://github.com/projecthydra/hydra-head/blob/master/hydra-access-controls/lib/hydra/ability.rb module is already included. This module has
|
26
|
-
:read and :
|
26
|
+
:read, :edit, and :discover permissions defined for you, along with some convenience methods that help you evaluate permssions
|
27
27
|
against info in the rightsMetadata datastream.
|
28
28
|
|
29
29
|
In your custom controllers, you will need to enforce access controls using "CanCan":https://github.com/ryanb/cancan. There are a number of ways to do this. The easiest way is to use the cancan "controller action":https://github.com/ryanb/cancan/wiki/Authorizing-Controller-Actions 'load_and_authorize_resource', however on show and edit, this also causes a load the resource from fedora, which you may want to avoid. If you want to authorize from solr, you ought to be able to call the cancan methods `authorize!` or `can?` which just checks the solr permissions handler.
|
@@ -35,11 +35,19 @@ module Hydra
|
|
35
35
|
|
36
36
|
def to_solr(solr_doc = {})
|
37
37
|
super.tap do |doc|
|
38
|
-
doc.merge!(embargo.
|
39
|
-
doc.merge!(lease.
|
38
|
+
doc.merge!(embargo_indexer_class.new(embargo).generate_solr_document) if embargo
|
39
|
+
doc.merge!(lease_indexer_class.new(lease).generate_solr_document) if lease
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
43
|
+
def embargo_indexer_class
|
44
|
+
EmbargoIndexer
|
45
|
+
end
|
46
|
+
|
47
|
+
def lease_indexer_class
|
48
|
+
LeaseIndexer
|
49
|
+
end
|
50
|
+
|
43
51
|
def under_embargo?
|
44
52
|
embargo && embargo.active?
|
45
53
|
end
|
@@ -63,7 +71,7 @@ module Hydra
|
|
63
71
|
self.visibility_during_embargo = visibility_during unless visibility_during.nil?
|
64
72
|
self.visibility_after_embargo = visibility_after unless visibility_after.nil?
|
65
73
|
embargo_visibility!
|
66
|
-
visibility_will_change!
|
74
|
+
visibility_will_change! if embargo.changed?
|
67
75
|
end
|
68
76
|
|
69
77
|
def deactivate_embargo!
|
@@ -134,7 +142,7 @@ module Hydra
|
|
134
142
|
self.visibility_during_lease = visibility_during unless visibility_during.nil?
|
135
143
|
self.visibility_after_lease = visibility_after unless visibility_after.nil?
|
136
144
|
lease_visibility!
|
137
|
-
visibility_will_change!
|
145
|
+
visibility_will_change! if lease.changed?
|
138
146
|
end
|
139
147
|
|
140
148
|
def deactivate_lease!
|
data/lib/hydra/ability.rb
CHANGED
@@ -13,7 +13,7 @@ module Hydra
|
|
13
13
|
include Hydra::PermissionsQuery
|
14
14
|
include Blacklight::SearchHelper
|
15
15
|
class_attribute :ability_logic
|
16
|
-
self.ability_logic = [:create_permissions, :edit_permissions, :read_permissions, :download_permissions, :custom_permissions]
|
16
|
+
self.ability_logic = [:create_permissions, :edit_permissions, :read_permissions, :discover_permissions, :download_permissions, :custom_permissions]
|
17
17
|
end
|
18
18
|
|
19
19
|
def self.user_class
|
@@ -87,6 +87,21 @@ module Hydra
|
|
87
87
|
end
|
88
88
|
end
|
89
89
|
|
90
|
+
def discover_permissions
|
91
|
+
can :discover, String do |id|
|
92
|
+
test_discover(id)
|
93
|
+
end
|
94
|
+
|
95
|
+
can :discover, ActiveFedora::Base do |obj|
|
96
|
+
test_discover(obj.id)
|
97
|
+
end
|
98
|
+
|
99
|
+
can :discover, SolrDocument do |obj|
|
100
|
+
cache.put(obj.id, obj)
|
101
|
+
test_discover(obj.id)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
90
105
|
# Download permissions are exercised in Hydra::Controller::DownloadBehavior
|
91
106
|
def download_permissions
|
92
107
|
can :download, ActiveFedora::File do |file|
|
@@ -117,6 +132,13 @@ module Hydra
|
|
117
132
|
result
|
118
133
|
end
|
119
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
|
+
|
120
142
|
def edit_groups(id)
|
121
143
|
doc = permissions_doc(id)
|
122
144
|
return [] if doc.nil?
|
@@ -134,6 +156,15 @@ module Hydra
|
|
134
156
|
return rg
|
135
157
|
end
|
136
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
|
166
|
+
end
|
167
|
+
|
137
168
|
def edit_users(id)
|
138
169
|
doc = permissions_doc(id)
|
139
170
|
return [] if doc.nil?
|
@@ -151,6 +182,15 @@ module Hydra
|
|
151
182
|
return rp
|
152
183
|
end
|
153
184
|
|
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
|
+
|
154
194
|
module ClassMethods
|
155
195
|
def read_group_field
|
156
196
|
Hydra.config.permissions.read.group
|
@@ -167,6 +207,14 @@ module Hydra
|
|
167
207
|
def edit_group_field
|
168
208
|
Hydra.config.permissions.edit.group
|
169
209
|
end
|
210
|
+
|
211
|
+
def discover_group_field
|
212
|
+
Hydra.config.permissions.discover.group
|
213
|
+
end
|
214
|
+
|
215
|
+
def discover_user_field
|
216
|
+
Hydra.config.permissions.discover.individual
|
217
|
+
end
|
170
218
|
end
|
171
219
|
end
|
172
220
|
end
|
@@ -5,23 +5,23 @@ module Hydra::RoleMapperBehavior
|
|
5
5
|
def role_names
|
6
6
|
map.keys
|
7
7
|
end
|
8
|
-
|
9
|
-
|
8
|
+
|
9
|
+
##
|
10
10
|
# @param user_or_uid either the User object or user id
|
11
11
|
# If you pass in a nil User object (ie. user isn't logged in), or a uid that doesn't exist, it will return an empty array
|
12
12
|
def roles(user_or_uid)
|
13
13
|
if user_or_uid.kind_of?(String)
|
14
14
|
user = Hydra::Ability.user_class.find_by_user_key(user_or_uid)
|
15
15
|
user_id = user_or_uid
|
16
|
-
elsif user_or_uid.kind_of?(Hydra::Ability.user_class) && user_or_uid.user_key
|
16
|
+
elsif user_or_uid.kind_of?(Hydra::Ability.user_class) && user_or_uid.user_key
|
17
17
|
user = user_or_uid
|
18
18
|
user_id = user.user_key
|
19
19
|
end
|
20
20
|
array = byname[user_id].dup || []
|
21
|
-
array = array << 'registered' unless (user.nil? || user.new_record?)
|
21
|
+
array = array << 'registered' unless (user.nil? || user.new_record?)
|
22
22
|
array
|
23
23
|
end
|
24
|
-
|
24
|
+
|
25
25
|
def whois(r)
|
26
26
|
map[r] || []
|
27
27
|
end
|
@@ -32,7 +32,7 @@ module Hydra::RoleMapperBehavior
|
|
32
32
|
|
33
33
|
|
34
34
|
def byname
|
35
|
-
@byname ||= map.each_with_object(Hash.new{ |h,k| h[k] = [] }) do |(role, usernames), memo|
|
35
|
+
@byname ||= map.each_with_object(Hash.new{ |h,k| h[k] = [] }) do |(role, usernames), memo|
|
36
36
|
Array(usernames).each { |x| memo[x] << role}
|
37
37
|
end
|
38
38
|
end
|
@@ -60,9 +60,12 @@ module Hydra::RoleMapperBehavior
|
|
60
60
|
rescue
|
61
61
|
raise("#{filename} was found, but could not be parsed.\n")
|
62
62
|
end
|
63
|
-
|
63
|
+
unless yml.is_a? Hash
|
64
|
+
raise("#{filename} was found, but was blank or malformed.\n")
|
65
|
+
end
|
66
|
+
|
67
|
+
yml.fetch(Rails.env)
|
64
68
|
|
65
|
-
raise("#{filename} was found, but was blank or malformed.\n")
|
66
69
|
end
|
67
70
|
end
|
68
71
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Hydra::AccessControls::EmbargoIndexer do
|
4
|
+
let(:attrs) do
|
5
|
+
{
|
6
|
+
visibility_during_embargo: Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_AUTHENTICATED,
|
7
|
+
visibility_after_embargo: Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PUBLIC,
|
8
|
+
embargo_release_date: Date.parse('2010-10-10')
|
9
|
+
}
|
10
|
+
end
|
11
|
+
let(:embargo) { Hydra::AccessControls::Embargo.new(attrs) }
|
12
|
+
let(:indexer) { described_class.new(embargo) }
|
13
|
+
subject { indexer.generate_solr_document }
|
14
|
+
|
15
|
+
it "has the fields" do
|
16
|
+
expect(subject['visibility_during_embargo_ssim']).to eq 'authenticated'
|
17
|
+
expect(subject['visibility_after_embargo_ssim']).to eq 'open'
|
18
|
+
expect(subject['embargo_release_date_dtsi']).to eq '2010-10-10T00:00:00Z'
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Hydra::AccessControls::LeaseIndexer do
|
4
|
+
let(:attrs) do
|
5
|
+
{
|
6
|
+
visibility_during_lease: Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PUBLIC,
|
7
|
+
visibility_after_lease: Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_AUTHENTICATED,
|
8
|
+
lease_expiration_date: Date.parse('2010-10-10')
|
9
|
+
}
|
10
|
+
end
|
11
|
+
let(:lease) { Hydra::AccessControls::Lease.new(attrs) }
|
12
|
+
let(:indexer) { described_class.new(lease) }
|
13
|
+
subject { indexer.generate_solr_document }
|
14
|
+
|
15
|
+
it "has the fields" do
|
16
|
+
expect(subject['visibility_during_lease_ssim']).to eq 'open'
|
17
|
+
expect(subject['visibility_after_lease_ssim']).to eq 'authenticated'
|
18
|
+
expect(subject['lease_expiration_date_dtsi']).to eq '2010-10-10T00:00:00Z'
|
19
|
+
end
|
20
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -26,6 +26,8 @@ require_relative '../app/vocabularies/acl'
|
|
26
26
|
require_relative '../app/vocabularies/hydra/acl'
|
27
27
|
require_relative '../app/models/role_mapper'
|
28
28
|
require_relative '../app/models/ability'
|
29
|
+
require_relative '../app/indexers/hydra/access_controls/embargo_indexer'
|
30
|
+
require_relative '../app/indexers/hydra/access_controls/lease_indexer'
|
29
31
|
require_relative '../app/models/hydra/access_controls/access_control_list'
|
30
32
|
require_relative '../app/models/hydra/access_controls/permission'
|
31
33
|
require_relative '../app/models/hydra/access_controls/embargo'
|
data/spec/unit/ability_spec.rb
CHANGED
@@ -8,6 +8,8 @@ describe Ability do
|
|
8
8
|
its(:read_user_field) { should == 'read_access_person_ssim'}
|
9
9
|
its(:edit_group_field) { should == 'edit_access_group_ssim'}
|
10
10
|
its(:edit_user_field) { should == 'edit_access_person_ssim'}
|
11
|
+
its(:discover_group_field) { should == 'discover_access_group_ssim'}
|
12
|
+
its(:discover_user_field) { should == 'discover_access_person_ssim'}
|
11
13
|
end
|
12
14
|
|
13
15
|
context "for a not-signed in user" do
|
@@ -37,6 +39,35 @@ describe Ability do
|
|
37
39
|
# See spec/requests/... for test coverage describing WHAT should appear on a page based on access permissions
|
38
40
|
# Test coverage for discover permission is in spec/requests/gated_discovery_spec.rb
|
39
41
|
|
42
|
+
describe "Given an asset that has been made publicly discoverable" do
|
43
|
+
let(:asset) { FactoryGirl.create(:asset) }
|
44
|
+
before do
|
45
|
+
asset.permissions_attributes = [{ name: "public", access: "discover", type: "group" }, { name: "joe_creator", access: "edit", type: "person" }, { name: "calvin_collaborator", access: "edit", type: "person" }]
|
46
|
+
asset.save
|
47
|
+
end
|
48
|
+
|
49
|
+
context "Then a not-signed-in user" do
|
50
|
+
subject { Ability.new(nil) }
|
51
|
+
it { should be_able_to(:discover, asset) }
|
52
|
+
it { should_not be_able_to(:read, asset) }
|
53
|
+
it { should_not be_able_to(:edit, asset) }
|
54
|
+
it { should_not be_able_to(:update, asset) }
|
55
|
+
it { should_not be_able_to(:destroy, asset) }
|
56
|
+
end
|
57
|
+
|
58
|
+
context "Then a registered user" do
|
59
|
+
before do
|
60
|
+
@user = FactoryGirl.build(:registered_user)
|
61
|
+
end
|
62
|
+
subject { Ability.new(@user) }
|
63
|
+
it { should be_able_to(:discover, asset) }
|
64
|
+
it { should_not be_able_to(:read, asset) }
|
65
|
+
it { should_not be_able_to(:edit, asset) }
|
66
|
+
it { should_not be_able_to(:update, asset) }
|
67
|
+
it { should_not be_able_to(:destroy, asset) }
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
40
71
|
describe "Given an asset that has been made publicly available (ie. open access)" do
|
41
72
|
#let(:asset) { FactoryGirl.create(:open_access_asset) }
|
42
73
|
let(:asset) { FactoryGirl.create(:asset) }
|
@@ -47,6 +78,7 @@ describe Ability do
|
|
47
78
|
|
48
79
|
context "Then a not-signed-in user" do
|
49
80
|
subject { Ability.new(nil) }
|
81
|
+
it { should be_able_to(:discover, asset) }
|
50
82
|
it { should be_able_to(:read, asset) }
|
51
83
|
it { should_not be_able_to(:edit, asset) }
|
52
84
|
it { should_not be_able_to(:update, asset) }
|
@@ -58,6 +90,7 @@ describe Ability do
|
|
58
90
|
@user = FactoryGirl.build(:registered_user)
|
59
91
|
end
|
60
92
|
subject { Ability.new(@user) }
|
93
|
+
it { should be_able_to(:discover, asset) }
|
61
94
|
it { should be_able_to(:read, asset) }
|
62
95
|
it { should_not be_able_to(:edit, asset) }
|
63
96
|
it { should_not be_able_to(:update, asset) }
|
@@ -76,6 +109,7 @@ describe Ability do
|
|
76
109
|
context "Then a not-signed-in user" do
|
77
110
|
let(:user) { User.new.tap {|u| u.new_record = true } }
|
78
111
|
subject { Ability.new(user) }
|
112
|
+
it { should_not be_able_to(:discover, asset) }
|
79
113
|
it { should_not be_able_to(:read, asset) }
|
80
114
|
it { should_not be_able_to(:edit, asset) }
|
81
115
|
it { should_not be_able_to(:update, asset) }
|
@@ -83,6 +117,7 @@ describe Ability do
|
|
83
117
|
end
|
84
118
|
context "Then a registered user" do
|
85
119
|
subject { Ability.new(FactoryGirl.build(:registered_user)) }
|
120
|
+
it { should_not be_able_to(:discover, asset) }
|
86
121
|
it { should_not be_able_to(:read, asset) }
|
87
122
|
it { should_not be_able_to(:edit, asset) }
|
88
123
|
it { should_not be_able_to(:update, asset) }
|
@@ -90,6 +125,7 @@ describe Ability do
|
|
90
125
|
end
|
91
126
|
context "Then the Creator" do
|
92
127
|
subject { Ability.new(FactoryGirl.build(:joe_creator)) }
|
128
|
+
it { should be_able_to(:discover, asset) }
|
93
129
|
it { should be_able_to(:read, asset) }
|
94
130
|
it { should be_able_to(:edit, asset) }
|
95
131
|
it { should be_able_to(:edit, solr_doc) }
|
@@ -114,6 +150,7 @@ describe Ability do
|
|
114
150
|
end
|
115
151
|
subject { Ability.new(@user) }
|
116
152
|
|
153
|
+
it { should be_able_to(:discover, asset) }
|
117
154
|
it { should be_able_to(:read, asset) }
|
118
155
|
it { should_not be_able_to(:edit, asset) }
|
119
156
|
it { should_not be_able_to(:update, asset) }
|
@@ -136,6 +173,7 @@ describe Ability do
|
|
136
173
|
end
|
137
174
|
subject { Ability.new(@user) }
|
138
175
|
|
176
|
+
it { should be_able_to(:discover, asset) }
|
139
177
|
it { should be_able_to(:read, asset) }
|
140
178
|
it { should be_able_to(:edit, asset) }
|
141
179
|
it { should be_able_to(:update, asset) }
|
@@ -167,6 +205,7 @@ describe Ability do
|
|
167
205
|
end
|
168
206
|
subject { Ability.new(@user) }
|
169
207
|
|
208
|
+
it { should_not be_able_to(:discover, asset) }
|
170
209
|
it { should_not be_able_to(:read, asset) }
|
171
210
|
it { should_not be_able_to(:edit, asset) }
|
172
211
|
it { should_not be_able_to(:update, asset) }
|
@@ -181,6 +220,7 @@ describe Ability do
|
|
181
220
|
end
|
182
221
|
subject { Ability.new(@user) }
|
183
222
|
|
223
|
+
it { should be_able_to(:discover, asset) }
|
184
224
|
it { should be_able_to(:read, asset) }
|
185
225
|
it { should_not be_able_to(:edit, asset) }
|
186
226
|
it { should_not be_able_to(:update, asset) }
|
@@ -16,7 +16,18 @@ describe Hydra::AccessControls::Embargoable do
|
|
16
16
|
|
17
17
|
let(:future_date) { Date.today+2 }
|
18
18
|
let(:past_date) { Date.today-2 }
|
19
|
-
|
19
|
+
let(:model) { TestModel.new }
|
20
|
+
subject { model }
|
21
|
+
|
22
|
+
describe '#embargo_indexer_class' do
|
23
|
+
subject { model.embargo_indexer_class }
|
24
|
+
it { is_expected.to eq Hydra::AccessControls::EmbargoIndexer }
|
25
|
+
end
|
26
|
+
|
27
|
+
describe '#lease_indexer_class' do
|
28
|
+
subject { model.lease_indexer_class }
|
29
|
+
it { is_expected.to eq Hydra::AccessControls::LeaseIndexer }
|
30
|
+
end
|
20
31
|
|
21
32
|
describe 'validations' do
|
22
33
|
context "with dates" do
|
@@ -77,7 +88,7 @@ describe Hydra::AccessControls::Embargoable do
|
|
77
88
|
end
|
78
89
|
end
|
79
90
|
|
80
|
-
|
91
|
+
describe '#apply_embargo' do
|
81
92
|
it "applies appropriate embargo_visibility settings" do
|
82
93
|
expect {
|
83
94
|
subject.apply_embargo(future_date.to_s, Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PRIVATE, Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PUBLIC)
|
@@ -87,12 +98,31 @@ describe Hydra::AccessControls::Embargoable do
|
|
87
98
|
expect(subject.embargo_release_date).to eq future_date
|
88
99
|
expect(subject.visibility_after_embargo).to eq Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PUBLIC
|
89
100
|
end
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
101
|
+
|
102
|
+
context "when no before/after visibility is provided" do
|
103
|
+
it "relies on defaults" do
|
104
|
+
subject.apply_embargo(future_date.to_s)
|
105
|
+
expect(subject).to be_under_embargo
|
106
|
+
expect(subject.visibility).to eq Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PRIVATE
|
107
|
+
expect(subject.embargo_release_date).to eq future_date
|
108
|
+
expect(subject.visibility_after_embargo).to eq Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_AUTHENTICATED
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
context "when the same embargo is applied" do
|
113
|
+
before do
|
114
|
+
subject.apply_embargo(future_date.to_s)
|
115
|
+
if ActiveModel.version < Gem::Version.new('4.2.0')
|
116
|
+
subject.embargo.send(:reset_changes)
|
117
|
+
else
|
118
|
+
subject.embargo.send(:clear_changes_information)
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
it "doesn't call visibility_will_change!" do
|
123
|
+
expect(subject).not_to receive(:visibility_will_change!)
|
124
|
+
subject.apply_embargo(future_date.to_s)
|
125
|
+
end
|
96
126
|
end
|
97
127
|
end
|
98
128
|
|
@@ -152,11 +182,30 @@ describe Hydra::AccessControls::Embargoable do
|
|
152
182
|
expect(subject.lease_expiration_date).to eq future_date
|
153
183
|
expect(subject.visibility_after_lease).to eq Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PRIVATE
|
154
184
|
end
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
185
|
+
|
186
|
+
context "when before/after visibility is not provided" do
|
187
|
+
it "sets default values" do
|
188
|
+
subject.apply_lease(future_date.to_s)
|
189
|
+
expect(subject.visibility_during_lease).to eq Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_AUTHENTICATED
|
190
|
+
expect(subject.lease_expiration_date).to eq future_date
|
191
|
+
expect(subject.visibility_after_lease).to eq Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PRIVATE
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
context "when the same lease is applied" do
|
196
|
+
before do
|
197
|
+
subject.apply_lease(future_date.to_s)
|
198
|
+
if ActiveModel.version < Gem::Version.new('4.2.0')
|
199
|
+
subject.lease.send(:reset_changes)
|
200
|
+
else
|
201
|
+
subject.lease.send(:clear_changes_information)
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
205
|
+
it "doesn't call visibility_will_change!" do
|
206
|
+
expect(subject).not_to receive(:visibility_will_change!)
|
207
|
+
subject.apply_lease(future_date.to_s)
|
208
|
+
end
|
160
209
|
end
|
161
210
|
end
|
162
211
|
|
@@ -2,7 +2,7 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe RoleMapper do
|
4
4
|
it "should define the 4 roles" do
|
5
|
-
expect(RoleMapper.role_names.sort).to eq %w(admin_policy_object_editor archivist donor patron researcher)
|
5
|
+
expect(RoleMapper.role_names.sort).to eq %w(admin_policy_object_editor archivist donor patron researcher)
|
6
6
|
end
|
7
7
|
it "should quer[iy]able for roles for a given user" do
|
8
8
|
expect(RoleMapper.roles('leland_himself@example.com').sort).to eq ['archivist', 'donor', 'patron']
|
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.3.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: 2015-
|
13
|
+
date: 2015-10-07 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: activesupport
|
@@ -134,6 +134,8 @@ files:
|
|
134
134
|
- ".rspec"
|
135
135
|
- README.textile
|
136
136
|
- Rakefile
|
137
|
+
- app/indexers/hydra/access_controls/embargo_indexer.rb
|
138
|
+
- app/indexers/hydra/access_controls/lease_indexer.rb
|
137
139
|
- app/models/ability.rb
|
138
140
|
- app/models/concerns/hydra/access_controls.rb
|
139
141
|
- app/models/concerns/hydra/access_controls/access_right.rb
|
@@ -172,6 +174,8 @@ files:
|
|
172
174
|
- lib/hydra/role_mapper_behavior.rb
|
173
175
|
- lib/hydra/user.rb
|
174
176
|
- spec/factories.rb
|
177
|
+
- spec/indexers/embargo_indexer_spec.rb
|
178
|
+
- spec/indexers/lease_indexer_spec.rb
|
175
179
|
- spec/services/embargo_service_spec.rb
|
176
180
|
- spec/services/lease_service_spec.rb
|
177
181
|
- spec/spec_helper.rb
|
@@ -218,12 +222,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
218
222
|
version: '0'
|
219
223
|
requirements: []
|
220
224
|
rubyforge_project:
|
221
|
-
rubygems_version: 2.4.
|
225
|
+
rubygems_version: 2.4.5.1
|
222
226
|
signing_key:
|
223
227
|
specification_version: 4
|
224
228
|
summary: Access controls for project hydra
|
225
229
|
test_files:
|
226
230
|
- spec/factories.rb
|
231
|
+
- spec/indexers/embargo_indexer_spec.rb
|
232
|
+
- spec/indexers/lease_indexer_spec.rb
|
227
233
|
- spec/services/embargo_service_spec.rb
|
228
234
|
- spec/services/lease_service_spec.rb
|
229
235
|
- spec/spec_helper.rb
|