dor-rights-auth 1.4.0 → 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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 155c15e0037ba6d647c2926ab7d83c01eb28902e
4
- data.tar.gz: b3ea1d4f93bf56722f103d88f11dddd20b05cc77
2
+ SHA256:
3
+ metadata.gz: f3461a34cc8edcf7b4362d1c6c58304bbe43a82fbd9edd16452ec02cf8a40204
4
+ data.tar.gz: 826e6ef53e3fec66cb97b1ab385793b9727ddc82bd81be1add9c46d285183303
5
5
  SHA512:
6
- metadata.gz: 758a25ecd5845ec8e39d6bb23359c200d92f5ee77f6c37556afad96b63aa130b172b892abe6bc6b51479d4f90548f8470c6432004585c1ba9e3b5eab14690f18
7
- data.tar.gz: 3d0f06f1fd0e34302c8a1010e3f7f4bff3e07750298421d0eafa3ffaf843c1c1cac391d48cee3a0ec560482a6eca2e41d1b0be354c46175baa5766b3ae8dcd6e
6
+ metadata.gz: 196996c12540e5e17907865aabdff51c36afca65d59781d6cf08660d7c422b8bd26fefd699bc211c02ffc51e97ada62331fc19a701f5b39c5a9e15b90a1248f0
7
+ data.tar.gz: 9dd9fa090720a1f4cdf5f9673513153ae3d41a63b57aaac99385353f26c9e4d3e1fa0e8309d863d1c0f01ab29302a4b4def2ee0730336ee72ace62f920ab9477
@@ -1 +1,3 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'dor/rights_auth'
@@ -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, :location)
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
@@ -31,8 +34,8 @@ module Dor
31
34
  # read rights_xml only once and create query-able methods for rights info
32
35
  class RightsAuth
33
36
 
34
- CONTAINS_STANFORD_XPATH = "contains(translate(text(), 'STANFORD', 'stanford'), 'stanford')".freeze
35
- NO_DOWNLOAD_RULE = 'no-download'.freeze
37
+ CONTAINS_STANFORD_XPATH = "contains(translate(text(), 'STANFORD', 'stanford'), 'stanford')"
38
+ NO_DOWNLOAD_RULE = 'no-download'
36
39
 
37
40
  attr_accessor :obj_lvl, :file, :embargoed, :index_elements
38
41
 
@@ -94,6 +97,12 @@ module Dor
94
97
  end
95
98
  alias_method :public_downloadable?, :world_downloadable?
96
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
104
+ end
105
+
97
106
  # Returns true if the object is stanford-only readable AND has no rule attribute
98
107
  # @return [Boolean]
99
108
  def stanford_only_unrestricted?
@@ -112,6 +121,7 @@ module Dor
112
121
  # @return [Boolean]
113
122
  def agent_unrestricted?(agent_name)
114
123
  return false unless @obj_lvl.agent.key? agent_name
124
+
115
125
  @obj_lvl.agent[agent_name].value && @obj_lvl.agent[agent_name].rule.nil?
116
126
  end
117
127
  alias_method :allowed_read_agent?, :agent_unrestricted?
@@ -194,8 +204,8 @@ module Dor
194
204
  # @return [Boolean] whether any location restrictions exist on the file or the
195
205
  # object itself (in the absence of file-level rights)
196
206
  def restricted_by_location?(file_name = nil)
197
- any_file_location = @file[file_name] && @file[file_name].location.any?
198
- any_object_location = @obj_lvl.location && @obj_lvl.location.any?
207
+ any_file_location = @file[file_name]&.location&.any?
208
+ any_object_location = @obj_lvl.location&.any?
199
209
 
200
210
  any_file_location || any_object_location
201
211
  end
@@ -208,6 +218,7 @@ module Dor
208
218
  # @note should be called after doing a check for world_unrestricted?
209
219
  def agent_rights(agent_name)
210
220
  return [false, nil] if @obj_lvl.agent[agent_name].nil?
221
+
211
222
  [@obj_lvl.agent[agent_name].value, @obj_lvl.agent[agent_name].rule]
212
223
  end
213
224
 
@@ -274,6 +285,7 @@ module Dor
274
285
  # @return [Array] list of things that are wrong with it
275
286
  def self.validate_lite(doc)
276
287
  return ['no_rightsMetadata'] if doc.nil? || doc.at_xpath('//rightsMetadata').nil?
288
+
277
289
  errors = []
278
290
  maindiscover = doc.at_xpath("//rightsMetadata/access[@type='discover' and not(file)]")
279
291
  mainread = doc.at_xpath("//rightsMetadata/access[@type='read' and not(file)]")
@@ -302,7 +314,10 @@ module Dor
302
314
  def self.extract_index_terms(doc)
303
315
  terms = []
304
316
  machine = doc.at_xpath("//rightsMetadata/access[@type='read' and not(file)]/machine")
305
- terms.push 'none_discover' if doc.at_xpath("//rightsMetadata/access[@type='discover']/machine/none") || doc.at_xpath("//rightsMetadata/access[@type='discover']/machine[not(*)]")
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
306
321
  terms.push 'world_discover' if doc.at_xpath("//rightsMetadata/access[@type='discover']/machine/world[not(@rule)]")
307
322
  return terms if machine.nil?
308
323
 
@@ -323,15 +338,15 @@ module Dor
323
338
  end
