ddr-models 1.2.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.
Files changed (188) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +12 -0
  3. data/README.md +5 -0
  4. data/Rakefile +37 -0
  5. data/app/models/attachment.rb +7 -0
  6. data/app/models/collection.rb +54 -0
  7. data/app/models/component.rb +15 -0
  8. data/app/models/item.rb +19 -0
  9. data/app/models/solr_document.rb +36 -0
  10. data/app/models/target.rb +8 -0
  11. data/config/initializers/active_fedora_base.rb +77 -0
  12. data/config/initializers/active_fedora_datastream.rb +5 -0
  13. data/config/initializers/ddr.rb +8 -0
  14. data/config/initializers/devise.rb +245 -0
  15. data/config/initializers/devise.rb~ +245 -0
  16. data/config/initializers/subscriptions.rb +15 -0
  17. data/config/routes.rb +2 -0
  18. data/db/migrate/20141021233359_create_events.rb +28 -0
  19. data/db/migrate/20141021234156_create_minted_ids.rb +19 -0
  20. data/db/migrate/20141103192146_create_workflow_state.rb +13 -0
  21. data/db/migrate/20141104181418_create_users.rb +34 -0
  22. data/db/migrate/20141104181418_create_users.rb~ +6 -0
  23. data/lib/ddr-models.rb +1 -0
  24. data/lib/ddr/actions.rb +8 -0
  25. data/lib/ddr/actions/fixity_check.rb +35 -0
  26. data/lib/ddr/auth.rb +45 -0
  27. data/lib/ddr/auth.rb~ +47 -0
  28. data/lib/ddr/auth/ability.rb +204 -0
  29. data/lib/ddr/auth/ability.rb~ +204 -0
  30. data/lib/ddr/auth/group_service.rb +53 -0
  31. data/lib/ddr/auth/group_service.rb~ +53 -0
  32. data/lib/ddr/auth/grouper_service.rb +76 -0
  33. data/lib/ddr/auth/grouper_service.rb~ +77 -0
  34. data/lib/ddr/auth/remote_group_service.rb +35 -0
  35. data/lib/ddr/auth/remote_group_service.rb~ +35 -0
  36. data/lib/ddr/auth/superuser.rb +13 -0
  37. data/lib/ddr/auth/superuser.rb~ +9 -0
  38. data/lib/ddr/auth/user.rb +71 -0
  39. data/lib/ddr/auth/user.rb~ +65 -0
  40. data/lib/ddr/configurable.rb +34 -0
  41. data/lib/ddr/datastreams.rb +32 -0
  42. data/lib/ddr/datastreams/content_metadata_datastream.rb +147 -0
  43. data/lib/ddr/datastreams/datastream_behavior.rb +95 -0
  44. data/lib/ddr/datastreams/descriptive_metadata_datastream.rb +84 -0
  45. data/lib/ddr/datastreams/properties_datastream.rb +25 -0
  46. data/lib/ddr/datastreams/role_assignments_datastream.rb +19 -0
  47. data/lib/ddr/events.rb +17 -0
  48. data/lib/ddr/events/creation_event.rb +12 -0
  49. data/lib/ddr/events/event.rb +163 -0
  50. data/lib/ddr/events/fixity_check_event.rb +43 -0
  51. data/lib/ddr/events/ingestion_event.rb +12 -0
  52. data/lib/ddr/events/preservation_event_behavior.rb +37 -0
  53. data/lib/ddr/events/preservation_event_type.rb +24 -0
  54. data/lib/ddr/events/reindex_object_after_save.rb +18 -0
  55. data/lib/ddr/events/update_event.rb +9 -0
  56. data/lib/ddr/events/validation_event.rb +11 -0
  57. data/lib/ddr/events/virus_check_event.rb +30 -0
  58. data/lib/ddr/index_fields.rb +39 -0
  59. data/lib/ddr/metadata.rb +22 -0
  60. data/lib/ddr/metadata/duke_terms.rb +15 -0
  61. data/lib/ddr/metadata/premis_event.rb +59 -0
  62. data/lib/ddr/metadata/rdf_vocabulary_parser.rb +45 -0
  63. data/lib/ddr/metadata/roles_vocabulary.rb +10 -0
  64. data/lib/ddr/metadata/sources/duketerms.rdf.xml +856 -0
  65. data/lib/ddr/metadata/vocabulary.rb +37 -0
  66. data/lib/ddr/models.rb +60 -0
  67. data/lib/ddr/models/access_controllable.rb +23 -0
  68. data/lib/ddr/models/base.rb +37 -0
  69. data/lib/ddr/models/describable.rb +81 -0
  70. data/lib/ddr/models/engine.rb +58 -0
  71. data/lib/ddr/models/error.rb +12 -0
  72. data/lib/ddr/models/event_loggable.rb +36 -0
  73. data/lib/ddr/models/file_management.rb +183 -0
  74. data/lib/ddr/models/fixity_checkable.rb +20 -0
  75. data/lib/ddr/models/governable.rb +48 -0
  76. data/lib/ddr/models/has_attachments.rb +12 -0
  77. data/lib/ddr/models/has_children.rb +21 -0
  78. data/lib/ddr/models/has_content.rb +114 -0
  79. data/lib/ddr/models/has_content_metadata.rb +16 -0
  80. data/lib/ddr/models/has_properties.rb +15 -0
  81. data/lib/ddr/models/has_role_assignments.rb +17 -0
  82. data/lib/ddr/models/has_thumbnail.rb +27 -0
  83. data/lib/ddr/models/has_workflow.rb +29 -0
  84. data/lib/ddr/models/indexing.rb +53 -0
  85. data/lib/ddr/models/licensable.rb +28 -0
  86. data/lib/ddr/models/minted_id.rb +10 -0
  87. data/lib/ddr/models/permanent_identification.rb +48 -0
  88. data/lib/ddr/models/solr_document.rb +193 -0
  89. data/lib/ddr/models/version.rb +5 -0
  90. data/lib/ddr/notifications.rb +15 -0
  91. data/lib/ddr/services.rb +8 -0
  92. data/lib/ddr/services/id_service.rb +48 -0
  93. data/lib/ddr/utils.rb +153 -0
  94. data/lib/ddr/workflow.rb +8 -0
  95. data/lib/ddr/workflow/workflow_state.rb +39 -0
  96. data/spec/dummy/README.rdoc +28 -0
  97. data/spec/dummy/Rakefile +6 -0
  98. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  99. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  100. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  101. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  102. data/spec/dummy/app/models/user.rb +5 -0
  103. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  104. data/spec/dummy/bin/bundle +3 -0
  105. data/spec/dummy/bin/rails +4 -0
  106. data/spec/dummy/bin/rake +4 -0
  107. data/spec/dummy/config.ru +4 -0
  108. data/spec/dummy/config/application.rb +29 -0
  109. data/spec/dummy/config/boot.rb +5 -0
  110. data/spec/dummy/config/database.yml +25 -0
  111. data/spec/dummy/config/environment.rb +5 -0
  112. data/spec/dummy/config/environments/development.rb +37 -0
  113. data/spec/dummy/config/environments/production.rb +78 -0
  114. data/spec/dummy/config/environments/test.rb +39 -0
  115. data/spec/dummy/config/initializers/assets.rb +8 -0
  116. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  117. data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
  118. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  119. data/spec/dummy/config/initializers/inflections.rb +16 -0
  120. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  121. data/spec/dummy/config/initializers/session_store.rb +3 -0
  122. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  123. data/spec/dummy/config/locales/en.yml +23 -0
  124. data/spec/dummy/config/routes.rb +56 -0
  125. data/spec/dummy/config/secrets.yml +22 -0
  126. data/spec/dummy/db/development.sqlite3 +0 -0
  127. data/spec/dummy/db/schema.rb +80 -0
  128. data/spec/dummy/db/test.sqlite3 +0 -0
  129. data/spec/dummy/log/development.log +4974 -0
  130. data/spec/dummy/log/test.log +55627 -0
  131. data/spec/dummy/public/404.html +67 -0
  132. data/spec/dummy/public/422.html +67 -0
  133. data/spec/dummy/public/500.html +66 -0
  134. data/spec/dummy/public/favicon.ico +0 -0
  135. data/spec/factories/attachment_factories.rb +15 -0
  136. data/spec/factories/collection_factories.rb +16 -0
  137. data/spec/factories/component_factories.rb +15 -0
  138. data/spec/factories/event_factories.rb +7 -0
  139. data/spec/factories/item_factories.rb +16 -0
  140. data/spec/factories/target_factories.rb +11 -0
  141. data/spec/factories/test_model_factories.rb +133 -0
  142. data/spec/factories/user_factories.rb +7 -0
  143. data/spec/factories/user_factories.rb~ +7 -0
  144. data/spec/features/grouper_integration_spec.rb~ +21 -0
  145. data/spec/fixtures/contentMetadata.xml +37 -0
  146. data/spec/fixtures/image1.tiff +0 -0
  147. data/spec/fixtures/image2.tiff +0 -0
  148. data/spec/fixtures/image3.tiff +0 -0
  149. data/spec/fixtures/library-devil.tiff +0 -0
  150. data/spec/fixtures/sample.docx +0 -0
  151. data/spec/fixtures/sample.pdf +0 -0
  152. data/spec/fixtures/target.png +0 -0
  153. data/spec/models/ability_spec.rb +248 -0
  154. data/spec/models/ability_spec.rb~ +245 -0
  155. data/spec/models/active_fedora_base_spec.rb +107 -0
  156. data/spec/models/active_fedora_datastream_spec.rb +121 -0
  157. data/spec/models/attachment_spec.rb +13 -0
  158. data/spec/models/collection_spec.rb +33 -0
  159. data/spec/models/component_spec.rb +8 -0
  160. data/spec/models/descriptive_metadata_datastream_spec.rb +102 -0
  161. data/spec/models/events_spec.rb +64 -0
  162. data/spec/models/file_management_spec.rb +179 -0
  163. data/spec/models/has_role_assignments_spec.rb +29 -0
  164. data/spec/models/has_workflow_spec.rb +54 -0
  165. data/spec/models/item_spec.rb +8 -0
  166. data/spec/models/permanent_identification_spec.rb +65 -0
  167. data/spec/models/role_assignments_datastream_spec.rb +25 -0
  168. data/spec/models/superuser_spec.rb +13 -0
  169. data/spec/models/superuser_spec.rb~ +13 -0
  170. data/spec/models/target_spec.rb +8 -0
  171. data/spec/models/user_spec.rb +60 -0
  172. data/spec/models/user_spec.rb~ +56 -0
  173. data/spec/services/group_service_spec.rb +75 -0
  174. data/spec/services/group_service_spec.rb~ +71 -0
  175. data/spec/services/id_service_spec.rb +33 -0
  176. data/spec/spec_helper.rb +125 -0
  177. data/spec/support/shared_examples_for_access_controllables.rb +6 -0
  178. data/spec/support/shared_examples_for_associations.rb +8 -0
  179. data/spec/support/shared_examples_for_ddr_models.rb +7 -0
  180. data/spec/support/shared_examples_for_describables.rb +63 -0
  181. data/spec/support/shared_examples_for_event_loggables.rb +3 -0
  182. data/spec/support/shared_examples_for_events.rb +179 -0
  183. data/spec/support/shared_examples_for_governables.rb +17 -0
  184. data/spec/support/shared_examples_for_has_content.rb +136 -0
  185. data/spec/support/shared_examples_for_has_content_metadata.rb +74 -0
  186. data/spec/support/shared_examples_for_has_properties.rb +5 -0
  187. data/spec/support/shared_examples_for_indexing.rb +36 -0
  188. metadata +562 -0
