sufia 2.0.1 → 3.0.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 (123) hide show
  1. checksums.yaml +4 -4
  2. data/CONTRIBUTING.md +111 -0
  3. data/Gemfile +4 -4
  4. data/History.md +126 -0
  5. data/README.md +23 -5
  6. data/SUFIA_VERSION +1 -1
  7. data/app/assets/javascripts/sufia/multiForm.js +10 -2
  8. data/app/assets/stylesheets/{application-bootstrap.css → application-bootstrap.css.erb} +7 -7
  9. data/app/assets/stylesheets/{bootstrap.min.css → bootstrap.min.css.erb} +1 -1
  10. data/app/controllers/concerns/sufia/users_controller_behavior.rb +9 -3
  11. data/app/controllers/single_use_link_controller.rb +1 -1
  12. data/app/helpers/sufia_helper.rb +7 -1
  13. data/app/models/contact_form.rb +0 -14
  14. data/app/views/_user_util_links.html.erb +0 -15
  15. data/app/views/batch_edits/_check_all.html.erb +2 -2
  16. data/app/views/batch_edits/_delete_selected.html.erb +1 -1
  17. data/app/views/layouts/{_head-tag-content.html.erb → _head_tag_content.html.erb} +0 -0
  18. data/app/views/layouts/homepage.html.erb +2 -2
  19. data/app/views/layouts/sufia-one-column.html.erb +1 -1
  20. data/app/views/layouts/sufia-two-column.html.erb +1 -1
  21. data/app/views/users/edit.html.erb +1 -1
  22. data/app/views/users/show.html.erb +1 -17
  23. data/config/routes.rb +31 -33
  24. data/lib/generators/sufia/sufia_generator.rb +5 -3
  25. data/lib/generators/sufia/templates/catalog_controller.rb +5 -1
  26. data/lib/generators/sufia/templates/config/redis_config.rb +1 -14
  27. data/lib/sufia/batch_edits_controller_behavior.rb +1 -1
  28. data/lib/sufia/controller.rb +1 -1
  29. data/lib/sufia/dashboard_controller_behavior.rb +8 -2
  30. data/lib/sufia/files_controller_behavior.rb +1 -2
  31. data/lib/sufia/version.rb +1 -1
  32. data/spec/active_fedora/unsaved_digital_object_spec.rb +1 -15
  33. data/spec/controllers/authorities_controller_spec.rb +1 -15
  34. data/spec/controllers/batch_controller_spec.rb +10 -16
  35. data/spec/controllers/batch_edits_controller_spec.rb +1 -1
  36. data/spec/controllers/catalog_controller_spec.rb +1 -15
  37. data/spec/controllers/dashboard_controller_spec.rb +23 -17
  38. data/spec/controllers/downloads_controller_spec.rb +1 -15
  39. data/spec/controllers/generic_files_controller_spec.rb +18 -32
  40. data/spec/controllers/mailbox_controller_spec.rb +1 -15
  41. data/spec/controllers/single_use_link_controller_spec.rb +6 -13
  42. data/spec/controllers/users_controller_spec.rb +27 -41
  43. data/spec/factories/users.rb +5 -14
  44. data/spec/features/browse_dashboard_files.rb +21 -0
  45. data/spec/features/browse_files.rb +31 -0
  46. data/spec/features/contact_form.rb +99 -0
  47. data/spec/features/display_dashboard.rb +46 -0
  48. data/spec/features/ingest_upload_files.rb +24 -0
  49. data/spec/features/users_spec.rb +25 -0
  50. data/spec/helpers/generic_file_helper_spec.rb +10 -3
  51. data/spec/helpers/sufia_helper_spec.rb +1 -1
  52. data/spec/lib/sufia/id_service_spec.rb +1 -15
  53. data/spec/models/audit_job_spec.rb +1 -15
  54. data/spec/models/batch_spec.rb +1 -15
  55. data/spec/models/batch_update_job_spec.rb +3 -16
  56. data/spec/models/characterize_job_spec.rb +4 -4
  57. data/spec/models/checksum_audit_log_spec.rb +1 -15
  58. data/spec/models/event_jobs_spec.rb +1 -15
  59. data/spec/models/file_content_datastream_spec.rb +5 -19
  60. data/spec/models/fits_datastream_spec.rb +1 -15
  61. data/spec/models/generic_file/web_form_spec.rb +34 -0
  62. data/spec/models/generic_file_spec.rb +11 -39
  63. data/spec/models/local_authority_spec.rb +3 -15
  64. data/spec/models/properties_datastream_spec.rb +1 -1
  65. data/spec/models/single_use_link_spec.rb +1 -1
  66. data/spec/models/solr_document_spec.rb +1 -1
  67. data/spec/models/transcode_audio_job_spec.rb +1 -1
  68. data/spec/models/transcode_video_job_spec.rb +1 -1
  69. data/spec/models/trophy_spec.rb +1 -1
  70. data/spec/models/unzip_job_spec.rb +1 -15
  71. data/spec/models/user_spec.rb +1 -15
  72. data/spec/rake/sufia_fixtures_spec.rb +3 -17
  73. data/spec/routing/route_spec.rb +7 -21
  74. data/spec/spec_helper.rb +8 -20
  75. data/spec/support/features.rb +6 -0
  76. data/spec/support/features/session_helpers.rb +21 -0
  77. data/spec/support/lib/generators/test_app_generator.rb +4 -0
  78. data/spec/views/batch_edits/check_all_spec.rb +6 -4
  79. data/sufia-models/app/models/checksum_audit_log.rb +1 -15
  80. data/sufia-models/app/models/domain_term.rb +3 -15
  81. data/sufia-models/app/models/geo_names_resource.rb +1 -13
  82. data/sufia-models/app/models/local_authority.rb +12 -17
  83. data/sufia-models/app/models/local_authority_entry.rb +1 -15
  84. data/sufia-models/app/models/single_use_link.rb +2 -3
  85. data/sufia-models/app/models/trophy.rb +1 -1
  86. data/sufia-models/app/models/version_committer.rb +1 -15
  87. data/sufia-models/lib/sufia/models.rb +6 -2
  88. data/sufia-models/lib/sufia/models/engine.rb +1 -1
  89. data/sufia-models/lib/sufia/models/generic_file.rb +3 -0
  90. data/sufia-models/lib/sufia/models/generic_file/accessible_attributes.rb +87 -0
  91. data/sufia-models/lib/sufia/models/generic_file/permissions.rb +2 -1
  92. data/sufia-models/lib/sufia/models/generic_file/web_form.rb +4 -1
  93. data/sufia-models/lib/sufia/models/user.rb +9 -2
  94. data/sufia-models/lib/sufia/models/version.rb +1 -1
  95. data/{lib → sufia-models/lib}/tasks/resque.rake +0 -0
  96. data/sufia-models/sufia-models.gemspec +13 -11
  97. data/sufia.gemspec +1 -3
  98. data/tasks/sufia-dev.rake +21 -10
  99. metadata +30 -84
  100. data/config/cucumber.yml +0 -8
  101. data/features/browse_dashboard_files.feature +0 -16
  102. data/features/browse_files.feature +0 -16
  103. data/features/contact_form.feature +0 -86
  104. data/features/display_dashboard.feature +0 -42
  105. data/features/ingest_upload_files.feature +0 -21
  106. data/features/step_definitions/edit_metadata_steps.rb +0 -89
  107. data/features/step_definitions/fixture_steps.rb +0 -35
  108. data/features/step_definitions/show_document_steps.rb +0 -103
  109. data/features/step_definitions/sufia.rb +0 -69
  110. data/features/step_definitions/user_steps.rb +0 -58
  111. data/features/step_definitions/web_steps.rb +0 -235
  112. data/features/support/cleanup.rb +0 -19
  113. data/features/support/env.rb +0 -90
  114. data/features/support/headless.rb +0 -26
  115. data/features/support/paths.rb +0 -101
  116. data/features/users.feature +0 -18
  117. data/spec/lib/sufia/role_mapper_spec.rb +0 -28
  118. data/spec/support/Gemfile +0 -24
  119. data/spec/views/single_user_link/download.html.erb_spec.rb +0 -5
  120. data/spec/views/single_user_link/generate_download.html.erb_spec.rb +0 -5
  121. data/spec/views/single_user_link/generate_show.html.erb_spec.rb +0 -5
  122. data/spec/views/single_user_link/show.html.erb_spec.rb +0 -5
  123. data/tasks/cucumber.rake +0 -72
