dor-rights-auth 1.4.0 → 1.5.0

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