actionpack 7.2.0 → 7.2.2.1

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
2
  SHA256:
3
- metadata.gz: 1c6dfb6390c5d4c6038c8aef6a4c79dd69ac971cc460d4e4f915e3c0c104b09b
4
- data.tar.gz: 4427bf987fa2fa103840ee22673c241e136e978dd29d4d29d2b7f370dc1dc2b8
3
+ metadata.gz: e2f850764c42d33756dafc52b3a241cd1264cf780ef17f52b9b3b0a8b1c3d98e
4
+ data.tar.gz: 7febf80d5ab5a57de20b9658daaa10fb21216b30590837e66ceb43cb6cdfe38f
5
5
  SHA512:
6
- metadata.gz: cc8f57cd76f9e51ac42c10970feceedce22c9374f02d5eb96f4812009cba4e1d68b4d2a7bad8f081d939f6628b0447dd73051a32a590cddfa375f8a3084b3a17
7
- data.tar.gz: 1fa922c393a19ec07ae0b9b615ed3bcc82a365f342270be2308c5dc16b8cd871d82f34c78b486aa981e97308aeefdf3d74cdedb91073602e84219ec05f75c520
6
+ metadata.gz: 6cd119f952b01a8fdf78c1a3c364bf5e681b6b0de52758a1830b935362bc7c0c9950d371bd6b6667e49dc49e8b9f98d0f60b06781a155bcf752be705e19c875f
7
+ data.tar.gz: 15339819a72191cd86e77924f9a108ec6c9f7bcc7f3169ba2127bc1ccdefc2a7fdb98609689a7271faf467664df7841f163610445294dbe8eed08c48c431aa01
data/CHANGELOG.md CHANGED
@@ -1,3 +1,47 @@
1
+ ## Rails 7.2.2.1 (December 10, 2024) ##
2
+
3
+ * Add validation to content security policies to disallow spaces and semicolons.
4
+ Developers should use multiple arguments, and different directive methods instead.
5
+
6
+ [CVE-2024-54133]
7
+
8
+ *Gannon McGibbon*
9
+
10
+
11
+ ## Rails 7.2.2 (October 30, 2024) ##
12
+
13
+ * Fix non-GET requests not updating cookies in `ActionController::TestCase`.
14
+
15
+ *Jon Moss*, *Hartley McGuire*
16
+
17
+
18
+ ## Rails 7.2.1.2 (October 23, 2024) ##
19
+
20
+ * No changes.
21
+
22
+
23
+ ## Rails 7.2.1.1 (October 15, 2024) ##
24
+
25
+ * Avoid regex backtracking in HTTP Token authentication
26
+
27
+ [CVE-2024-47887]
28
+
29
+ *John Hawthorn*
30
+
31
+ * Avoid regex backtracking in query parameter filtering
32
+
33
+ [CVE-2024-41128]
34
+
35
+ *John Hawthorn*
36
+
37
+
38
+ ## Rails 7.2.1 (August 22, 2024) ##
39
+
40
+ * Fix `Request#raw_post` raising `NoMethodError` when `rack.input` is `nil`.
41
+
42
+ *Hartley McGuire*
43
+
44
+
1
45
  ## Rails 7.2.0 (August 09, 2024) ##
2
46
 
3
47
  * Allow bots to ignore `allow_browser`.
@@ -104,6 +104,7 @@ module AbstractController
104
104
  # Declare a controller method as a helper. For example, the following
105
105
  # makes the `current_user` and `logged_in?` controller methods available
106
106
  # to the view:
107
+ #
107
108
  # class ApplicationController < ActionController::Base
108
109
  # helper_method :current_user, :logged_in?
109
110
  #
@@ -118,6 +119,7 @@ module AbstractController
118
119
  # end
119
120
  #
120
121
  # In a view:
122
+ #
121
123
  # <% if logged_in? -%>Welcome, <%= current_user.name %><% end -%>
122
124
  #
123
125
  # #### Parameters
@@ -123,6 +123,7 @@ module ActionController
123
123
  BasicImplicitRender,