data/spec/spec_helper.rb CHANGED
@@ -1,17 +1,3 @@
1
- # Copyright © 2012 The Pennsylvania State University
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # http://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
-
15
1
  # This file is copied to spec/ when you run 'rails generate rspec:install'
16
2
  ENV["RAILS_ENV"] ||= 'test'
17
3
 
@@ -21,6 +7,8 @@ require 'rspec/autorun'
21
7
  require 'capybara/rspec'
22
8
  require 'capybara/rails'
23
9
 
10
+ require File.expand_path('../support/features', __FILE__)
11
+
24
12
  if ENV['COVERAGE']
25
13
  require 'simplecov'
26
14
  SimpleCov.start 'rails'
@@ -47,9 +35,11 @@ Resque.inline = Rails.env.test?
47
35
  FactoryGirl.definition_file_paths = [File.expand_path("../factories", __FILE__)]
48
36
  FactoryGirl.find_definitions
49
37
 
50
- # Requires supporting ruby files with custom matchers and macros, etc,
51
- # in spec/support/ and its subdirectories.
52
- #Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}
38
+ module EngineRoutes
39
+ def self.included(base)
40
+ base.routes { Sufia::Engine.routes }
41
+ end
42
+ end
53
43
 
54
44
  RSpec.configure do |config|