@@ -0,0 +1,47 @@
1
+ module Ddr
2
+ module Auth
3
+ extend ActiveSupport::Autoload
4
+
5
+ autoload :User
6
+ autoload :Superuser
7
+ autoload :Ability
8
+ autoload :GroupService
9
+ autoload :GrouperService
10
+ autoload :RemoteGroupService
11
+
12
+ # Superuser group
13
+ mattr_accessor :superuser_group do
14
+ ENV['SUPERUSER_GROUP']
15
+ end
16
+
17
+ ## Remote groups (i.e., Grouper) config settings
18
+ # request.env key for group memberships
19
+ mattr_accessor :remote_groups_env_key do
20
+ "ismemberof"
21
+ end
22
+
23
+ # request.env value internal delimiter
24
+ mattr_accessor :remote_groups_env_value_delim do
25
+ ";"
26
+ end
27
+
28
+ # pattern/repl for converting request.env membership values to proper (Grouper) group names
29
+ mattr_accessor :remote_groups_env_value_sub do
30
+ [/^urn:mace:duke\.edu:groups/, "duke"]
31
+ end
32
+
33
+ # Filter for getting list of remote groups for the repository - String, not Regexp
34
+ mattr_accessor :remote_groups_name_filter do
35
+ "duke:library:repository:ddr:"
36
+ end
37
+
38
+ mattr_accessor :everyone_group do
39
+ "public"
40
+ end
41
+
42
+ mattr_accessor :authenticated_users_group do
43
+ "registered"
44
+ end
45
+
46
+ end
47
+ end
@@ -0,0 +1,204 @@
1
+ module Ddr
2
+ module Auth
3
+ class Ability
4
+
5
+ include Hydra::PolicyAwareAbility
6
+
7
+ def custom_permissions
8
+ action_aliases
9
+ discover_permissions
10
+ #export_sets_permissions
11
+ events_permissions
12
+ #batches_permissions
13
+ #ingest_folders_permissions
14
+ #metadata_files_permissions
15
+ attachment_permissions
16
+ children_permissions
17
+ upload_permissions
18
+ end
19
+
20
+ def action_aliases
21
+ # read aliases
22
+ alias_action :attachments, :collection_info, :components, :event, :events, :items, :targets, to: :read
23
+ # edit/update aliases
24
+ alias_action :permissions, :default_permissions, to: :update
25
+ end
26
+
27
+ def read_permissions
28
+ super
29
+ can :read, ActiveFedora::Datastream do |ds|
30
+ can? :read, ds.pid
31
+ end
32
+ end
33
+
34
+ def edit_permissions
35
+ super
36
+ can [:edit, :update, :destroy], ActiveFedora::Datastream do |action, ds|
37
+ can? action, ds.pid
38
+ end
39
+ end
40
+
41
+ def export_sets_permissions
42
+ can :create, ExportSet if authenticated_user?
43
+ can :manage, ExportSet, user: current_user
44
+ end
45
+
46
+ def events_permissions
47
+ can :read, Ddr::Events::Event, user: current_user
48
+ can :read, Ddr::Events::Event do |e|
49
+ can? :read, e.pid
50
+ end
51
+ end
52
+
53
+ def batches_permissions
54
+ can :manage, DulHydra::Batch::Models::Batch, :user_id => current_user.id
55
+ can :manage, DulHydra::Batch::Models::BatchObject do |batch_object|
56
+ can? :manage, batch_object.batch
57
+ end
58
+ end
59
+
60
+ def ingest_folders_permissions
61
+ can :create, IngestFolder if IngestFolder.permitted_folders(current_user).present?
62
+ can [:show, :procezz], IngestFolder, user: current_user
63
+ end
64
+
65
+ def metadata_files_permissions
66
+ can [:show, :procezz], MetadataFile, user: current_user
67
+ end
68
+
69
+ def download_permissions
70
+ can :download, ActiveFedora::Base do |obj|
71
+ if obj.is_a? Component
72
+ can?(:edit, obj) || (can?(:read, obj) && current_user.has_role?(obj, :downloader))
73
+ else
74
+ can? :read, obj
75
+ end
76
+ end
77
+ can :download, SolrDocument do |doc|
78
+ if doc.active_fedora_model == "Component"
79
+ can?(:edit, doc) || (can?(:read, doc) && current_user.has_role?(doc, :downloader))
80
+ else
81
+ can? :read, doc
82
+ end
83
+ end
84
+ can :download, ActiveFedora::Datastream do |ds|
85
+ if ds.dsid == Ddr::Datastreams::CONTENT and ds.digital_object.original_class == Component
86
+ can?(:edit, ds.pid) || (can?(:read, ds.pid) && current_user.has_role?(solr_doc(ds.pid), :downloader))
87
+ else
88
+ can? :read, ds.pid
89
+ end
90
+ end
91
+ end
92
+
93
+ def upload_permissions
94
+ can :upload, Ddr::Models::HasContent do |obj|
95
+ can?(:edit, obj)
96
+ end
97
+ end
98
+
99
+ def children_permissions
100
+ can :add_children, Ddr::Models::HasChildren do |obj|
101
+ can?(:edit, obj)
102
+ end
103
+ end
104
+
105
+ # Mimics Hydra::Ability#read_permissions
106
+ def discover_permissions
107
+ can :discover, String do |pid|
108
+ test_discover(pid)
109
+ end
110
+
111
+ can :discover, ActiveFedora::Base do |obj|
112
+ test_discover(obj.pid)
113
+ end
114
+
115
+ can :discover, SolrDocument do |obj|
116
+ cache.put(obj.id, obj)
117
+ test_discover(obj.id)
118
+ end
119
+ end
120
+
121
+ def attachment_permissions
122
+ can :add_attachment, Ddr::Models::HasAttachments do |obj|
123
+ can?(:edit, obj)
124
+ end
125
+ end
126
+
127
+ # Mimics Hydra::Ability#test_read + Hydra::PolicyAwareAbility#test_read in one method
128
+ def test_discover(pid)
129
+ Rails.logger.debug("[CANCAN] Checking discover permissions for user: #{current_user.user_key} with groups: #{user_groups.inspect}")
130
+ group_intersection = user_groups & discover_groups(pid)
131
+ result = !group_intersection.empty? || discover_persons(pid).include?(current_user.user_key)
132
+ result || test_discover_from_policy(pid)
133
+ end
134
+
135
+ # Mimics Hydra::PolicyAwareAbility#test_read_from_policy
136
+ def test_discover_from_policy(object_pid)
137
+ policy_pid = policy_pid_for(object_pid)
138
+ if policy_pid.nil?
139
+ return false
140
+ else
141
+ Rails.logger.debug("[CANCAN] -policy- Does the POLICY #{policy_pid} provide DISCOVER permissions for #{current_user.user_key}?")
142
+ group_intersection = user_groups & discover_groups_from_policy(policy_pid)
143
+ result = !group_intersection.empty? || discover_persons_from_policy(policy_pid).include?(current_user.user_key)
144
+ Rails.logger.debug("[CANCAN] -policy- decision: #{result}")
145
+ result
146
+ end
147
+ end
148
+
149
+ # Mimics Hydra::Ability#read_groups
150
+ def discover_groups(pid)
151
+ doc = permissions_doc(pid)
152
+ return [] if doc.nil?
153
+ dg = edit_groups(pid) | read_groups(pid) | (doc[self.class.discover_group_field] || [])
154
+ Rails.logger.debug("[CANCAN] discover_groups: #{dg.inspect}")
155
+ return dg
156
+ end
157
+
158
+ # Mimics Hydra::PolicyAwareAbility#read_groups_from_policy
159
+ def discover_groups_from_policy(policy_pid)
160
+ policy_permissions = policy_permissions_doc(policy_pid)
161
+ discover_group_field = Hydra.config[:permissions][:inheritable][:discover][:group]
162
+ dg = edit_groups_from_policy(policy_pid) | read_groups_from_policy(policy_pid) | ((policy_permissions == nil || policy_permissions.fetch(discover_group_field, nil) == nil) ? [] : policy_permissions.fetch(discover_group_field, nil))
163
+ Rails.logger.debug("[CANCAN] -policy- discover_groups: #{dg.inspect}")
164
+ return dg
165
+ end
166
+
167
+ # Mimics Hydra::Ability#read_persons
168
+ def discover_persons(pid)
169
+ doc = permissions_doc(pid)
170
+ return [] if doc.nil?
171
+ dp = edit_persons(pid) | read_persons(pid) | (doc[self.class.discover_person_field] || [])
172
+ Rails.logger.debug("[CANCAN] discover_persons: #{dp.inspect}")
173
+ return dp
174
+ end
175
+
176
+ def discover_persons_from_policy(policy_pid)
177
+ policy_permissions = policy_permissions_doc(policy_pid)
178
+ discover_individual_field = Hydra.config[:permissions][:inheritable][:discover][:individual]
179
+ dp = edit_persons_from_policy(policy_pid) | read_persons_from_policy(policy_pid) | ((policy_permissions == nil || policy_permissions.fetch(discover_individual_field, nil) == nil) ? [] : policy_permissions.fetch(discover_individual_field, nil))
180
+ Rails.logger.debug("[CANCAN] -policy- discover_persons: #{dp.inspect}")
181
+ return dp
182
+ end
183
+
184
+ def self.discover_person_field
185
+ Hydra.config[:permissions][:discover][:individual]
186
+ end
187
+
188
+ def self.discover_group_field
189
+ Hydra.config[:permissions][:discover][:group]
190
+ end
191
+
192
+ private
193
+
194
+ def authenticated_user?
195
+ current_user.persisted?
196
+ end
197
+
198
+ def solr_doc(pid)
199
+ SolrDocument.new(ActiveFedora::SolrService.query("id:\"#{pid}\"", rows: 1).first)
200
+ end
201
+
202
+ end
203
+ end
204
+ end
@@ -0,0 +1,204 @@
1
+ module Ddr
2
+ module Auth
3
+ class Ability
4
+
5
+ include Hydra::PolicyAwareAbility
6
+
7
+ def custom_permissions
8
+ action_aliases
9
+ discover_permissions
10
+ export_sets_permissions
11
+ events_permissions
12
+ batches_permissions
13
+ ingest_folders_permissions
14
+ metadata_files_permissions
15
+ attachment_permissions
16
+ children_permissions
17
+ upload_permissions
18
+ end
19
+
20
+ def action_aliases
21
+ # read aliases
22
+ alias_action :attachments, :collection_info, :components, :event, :events, :items, :targets, to: :read
23
+ # edit/update aliases
24
+ alias_action :permissions, :default_permissions, to: :update
25
+ end
26
+
27
+ def read_permissions
28
+ super
29
+ can :read, ActiveFedora::Datastream do |ds|
30
+ can? :read, ds.pid
31
+ end
32
+ end
33
+
34
+ def edit_permissions
35
+ super
36
+ can [:edit, :update, :destroy], ActiveFedora::Datastream do |action, ds|
37
+ can? action, ds.pid
38
+ end
39
+ end
40
+
41
+ def export_sets_permissions
42
+ can :create, ExportSet if authenticated_user?
43
+ can :manage, ExportSet, user: current_user
44
+ end
45
+
46
+ def events_permissions
47
+ can :read, Ddr::Events::Event, user: current_user
48
+ can :read, Ddr::Events::Event do |e|
49
+ can? :read, e.pid
50
+ end
51
+ end
52
+
53
+ def batches_permissions
54
+ can :manage, DulHydra::Batch::Models::Batch, :user_id => current_user.id
55
+ can :manage, DulHydra::Batch::Models::BatchObject do |batch_object|
56
+ can? :manage, batch_object.batch
57
+ end
58
+ end
59
+
60
+ def ingest_folders_permissions
61
+ can :create, IngestFolder if IngestFolder.permitted_folders(current_user).present?
62
+ can [:show, :procezz], IngestFolder, user: current_user
63
+ end
64
+
65
+ def metadata_files_permissions
66
+ can [:show, :procezz], MetadataFile, user: current_user
67
+ end
68
+
69
+ def download_permissions
70
+ can :download, ActiveFedora::Base do |obj|
71
+ if obj.is_a? Component
72
+ can?(:edit, obj) || (can?(:read, obj) && current_user.has_role?(obj, :downloader))
73
+ else
74
+ can? :read, obj
75
+ end
76
+ end
77
+ can :download, SolrDocument do |doc|
78
+ if doc.active_fedora_model == "Component"
79
+ can?(:edit, doc) || (can?(:read, doc) && current_user.has_role?(doc, :downloader))
80
+ else
81
+ can? :read, doc
82
+ end
83
+ end
84
+ can :download, ActiveFedora::Datastream do |ds|
85
+ if ds.dsid == Ddr::Datastreams::CONTENT and ds.digital_object.original_class == Component
86
+ can?(:edit, ds.pid) || (can?(:read, ds.pid) && current_user.has_role?(solr_doc(ds.pid), :downloader))
87
+ else
88
+ can? :read, ds.pid
89
+ end
90
+ end
91
+ end
92
+
93
+ def upload_permissions
94
+ can :upload, Ddr::Models::HasContent do |obj|
95
+ can?(:edit, obj)
96
+ end
97
+ end
98
+
99
+ def children_permissions
100
+ can :add_children, Ddr::Models::HasChildren do |obj|
101
+ can?(:edit, obj)
102
+ end
103
+ end
104
+
105
+ # Mimics Hydra::Ability#read_permissions
106
+ def discover_permissions
107
+ can :discover, String do |pid|
108
+ test_discover(pid)
109
+ end
110
+
111
+ can :discover, ActiveFedora::Base do |obj|
112
+ test_discover(obj.pid)
113
+ end
114
+
115
+ can :discover, SolrDocument do |obj|
116
+ cache.put(obj.id, obj)
117
+ test_discover(obj.id)
118
+ end
119
+ end
120
+
121
+ def attachment_permissions
122
+ can :add_attachment, Ddr::Models::HasAttachments do |obj|
123
+ can?(:edit, obj)
124
+ end
125
+ end
126
+
127
+ # Mimics Hydra::Ability#test_read + Hydra::PolicyAwareAbility#test_read in one method
128
+ def test_discover(pid)
129
+ Rails.logger.debug("[CANCAN] Checking discover permissions for user: #{current_user.user_key} with groups: #{user_groups.inspect}")
130
+ group_intersection = user_groups & discover_groups(pid)
131
+ result = !group_intersection.empty? || discover_persons(pid).include?(current_user.user_key)
132
+ result || test_discover_from_policy(pid)
133
+ end
134
+
135
+ # Mimics Hydra::PolicyAwareAbility#test_read_from_policy
136
+ def test_discover_from_policy(object_pid)
137
+ policy_pid = policy_pid_for(object_pid)
138
+ if policy_pid.nil?
139
+ return false
140
+ else
141
+ Rails.logger.debug("[CANCAN] -policy- Does the POLICY #{policy_pid} provide DISCOVER permissions for #{current_user.user_key}?")
142
+ group_intersection = user_groups & discover_groups_from_policy(policy_pid)
143
+ result = !group_intersection.empty? || discover_persons_from_policy(policy_pid).include?(current_user.user_key)
144
+ Rails.logger.debug("[CANCAN] -policy- decision: #{result}")
145
+ result
146
+ end
147
+ end
148
+
149
+ # Mimics Hydra::Ability#read_groups
150
+ def discover_groups(pid)
151
+ doc = permissions_doc(pid)
152
+ return [] if doc.nil?
153
+ dg = edit_groups(pid) | read_groups(pid) | (doc[self.class.discover_group_field] || [])
154
+ Rails.logger.debug("[CANCAN] discover_groups: #{dg.inspect}")
155
+ return dg
156
+ end
157
+
158
+ # Mimics Hydra::PolicyAwareAbility#read_groups_from_policy
159
+ def discover_groups_from_policy(policy_pid)
160
+ policy_permissions = policy_permissions_doc(policy_pid)
161
+ discover_group_field = Hydra.config[:permissions][:inheritable][:discover][:group]
162
+ dg = edit_groups_from_policy(policy_pid) | read_groups_from_policy(policy_pid) | ((policy_permissions == nil || policy_permissions.fetch(discover_group_field, nil) == nil) ? [] : policy_permissions.fetch(discover_group_field, nil))
163
+ Rails.logger.debug("[CANCAN] -policy- discover_groups: #{dg.inspect}")
164
+ return dg
165
+ end
166
+
167
+ # Mimics Hydra::Ability#read_persons
168
+ def discover_persons(pid)
169
+ doc = permissions_doc(pid)
170
+ return [] if doc.nil?
171
+ dp = edit_persons(pid) | read_persons(pid) | (doc[self.class.discover_person_field] || [])
172
+ Rails.logger.debug("[CANCAN] discover_persons: #{dp.inspect}")
173
+ return dp
174
+ end
175
+
176
+ def discover_persons_from_policy(policy_pid)
177
+ policy_permissions = policy_permissions_doc(policy_pid)
178
+ discover_individual_field = Hydra.config[:permissions][:inheritable][:discover][:individual]
179
+ dp = edit_persons_from_policy(policy_pid) | read_persons_from_policy(policy_pid) | ((policy_permissions == nil || policy_permissions.fetch(discover_individual_field, nil) == nil) ? [] : policy_permissions.fetch(discover_individual_field, nil))
180
+ Rails.logger.debug("[CANCAN] -policy- discover_persons: #{dp.inspect}")
181
+ return dp
182
+ end
183
+
184
+ def self.discover_person_field
185
+ Hydra.config[:permissions][:discover][:individual]
186
+ end
187
+
188
+ def self.discover_group_field
189
+ Hydra.config[:permissions][:discover][:group]
190
+ end
191
+
192
+ private
193
+
194
+ def authenticated_user?
195
+ current_user.persisted?
196
+ end
197
+
198
+ def solr_doc(pid)
199
+ SolrDocument.new(ActiveFedora::SolrService.query("id:\"#{pid}\"", rows: 1).first)
200
+ end
201
+
202
+ end
203
+ end
204
+ end