actionpack 6.1.3 → 6.1.4.1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of actionpack might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGELOG.md +72 -0
- data/lib/action_controller/metal/etag_with_template_digest.rb +1 -1
- data/lib/action_controller/metal/http_authentication.rb +1 -1
- data/lib/action_controller/metal/live.rb +10 -1
- data/lib/action_controller/metal/params_wrapper.rb +3 -2
- data/lib/action_controller/test_case.rb +3 -0
- data/lib/action_dispatch/http/cache.rb +6 -7
- data/lib/action_dispatch/http/mime_type.rb +1 -1
- data/lib/action_dispatch/journey/formatter.rb +2 -2
- data/lib/action_dispatch/journey/visitors.rb +1 -1
- data/lib/action_dispatch/middleware/host_authorization.rb +9 -15
- data/lib/action_dispatch/middleware/templates/rescues/invalid_statement.text.erb +1 -0
- data/lib/action_dispatch/routing/polymorphic_routes.rb +8 -4
- data/lib/action_pack/gem_version.rb +2 -2
- metadata +12 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 65eaf0a7cdcac42378d27ebca8973bfb4cdf41b0dd79425c2b276c83460bd39b
|
4
|
+
data.tar.gz: d76e6cfc52492a8e7a1c0fc21e59e1cd60ec3c464feb2f304dbbb037418a9739
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a6033213d92c1734124bf7e3b75c61c3f304cf507052f52f85ac96a6ae7079c3c7e526a76ddfdb3024afb0de8fe8e5f6a6fda1d68a8f4ba69c8f048b0902d782
|
7
|
+
data.tar.gz: 4de05a81d6de0efb723dbeb96cb28e403fbe8bfb96963ee64f69dbb22d67ce320393f71b5afaab5dbc65b493e238e176642cc898671019b592c9fa43b9082234
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,75 @@
|
|
1
|
+
## Rails 6.1.4.1 (August 19, 2021) ##
|
2
|
+
|
3
|
+
* [CVE-2021-22942] Fix possible open redirect in Host Authorization middleware.
|
4
|
+
|
5
|
+
Specially crafted "X-Forwarded-Host" headers in combination with certain
|
6
|
+
"allowed host" formats can cause the Host Authorization middleware in Action
|
7
|
+
Pack to redirect users to a malicious website.
|
8
|
+
|
9
|
+
## Rails 6.1.4 (June 24, 2021) ##
|
10
|
+
|
11
|
+
* Ignore file fixtures on `db:fixtures:load`
|
12
|
+
|
13
|
+
*Kevin Sjöberg*
|
14
|
+
|
15
|
+
* Fix ActionController::Live controller test deadlocks by removing the body buffer size limit for tests.
|
16
|
+
|
17
|
+
*Dylan Thacker-Smith*
|
18
|
+
|
19
|
+
* Correctly place optional path parameter booleans.
|
20
|
+
|
21
|
+
Previously, if you specify a url parameter that is part of the path as false it would include that part
|
22
|
+
of the path as parameter for example:
|
23
|
+
|
24
|
+
```
|
25
|
+
get "(/optional/:optional_id)/things" => "foo#foo", as: :things
|
26
|
+
things_path(optional_id: false) # => /things?optional_id=false
|
27
|
+
```
|
28
|
+
|
29
|
+
After this change, true and false will be treated the same when used as optional path parameters. Meaning now:
|
30
|
+
|
31
|
+
```
|
32
|
+
get '(this/:my_bool)/that' as: :that
|
33
|
+
|
34
|
+
that_path(my_bool: true) # => `/this/true/that`
|
35
|
+
that_path(my_bool: false) # => `/this/false/that`
|
36
|
+
```
|
37
|
+
|
38
|
+
*Adam Hess*
|
39
|
+
|
40
|
+
* Add support for 'private, no-store' Cache-Control headers.
|
41
|
+
|
42
|
+
Previously, 'no-store' was exclusive; no other directives could be specified.
|
43
|
+
|
44
|
+
*Alex Smith*
|
45
|
+
|
46
|
+
|
47
|
+
## Rails 6.1.3.2 (May 05, 2021) ##
|
48
|
+
|
49
|
+
* Prevent open redirects by correctly escaping the host allow list
|
50
|
+
CVE-2021-22903
|
51
|
+
|
52
|
+
* Prevent catastrophic backtracking during mime parsing
|
53
|
+
CVE-2021-22902
|
54
|
+
|
55
|
+
* Prevent regex DoS in HTTP token authentication
|
56
|
+
CVE-2021-22904
|
57
|
+
|
58
|
+
* Prevent string polymorphic route arguments.
|
59
|
+
|
60
|
+
`url_for` supports building polymorphic URLs via an array
|
61
|
+
of arguments (usually symbols and records). If a developer passes a
|
62
|
+
user input array, strings can result in unwanted route helper calls.
|
63
|
+
|
64
|
+
CVE-2021-22885
|
65
|
+
|
66
|
+
*Gannon McGibbon*
|
67
|
+
|
68
|
+
## Rails 6.1.3.1 (March 26, 2021) ##
|
69
|
+
|
70
|
+
* No changes.
|
71
|
+
|
72
|
+
|
1
73
|
## Rails 6.1.3 (February 17, 2021) ##
|
2
74
|
|
3
75
|
* Re-define routes when not set correctly via inheritance.
|
@@ -44,7 +44,7 @@ module ActionController
|
|
44
44
|
# template digest from the ETag.
|
45
45
|
def pick_template_for_etag(options)
|
46
46
|
unless options[:template] == false
|
47
|
-
options[:template] ||
|
47
|
+
options[:template] || lookup_context.find_all(action_name, _prefixes).first&.virtual_path
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
@@ -127,6 +127,11 @@ module ActionController
|
|
127
127
|
class Buffer < ActionDispatch::Response::Buffer #:nodoc:
|
128
128
|
include MonitorMixin
|
129
129
|
|
130
|
+
class << self
|
131
|
+
attr_accessor :queue_size
|
132
|
+
end
|
133
|
+
@queue_size = 10
|
134
|
+
|
130
135
|
# Ignore that the client has disconnected.
|
131
136
|
#
|
132
137
|
# If this value is `true`, calling `write` after the client
|
@@ -136,7 +141,7 @@ module ActionController
|
|
136
141
|
attr_accessor :ignore_disconnect
|
137
142
|
|
138
143
|
def initialize(response)
|
139
|
-
super(response,
|
144
|
+
super(response, build_queue(self.class.queue_size))
|
140
145
|
@error_callback = lambda { true }
|
141
146
|
@cv = new_cond
|
142
147
|
@aborted = false
|
@@ -214,6 +219,10 @@ module ActionController
|
|
214
219
|
yield str
|
215
220
|
end
|
216
221
|
end
|
222
|
+
|
223
|
+
def build_queue(queue_size)
|
224
|
+
queue_size ? SizedQueue.new(queue_size) : Queue.new
|
225
|
+
end
|
217
226
|
end
|
218
227
|
|
219
228
|
class Response < ActionDispatch::Response #:nodoc: all
|
@@ -281,7 +281,10 @@ module ActionController
|
|
281
281
|
return false unless request.has_content_type?
|
282
282
|
|
283
283
|
ref = request.content_mime_type.ref
|
284
|
+
|
284
285
|
_wrapper_formats.include?(ref) && _wrapper_key && !request.parameters.key?(_wrapper_key)
|
286
|
+
rescue ActionDispatch::Http::Parameters::ParseError
|
287
|
+
false
|
285
288
|
end
|
286
289
|
|
287
290
|
def _perform_parameter_wrapping
|
@@ -295,8 +298,6 @@ module ActionController
|
|
295
298
|
|
296
299
|
# This will display the wrapped hash in the log file.
|
297
300
|
request.filtered_parameters.merge! wrapped_filtered_hash
|
298
|
-
rescue ActionDispatch::Http::Parameters::ParseError
|
299
|
-
# swallow parse error exception
|
300
301
|
end
|
301
302
|
end
|
302
303
|
end
|
@@ -195,31 +195,30 @@ module ActionDispatch
|
|
195
195
|
|
196
196
|
control.merge! cache_control
|
197
197
|
|
198
|
+
options = []
|
199
|
+
|
198
200
|
if control[:no_store]
|
199
|
-
|
201
|
+
options << PRIVATE if control[:private]
|
202
|
+
options << NO_STORE
|
200
203
|
elsif control[:no_cache]
|
201
|
-
options = []
|
202
204
|
options << PUBLIC if control[:public]
|
203
205
|
options << NO_CACHE
|
204
206
|
options.concat(control[:extras]) if control[:extras]
|
205
|
-
|
206
|
-
self._cache_control = options.join(", ")
|
207
207
|
else
|
208
208
|
extras = control[:extras]
|
209
209
|
max_age = control[:max_age]
|
210
210
|
stale_while_revalidate = control[:stale_while_revalidate]
|
211
211
|
stale_if_error = control[:stale_if_error]
|
212
212
|
|
213
|
-
options = []
|
214
213
|
options << "max-age=#{max_age.to_i}" if max_age
|
215
214
|
options << (control[:public] ? PUBLIC : PRIVATE)
|
216
215
|
options << MUST_REVALIDATE if control[:must_revalidate]
|
217
216
|
options << "stale-while-revalidate=#{stale_while_revalidate.to_i}" if stale_while_revalidate
|
218
217
|
options << "stale-if-error=#{stale_if_error.to_i}" if stale_if_error
|
219
218
|
options.concat(extras) if extras
|
220
|
-
|
221
|
-
self._cache_control = options.join(", ")
|
222
219
|
end
|
220
|
+
|
221
|
+
self._cache_control = options.join(", ")
|
223
222
|
end
|
224
223
|
end
|
225
224
|
end
|
@@ -229,7 +229,7 @@ module Mime
|
|
229
229
|
MIME_PARAMETER_KEY = "[a-zA-Z0-9][a-zA-Z0-9#{Regexp.escape('!#$&-^_.+')}]{0,126}"
|
230
230
|
MIME_PARAMETER_VALUE = "#{Regexp.escape('"')}?[a-zA-Z0-9][a-zA-Z0-9#{Regexp.escape('!#$&-^_.+')}]{0,126}#{Regexp.escape('"')}?"
|
231
231
|
MIME_PARAMETER = "\s*\;\s*#{MIME_PARAMETER_KEY}(?:\=#{MIME_PARAMETER_VALUE})?"
|
232
|
-
MIME_REGEXP = /\A(?:\*\/\*|#{MIME_NAME}\/(?:\*|#{MIME_NAME})(
|
232
|
+
MIME_REGEXP = /\A(?:\*\/\*|#{MIME_NAME}\/(?:\*|#{MIME_NAME})(?>\s*#{MIME_PARAMETER}\s*)*)\z/
|
233
233
|
|
234
234
|
class InvalidMimeType < StandardError; end
|
235
235
|
|
@@ -103,7 +103,7 @@ module ActionDispatch
|
|
103
103
|
parameterized_parts = recall.merge(options)
|
104
104
|
|
105
105
|
keys_to_keep = route.parts.reverse_each.drop_while { |part|
|
106
|
-
!(options.key?(part) || route.scope_options.key?(part)) || (options[part]
|
106
|
+
!(options.key?(part) || route.scope_options.key?(part)) || (options[part].nil? && recall[part].nil?)
|
107
107
|
} | route.required_parts
|
108
108
|
|
109
109
|
parameterized_parts.delete_if do |bad_key, _|
|
@@ -118,7 +118,7 @@ module ActionDispatch
|
|
118
118
|
end
|
119
119
|
end
|
120
120
|
|
121
|
-
parameterized_parts.
|
121
|
+
parameterized_parts.compact!
|
122
122
|
parameterized_parts
|
123
123
|
end
|
124
124
|
|
@@ -53,7 +53,7 @@ module ActionDispatch
|
|
53
53
|
if host.start_with?(".")
|
54
54
|
/\A(.+\.)?#{Regexp.escape(host[1..-1])}\z/i
|
55
55
|
else
|
56
|
-
/\A#{host}\z/i
|
56
|
+
/\A#{Regexp.escape host}\z/i
|
57
57
|
end
|
58
58
|
end
|
59
59
|
end
|
@@ -102,21 +102,15 @@ module ActionDispatch
|
|
102
102
|
end
|
103
103
|
|
104
104
|
private
|
105
|
+
HOSTNAME = /[a-z0-9.-]+|\[[a-f0-9]*:[a-f0-9.:]+\]/i
|
106
|
+
VALID_ORIGIN_HOST = /\A(#{HOSTNAME})(?::\d+)?\z/
|
107
|
+
VALID_FORWARDED_HOST = /(?:\A|,[ ]?)(#{HOSTNAME})(?::\d+)?\z/
|
108
|
+
|
105
109
|
def authorized?(request)
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
\z
|
111
|
-
/x
|
112
|
-
|
113
|
-
origin_host = valid_host.match(
|
114
|
-
request.get_header("HTTP_HOST").to_s.downcase)
|
115
|
-
forwarded_host = valid_host.match(
|
116
|
-
request.x_forwarded_host.to_s.split(/,\s?/).last)
|
117
|
-
|
118
|
-
origin_host && @permissions.allows?(origin_host[:host]) && (
|
119
|
-
forwarded_host.nil? || @permissions.allows?(forwarded_host[:host]))
|
110
|
+
origin_host = request.get_header("HTTP_HOST")&.slice(VALID_ORIGIN_HOST, 1) || ""
|
111
|
+
forwarded_host = request.x_forwarded_host&.slice(VALID_FORWARDED_HOST, 1) || ""
|
112
|
+
|
113
|
+
@permissions.allows?(origin_host) && (forwarded_host.blank? || @permissions.allows?(forwarded_host))
|
120
114
|
end
|
121
115
|
|
122
116
|
def excluded?(request)
|
@@ -6,6 +6,7 @@
|
|
6
6
|
<%= @exception.message %>
|
7
7
|
<% if defined?(ActiveStorage) && @exception.message.match?(%r{#{ActiveStorage::Blob.table_name}|#{ActiveStorage::Attachment.table_name}}) %>
|
8
8
|
To resolve this issue run: bin/rails active_storage:install
|
9
|
+
<% end %>
|
9
10
|
<% if defined?(ActionMailbox) && @exception.message.match?(%r{#{ActionMailbox::InboundEmail.table_name}}) %>
|
10
11
|
To resolve this issue run: bin/rails action_mailbox:install
|
11
12
|
<% end %>
|
@@ -287,10 +287,12 @@ module ActionDispatch
|
|
287
287
|
|
288
288
|
args = []
|
289
289
|
|
290
|
-
route = record_list.map
|
290
|
+
route = record_list.map do |parent|
|
291
291
|
case parent
|
292
|
-
when Symbol
|
292
|
+
when Symbol
|
293
293
|
parent.to_s
|
294
|
+
when String
|
295
|
+
raise(ArgumentError, "Please use symbols for polymorphic route arguments.")
|
294
296
|
when Class
|
295
297
|
args << parent
|
296
298
|
parent.model_name.singular_route_key
|
@@ -298,12 +300,14 @@ module ActionDispatch
|
|
298
300
|
args << parent.to_model
|
299
301
|
parent.to_model.model_name.singular_route_key
|
300
302
|
end
|
301
|
-
|
303
|
+
end
|
302
304
|
|
303
305
|
route <<
|
304
306
|
case record
|
305
|
-
when Symbol
|
307
|
+
when Symbol
|
306
308
|
record.to_s
|
309
|
+
when String
|
310
|
+
raise(ArgumentError, "Please use symbols for polymorphic route arguments.")
|
307
311
|
when Class
|
308
312
|
@key_strategy.call record.model_name
|
309
313
|
else
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: actionpack
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 6.1.
|
4
|
+
version: 6.1.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Heinemeier Hansson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-08-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - '='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 6.1.
|
19
|
+
version: 6.1.4.1
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - '='
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 6.1.
|
26
|
+
version: 6.1.4.1
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rack
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -98,28 +98,28 @@ dependencies:
|
|
98
98
|
requirements:
|
99
99
|
- - '='
|
100
100
|
- !ruby/object:Gem::Version
|
101
|
-
version: 6.1.
|
101
|
+
version: 6.1.4.1
|
102
102
|
type: :runtime
|
103
103
|
prerelease: false
|
104
104
|
version_requirements: !ruby/object:Gem::Requirement
|
105
105
|
requirements:
|
106
106
|
- - '='
|
107
107
|
- !ruby/object:Gem::Version
|
108
|
-
version: 6.1.
|
108
|
+
version: 6.1.4.1
|
109
109
|
- !ruby/object:Gem::Dependency
|
110
110
|
name: activemodel
|
111
111
|
requirement: !ruby/object:Gem::Requirement
|
112
112
|
requirements:
|
113
113
|
- - '='
|
114
114
|
- !ruby/object:Gem::Version
|
115
|
-
version: 6.1.
|
115
|
+
version: 6.1.4.1
|
116
116
|
type: :development
|
117
117
|
prerelease: false
|
118
118
|
version_requirements: !ruby/object:Gem::Requirement
|
119
119
|
requirements:
|
120
120
|
- - '='
|
121
121
|
- !ruby/object:Gem::Version
|
122
|
-
version: 6.1.
|
122
|
+
version: 6.1.4.1
|
123
123
|
description: Web apps on Rails. Simple, battle-tested conventions for building and
|
124
124
|
testing MVC web applications. Works with any Rack-compatible server.
|
125
125
|
email: david@loudthinking.com
|
@@ -309,10 +309,10 @@ licenses:
|
|
309
309
|
- MIT
|
310
310
|
metadata:
|
311
311
|
bug_tracker_uri: https://github.com/rails/rails/issues
|
312
|
-
changelog_uri: https://github.com/rails/rails/blob/v6.1.
|
313
|
-
documentation_uri: https://api.rubyonrails.org/v6.1.
|
312
|
+
changelog_uri: https://github.com/rails/rails/blob/v6.1.4.1/actionpack/CHANGELOG.md
|
313
|
+
documentation_uri: https://api.rubyonrails.org/v6.1.4.1/
|
314
314
|
mailing_list_uri: https://discuss.rubyonrails.org/c/rubyonrails-talk
|
315
|
-
source_code_uri: https://github.com/rails/rails/tree/v6.1.
|
315
|
+
source_code_uri: https://github.com/rails/rails/tree/v6.1.4.1/actionpack
|
316
316
|
post_install_message:
|
317
317
|
rdoc_options: []
|
318
318
|
require_paths:
|
@@ -329,7 +329,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
329
329
|
version: '0'
|
330
330
|
requirements:
|
331
331
|
- none
|
332
|
-
rubygems_version: 3.2.
|
332
|
+
rubygems_version: 3.2.15
|
333
333
|
signing_key:
|
334
334
|
specification_version: 4
|
335
335
|
summary: Web-flow and rendering framework putting the VC in MVC (part of Rails).
|