55
45
  # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
@@ -66,9 +56,7 @@ RSpec.configure do |config|
66
56
  config.infer_base_class_for_anonymous_controllers = false
67
57
 
68
58
  config.include Devise::TestHelpers, :type => :controller
69
-
70
- # see https://github.com/rails/journey/issues/39
71
- config.before(:each, :type=>"controller") { @routes = Sufia::Engine.routes }
59
+ config.include EngineRoutes, :type => :controller
72
60
  end
73
61
 
74
62
 
@@ -0,0 +1,6 @@
1
+ # spec/support/features.rb
2
+ require File.expand_path('../features/session_helpers', __FILE__)
3
+
4
+ RSpec.configure do |config|
5
+ config.include Features::SessionHelpers, type: :feature
6
+ end
@@ -0,0 +1,21 @@
1
+ # spec/support/features/session_helpers.rb
2
+ module Features
3
+ module SessionHelpers
4
+ def sign_up_with(email, password)
5
+ Capybara.exact = true
6
+ visit new_user_registration_path
7
+ fill_in 'Email', with: email
8
+ fill_in 'Password', with: password
9
+ fill_in 'Password confirmation', with: password
10
+ click_button 'Sign up'
11
+ end
12
+
13
+ def sign_in(who = :user)
14
+ user = FactoryGirl.create(who)
15
+ visit new_user_session_path
16
+ fill_in 'Email', with: user.email
17
+ fill_in 'Password', with: user.password
18
+ click_button 'Sign in'
19
+ end
20
+ end
21
+ end
@@ -26,5 +26,9 @@ class TestAppGenerator < Rails::Generators::Base
26
26
  def remove_index_page
27
27
  remove_file 'public/index.html'
28
28
  end
29
+
30
+ def copy_rspec_rake_task
31
+ copy_file "lib/tasks/rspec.rake"
32
+ end
29
33
 
30
34
  end
@@ -1,4 +1,4 @@
1
- require 'spec_helper'
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
2
 
3
3
  describe 'Check All' do
4
4
  before (:all) do
@@ -8,15 +8,17 @@ describe 'Check All' do
8
8
  end