324
339
  end
325
340
 
326
- if doc.at_xpath("//rightsMetadata/access[@type='read' and file]/machine/none")
327
- terms.push "none_read_file"
328
- end
341
+ terms.push 'none_read_file' if doc.at_xpath("//rightsMetadata/access[@type='read' and file]/machine/none")
329
342
 
330
343
  if machine.at_xpath('./none')
331
344
  terms.push 'none_read'
332
345
  elsif machine.at_xpath('./world')
333
346
  terms.push 'world_read'
334
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'
335
350
  end
336
351
 
337
352
  # now some statistical generation
@@ -366,23 +381,23 @@ module Dor
366
381
  def self.init_index_elements(doc)
367
382
  errors = validate_lite(doc)
368
383
  stuff = {
369
- :primary => nil,
370
- :errors => errors,
371
- :terms => [],
372
- :obj_groups => [],
373
- :obj_locations => [],
374
- :obj_agents => [],
375
- :file_groups => [],
376
- :file_locations => [],
377
- :file_agents => [],
378
- :obj_world_qualified => [],
379
- :obj_groups_qualified => [],
380
- :obj_locations_qualified => [],
381
- :obj_agents_qualified => [],
382
- :file_world_qualified => [],
383
- :file_groups_qualified => [],
384
+ :primary => nil,
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 => [],
384
399
  :file_locations_qualified => [],
385
- :file_agents_qualified => []
400
+ :file_agents_qualified => []
386
401
  }
387
402
 
388
403
  if errors.include? 'no_rightsMetadata'
@@ -404,6 +419,8 @@ module Dor
404
419
  has_rule = index_terms.include? 'has_rule'
405
420
  if index_terms.include?('none_discover')
406
421
  'dark'
422
+ elsif index_terms.include?('cdl_none')
423
+ 'controlled digital lending'
407
424
  elsif errors.include?('no_discover_access') || errors.include?('no_discover_machine')
408
425
  'dark'
409
426
  elsif errors.include?('no_read_machine') || index_terms.include?('none_read')
@@ -440,7 +457,14 @@ module Dor
440
457
  rights.obj_lvl.world.value = false
441
458
  end
442
459
 
443
- rights.obj_lvl.group = { :stanford => Rights.new }
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
466
+
467
+ rights.obj_lvl.group = { :stanford => Rights.new }
444
468
  xpath = "//rightsMetadata/access[@type='read' and not(file)]/machine/group[#{CONTAINS_STANFORD_XPATH}]"
445
469
  if doc.at_xpath(xpath)
446
470
  rights.obj_lvl.group[:stanford].value = true
@@ -548,20 +572,20 @@ module Dor
548
572
  end
549
573
 
550
574
  if forindex
551
- [:obj_groups,
552
- :obj_locations,
553
- :obj_agents,
554
- :file_groups,
555
- :file_locations,
556
- :file_agents,
557
- :obj_world_qualified,
558
- :obj_groups_qualified,
559
- :obj_locations_qualified,
560
- :obj_agents_qualified,
561
- :file_world_qualified,
562
- :file_groups_qualified,
563
- :file_locations_qualified,
564
- :file_agents_qualified].each { |index_elt| rights.index_elements[index_elt].uniq! }
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! }
565
589
  end
566
590
 
567
591
  rights
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.4.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: 2019-08-22 00:00:00.000000000 Z
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
@@ -54,7 +84,7 @@ dependencies:
54
84
  - !ruby/object:Gem::Version
55
85
  version: '3.0'
56
86
  - !ruby/object:Gem::Dependency
57
- name: coveralls
87
+ name: rubocop
58
88
  requirement: !ruby/object:Gem::Requirement
59
89
  requirements:
60
90
  - - ">="
@@ -68,7 +98,7 @@ dependencies:
68
98
  - !ruby/object:Gem::Version
69
99
  version: '0'
70
100
  - !ruby/object:Gem::Dependency
71
- name: codeclimate-test-reporter
101
+ name: rubocop-rspec
72
102
  requirement: !ruby/object:Gem::Requirement
73
103
  requirements:
74
104
  - - ">="
@@ -97,7 +127,7 @@ dependencies:
97
127
  version: '0'
98
128
  description: Parses rightsMetadata xml into a useable object
99
129
  email:
100
- - atz@stanford.edu
130
+ - dlss-infrastructure-team@lists.stanford.edu
101
131
  executables: []
102
132
  extensions: []
103
133
  extra_rdoc_files: []
@@ -120,17 +150,16 @@ require_paths:
120
150
  - lib
121
151
  required_ruby_version: !ruby/object:Gem::Requirement
122
152
  requirements:
123
- - - ">="
153
+ - - "~>"
124
154
  - !ruby/object:Gem::Version
125
- version: '0'
155
+ version: '2.5'
126
156
  required_rubygems_version: !ruby/object:Gem::Requirement
127
157
  requirements:
128
158
  - - ">="
129
159
  - !ruby/object:Gem::Version
130
160
  version: 1.3.6
131
161
  requirements: []
132
- rubyforge_project:
133
- rubygems_version: 2.6.13
162
+ rubygems_version: 3.1.2
134
163
  signing_key:
135
164
  specification_version: 4
136
165
  summary: Parses rightsMetadata xml into a useable object
OSZAR »