124
124
  StrongParameters,
125
125
  RateLimiting,
126
+ Caching,
126
127
 
127
128
  DataStreaming,
128
129
  DefaultHeaders,
@@ -60,7 +60,7 @@ module ActionController # :nodoc:
60
60
  end
61
61
  end
62
62
 
63
- class BrowserBlocker
63
+ class BrowserBlocker # :nodoc:
64
64
  SETS = {
65
65
  modern: { safari: 17.2, chrome: 120, firefox: 121, opera: 106, ie: false }
66
66
  }
@@ -76,8 +76,7 @@ module ActionController
76
76
  # `:cache_control`
77
77
  # : When given, will overwrite an existing `Cache-Control` header. For a list
78
78
  # of `Cache-Control` directives, see the [article on
79
- # MDN](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Contr
80
- # ol).
79
+ # MDN](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control).
81
80
  #
82
81
  # `:template`
83
82
  # : By default, the template digest for the current controller/action is
@@ -211,7 +211,7 @@ module ActionController
211
211
  end
212
212
  end
213
213
 
214
- # Returns false on a valid response, true otherwise.
214
+ # Returns true on a valid response, false otherwise.
215
215
  def authenticate(request, realm, &password_procedure)
216
216
  request.authorization && validate_digest_response(request, realm, &password_procedure)
217
217
  end
@@ -431,7 +431,7 @@ module ActionController
431
431
  module ControllerMethods
432
432
  # Authenticate using an HTTP Bearer token, or otherwise render an HTTP header
433
433
  # requesting the client to send a Bearer token. For the authentication to be
434
- # considered successful, `login_procedure` should return a non-nil value.
434
+ # considered successful, `login_procedure` must not return a false value.
435
435
  # Typically, the authenticated user is returned.
436
436
  #
437
437
  # See ActionController::HttpAuthentication::Token for example usage.
@@ -513,14 +513,11 @@ module ActionController
513
513
  array_params.each { |param| (param[1] || +"").gsub! %r/^"|"$/, "" }
514
514
  end
515
515
 
516
- WHITESPACED_AUTHN_PAIR_DELIMITERS = /\s*#{AUTHN_PAIR_DELIMITERS}\s*/
517
- private_constant :WHITESPACED_AUTHN_PAIR_DELIMITERS
518
-
519
516
  # This method takes an authorization body and splits up the key-value pairs by
520
517
  # the standardized `:`, `;`, or `\t` delimiters defined in
521
518
  # `AUTHN_PAIR_DELIMITERS`.
522
519
  def raw_params(auth)
523
- _raw_params = auth.sub(TOKEN_REGEX, "").split(WHITESPACED_AUTHN_PAIR_DELIMITERS)
520
+ _raw_params = auth.sub(TOKEN_REGEX, "").split(AUTHN_PAIR_DELIMITERS).map(&:strip)
524
521
  _raw_params.reject!(&:empty?)
525
522
 
526
523
  if !_raw_params.first&.start_with?(TOKEN_KEY)
@@ -77,12 +77,15 @@ module ActionController
77
77
  # Writing an object will convert it into standard SSE format with whatever
78
78
  # options you have configured. You may choose to set the following options:
79
79
  #
80
- # 1) Event. If specified, an event with this name will be dispatched on
81
- # the browser.
82
- # 2) Retry. The reconnection time in milliseconds used when attempting
83
- # to send the event.
84
- # 3) Id. If the connection dies while sending an SSE to the browser, then
85
- # the server will receive a +Last-Event-ID+ header with value equal to +id+.
80
+ # `:event`
81
+ # : If specified, an event with this name will be dispatched on the browser.
82
+ #
83
+ # `:retry`
84
+ # : The reconnection time in milliseconds used when attempting to send the event.
85
+ #
86
+ # `:id`
87
+ # : If the connection dies while sending an SSE to the browser, then the
88
+ # server will receive a `Last-Event-ID` header with value equal to `id`.
86
89
  #