9
9
 
10
10
  it 'should render batch edits actions' do
11
+ controller.stub(:controller_name).and_return('batch_edits')
11
12
  controller.prepend_view_path "app/views/batch_edits"
12
- html = render :partial=>'/batch_edits/check_all'
13
+ html = render partial: 'batch_edits/check_all'
13
14
  html.should have_selector("li[data-behavior='batch-edit-select-abc']")
14
15
  end
15
16
 
16
17
  it 'should render dashboard actions' do
18
+ controller.stub(:controller_name).and_return('dashboard')
17
19
  controller.prepend_view_path "app/views/dashboard"
18
- html = render :partial=>'/batch_edits/check_all'
20
+ html = render partial: 'batch_edits/check_all'
19
21
  html.should have_selector("li[data-behavior='batch-edit-select-none']")
20
22
  html.should have_selector("li[data-behavior='batch-edit-select-page']")
21
23
  end
22
- end
24
+ end
@@ -1,19 +1,5 @@
1
- # Copyright © 2012 The Pennsylvania State University
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # http://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
-
15
1
  class ChecksumAuditLog < ActiveRecord::Base
16
- attr_accessible :pass, :pid, :dsid, :version, :created_at
2
+ attr_accessible :pass, :pid, :dsid, :version, :created_at if Rails::VERSION::MAJOR == 3
17
3
 
18
4
  def ChecksumAuditLog.get_audit_log(version)
