dor-rights-auth 1.0.2 → 1.5.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 +5 -5
- data/lib/dor/rights/auth.rb +2 -0
- data/lib/dor/rights_auth.rb +253 -30
- metadata +64 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: f3461a34cc8edcf7b4362d1c6c58304bbe43a82fbd9edd16452ec02cf8a40204
|
4
|
+
data.tar.gz: 826e6ef53e3fec66cb97b1ab385793b9727ddc82bd81be1add9c46d285183303
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 196996c12540e5e17907865aabdff51c36afca65d59781d6cf08660d7c422b8bd26fefd699bc211c02ffc51e97ada62331fc19a701f5b39c5a9e15b90a1248f0
|
7
|
+
data.tar.gz: 9dd9fa090720a1f4cdf5f9673513153ae3d41a63b57aaac99385353f26c9e4d3e1fa0e8309d863d1c0f01ab29302a4b4def2ee0730336ee72ace62f920ab9477
|
data/lib/dor/rights/auth.rb
CHANGED
data/lib/dor/rights_auth.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'nokogiri'
|
2
4
|
require 'time'
|
3
5
|
|
@@ -8,7 +10,7 @@ module Dor
|
|
8
10
|
Rights = Struct.new(:value, :rule)
|
9
11
|
|
10
12
|
# Rights for an object or File
|
11
|
-
EntityRights = Struct.new(:world, :group, :agent)
|
13
|
+
EntityRights = Struct.new(:world, :group, :agent, :location, :controlled_digital_lending)
|
12
14
|
# class EntityRights
|
13
15
|
# @world = #Rights
|
14
16
|
# @group {
|
@@ -18,6 +20,7 @@ module Dor
|
|
18
20
|
# 'app1' => #Rights,
|
19
21
|
# 'app2' => #Rights
|
20
22
|
# }
|
23
|
+
# @controlled_digital_lending = false
|
21
24
|
# end
|
22
25
|
|
23
26
|
# class Dor::RightsAuth
|
@@ -28,9 +31,11 @@ module Dor
|
|
28
31
|
# }
|
29
32
|
# end
|
30
33
|
|
34
|
+
# read rights_xml only once and create query-able methods for rights info
|
31
35
|
class RightsAuth
|
32
36
|
|
33
37
|
CONTAINS_STANFORD_XPATH = "contains(translate(text(), 'STANFORD', 'stanford'), 'stanford')"
|
38
|
+
NO_DOWNLOAD_RULE = 'no-download'
|
34
39
|
|
35
40
|
attr_accessor :obj_lvl, :file, :embargoed, :index_elements
|
36
41
|
|
@@ -43,20 +48,59 @@ module Dor
|
|
43
48
|
|
44
49
|
# Returns true if the object is under embargo.
|
45
50
|
# @return [Boolean]
|
46
|
-
def embargoed?
|
51
|
+
def embargoed?
|
47
52
|
@embargoed
|
48
53
|
end
|
49
54
|
|
55
|
+
# summary level rights info is mostly used for object-level indexing/faceting.
|
56
|
+
# thus, we currently only calculate it when parsing object rights for indexing.
|
57
|
+
# to keep from having to refactor or duplicate code right now, we'll just leverage
|
58
|
+
# what we've got, checking whether index_elements is populated, and raising an error
|
59
|
+
# if the object wasn't instantiated in a way that makes those calculations.
|
60
|
+
def check_index_elements_calculated!
|
61
|
+
unless index_elements.size > 0
|
62
|
+
raise "primary access rights not calculated. instantiate by calling '.parse(xml, forindex = true)'."
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
# this is just a convenience method for asking whether an object's rights would
|
67
|
+
# classify it as 'dark'.
|
68
|
+
def dark?
|
69
|
+
check_index_elements_calculated!
|
70
|
+
index_elements[:primary] == 'dark'
|
71
|
+
end
|
72
|
+
|
73
|
+
# this is just a convenience method for asking whether an object's rights would
|
74
|
+
# classify it as 'citation only'.
|
75
|
+
def citation_only?
|
76
|
+
check_index_elements_calculated!
|
77
|
+
index_elements[:primary] == 'citation'
|
78
|
+
end
|
79
|
+
|
50
80
|
# Returns true if the object is world readable AND has no rule attribute
|
51
81
|
# @return [Boolean]
|
52
82
|
def world_unrestricted?
|
53
83
|
@obj_lvl.world.value && @obj_lvl.world.rule.nil?
|
54
84
|
end
|
55
|
-
|
56
85
|
alias_method :public_unrestricted?, :world_unrestricted?
|
57
86
|
|
58
87
|
def readable?
|
59
|
-
|
88
|
+
# TODO: stanford_only or public with rule, figure out if this is still a legit method
|
89
|
+
public_unrestricted? || stanford_only_unrestricted?
|
90
|
+
end
|
91
|
+
|
92
|
+
# Returns true if the object is readable AND allows download
|
93
|
+
# @return [Boolean]
|
94
|
+
def world_downloadable?
|
95
|
+
world_rule = @obj_lvl.world.rule
|
96
|
+
@obj_lvl.world.value && (world_rule.nil? || world_rule != NO_DOWNLOAD_RULE)
|
97
|
+
end
|
98
|
+
alias_method :public_downloadable?, :world_downloadable?
|
99
|
+
|
100
|
+
# Returns true if the object is enabled for controlled digital lending
|
101
|
+
# @return [Boolean]
|
102
|
+
def controlled_digital_lending?
|
103
|
+
@obj_lvl.controlled_digital_lending
|
60
104
|
end
|
61
105
|
|
62
106
|
# Returns true if the object is stanford-only readable AND has no rule attribute
|
@@ -65,14 +109,21 @@ module Dor
|
|
65
109
|
@obj_lvl.group[:stanford].value && @obj_lvl.group[:stanford].rule.nil?
|
66
110
|
end
|
67
111
|
|
112
|
+
# Returns true if the object is stanford-only readable AND allows download
|
113
|
+
# @return [Boolean]
|
114
|
+
def stanford_only_downloadable?
|
115
|
+
stanford_rule = @obj_lvl.group[:stanford].rule
|
116
|
+
@obj_lvl.group[:stanford].value && (stanford_rule.nil? || stanford_rule != NO_DOWNLOAD_RULE)
|
117
|
+
end
|
118
|
+
|
68
119
|
# Returns true if the passed in agent (usually an application) is allowed access to the object without a rule
|
69
120
|
# @param [String] agent_name Name of the agent that wants to access this object
|
70
121
|
# @return [Boolean]
|
71
122
|
def agent_unrestricted?(agent_name)
|
72
123
|
return false unless @obj_lvl.agent.key? agent_name
|
124
|
+
|
73
125
|
@obj_lvl.agent[agent_name].value && @obj_lvl.agent[agent_name].rule.nil?
|
74
126
|
end
|
75
|
-
|
76
127
|
alias_method :allowed_read_agent?, :agent_unrestricted?
|
77
128
|
|
78
129
|
# Returns true if the file is stanford-only readable AND has no rule attribute
|
@@ -96,18 +147,38 @@ module Dor
|
|
96
147
|
|
97
148
|
@file[file_name].world.value && @file[file_name].world.rule.nil?
|
98
149
|
end
|
99
|
-
|
100
150
|
alias_method :public_unrestricted_file?, :world_unrestricted_file?
|
101
151
|
|
152
|
+
# Returns true if the file is world readable AND either has no rule attribute or
|
153
|
+
# the rule attribute is not 'no-download'
|
154
|
+
# If world rights do not exist for this file, then object level rights are returned
|
155
|
+
# @see #world_downloadable?
|
156
|
+
# @param [String] file_name name of the file being tested
|
157
|
+
# @return (see #world_rights)
|
158
|
+
def world_downloadable_file?(file_name)
|
159
|
+
return world_downloadable? if @file[file_name].nil? || @file[file_name].world.nil?
|
160
|
+
|
161
|
+
world_rule = @file[file_name].world.rule
|
162
|
+
@file[file_name].world.value && (world_rule.nil? || world_rule != NO_DOWNLOAD_RULE)
|
163
|
+
end
|
164
|
+
alias_method :public_downloadable_file?, :world_downloadable_file?
|
165
|
+
|
166
|
+
def stanford_only_downloadable_file?(file_name)
|
167
|
+
return stanford_only_downloadable? if @file[file_name].nil? || @file[file_name].group[:stanford].nil?
|
168
|
+
|
169
|
+
stanford_rule = @file[file_name].group[:stanford].rule
|
170
|
+
@file[file_name].group[:stanford].value && (stanford_rule.nil? || stanford_rule != NO_DOWNLOAD_RULE)
|
171
|
+
end
|
172
|
+
|
102
173
|
# Returns whether an object-level world node exists, and the value of its rule attribute
|
103
|
-
# @return [Array<(Boolean, String)>] First value:
|
174
|
+
# @return [Array<(Boolean, String)>] First value: existence of node. Second Value: rule attribute, nil otherwise
|
104
175
|
# @example Using multiple variable assignment to read both array elements
|
105
176
|
# world_exists, world_rule = rights.world_rights
|
106
177
|
def world_rights
|
107
178
|
[@obj_lvl.world.value, @obj_lvl.world.rule]
|
108
179
|
end
|
109
180
|
|
110
|
-
# Returns whether
|
181
|
+
# Returns whether an object-level group/stanford node exists, and the value of its rule attribute
|
111
182
|
# @return (see #world_rights)
|
112
183
|
# @example Using multiple variable assignment to read both array elements
|
113
184
|
# su_only_exists, su_only_rule = rights.stanford_only_rights
|
@@ -115,6 +186,30 @@ module Dor
|
|
115
186
|
[@obj_lvl.group[:stanford].value, @obj_lvl.group[:stanford].rule]
|
116
187
|
end
|
117
188
|
|
189
|
+
# Returns whether an object-level location node exists for the passed in location, and the
|
190
|
+
# value of its rule attribute
|
191
|
+
# @param [String] location_name name of the location that is tested for access
|
192
|
+
# @return (see #world_rights)
|
193
|
+
# @example Using multiple variable assignment to read both array elements
|
194
|
+
# location_exists, location_rule = rights.location_rights('spec_coll_reading_room')
|
195
|
+
def location_rights(location_name)
|
196
|
+
return [false, nil] if @obj_lvl.location[location_name].nil?
|
197
|
+
|
198
|
+
[@obj_lvl.location[location_name].value, @obj_lvl.location[location_name].rule]
|
199
|
+
end
|
200
|
+
|
201
|
+
# Returns whether a given file has any location restrictions and falls back to
|
202
|
+
# the object behavior in the absence of the file.
|
203
|
+
# @param [String] file_name name of the file being tested
|
204
|
+
# @return [Boolean] whether any location restrictions exist on the file or the
|
205
|
+
# object itself (in the absence of file-level rights)
|
206
|
+
def restricted_by_location?(file_name = nil)
|
207
|
+
any_file_location = @file[file_name]&.location&.any?
|
208
|
+
any_object_location = @obj_lvl.location&.any?
|
209
|
+
|
210
|
+
any_file_location || any_object_location
|
211
|
+
end
|
212
|
+
|
118
213
|
# Returns whether an object-level agent node exists for the passed in agent, and the value of its rule attribute
|
119
214
|
# @param [String] agent_name name of the app or thing that is tested for access
|
120
215
|
# @return (see #world_rights)
|
@@ -123,6 +218,7 @@ module Dor
|
|
123
218
|
# @note should be called after doing a check for world_unrestricted?
|
124
219
|
def agent_rights(agent_name)
|
125
220
|
return [false, nil] if @obj_lvl.agent[agent_name].nil?
|
221
|
+
|
126
222
|
[@obj_lvl.agent[agent_name].value, @obj_lvl.agent[agent_name].rule]
|
127
223
|
end
|
128
224
|
|
@@ -142,7 +238,7 @@ module Dor
|
|
142
238
|
# Returns whether a file-level group/stanford node exists, and the value of its rule attribute
|
143
239
|
# If a group/stanford node does not exist for this file, then object-level group/stanford rights are returned
|
144
240
|
# @see #stanford_only_rights
|
145
|
-
# @param
|
241
|
+
# @param [String] file_name name of the file being tested
|
146
242
|
# @return (see #world_rights)
|
147
243
|
# @example Using multiple variable assignment to read both array elements
|
148
244
|
# su_only_exists, su_only_rule = rights.stanford_only_rights_for_file('somefile')
|
@@ -152,6 +248,22 @@ module Dor
|
|
152
248
|
[@file[file_name].group[:stanford].value, @file[file_name].group[:stanford].rule]
|
153
249
|
end
|
154
250
|
|
251
|
+
# Returns whether a file-level location-node exists, and the value of its rule attribute
|
252
|
+
# If a location-node does not exist for this file, then object-level location rights are returned
|
253
|
+
# @param [String] file_name name of the file being tested
|
254
|
+
# @param [String] location_name name of the location being tested
|
255
|
+
# @return (see #world_rights)
|
256
|
+
# @example Using multiple variable assignment to read both array elements
|
257
|
+
# location_exists, location_rule = rightslocation_rights_for_file('filex', 'spec_coll_reading_room')
|
258
|
+
def location_rights_for_file(file_name, location_name)
|
259
|
+
file_rights = @file[file_name]
|
260
|
+
return location_rights(location_name) if file_rights.nil?
|
261
|
+
|
262
|
+
return [false, nil] if file_rights.location[location_name].nil?
|
263
|
+
|
264
|
+
[file_rights.location[location_name].value, file_rights.location[location_name].rule]
|
265
|
+
end
|
266
|
+
|
155
267
|
# Returns whether a file-level agent-node exists, and the value of its rule attribute
|
156
268
|
# If an agent-node does not exist for this file, then object-level agent rights are returned
|
157
269
|
# @param [String] file_name name of the file being tested
|
@@ -160,7 +272,8 @@ module Dor
|
|
160
272
|
# @example Using multiple variable assignment to read both array elements
|
161
273
|
# agent_exists, agent_rule = rights.agent_rights_for_file('filex', 'someapp')
|
162
274
|
def agent_rights_for_file(file_name, agent_name)
|
163
|
-
|
275
|
+
# look at object level agent rights if the file-name is not stored
|
276
|
+
return agent_rights(agent_name) if @file[file_name].nil?
|
164
277
|
|
165
278
|
return [false, nil] if @file[file_name].agent[agent_name].nil? # file rules exist, but not for this agent
|
166
279
|
|
@@ -172,6 +285,7 @@ module Dor
|
|
172
285
|
# @return [Array] list of things that are wrong with it
|
173
286
|
def self.validate_lite(doc)
|
174
287
|
return ['no_rightsMetadata'] if doc.nil? || doc.at_xpath('//rightsMetadata').nil?
|
288
|
+
|
175
289
|
errors = []
|
176
290
|
maindiscover = doc.at_xpath("//rightsMetadata/access[@type='discover' and not(file)]")
|
177
291
|
mainread = doc.at_xpath("//rightsMetadata/access[@type='read' and not(file)]")
|
@@ -200,7 +314,10 @@ module Dor
|
|
200
314
|
def self.extract_index_terms(doc)
|
201
315
|
terms = []
|
202
316
|
machine = doc.at_xpath("//rightsMetadata/access[@type='read' and not(file)]/machine")
|
203
|
-
|
317
|
+
if doc.at_xpath("//rightsMetadata/access[@type='discover']/machine/none") ||
|
318
|
+
doc.at_xpath("//rightsMetadata/access[@type='discover']/machine[not(*)]")
|
319
|
+
terms.push 'none_discover'
|
320
|
+
end
|
204
321
|
terms.push 'world_discover' if doc.at_xpath("//rightsMetadata/access[@type='discover']/machine/world[not(@rule)]")
|
205
322
|
return terms if machine.nil?
|
206
323
|
|
@@ -214,11 +331,22 @@ module Dor
|
|
214
331
|
terms.push "group|#{machine.at_xpath('./group').value.downcase}"
|
215
332
|
end
|
216
333
|
|
334
|
+
['location', 'agent'].each do |access_type|
|
335
|
+
if machine.at_xpath("./#{access_type}")
|
336
|
+
terms.push access_type
|
337
|
+
terms.push "#{access_type}_with_rule" if machine.at_xpath("./#{access_type}")
|
338
|
+
end
|
339
|
+
end
|
340
|
+
|
341
|
+
terms.push 'none_read_file' if doc.at_xpath("//rightsMetadata/access[@type='read' and file]/machine/none")
|
342
|
+
|
217
343
|
if machine.at_xpath('./none')
|
218
344
|
terms.push 'none_read'
|
219
345
|
elsif machine.at_xpath('./world')
|
220
346
|
terms.push 'world_read'
|
221
347
|
terms.push "world|#{machine.at_xpath('./world/@rule').value.downcase}" if machine.at_xpath('./world/@rule')
|
348
|
+
elsif machine.at_xpath('./cdl')
|
349
|
+
terms.push 'cdl_none'
|
222
350
|
end
|
223
351
|
|
224
352
|
# now some statistical generation
|
@@ -250,12 +378,26 @@ module Dor
|
|
250
378
|
# :errors => [...], # known error cases
|
251
379
|
# :terms => [...] # array of non-error characterizations and stats strings
|
252
380
|
# }
|
253
|
-
def self.
|
381
|
+
def self.init_index_elements(doc)
|
254
382
|
errors = validate_lite(doc)
|
255
383
|
stuff = {
|
256
384
|
:primary => nil,
|
257
|
-
:errors
|
258
|
-
:terms
|
385
|
+
:errors => errors,
|
386
|
+
:terms => [],
|
387
|
+
:obj_groups => [],
|
388
|
+
:obj_locations => [],
|
389
|
+
:obj_agents => [],
|
390
|
+
:file_groups => [],
|
391
|
+
:file_locations => [],
|
392
|
+
:file_agents => [],
|
393
|
+
:obj_world_qualified => [],
|
394
|
+
:obj_groups_qualified => [],
|
395
|
+
:obj_locations_qualified => [],
|
396
|
+
:obj_agents_qualified => [],
|
397
|
+
:file_world_qualified => [],
|
398
|
+
:file_groups_qualified => [],
|
399
|
+
:file_locations_qualified => [],
|
400
|
+
:file_agents_qualified => []
|
259
401
|
}
|
260
402
|
|
261
403
|
if errors.include? 'no_rightsMetadata'
|
@@ -264,22 +406,33 @@ module Dor
|
|
264
406
|
end
|
265
407
|
|
266
408
|
stuff[:terms] = extract_index_terms(doc)
|
267
|
-
|
409
|
+
stuff[:primary] = primary_access_rights stuff[:terms], errors
|
268
410
|
|
269
|
-
|
270
|
-
|
411
|
+
stuff
|
412
|
+
end
|
413
|
+
|
414
|
+
# "primary" access is a somewhat crude way of summarizing a whole
|
415
|
+
# object (possibly with many disparate interacting rights types)
|
416
|
+
# using one rights label. but it should still do a good job of capturing
|
417
|
+
# rights that make more sense at the object level (e.g. 'dark').
|
418
|
+
def self.primary_access_rights(index_terms, errors)
|
419
|
+
has_rule = index_terms.include? 'has_rule'
|
420
|
+
if index_terms.include?('none_discover')
|
421
|
+
'dark'
|
422
|
+
elsif index_terms.include?('cdl_none')
|
423
|
+
'controlled digital lending'
|
271
424
|
elsif errors.include?('no_discover_access') || errors.include?('no_discover_machine')
|
272
|
-
|
273
|
-
elsif errors.include?('no_read_machine') ||
|
274
|
-
|
275
|
-
elsif
|
276
|
-
|
277
|
-
elsif
|
278
|
-
|
425
|
+
'dark'
|
426
|
+
elsif errors.include?('no_read_machine') || index_terms.include?('none_read')
|
427
|
+
'citation'
|
428
|
+
elsif index_terms.include? 'world_read'
|
429
|
+
has_rule ? 'world_qualified' : 'world'
|
430
|
+
elsif index_terms.include?('has_group_rights') ||
|
431
|
+
index_terms.include?('location') || index_terms.include?('agent')
|
432
|
+
has_rule ? 'access_restricted_qualified' : 'access_restricted'
|
279
433
|
else # should never happen, but we might as well note it if it does
|
280
|
-
|
434
|
+
has_rule ? 'UNKNOWN_qualified' : 'UNKNOWN'
|
281
435
|
end
|
282
|
-
stuff
|
283
436
|
end
|
284
437
|
|
285
438
|
# Create a Dor::RightsAuth object from xml
|
@@ -292,31 +445,61 @@ module Dor
|
|
292
445
|
rights.obj_lvl.world = Rights.new
|
293
446
|
|
294
447
|
doc = xml.is_a?(Nokogiri::XML::Document) ? xml.clone : Nokogiri::XML(xml)
|
448
|
+
|
449
|
+
rights.index_elements = init_index_elements(doc) if forindex
|
450
|
+
|
295
451
|
if doc.at_xpath("//rightsMetadata/access[@type='read' and not(file)]/machine/world")
|
296
452
|
rights.obj_lvl.world.value = true
|
297
453
|
rule = doc.at_xpath("//rightsMetadata/access[@type='read' and not(file)]/machine/world/@rule")
|
298
454
|
rights.obj_lvl.world.rule = rule.value if rule
|
455
|
+
rights.index_elements[:obj_world_qualified] << { :rule => (rule ? rule.value : nil) } if forindex
|
299
456
|
else
|
300
457
|
rights.obj_lvl.world.value = false
|
301
458
|
end
|
302
459
|
|
303
|
-
|
304
|
-
|
460
|
+
# TODO: we should also look for the <group rule="no-download">stanford</group> node and parse as needed
|
461
|
+
if doc.at_xpath("//rightsMetadata/access[@type='read' and not(file)]/machine/cdl")
|
462
|
+
rights.obj_lvl.controlled_digital_lending = true
|
463
|
+
else
|
464
|
+
rights.obj_lvl.controlled_digital_lending = false
|
465
|
+
end
|
305
466
|
|
306
|
-
|
467
|
+
rights.obj_lvl.group = { :stanford => Rights.new }
|
468
|
+
xpath = "//rightsMetadata/access[@type='read' and not(file)]/machine/group[#{CONTAINS_STANFORD_XPATH}]"
|
469
|
+
if doc.at_xpath(xpath)
|
307
470
|
rights.obj_lvl.group[:stanford].value = true
|
308
|
-
rule = doc.at_xpath("
|
471
|
+
rule = doc.at_xpath("#{xpath}/@rule")
|
309
472
|
rights.obj_lvl.group[:stanford].rule = rule.value if rule
|
473
|
+
if forindex
|
474
|
+
rights.index_elements[:obj_groups_qualified] << { :group => 'stanford', :rule => (rule ? rule.value : nil) }
|
475
|
+
rights.index_elements[:obj_groups] << 'stanford'
|
476
|
+
end
|
310
477
|
else
|
311
478
|
rights.obj_lvl.group[:stanford].value = false
|
312
479
|
end
|
313
480
|
|
481
|
+
rights.obj_lvl.location = {}
|
482
|
+
doc.xpath("//rightsMetadata/access[@type='read' and not(file)]/machine/location").each do |node|
|
483
|
+
r = Rights.new
|
484
|
+
r.value = true
|
485
|
+
r.rule = node['rule']
|
486
|
+
rights.obj_lvl.location[node.content] = r
|
487
|
+
if forindex
|
488
|
+
rights.index_elements[:obj_locations_qualified] << { :location => node.content, :rule => node['rule'] }
|
489
|
+
rights.index_elements[:obj_locations] << node.content
|
490
|
+
end
|
491
|
+
end
|
492
|
+
|
314
493
|
rights.obj_lvl.agent = {}
|
315
494
|
doc.xpath("//rightsMetadata/access[@type='read' and not(file)]/machine/agent").each do |node|
|
316
495
|
r = Rights.new
|
317
496
|
r.value = true
|
318
497
|
r.rule = node['rule']
|
319
498
|
rights.obj_lvl.agent[node.content] = r
|
499
|
+
if forindex
|
500
|
+
rights.index_elements[:obj_agents_qualified] << { :agent => node.content, :rule => node['rule'] }
|
501
|
+
rights.index_elements[:obj_agents] << node.content
|
502
|
+
end
|
320
503
|
end
|
321
504
|
|
322
505
|
# Initialze embargo_status to false
|
@@ -335,6 +518,11 @@ module Dor
|
|
335
518
|
stanford_access.value = true
|
336
519
|
rule = access_node.at_xpath("machine/group[#{CONTAINS_STANFORD_XPATH}]/@rule")
|
337
520
|
stanford_access.rule = rule.value if rule
|
521
|
+
if forindex
|
522
|
+
rights.index_elements[:file_groups_qualified] <<
|
523
|
+
{ :group => 'stanford', :rule => (rule ? rule.value : nil) }
|
524
|
+
rights.index_elements[:file_groups] << 'stanford'
|
525
|
+
end
|
338
526
|
else
|
339
527
|
stanford_access.value = false
|
340
528
|
end
|
@@ -343,16 +531,33 @@ module Dor
|
|
343
531
|
world_access.value = true
|
344
532
|
rule = access_node.at_xpath('machine/world/@rule')
|
345
533
|
world_access.rule = rule.value if rule
|
534
|
+
rights.index_elements[:file_world_qualified] << { :rule => (rule ? rule.value : nil) } if forindex
|
346
535
|
else
|
347
536
|
world_access.value = false
|
348
537
|
end
|
349
538
|
|
539
|
+
file_locations = {}
|
540
|
+
access_node.xpath('machine/location').each do |node|
|
541
|
+
r = Rights.new
|
542
|
+
r.value = true
|
543
|
+
r.rule = node['rule']
|
544
|
+
file_locations[node.content] = r
|
545
|
+
if forindex
|
546
|
+
rights.index_elements[:file_locations_qualified] << { :location => node.content, :rule => node['rule'] }
|
547
|
+
rights.index_elements[:file_locations] << node.content
|
548
|
+
end
|
549
|
+
end
|
550
|
+
|
350
551
|
file_agents = {}
|
351
552
|
access_node.xpath('machine/agent').each do |node|
|
352
553
|
r = Rights.new
|
353
554
|
r.value = true
|
354
555
|
r.rule = node['rule']
|
355
556
|
file_agents[node.content] = r
|
557
|
+
if forindex
|
558
|
+
rights.index_elements[:file_agents_qualified] << { :agent => node.content, :rule => node['rule'] }
|
559
|
+
rights.index_elements[:file_agents] << node.content
|
560
|
+
end
|
356
561
|
end
|
357
562
|
|
358
563
|
access_node.xpath('file').each do |f|
|
@@ -360,11 +565,29 @@ module Dor
|
|
360
565
|
file_rights.world = world_access
|
361
566
|
file_rights.group = { :stanford => stanford_access }
|
362
567
|
file_rights.agent = file_agents
|
568
|
+
file_rights.location = file_locations
|
363
569
|
|
364
570
|
rights.file[f.content] = file_rights
|
365
571
|
end
|
366
572
|
end
|
367
573
|
|
574
|
+
if forindex
|
575
|
+
%i[obj_groups
|
576
|
+
obj_locations
|
577
|
+
obj_agents
|
578
|
+
file_groups
|
579
|
+
file_locations
|
580
|
+
file_agents
|
581
|
+
obj_world_qualified
|
582
|
+
obj_groups_qualified
|
583
|
+
obj_locations_qualified
|
584
|
+
obj_agents_qualified
|
585
|
+
file_world_qualified
|
586
|
+
file_groups_qualified
|
587
|
+
file_locations_qualified
|
588
|
+
file_agents_qualified].each { |index_elt| rights.index_elements[index_elt].uniq! }
|
589
|
+
end
|
590
|
+
|
368
591
|
rights
|
369
592
|
end
|
370
593
|
|
metadata
CHANGED
@@ -1,15 +1,17 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dor-rights-auth
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Willy Mene
|
8
8
|
- Joe Atzberger
|
9
|
+
- Johnathan Martin
|
10
|
+
- Naomi Dushay
|
9
11
|
autorequire:
|
10
12
|
bindir: bin
|
11
13
|
cert_chain: []
|
12
|
-
date:
|
14
|
+
date: 2020-08-26 00:00:00.000000000 Z
|
13
15
|
dependencies:
|
14
16
|
- !ruby/object:Gem::Dependency
|
15
17
|
name: nokogiri
|
@@ -25,6 +27,34 @@ dependencies:
|
|
25
27
|
- - ">="
|
26
28
|
- !ruby/object:Gem::Version
|
27
29
|
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: codeclimate-test-reporter
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
requirements:
|
34
|
+
- - ">="
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: '0'
|
37
|
+
type: :development
|
38
|
+
prerelease: false
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
- !ruby/object:Gem::Dependency
|
45
|
+
name: coveralls
|
46
|
+
requirement: !ruby/object:Gem::Requirement
|
47
|
+
requirements:
|
48
|
+
- - ">="
|
49
|
+
- !ruby/object:Gem::Version
|
50
|
+
version: '0'
|
51
|
+
type: :development
|
52
|
+
prerelease: false
|
53
|
+
version_requirements: !ruby/object:Gem::Requirement
|
54
|
+
requirements:
|
55
|
+
- - ">="
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: '0'
|
28
58
|
- !ruby/object:Gem::Dependency
|
29
59
|
name: rake
|
30
60
|
requirement: !ruby/object:Gem::Requirement
|
@@ -53,6 +83,34 @@ dependencies:
|
|
53
83
|
- - "~>"
|
54
84
|
- !ruby/object:Gem::Version
|
55
85
|
version: '3.0'
|
86
|
+
- !ruby/object:Gem::Dependency
|
87
|
+
name: rubocop
|
88
|
+
requirement: !ruby/object:Gem::Requirement
|
89
|
+
requirements:
|
90
|
+
- - ">="
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
version: '0'
|
93
|
+
type: :development
|
94
|
+
prerelease: false
|
95
|
+
version_requirements: !ruby/object:Gem::Requirement
|
96
|
+
requirements:
|
97
|
+
- - ">="
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: '0'
|
100
|
+
- !ruby/object:Gem::Dependency
|
101
|
+
name: rubocop-rspec
|
102
|
+
requirement: !ruby/object:Gem::Requirement
|
103
|
+
requirements:
|
104
|
+
- - ">="
|
105
|
+
- !ruby/object:Gem::Version
|
106
|
+
version: '0'
|
107
|
+
type: :development
|
108
|
+
prerelease: false
|
109
|
+
version_requirements: !ruby/object:Gem::Requirement
|
110
|
+
requirements:
|
111
|
+
- - ">="
|
112
|
+
- !ruby/object:Gem::Version
|
113
|
+
version: '0'
|
56
114
|
- !ruby/object:Gem::Dependency
|
57
115
|
name: yard
|
58
116
|
requirement: !ruby/object:Gem::Requirement
|
@@ -69,8 +127,7 @@ dependencies:
|
|
69
127
|
version: '0'
|
70
128
|
description: Parses rightsMetadata xml into a useable object
|
71
129
|
email:
|
72
|
-
-
|
73
|
-
- atz@stanford.edu
|
130
|
+
- dlss-infrastructure-team@lists.stanford.edu
|
74
131
|
executables: []
|
75
132
|
extensions: []
|
76
133
|
extra_rdoc_files: []
|
@@ -93,19 +150,17 @@ require_paths:
|
|
93
150
|
- lib
|
94
151
|
required_ruby_version: !ruby/object:Gem::Requirement
|
95
152
|
requirements:
|
96
|
-
- - "
|
153
|
+
- - "~>"
|
97
154
|
- !ruby/object:Gem::Version
|
98
|
-
version: '
|
155
|
+
version: '2.5'
|
99
156
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
100
157
|
requirements:
|
101
158
|
- - ">="
|
102
159
|
- !ruby/object:Gem::Version
|
103
160
|
version: 1.3.6
|
104
161
|
requirements: []
|
105
|
-
|
106
|
-
rubygems_version: 2.4.6
|
162
|
+
rubygems_version: 3.1.2
|
107
163
|
signing_key:
|
108
164
|
specification_version: 4
|
109
165
|
summary: Parses rightsMetadata xml into a useable object
|
110
166
|
test_files: []
|
111
|
-
has_rdoc:
|