87
90
  # After setting an option in the constructor of the SSE object, all future SSEs
88
91
  # sent across the stream will use those options unless overridden.
@@ -427,9 +427,7 @@ module ActionController
427
427
  # Note that the request method is not verified. The different methods are
428
428
  # available to make the tests more expressive.
429
429
  def get(action, **args)
430
- res = process(action, method: "GET", **args)
431
- cookies.update res.cookies
432
- res
430
+ process(action, method: "GET", **args)
433
431
  end
434
432
 
435
433
  # Simulate a POST request with the given parameters and set/volley the response.
@@ -637,6 +635,7 @@ module ActionController
637
635
  unless @request.cookie_jar.committed?
638
636
  @request.cookie_jar.write(@response)
639
637
  cookies.update(@request.cookie_jar.instance_variable_get(:@cookies))
638
+ cookies.update(@response.cookies)
640
639
  end
641
640
  end
642
641
  @response.prepare!
@@ -8,8 +8,7 @@ require "active_support/core_ext/array/wrap"
8
8
  module ActionDispatch # :nodoc:
9
9
  # # Action Dispatch Content Security Policy
10
10
  #
11
- # Configures the HTTP [Content-Security-Policy]
12
- # (https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy)
11
+ # Configures the HTTP [Content-Security-Policy](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy)
13
12
  # response header to help protect against XSS and
14
13
  # injection attacks.
15
14
  #
@@ -27,6 +26,9 @@ module ActionDispatch # :nodoc:
27
26
  # policy.report_uri "/csp-violation-report-endpoint"
28
27
  # end
29
28
  class ContentSecurityPolicy
29
+ class InvalidDirectiveError < StandardError
30
+ end
31
+
30
32
  class Middleware
31
33
  def initialize(app)
32
34
  @app = app
@@ -226,8 +228,7 @@ module ActionDispatch # :nodoc:
226
228
  end
227
229
  end
228
230
 
229
- # Enable the [report-uri]
230
- # (https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/report-uri)
231
+ # Enable the [report-uri](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/report-uri)
231
232
  # directive. Violation reports will be sent to the
232
233
  # specified URI:
233
234
  #
@@ -237,8 +238,7 @@ module ActionDispatch # :nodoc:
237
238
  @directives["report-uri"] = [uri]
238
239
  end
239
240
 
240
- # Specify asset types for which [Subresource Integrity]
241
- # (https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity) is required:
241
+ # Specify asset types for which [Subresource Integrity](https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity) is required:
242
242
  #
243
243
  # policy.require_sri_for :script, :style
244
244
  #
@@ -254,8 +254,7 @@ module ActionDispatch # :nodoc:
254
254
  end
255
255
  end
256
256
 
257
- # Specify whether a [sandbox]
258
- # (https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/sandbox)
257
+ # Specify whether a [sandbox](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/sandbox)
259
258
  # should be enabled for the requested resource:
260
259
  #
261
260
  # policy.sandbox
@@ -323,9 +322,9 @@ module ActionDispatch # :nodoc:
323
322
  @directives.map do |directive, sources|
324
323
  if sources.is_a?(Array)
325
324
  if nonce && nonce_directive?(directive, nonce_directives)
326
- "#{directive} #{build_directive(sources, context).join(' ')} 'nonce-#{nonce}'"
325
+ "#{directive} #{build_directive(directive, sources, context).join(' ')} 'nonce-#{nonce}'"
327
326
  else
328
- "#{directive} #{build_directive(sources, context).join(' ')}"
327
+ "#{directive} #{build_directive(directive, sources, context).join(' ')}"
329
328
  end
330
329
  elsif sources
331
330
  directive
@@ -335,8 +334,22 @@ module ActionDispatch # :nodoc:
335
334
  end
336
335
  end
337
336
 