19
5
  ChecksumAuditLog.find_or_create_by_pid_and_dsid_and_version(:pid => version.pid,
@@ -1,18 +1,6 @@
1
- # Copyright © 2012 The Pennsylvania State University
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # http://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
-
15
1
  class DomainTerm < ActiveRecord::Base
16
- attr_accessible :model, :term
2
+ attr_accessible :model, :term if Rails::VERSION::MAJOR == 3
3
+
4
+ # TODO we should add an index on this join table and remove the uniq query
17
5
  has_and_belongs_to_many :local_authorities, :uniq=> true
18
6
  end
@@ -1,16 +1,4 @@
1
- # Copyright © 2012 The Pennsylvania State University
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # http://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
1
+ require 'active_resource'
14
2
 
15
3
  class GeoNamesResource < ActiveResource::Base
16
4
  self.site = "http://api.geonames.org/"
@@ -1,22 +1,9 @@
1
- # Copyright © 2012 The Pennsylvania State University
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # http://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
-
15
1
  require 'rdf'
16
2
  require 'rdf/rdfxml'
17
3
 
18
4
  class LocalAuthority < ActiveRecord::Base
19
- attr_accessible :name
5
+ attr_accessible :name if Rails::VERSION::MAJOR == 3
6
+ # TODO we should add an index on this join table and remove the uniq query
20
7
  has_and_belongs_to_many :domain_terms, :uniq=> true
21
8
  has_many :local_authority_entries
22
9
 
@@ -37,7 +24,11 @@ class LocalAuthority < ActiveRecord::Base
37
24
  end
38
25
  end
39
26
  end
40
- LocalAuthorityEntry.import entries
27
+ if LocalAuthorityEntry.respond_to? :import
28
+ LocalAuthorityEntry.import entries
29
+ else
30
+ entries.each { |e| e.save! }
31
+ end
41
32
  end
42
33
 
43
34
  def self.harvest_tsv(name, sources, opts = {})
@@ -55,7 +46,11 @@ class LocalAuthority < ActiveRecord::Base
55
46
  end
56
47
  end
57
48
  end
58
- LocalAuthorityEntry.import entries
49
+ if LocalAuthorityEntry.respond_to? :import
50
+ LocalAuthorityEntry.import entries
51
+ else
52
+ entries.each { |e| e.save! }
53
+ end
59
54
  end
60
55
 
61
56
  def self.register_vocabulary(model, term, name)
@@ -1,18 +1,4 @@
1
- # Copyright © 2012 The Pennsylvania State University
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # http://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
-
15
1
  class LocalAuthorityEntry < ActiveRecord::Base
16
2
  belongs_to :local_authority
17
- attr_accessible :local_authority, :label, :uri
3
+ attr_accessible :local_authority, :label, :uri if Rails::VERSION::MAJOR == 3
18
4
  end
@@ -1,7 +1,6 @@
1
1
  class SingleUseLink < ActiveRecord::Base
2
2
 
3
- attr_accessible :downloadKey, :expires, :itemId, :path
4
-
3
+ attr_accessible :downloadKey, :expires, :itemId, :path if Rails::VERSION::MAJOR == 3
5
4
 
6
5
 
7
6
  def self.create_show(item_id)
@@ -20,7 +19,7 @@ class SingleUseLink < ActiveRecord::Base
20
19
  protected
21
20
  def self.create_path(itemId, path)
22
21
  expires = DateTime.now.advance(hours:24)
23
- key = Digest::SHA2.new << DateTime.now.to_f.to_s
22
+ key = Digest::SHA2.new << rand(1000000000).to_s
24
23
  return create({downloadKey:key.to_s, expires:expires, path:path, itemId:itemId} )
25
24
  end
26
25
  end
@@ -1,5 +1,5 @@
1
1
  class Trophy < ActiveRecord::Base
2
- attr_accessible :generic_file_id, :user_id
2
+ attr_accessible :generic_file_id, :user_id if Rails::VERSION::MAJOR == 3
3
3
 
4
4
  validate :count_within_limit, :on => :create
5
5
 
@@ -1,17 +1,3 @@
1
- # Copyright © 2012 The Pennsylvania State University
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # http://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
-
15
1
  class VersionCommitter < ActiveRecord::Base
16
- attr_accessible :obj_id, :datastream_id, :version_id, :committer_login
2
+ attr_accessible :obj_id, :datastream_id, :version_id, :committer_login if Rails::VERSION::MAJOR == 3
17
3
  end
@@ -1,13 +1,17 @@
1
1
  require "sufia/models/version"
2
2
  require "sufia/models/engine"
3
3
  require 'hydra/head'
4
- require 'devise'
5
4
  require 'nest'
6
5
  require 'mailboxer'
7
6
  require 'acts_as_follower'
8
7
  require 'paperclip'
9
8
  require 'RMagick'
10
- require 'activerecord-import'
9
+ begin
10
+ # activerecord-import 0.3.1 does not support rails 4, so we don't require it.
11
+ require 'activerecord-import'
12
+ rescue LoadError
13
+ $stderr.puts "Sufia-models is unable to load activerecord-import"
14
+ end
11
15
  require 'resque/server'
12
16
 
13
17
  module Sufia
@@ -36,7 +36,7 @@ module Sufia
36
36
  initializer "patches" do
37
37
  require 'sufia/models/active_fedora/redis'
38
38
  require 'sufia/models/active_record/redis'
39
- require 'sufia/models/active_support/core_ext/marshal'
39
+ require 'sufia/models/active_support/core_ext/marshal' unless Rails::VERSION::MAJOR == 4
40
40
  end
41
41
 
42
42
  initializer 'requires' do
@@ -9,6 +9,7 @@ module Sufia
9
9
  autoload :Actions
10
10
  autoload :Permissions
11
11
  autoload :WebForm, 'sufia/models/generic_file/web_form'
12
+ autoload :AccessibleAttributes, 'sufia/models/generic_file/accessible_attributes'
12
13
  include Sufia::ModelMethods
13
14
  include Sufia::Noid
14
15
  include Sufia::GenericFile::Thumbnail
@@ -35,6 +36,8 @@ module Sufia
35
36
 
36
37
  around_save :characterize_if_changed, :retry_warming
37
38
  before_destroy :cleanup_trophies
39
+
40
+ attr_accessible *(ds_specs['descMetadata'][:type].fields + [:permissions])
38
41
  end
39
42
 
40
43
 
@@ -0,0 +1,87 @@
1
+ module Sufia
2
+ module GenericFile
3
+ module AccessibleAttributes
4
+ extend ActiveSupport::Concern
5
+ included do
6
+ class_attribute :_accessible_attributes
7
+ self._accessible_attributes = {}
8
+ end
9
+
10
+ def accessible_attributes(role = :default)
11
+ self.class._accessible_attributes[role] || []
12
+ end
13
+
14
+ # Sanitize the provided attributes using only those that are specified
15
+ # as accessible by attr_accessor
16
+ # @param [Hash] attributes the raw parameters
17
+ # @param [Hash] args a hash of options
18
+ # @option args [Symbol] :as (:default) the role to use
19
+ # @return A sanitized hash of parameters
20
+ def sanitize_attributes(attributes = {}, args = {})
21
+ role = args[:as] || :default
22
+ attributes.select { |k,v| accessible_attributes.include?(k.to_sym)}
23
+ end
24
+
25
+ module ClassMethods
26
+ # Specifies a white list of model attributes that can be set via
27
+ # mass-assignment.
28
+ #
29
+ # Like +attr_protected+, a role for the attributes is optional,
30
+ # if no role is provided then :default is used. A role can be defined by
31
+ # using the :as option.
32
+ #
33
+ # Mass-assignment will only set attributes in this list, to assign to
34
+ # the rest of # attributes you can use direct writer methods. This is
35
+ # meant to protect sensitive attributes from being overwritten by
36
+ # malicious users # tampering with URLs or forms.
37
+ #
38
+ # class Customer
39
+ # include ActiveModel::MassAssignmentSecurity
40
+ #
41
+ # attr_accessor :name, :credit_rating
42
+ #
43
+ # attr_accessible :name
44
+ # attr_accessible :name, :credit_rating, :as => :admin
45
+ #
46
+ # def assign_attributes(values, options = {})
47
+ # sanitize_for_mass_assignment(values, options[:as]).each do |k, v|
48
+ # send("#{k}=", v)
49
+ # end
50
+ # end
51
+ # end
52
+ #
53
+ # When using the :default role:
54
+ #
55
+ # customer = Customer.new
56
+ # customer.assign_attributes({ "name" => "David", "credit_rating" => "Excellent", :last_login => 1.day.ago }, :as => :default)
57
+ # customer.name # => "David"
58
+ # customer.credit_rating # => nil
59
+ #
60
+ # customer.credit_rating = "Average"
61
+ # customer.credit_rating # => "Average"
62
+ #
63
+ # And using the :admin role:
64
+ #
65
+ # customer = Customer.new
66
+ # customer.assign_attributes({ "name" => "David", "credit_rating" => "Excellent", :last_login => 1.day.ago }, :as => :admin)
67
+ # customer.name # => "David"
68
+ # customer.credit_rating # => "Excellent"
69
+ #
70
+ # Note that using <tt>Hash#except</tt> or <tt>Hash#slice</tt> in place of
71
+ # +attr_accessible+ to sanitize attributes provides basically the same
72
+ # functionality, but it makes a bit tricky to deal with nested attributes.
73
+ def attr_accessible(*args)
74
+ options = args.extract_options!
75
+ role = options[:as] || :default
76
+
77
+ self._accessible_attributes ||= {}
78
+
79
+ Array.wrap(role).each do |name|
80
+ self._accessible_attributes[name] = args.map &:to_sym
81
+ end
82
+ end
83
+
84
+ end
85
+ end
86
+ end
87
+ end
@@ -37,7 +37,8 @@ module Sufia
37
37
  params[:new_group_name].each { |name, access| perm_hash['group'][name] = access } if params[:new_group_name].present?
38
38
 
39
39
  params[:user].each { |name, access| perm_hash['person'][name] = access} if params[:user]
40
- params[:group].each { |name, access| perm_hash['group'][name] = access} if params[:group]
40
+ params[:group].each { |name, access| perm_hash['group'][name] = access if ['read', 'edit'].include?(access)} if params[:group]
41
+
41
42
  rightsMetadata.update_permissions(perm_hash)
42
43
  end
43
44