mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Merge pull request #15933 from rafael/master
Add always permitted parameters as a configurable option. [Rafael Mendonça França + Gary S. Weaver]
This commit is contained in:
commit
ebdedaec32
6 changed files with 99 additions and 5 deletions
|
@ -1,3 +1,9 @@
|
|||
* Add `config.action_controller.always_permitted_parameters` to configure which
|
||||
parameters are permitted globally. The default value of this configuration is
|
||||
`['controller', 'action']`.
|
||||
|
||||
*Gary S. Weaver*, *Rafael Chacon*
|
||||
|
||||
* Fix env['PATH_INFO'] missing leading slash when a rack app mounted at '/'.
|
||||
|
||||
Fixes #15511.
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
require 'active_support/core_ext/hash/indifferent_access'
|
||||
require 'active_support/core_ext/array/wrap'
|
||||
require 'active_support/deprecation'
|
||||
require 'active_support/rescuable'
|
||||
require 'action_dispatch/http/upload'
|
||||
require 'stringio'
|
||||
|
@ -39,7 +40,7 @@ module ActionController
|
|||
# == Action Controller \Parameters
|
||||
#
|
||||
# Allows to choose which attributes should be whitelisted for mass updating
|
||||
# and thus prevent accidentally exposing that which shouldn’t be exposed.
|
||||
# and thus prevent accidentally exposing that which shouldn't be exposed.
|
||||
# Provides two methods for this purpose: #require and #permit. The former is
|
||||
# used to mark parameters as required. The latter is used to set the parameter
|
||||
# as permitted and limit which attributes should be allowed for mass updating.
|
||||
|
@ -101,9 +102,23 @@ module ActionController
|
|||
cattr_accessor :permit_all_parameters, instance_accessor: false
|
||||
cattr_accessor :action_on_unpermitted_parameters, instance_accessor: false
|
||||
|
||||
# Never raise an UnpermittedParameters exception because of these params
|
||||
# are present. They are added by Rails and it's of no concern.
|
||||
NEVER_UNPERMITTED_PARAMS = %w( controller action )
|
||||
# By default, never raise an UnpermittedParameters exception if these
|
||||
# params are present. The default includes both 'controller' and 'action'
|
||||
# because they are added by Rails and should be of no concern. One way
|
||||
# to change these is to specify `always_permitted_parameters` in your
|
||||
# config. For instance:
|
||||
#
|
||||
# config.always_permitted_parameters = %w( controller action format )
|
||||
cattr_accessor :always_permitted_parameters
|
||||
self.always_permitted_parameters = %w( controller action )
|
||||
|
||||
def self.const_missing(const_name)
|
||||
super unless const_name == :NEVER_UNPERMITTED_PARAMS
|
||||
ActiveSupport::Deprecation.warn "`ActionController::Parameters::NEVER_UNPERMITTED_PARAMS`"\
|
||||
" has been deprecated. Use "\
|
||||
"`ActionController::Parameters.always_permitted_parameters` instead."
|
||||
self.always_permitted_parameters
|
||||
end
|
||||
|
||||
# Returns a new instance of <tt>ActionController::Parameters</tt>.
|
||||
# Also, sets the +permitted+ attribute to the default value of
|
||||
|
@ -389,7 +404,7 @@ module ActionController
|
|||
end
|
||||
|
||||
def unpermitted_keys(params)
|
||||
self.keys - params.keys - NEVER_UNPERMITTED_PARAMS
|
||||
self.keys - params.keys - self.always_permitted_parameters
|
||||
end
|
||||
|
||||
#
|
||||
|
|
|
@ -23,6 +23,10 @@ module ActionController
|
|||
options = app.config.action_controller
|
||||
|
||||
ActionController::Parameters.permit_all_parameters = options.delete(:permit_all_parameters) { false }
|
||||
if app.config.action_controller[:always_permitted_parameters]
|
||||
ActionController::Parameters.always_permitted_parameters =
|
||||
app.config.action_controller.delete(:always_permitted_parameters)
|
||||
end
|
||||
ActionController::Parameters.action_on_unpermitted_parameters = options.delete(:action_on_unpermitted_parameters) do
|
||||
(Rails.env.test? || Rails.env.development?) ? :log : false
|
||||
end
|
||||
|
|
|
@ -0,0 +1,29 @@
|
|||
require 'abstract_unit'
|
||||
require 'action_controller/metal/strong_parameters'
|
||||
|
||||
class AlwaysPermittedParametersTest < ActiveSupport::TestCase
|
||||
def setup
|
||||
ActionController::Parameters.action_on_unpermitted_parameters = :raise
|
||||
ActionController::Parameters.always_permitted_parameters = %w( controller action format )
|
||||
end
|
||||
|
||||
def teardown
|
||||
ActionController::Parameters.action_on_unpermitted_parameters = false
|
||||
ActionController::Parameters.always_permitted_parameters = %w( controller action )
|
||||
end
|
||||
|
||||
test "shows deprecations warning on NEVER_UNPERMITTED_PARAMS" do
|
||||
assert_deprecated do
|
||||
ActionController::Parameters::NEVER_UNPERMITTED_PARAMS
|
||||
end
|
||||
end
|
||||
|
||||
test "permits parameters that are whitelisted" do
|
||||
params = ActionController::Parameters.new({
|
||||
book: { pages: 65 },
|
||||
format: "json"
|
||||
})
|
||||
permitted = params.permit book: [:pages]
|
||||
assert permitted.permitted?
|
||||
end
|
||||
end
|
|
@ -330,6 +330,8 @@ The schema dumper adds one additional configuration option:
|
|||
|
||||
* `config.action_controller.action_on_unpermitted_parameters` enables logging or raising an exception if parameters that are not explicitly permitted are found. Set to `:log` or `:raise` to enable. The default value is `:log` in development and test environments, and `false` in all other environments.
|
||||
|
||||
* `config.action_controller.always_permitted_parameters` sets a list of whitelisted parameters that are permitted by default. The default values are `['controller', 'action']`.
|
||||
|
||||
### Configuring Action Dispatch
|
||||
|
||||
* `config.action_dispatch.session_store` sets the name of the store for session data. The default is `:cookie_store`; other valid options include `:active_record_store`, `:mem_cache_store` or the name of your own custom class.
|
||||
|
|
|
@ -714,6 +714,44 @@ module ApplicationTests
|
|||
assert_match "We're sorry, but something went wrong", last_response.body
|
||||
end
|
||||
|
||||
test "config.action_controller.always_permitted_parameters are: controller, action by default" do
|
||||
require "#{app_path}/config/environment"
|
||||
assert_equal %w(controller action), ActionController::Parameters.always_permitted_parameters
|
||||
end
|
||||
|
||||
test "config.action_controller.always_permitted_parameters = ['controller', 'action', 'format']" do
|
||||
add_to_config <<-RUBY
|
||||
config.action_controller.always_permitted_parameters = %w( controller action format )
|
||||
RUBY
|
||||
require "#{app_path}/config/environment"
|
||||
assert_equal %w( controller action format ), ActionController::Parameters.always_permitted_parameters
|
||||
end
|
||||
|
||||
test "config.action_controller.always_permitted_parameters = ['controller','action','format'] does not raise exeception" do
|
||||
app_file 'app/controllers/posts_controller.rb', <<-RUBY
|
||||
class PostsController < ActionController::Base
|
||||
def create
|
||||
render text: params.permit(post: [:title])
|
||||
end
|
||||
end
|
||||
RUBY
|
||||
|
||||
add_to_config <<-RUBY
|
||||
routes.prepend do
|
||||
resources :posts
|
||||
end
|
||||
config.action_controller.always_permitted_parameters = %w( controller action format )
|
||||
config.action_controller.action_on_unpermitted_parameters = :raise
|
||||
RUBY
|
||||
|
||||
require "#{app_path}/config/environment"
|
||||
|
||||
assert_equal :raise, ActionController::Parameters.action_on_unpermitted_parameters
|
||||
|
||||
post "/posts", {post: {"title" =>"zomg"}, format: "json"}
|
||||
assert_equal 200, last_response.status
|
||||
end
|
||||
|
||||
test "config.action_controller.action_on_unpermitted_parameters is :log by default on development" do
|
||||
ENV["RAILS_ENV"] = "development"
|
||||
|
||||
|
|
Loading…
Reference in a new issue