338
- def build_directive(sources, context)
339
- sources.map { |source| resolve_source(source, context) }
337
+ def validate(directive, sources)
338
+ sources.flatten.each do |source|
339
+ if source.include?(";") || source != source.gsub(/[[:space:]]/, "")
340
+ raise InvalidDirectiveError, <<~MSG.squish
341
+ Invalid Content Security Policy #{directive}: "#{source}".
342
+ Directive values must not contain whitespace or semicolons.
343
+ Please use multiple arguments or other directive methods instead.
344
+ MSG
345
+ end
346
+ end
347
+ end
348
+
349
+ def build_directive(directive, sources, context)
350
+ resolved_sources = sources.map { |source| resolve_source(source, context) }
351
+
352
+ validate(directive, resolved_sources)
340
353
  end
341
354
 
342
355
  def resolve_source(source, context)
@@ -68,12 +68,17 @@ module ActionDispatch
68
68
  ActiveSupport::ParameterFilter.new(filters)
69
69
  end
70
70
 
71
- KV_RE = "[^&;=]+"
72
- PAIR_RE = %r{(#{KV_RE})=(#{KV_RE})}
73
71
  def filtered_query_string # :doc:
74
- query_string.gsub(PAIR_RE) do |_|
75
- parameter_filter.filter($1 => $2).first.join("=")
72
+ parts = query_string.split(/([&;])/)
73
+ filtered_parts = parts.map do |part|
74
+ if part.include?("=")
75
+ key, value = part.split("=", 2)
76
+ parameter_filter.filter(key => value).first.join("=")
77
+ else
78
+ part
79
+ end
76
80
  end
81
+ filtered_parts.join("")
77
82
  end
78
83
  end
79
84
  end
@@ -37,9 +37,16 @@ module ActionDispatch
37
37
  def parameter_filtered_location
38
38
  uri = URI.parse(location)
39
39
  unless uri.query.nil? || uri.query.empty?
40
- uri.query.gsub!(FilterParameters::PAIR_RE) do
41
- request.parameter_filter.filter($1 => $2).first.join("=")
40
+ parts = uri.query.split(/([&;])/)
41
+ filtered_parts = parts.map do |part|
42
+ if part.include?("=")
43
+ key, value = part.split("=", 2)
44
+ request.parameter_filter.filter(key => value).first.join("=")
45
+ else
46
+ part
47
+ end
42
48
  end
49
+ uri.query = filtered_parts.join("")
43
50
  end
44
51
  uri.to_s
45
52
  rescue URI::Error
@@ -340,7 +340,6 @@ module ActionDispatch
340
340
  def raw_post
341
341
  unless has_header? "RAW_POST_DATA"
342
342
  set_header("RAW_POST_DATA", read_body_stream)
343
- body_stream.rewind if body_stream.respond_to?(:rewind)
344
343
  end
345
344
  get_header "RAW_POST_DATA"
346
345
  end
@@ -467,9 +466,29 @@ module ActionDispatch
467
466
  end
468
467
 
469
468
  def read_body_stream
470
- body_stream.rewind if body_stream.respond_to?(:rewind)
471
- return body_stream.read if headers.key?("Transfer-Encoding") # Read body stream until EOF if "Transfer-Encoding" is present
472
- body_stream.read(content_length)
469
+ if body_stream
470
+ reset_stream(body_stream) do
471
+ if headers.key?("Transfer-Encoding")
472
+ body_stream.read # Read body stream until EOF if "Transfer-Encoding" is present
473
+ else
474
+ body_stream.read(content_length)
475
+ end
476
+ end
477
+ end
478
+ end
479
+
480
+ def reset_stream(body_stream)
481
+ if body_stream.respond_to?(:rewind)
482
+ body_stream.rewind
483
+
484
+ content = yield
485
+
486
+ body_stream.rewind
487
+
488
+ content
489
+ else
490
+ yield
491
+ end
473
492
  end
474
493
  end
475
494
  end
@@ -18,8 +18,8 @@ module ActionDispatch
18
18
  # 2616](https://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2) requires.
19
19
  # Some Rack servers simply drop preceding headers, and only report the value
20
20
  # that was [given in the last
21
- # header](https://andre.arko.net/2011/12/26/repeated-headers-and-ruby-web-server
22
- # s). If you are behind multiple proxy servers (like NGINX to HAProxy to
21
+ # header](https://andre.arko.net/2011/12/26/repeated-headers-and-ruby-web-servers).
22
+ # If you are behind multiple proxy servers (like NGINX to HAProxy to
23
23
  # Unicorn) then you should test your Rack server to make sure your data is good.
24
24
  #
25
25
  # IF YOU DON'T USE A PROXY, THIS MAKES YOU VULNERABLE TO IP SPOOFING. This
@@ -117,10 +117,9 @@ module ActionDispatch
117
117
  # instead, so we check that too.
118
118
  #
119
119
  # As discussed in [this post about Rails IP
120
- # Spoofing](https://web.archive.org/web/20170626095448/https://blog.gingerlime.c
121
- # om/2012/rails-ip-spoofing-vulnerabilities-and-protection/), while the first IP
122
- # in the list is likely to be the "originating" IP, it could also have been set
123
- # by the client maliciously.
120
+ # Spoofing](https://web.archive.org/web/20170626095448/https://blog.gingerlime.com/2012/rails-ip-spoofing-vulnerabilities-and-protection/),
121
+ # while the first IP in the list is likely to be the "originating" IP, it
122
+ # could also have been set by the client maliciously.
124
123
  #
125
124
  # In order to find the first address that is (probably) accurate, we take the
126
125
  # list of IPs, remove known and trusted proxies, and then take the last address
@@ -17,7 +17,7 @@ module ActionDispatch
17
17
  #
18
18
  # Requests can opt-out of redirection with `exclude`:
19
19
  #
20
- # config.ssl_options = { redirect: { exclude: -> request { /healthcheck/.match?(request.path) } } }
20
+ # config.ssl_options = { redirect: { exclude: -> request { request.path == "/up" } } }
21
21
  #
22
22
  # Cookies will not be flagged as secure for excluded requests.
23
23
  #
@@ -101,7 +101,7 @@ module ActionDispatch
101
101
  { controller: /#{filter[:controller].underscore.sub(/_?controller\z/, "")}/ }
102
102
  elsif filter[:grep]
103
103
  grep_pattern = Regexp.new(filter[:grep])
104
- path = URI::DEFAULT_PARSER.escape(filter[:grep])
104
+ path = RFC2396_PARSER.escape(filter[:grep])
105
105
  normalized_path = ("/" + path).squeeze("/")
106
106
 
107
107
  {
@@ -1048,6 +1048,7 @@ module ActionDispatch
1048
1048
  end
1049
1049
 
1050
1050
  # Allows you to set default parameters for a route, such as this:
1051
+ #
1051
1052
  # defaults id: 'home' do
1052
1053
  # match 'scoped_pages/(:id)', to: 'pages#show'
1053
1054
  # end
@@ -2024,7 +2025,7 @@ module ActionDispatch
2024
2025
  name_for_action(options.delete(:as), action)
2025
2026
  end
2026
2027
 
2027
- path = Mapping.normalize_path URI::DEFAULT_PARSER.escape(path), formatted
2028
+ path = Mapping.normalize_path RFC2396_PARSER.escape(path), formatted
2028
2029
  ast = Journey::Parser.parse path
2029
2030
 
2030
2031
  mapping = Mapping.build(@scope, @set, ast, controller, default_action, to, via, formatted, options_constraints, anchor, options)
@@ -917,7 +917,7 @@ module ActionDispatch
917
917
  params.each do |key, value|
918
918
  if value.is_a?(String)
919
919
  value = value.dup.force_encoding(Encoding::BINARY)
920
- params[key] = URI::DEFAULT_PARSER.unescape(value)
920
+ params[key] = RFC2396_PARSER.unescape(value)
921
921
  end
922
922
  end
923
923
  req.path_parameters = params
@@ -30,6 +30,7 @@ require "active_support/core_ext/module/attribute_accessors"
30
30
 
31
31
  require "action_pack"
32
32
  require "rack"
33
+ require "uri"
33
34
  require "action_dispatch/deprecator"
34
35
 
35
36
  module Rack # :nodoc:
@@ -47,6 +48,9 @@ end
47
48
  module ActionDispatch
48
49
  extend ActiveSupport::Autoload
49
50
 
51
+ RFC2396_PARSER = defined?(URI::RFC2396_PARSER) ? URI::RFC2396_PARSER : URI::RFC2396_Parser.new
52
+ private_constant :RFC2396_PARSER
53
+
50
54
  class MissingController < NameError
51
55
  end
52
56
 
@@ -11,8 +11,8 @@ module ActionPack
11
11
  module VERSION
12
12
  MAJOR = 7
13
13
  MINOR = 2
14
- TINY = 0
15
- PRE = nil
14
+ TINY = 2
15
+ PRE = "1"
16
16
 
17
17
  STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".")
18
18
  end
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: 7.2.0
4
+ version: 7.2.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Heinemeier Hansson
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-08-09 00:00:00.000000000 Z
11
+ date: 2024-12-10 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: 7.2.0
19
+ version: 7.2.2.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: 7.2.0
26
+ version: 7.2.2.1
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: nokogiri
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -148,28 +148,28 @@ dependencies:
148
148
  requirements:
149
149
  - - '='
150
150
  - !ruby/object:Gem::Version
151
- version: 7.2.0
151
+ version: 7.2.2.1
152
152
  type: :runtime
153
153
  prerelease: false
154
154
  version_requirements: !ruby/object:Gem::Requirement
155
155
  requirements:
156
156
  - - '='
157
157
  - !ruby/object:Gem::Version
158
- version: 7.2.0
158
+ version: 7.2.2.1
159
159
  - !ruby/object:Gem::Dependency
160
160
  name: activemodel
161
161
  requirement: !ruby/object:Gem::Requirement
162
162
  requirements:
163
163
  - - '='
164
164
  - !ruby/object:Gem::Version
165
- version: 7.2.0
165
+ version: 7.2.2.1
166
166
  type: :development
167
167
  prerelease: false
168
168
  version_requirements: !ruby/object:Gem::Requirement
169
169
  requirements:
170
170
  - - '='
171
171
  - !ruby/object:Gem::Version
172
- version: 7.2.0
172
+ version: 7.2.2.1
173
173
  description: Web apps on Rails. Simple, battle-tested conventions for building and
174
174
  testing MVC web applications. Works with any Rack-compatible server.
175
175
  email: david@loudthinking.com
@@ -369,12 +369,12 @@ licenses:
369
369
  - MIT
370
370
  metadata:
371
371
  bug_tracker_uri: https://github.com/rails/rails/issues
372
- changelog_uri: https://github.com/rails/rails/blob/v7.2.0/actionpack/CHANGELOG.md
373
- documentation_uri: https://api.rubyonrails.org/v7.2.0/
372
+ changelog_uri: https://github.com/rails/rails/blob/v7.2.2.1/actionpack/CHANGELOG.md
373
+ documentation_uri: https://api.rubyonrails.org/v7.2.2.1/
374
374
  mailing_list_uri: https://discuss.rubyonrails.org/c/rubyonrails-talk
375
- source_code_uri: https://github.com/rails/rails/tree/v7.2.0/actionpack
375
+ source_code_uri: https://github.com/rails/rails/tree/v7.2.2.1/actionpack
376
376
  rubygems_mfa_required: 'true'
377
- post_install_message:
377
+ post_install_message:
378
378
  rdoc_options: []
379
379
  require_paths:
380
380
  - lib
@@ -390,8 +390,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
390
390
  version: '0'
391
391
  requirements:
392
392
  - none
393
- rubygems_version: 3.5.11
394
- signing_key:
393
+ rubygems_version: 3.5.22
394
+ signing_key:
395
395
  specification_version: 4
396
396
  summary: Web-flow and rendering framework putting the VC in MVC (part of Rails).
397
397
  test_files: []