actionpack 3.2.19 → 4.2.11.3
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 +7 -0
- data/CHANGELOG.md +412 -503
- data/MIT-LICENSE +1 -1
- data/README.rdoc +11 -294
- data/lib/abstract_controller/asset_paths.rb +2 -2
- data/lib/abstract_controller/base.rb +52 -18
- data/lib/abstract_controller/callbacks.rb +87 -89
- data/lib/abstract_controller/collector.rb +17 -3
- data/lib/abstract_controller/helpers.rb +41 -14
- data/lib/abstract_controller/logger.rb +1 -2
- data/lib/abstract_controller/railties/routes_helpers.rb +3 -3
- data/lib/abstract_controller/rendering.rb +65 -118
- data/lib/abstract_controller/translation.rb +16 -1
- data/lib/abstract_controller/url_for.rb +7 -7
- data/lib/abstract_controller.rb +2 -10
- data/lib/action_controller/base.rb +61 -28
- data/lib/action_controller/caching/fragments.rb +30 -54
- data/lib/action_controller/caching.rb +38 -35
- data/lib/action_controller/log_subscriber.rb +35 -18
- data/lib/action_controller/metal/conditional_get.rb +103 -34
- data/lib/action_controller/metal/data_streaming.rb +20 -26
- data/lib/action_controller/metal/etag_with_template_digest.rb +50 -0
- data/lib/action_controller/metal/exceptions.rb +19 -6
- data/lib/action_controller/metal/flash.rb +41 -9
- data/lib/action_controller/metal/force_ssl.rb +70 -12
- data/lib/action_controller/metal/head.rb +30 -7
- data/lib/action_controller/metal/helpers.rb +11 -11
- data/lib/action_controller/metal/hide_actions.rb +0 -1
- data/lib/action_controller/metal/http_authentication.rb +140 -94
- data/lib/action_controller/metal/implicit_render.rb +1 -1
- data/lib/action_controller/metal/instrumentation.rb +11 -7
- data/lib/action_controller/metal/live.rb +328 -0
- data/lib/action_controller/metal/mime_responds.rb +161 -152
- data/lib/action_controller/metal/params_wrapper.rb +126 -81
- data/lib/action_controller/metal/rack_delegation.rb +10 -4
- data/lib/action_controller/metal/redirecting.rb +44 -41
- data/lib/action_controller/metal/renderers.rb +48 -19
- data/lib/action_controller/metal/rendering.rb +46 -11
- data/lib/action_controller/metal/request_forgery_protection.rb +250 -29
- data/lib/action_controller/metal/streaming.rb +30 -38
- data/lib/action_controller/metal/strong_parameters.rb +669 -0
- data/lib/action_controller/metal/testing.rb +12 -18
- data/lib/action_controller/metal/url_for.rb +31 -29
- data/lib/action_controller/metal.rb +31 -40
- data/lib/action_controller/model_naming.rb +12 -0
- data/lib/action_controller/railtie.rb +38 -18
- data/lib/action_controller/railties/helpers.rb +22 -0
- data/lib/action_controller/test_case.rb +359 -173
- data/lib/action_controller.rb +9 -16
- data/lib/action_dispatch/http/cache.rb +64 -11
- data/lib/action_dispatch/http/filter_parameters.rb +20 -10
- data/lib/action_dispatch/http/filter_redirect.rb +38 -0
- data/lib/action_dispatch/http/headers.rb +85 -17
- data/lib/action_dispatch/http/mime_negotiation.rb +55 -5
- data/lib/action_dispatch/http/mime_type.rb +167 -114
- data/lib/action_dispatch/http/mime_types.rb +2 -1
- data/lib/action_dispatch/http/parameter_filter.rb +44 -46
- data/lib/action_dispatch/http/parameters.rb +30 -46
- data/lib/action_dispatch/http/rack_cache.rb +2 -3
- data/lib/action_dispatch/http/request.rb +108 -45
- data/lib/action_dispatch/http/response.rb +247 -48
- data/lib/action_dispatch/http/upload.rb +60 -29
- data/lib/action_dispatch/http/url.rb +135 -45
- data/lib/action_dispatch/journey/backwards.rb +5 -0
- data/lib/action_dispatch/journey/formatter.rb +166 -0
- data/lib/action_dispatch/journey/gtg/builder.rb +162 -0
- data/lib/action_dispatch/journey/gtg/simulator.rb +47 -0
- data/lib/action_dispatch/journey/gtg/transition_table.rb +157 -0
- data/lib/action_dispatch/journey/nfa/builder.rb +76 -0
- data/lib/action_dispatch/journey/nfa/dot.rb +36 -0
- data/lib/action_dispatch/journey/nfa/simulator.rb +47 -0
- data/lib/action_dispatch/journey/nfa/transition_table.rb +163 -0
- data/lib/action_dispatch/journey/nodes/node.rb +128 -0
- data/lib/action_dispatch/journey/parser.rb +198 -0
- data/lib/action_dispatch/journey/parser.y +49 -0
- data/lib/action_dispatch/journey/parser_extras.rb +23 -0
- data/lib/action_dispatch/journey/path/pattern.rb +193 -0
- data/lib/action_dispatch/journey/route.rb +125 -0
- data/lib/action_dispatch/journey/router/strexp.rb +27 -0
- data/lib/action_dispatch/journey/router/utils.rb +93 -0
- data/lib/action_dispatch/journey/router.rb +144 -0
- data/lib/action_dispatch/journey/routes.rb +80 -0
- data/lib/action_dispatch/journey/scanner.rb +61 -0
- data/lib/action_dispatch/journey/visitors.rb +221 -0
- data/lib/action_dispatch/journey/visualizer/fsm.css +30 -0
- data/lib/action_dispatch/journey/visualizer/fsm.js +134 -0
- data/lib/action_dispatch/journey/visualizer/index.html.erb +52 -0
- data/lib/action_dispatch/journey.rb +5 -0
- data/lib/action_dispatch/middleware/callbacks.rb +16 -11
- data/lib/action_dispatch/middleware/cookies.rb +346 -125
- data/lib/action_dispatch/middleware/debug_exceptions.rb +52 -24
- data/lib/action_dispatch/middleware/exception_wrapper.rb +75 -9
- data/lib/action_dispatch/middleware/flash.rb +85 -72
- data/lib/action_dispatch/middleware/params_parser.rb +16 -31
- data/lib/action_dispatch/middleware/public_exceptions.rb +39 -14
- data/lib/action_dispatch/middleware/reloader.rb +16 -7
- data/lib/action_dispatch/middleware/remote_ip.rb +132 -40
- data/lib/action_dispatch/middleware/request_id.rb +3 -7
- data/lib/action_dispatch/middleware/session/abstract_store.rb +22 -20
- data/lib/action_dispatch/middleware/session/cache_store.rb +3 -3
- data/lib/action_dispatch/middleware/session/cookie_store.rb +84 -29
- data/lib/action_dispatch/middleware/session/mem_cache_store.rb +8 -3
- data/lib/action_dispatch/middleware/show_exceptions.rb +15 -44
- data/lib/action_dispatch/middleware/ssl.rb +72 -0
- data/lib/action_dispatch/middleware/stack.rb +6 -1
- data/lib/action_dispatch/middleware/static.rb +80 -23
- data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb +34 -0
- data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.text.erb +23 -0
- data/lib/action_dispatch/middleware/templates/rescues/_source.erb +27 -0
- data/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb +52 -0
- data/lib/action_dispatch/middleware/templates/rescues/_trace.text.erb +9 -0
- data/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb +16 -0
- data/lib/action_dispatch/middleware/templates/rescues/diagnostics.text.erb +9 -0
- data/lib/action_dispatch/middleware/templates/rescues/layout.erb +133 -5
- data/lib/action_dispatch/middleware/templates/rescues/missing_template.html.erb +11 -0
- data/lib/action_dispatch/middleware/templates/rescues/missing_template.text.erb +3 -0
- data/lib/action_dispatch/middleware/templates/rescues/routing_error.html.erb +32 -0
- data/lib/action_dispatch/middleware/templates/rescues/routing_error.text.erb +11 -0
- data/lib/action_dispatch/middleware/templates/rescues/template_error.html.erb +20 -0
- data/lib/action_dispatch/middleware/templates/rescues/template_error.text.erb +7 -0
- data/lib/action_dispatch/middleware/templates/rescues/unknown_action.html.erb +6 -0
- data/lib/action_dispatch/middleware/templates/rescues/unknown_action.text.erb +3 -0
- data/lib/action_dispatch/middleware/templates/routes/_route.html.erb +16 -0
- data/lib/action_dispatch/middleware/templates/routes/_table.html.erb +200 -0
- data/lib/action_dispatch/railtie.rb +19 -6
- data/lib/action_dispatch/request/session.rb +193 -0
- data/lib/action_dispatch/request/utils.rb +35 -0
- data/lib/action_dispatch/routing/endpoint.rb +10 -0
- data/lib/action_dispatch/routing/inspector.rb +234 -0
- data/lib/action_dispatch/routing/mapper.rb +897 -436
- data/lib/action_dispatch/routing/polymorphic_routes.rb +213 -92
- data/lib/action_dispatch/routing/redirection.rb +97 -37
- data/lib/action_dispatch/routing/route_set.rb +432 -239
- data/lib/action_dispatch/routing/routes_proxy.rb +7 -4
- data/lib/action_dispatch/routing/url_for.rb +63 -34
- data/lib/action_dispatch/routing.rb +57 -89
- data/lib/action_dispatch/testing/assertions/dom.rb +2 -36
- data/lib/action_dispatch/testing/assertions/response.rb +24 -38
- data/lib/action_dispatch/testing/assertions/routing.rb +55 -54
- data/lib/action_dispatch/testing/assertions/selector.rb +2 -434
- data/lib/action_dispatch/testing/assertions/tag.rb +2 -137
- data/lib/action_dispatch/testing/assertions.rb +11 -7
- data/lib/action_dispatch/testing/integration.rb +88 -72
- data/lib/action_dispatch/testing/test_process.rb +9 -6
- data/lib/action_dispatch/testing/test_request.rb +13 -9
- data/lib/action_dispatch/testing/test_response.rb +1 -5
- data/lib/action_dispatch.rb +24 -21
- data/lib/action_pack/gem_version.rb +15 -0
- data/lib/action_pack/version.rb +5 -7
- data/lib/action_pack.rb +1 -1
- metadata +181 -292
- data/lib/abstract_controller/layouts.rb +0 -423
- data/lib/abstract_controller/view_paths.rb +0 -96
- data/lib/action_controller/caching/actions.rb +0 -185
- data/lib/action_controller/caching/pages.rb +0 -187
- data/lib/action_controller/caching/sweeping.rb +0 -97
- data/lib/action_controller/deprecated/integration_test.rb +0 -2
- data/lib/action_controller/deprecated/performance_test.rb +0 -1
- data/lib/action_controller/deprecated.rb +0 -3
- data/lib/action_controller/metal/compatibility.rb +0 -65
- data/lib/action_controller/metal/responder.rb +0 -286
- data/lib/action_controller/metal/session_management.rb +0 -14
- data/lib/action_controller/railties/paths.rb +0 -25
- data/lib/action_controller/record_identifier.rb +0 -85
- data/lib/action_controller/vendor/html-scanner/html/document.rb +0 -68
- data/lib/action_controller/vendor/html-scanner/html/node.rb +0 -532
- data/lib/action_controller/vendor/html-scanner/html/sanitizer.rb +0 -177
- data/lib/action_controller/vendor/html-scanner/html/selector.rb +0 -830
- data/lib/action_controller/vendor/html-scanner/html/tokenizer.rb +0 -107
- data/lib/action_controller/vendor/html-scanner/html/version.rb +0 -11
- data/lib/action_controller/vendor/html-scanner.rb +0 -20
- data/lib/action_dispatch/middleware/best_standards_support.rb +0 -30
- data/lib/action_dispatch/middleware/body_proxy.rb +0 -30
- data/lib/action_dispatch/middleware/head.rb +0 -18
- data/lib/action_dispatch/middleware/rescue.rb +0 -26
- data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb +0 -31
- data/lib/action_dispatch/middleware/templates/rescues/_trace.erb +0 -26
- data/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb +0 -10
- data/lib/action_dispatch/middleware/templates/rescues/missing_template.erb +0 -2
- data/lib/action_dispatch/middleware/templates/rescues/routing_error.erb +0 -15
- data/lib/action_dispatch/middleware/templates/rescues/template_error.erb +0 -17
- data/lib/action_dispatch/middleware/templates/rescues/unknown_action.erb +0 -2
- data/lib/action_dispatch/testing/performance_test.rb +0 -10
- data/lib/action_view/asset_paths.rb +0 -142
- data/lib/action_view/base.rb +0 -220
- data/lib/action_view/buffers.rb +0 -43
- data/lib/action_view/context.rb +0 -36
- data/lib/action_view/flows.rb +0 -79
- data/lib/action_view/helpers/active_model_helper.rb +0 -50
- data/lib/action_view/helpers/asset_paths.rb +0 -7
- data/lib/action_view/helpers/asset_tag_helper.rb +0 -457
- data/lib/action_view/helpers/asset_tag_helpers/asset_include_tag.rb +0 -146
- data/lib/action_view/helpers/asset_tag_helpers/asset_paths.rb +0 -93
- data/lib/action_view/helpers/asset_tag_helpers/javascript_tag_helpers.rb +0 -193
- data/lib/action_view/helpers/asset_tag_helpers/stylesheet_tag_helpers.rb +0 -148
- data/lib/action_view/helpers/atom_feed_helper.rb +0 -200
- data/lib/action_view/helpers/cache_helper.rb +0 -64
- data/lib/action_view/helpers/capture_helper.rb +0 -203
- data/lib/action_view/helpers/controller_helper.rb +0 -25
- data/lib/action_view/helpers/csrf_helper.rb +0 -32
- data/lib/action_view/helpers/date_helper.rb +0 -1062
- data/lib/action_view/helpers/debug_helper.rb +0 -40
- data/lib/action_view/helpers/form_helper.rb +0 -1486
- data/lib/action_view/helpers/form_options_helper.rb +0 -658
- data/lib/action_view/helpers/form_tag_helper.rb +0 -685
- data/lib/action_view/helpers/javascript_helper.rb +0 -110
- data/lib/action_view/helpers/number_helper.rb +0 -622
- data/lib/action_view/helpers/output_safety_helper.rb +0 -38
- data/lib/action_view/helpers/record_tag_helper.rb +0 -111
- data/lib/action_view/helpers/rendering_helper.rb +0 -90
- data/lib/action_view/helpers/sanitize_helper.rb +0 -259
- data/lib/action_view/helpers/tag_helper.rb +0 -160
- data/lib/action_view/helpers/text_helper.rb +0 -426
- data/lib/action_view/helpers/translation_helper.rb +0 -91
- data/lib/action_view/helpers/url_helper.rb +0 -693
- data/lib/action_view/helpers.rb +0 -60
- data/lib/action_view/locale/en.yml +0 -160
- data/lib/action_view/log_subscriber.rb +0 -28
- data/lib/action_view/lookup_context.rb +0 -254
- data/lib/action_view/path_set.rb +0 -89
- data/lib/action_view/railtie.rb +0 -55
- data/lib/action_view/renderer/abstract_renderer.rb +0 -41
- data/lib/action_view/renderer/partial_renderer.rb +0 -415
- data/lib/action_view/renderer/renderer.rb +0 -54
- data/lib/action_view/renderer/streaming_template_renderer.rb +0 -106
- data/lib/action_view/renderer/template_renderer.rb +0 -94
- data/lib/action_view/template/error.rb +0 -128
- data/lib/action_view/template/handlers/builder.rb +0 -26
- data/lib/action_view/template/handlers/erb.rb +0 -125
- data/lib/action_view/template/handlers.rb +0 -50
- data/lib/action_view/template/resolver.rb +0 -272
- data/lib/action_view/template/text.rb +0 -30
- data/lib/action_view/template.rb +0 -337
- data/lib/action_view/test_case.rb +0 -245
- data/lib/action_view/testing/resolvers.rb +0 -50
- data/lib/action_view.rb +0 -84
- data/lib/sprockets/assets.rake +0 -99
- data/lib/sprockets/bootstrap.rb +0 -37
- data/lib/sprockets/compressors.rb +0 -83
- data/lib/sprockets/helpers/isolated_helper.rb +0 -13
- data/lib/sprockets/helpers/rails_helper.rb +0 -182
- data/lib/sprockets/helpers.rb +0 -6
- data/lib/sprockets/railtie.rb +0 -62
- data/lib/sprockets/static_compiler.rb +0 -56
@@ -1,111 +0,0 @@
|
|
1
|
-
require 'action_controller/record_identifier'
|
2
|
-
|
3
|
-
module ActionView
|
4
|
-
# = Action View Record Tag Helpers
|
5
|
-
module Helpers
|
6
|
-
module RecordTagHelper
|
7
|
-
include ActionController::RecordIdentifier
|
8
|
-
|
9
|
-
# Produces a wrapper DIV element with id and class parameters that
|
10
|
-
# relate to the specified Active Record object. Usage example:
|
11
|
-
#
|
12
|
-
# <%= div_for(@person, :class => "foo") do %>
|
13
|
-
# <%= @person.name %>
|
14
|
-
# <% end %>
|
15
|
-
#
|
16
|
-
# produces:
|
17
|
-
#
|
18
|
-
# <div id="person_123" class="person foo"> Joe Bloggs </div>
|
19
|
-
#
|
20
|
-
# You can also pass an array of Active Record objects, which will then
|
21
|
-
# get iterated over and yield each record as an argument for the block.
|
22
|
-
# For example:
|
23
|
-
#
|
24
|
-
# <%= div_for(@people, :class => "foo") do |person| %>
|
25
|
-
# <%= person.name %>
|
26
|
-
# <% end %>
|
27
|
-
#
|
28
|
-
# produces:
|
29
|
-
#
|
30
|
-
# <div id="person_123" class="person foo"> Joe Bloggs </div>
|
31
|
-
# <div id="person_124" class="person foo"> Jane Bloggs </div>
|
32
|
-
#
|
33
|
-
def div_for(record, *args, &block)
|
34
|
-
content_tag_for(:div, record, *args, &block)
|
35
|
-
end
|
36
|
-
|
37
|
-
# content_tag_for creates an HTML element with id and class parameters
|
38
|
-
# that relate to the specified Active Record object. For example:
|
39
|
-
#
|
40
|
-
# <%= content_tag_for(:tr, @person) do %>
|
41
|
-
# <td><%= @person.first_name %></td>
|
42
|
-
# <td><%= @person.last_name %></td>
|
43
|
-
# <% end %>
|
44
|
-
#
|
45
|
-
# would produce the following HTML (assuming @person is an instance of
|
46
|
-
# a Person object, with an id value of 123):
|
47
|
-
#
|
48
|
-
# <tr id="person_123" class="person">....</tr>
|
49
|
-
#
|
50
|
-
# If you require the HTML id attribute to have a prefix, you can specify it:
|
51
|
-
#
|
52
|
-
# <%= content_tag_for(:tr, @person, :foo) do %> ...
|
53
|
-
#
|
54
|
-
# produces:
|
55
|
-
#
|
56
|
-
# <tr id="foo_person_123" class="person">...
|
57
|
-
#
|
58
|
-
# You can also pass an array of objects which this method will loop through
|
59
|
-
# and yield the current object to the supplied block, reducing the need for
|
60
|
-
# having to iterate through the object (using <tt>each</tt>) beforehand.
|
61
|
-
# For example (assuming @people is an array of Person objects):
|
62
|
-
#
|
63
|
-
# <%= content_tag_for(:tr, @people) do |person| %>
|
64
|
-
# <td><%= person.first_name %></td>
|
65
|
-
# <td><%= person.last_name %></td>
|
66
|
-
# <% end %>
|
67
|
-
#
|
68
|
-
# produces:
|
69
|
-
#
|
70
|
-
# <tr id="person_123" class="person">...</tr>
|
71
|
-
# <tr id="person_124" class="person">...</tr>
|
72
|
-
#
|
73
|
-
# content_tag_for also accepts a hash of options, which will be converted to
|
74
|
-
# additional HTML attributes. If you specify a <tt>:class</tt> value, it will be combined
|
75
|
-
# with the default class name for your object. For example:
|
76
|
-
#
|
77
|
-
# <%= content_tag_for(:li, @person, :class => "bar") %>...
|
78
|
-
#
|
79
|
-
# produces:
|
80
|
-
#
|
81
|
-
# <li id="person_123" class="person bar">...
|
82
|
-
#
|
83
|
-
def content_tag_for(tag_name, single_or_multiple_records, prefix = nil, options = nil, &block)
|
84
|
-
if single_or_multiple_records.respond_to?(:to_ary)
|
85
|
-
single_or_multiple_records.to_ary.map do |single_record|
|
86
|
-
capture { content_tag_for_single_record(tag_name, single_record, prefix, options, &block) }
|
87
|
-
end.join("\n").html_safe
|
88
|
-
else
|
89
|
-
content_tag_for_single_record(tag_name, single_or_multiple_records, prefix, options, &block)
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
private
|
94
|
-
|
95
|
-
# Called by <tt>content_tag_for</tt> internally to render a content tag
|
96
|
-
# for each record.
|
97
|
-
def content_tag_for_single_record(tag_name, record, prefix, options, &block)
|
98
|
-
options, prefix = prefix, nil if prefix.is_a?(Hash)
|
99
|
-
options = options ? options.dup : {}
|
100
|
-
options.merge!(:class => "#{dom_class(record, prefix)} #{options[:class]}".strip, :id => dom_id(record, prefix))
|
101
|
-
if !block_given?
|
102
|
-
content_tag(tag_name, "", options)
|
103
|
-
elsif block.arity == 0
|
104
|
-
content_tag(tag_name, capture(&block), options)
|
105
|
-
else
|
106
|
-
content_tag(tag_name, capture(record, &block), options)
|
107
|
-
end
|
108
|
-
end
|
109
|
-
end
|
110
|
-
end
|
111
|
-
end
|
@@ -1,90 +0,0 @@
|
|
1
|
-
module ActionView
|
2
|
-
module Helpers
|
3
|
-
# = Action View Rendering
|
4
|
-
#
|
5
|
-
# Implements methods that allow rendering from a view context.
|
6
|
-
# In order to use this module, all you need is to implement
|
7
|
-
# view_renderer that returns an ActionView::Renderer object.
|
8
|
-
module RenderingHelper
|
9
|
-
# Returns the result of a render that's dictated by the options hash. The primary options are:
|
10
|
-
#
|
11
|
-
# * <tt>:partial</tt> - See <tt>ActionView::PartialRenderer</tt>.
|
12
|
-
# * <tt>:file</tt> - Renders an explicit template file (this used to be the old default), add :locals to pass in those.
|
13
|
-
# * <tt>:inline</tt> - Renders an inline template similar to how it's done in the controller.
|
14
|
-
# * <tt>:text</tt> - Renders the text passed in out.
|
15
|
-
#
|
16
|
-
# If no options hash is passed or :update specified, the default is to render a partial and use the second parameter
|
17
|
-
# as the locals hash.
|
18
|
-
def render(options = {}, locals = {}, &block)
|
19
|
-
case options
|
20
|
-
when Hash
|
21
|
-
if block_given?
|
22
|
-
view_renderer.render_partial(self, options.merge(:partial => options[:layout]), &block)
|
23
|
-
else
|
24
|
-
view_renderer.render(self, options)
|
25
|
-
end
|
26
|
-
else
|
27
|
-
view_renderer.render_partial(self, :partial => options, :locals => locals)
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
# Overwrites _layout_for in the context object so it supports the case a block is
|
32
|
-
# passed to a partial. Returns the contents that are yielded to a layout, given a
|
33
|
-
# name or a block.
|
34
|
-
#
|
35
|
-
# You can think of a layout as a method that is called with a block. If the user calls
|
36
|
-
# <tt>yield :some_name</tt>, the block, by default, returns <tt>content_for(:some_name)</tt>.
|
37
|
-
# If the user calls simply +yield+, the default block returns <tt>content_for(:layout)</tt>.
|
38
|
-
#
|
39
|
-
# The user can override this default by passing a block to the layout:
|
40
|
-
#
|
41
|
-
# # The template
|
42
|
-
# <%= render :layout => "my_layout" do %>
|
43
|
-
# Content
|
44
|
-
# <% end %>
|
45
|
-
#
|
46
|
-
# # The layout
|
47
|
-
# <html>
|
48
|
-
# <%= yield %>
|
49
|
-
# </html>
|
50
|
-
#
|
51
|
-
# In this case, instead of the default block, which would return <tt>content_for(:layout)</tt>,
|
52
|
-
# this method returns the block that was passed in to <tt>render :layout</tt>, and the response
|
53
|
-
# would be
|
54
|
-
#
|
55
|
-
# <html>
|
56
|
-
# Content
|
57
|
-
# </html>
|
58
|
-
#
|
59
|
-
# Finally, the block can take block arguments, which can be passed in by +yield+:
|
60
|
-
#
|
61
|
-
# # The template
|
62
|
-
# <%= render :layout => "my_layout" do |customer| %>
|
63
|
-
# Hello <%= customer.name %>
|
64
|
-
# <% end %>
|
65
|
-
#
|
66
|
-
# # The layout
|
67
|
-
# <html>
|
68
|
-
# <%= yield Struct.new(:name).new("David") %>
|
69
|
-
# </html>
|
70
|
-
#
|
71
|
-
# In this case, the layout would receive the block passed into <tt>render :layout</tt>,
|
72
|
-
# and the struct specified would be passed into the block as an argument. The result
|
73
|
-
# would be
|
74
|
-
#
|
75
|
-
# <html>
|
76
|
-
# Hello David
|
77
|
-
# </html>
|
78
|
-
#
|
79
|
-
def _layout_for(*args, &block)
|
80
|
-
name = args.first
|
81
|
-
|
82
|
-
if block && !name.is_a?(Symbol)
|
83
|
-
capture(*args, &block)
|
84
|
-
else
|
85
|
-
super
|
86
|
-
end
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|
90
|
-
end
|
@@ -1,259 +0,0 @@
|
|
1
|
-
require 'active_support/core_ext/object/try'
|
2
|
-
require 'action_controller/vendor/html-scanner'
|
3
|
-
|
4
|
-
module ActionView
|
5
|
-
# = Action View Sanitize Helpers
|
6
|
-
module Helpers #:nodoc:
|
7
|
-
# The SanitizeHelper module provides a set of methods for scrubbing text of undesired HTML elements.
|
8
|
-
# These helper methods extend Action View making them callable within your template files.
|
9
|
-
module SanitizeHelper
|
10
|
-
extend ActiveSupport::Concern
|
11
|
-
# This +sanitize+ helper will html encode all tags and strip all attributes that
|
12
|
-
# aren't specifically allowed.
|
13
|
-
#
|
14
|
-
# It also strips href/src tags with invalid protocols, like javascript: especially.
|
15
|
-
# It does its best to counter any tricks that hackers may use, like throwing in
|
16
|
-
# unicode/ascii/hex values to get past the javascript: filters. Check out
|
17
|
-
# the extensive test suite.
|
18
|
-
#
|
19
|
-
# <%= sanitize @article.body %>
|
20
|
-
#
|
21
|
-
# You can add or remove tags/attributes if you want to customize it a bit.
|
22
|
-
# See ActionView::Base for full docs on the available options. You can add
|
23
|
-
# tags/attributes for single uses of +sanitize+ by passing either the
|
24
|
-
# <tt>:attributes</tt> or <tt>:tags</tt> options:
|
25
|
-
#
|
26
|
-
# Normal Use
|
27
|
-
#
|
28
|
-
# <%= sanitize @article.body %>
|
29
|
-
#
|
30
|
-
# Custom Use (only the mentioned tags and attributes are allowed, nothing else)
|
31
|
-
#
|
32
|
-
# <%= sanitize @article.body, :tags => %w(table tr td), :attributes => %w(id class style) %>
|
33
|
-
#
|
34
|
-
# Add table tags to the default allowed tags
|
35
|
-
#
|
36
|
-
# class Application < Rails::Application
|
37
|
-
# config.action_view.sanitized_allowed_tags = 'table', 'tr', 'td'
|
38
|
-
# end
|
39
|
-
#
|
40
|
-
# Remove tags to the default allowed tags
|
41
|
-
#
|
42
|
-
# class Application < Rails::Application
|
43
|
-
# config.after_initialize do
|
44
|
-
# ActionView::Base.sanitized_allowed_tags.delete 'div'
|
45
|
-
# end
|
46
|
-
# end
|
47
|
-
#
|
48
|
-
# Change allowed default attributes
|
49
|
-
#
|
50
|
-
# class Application < Rails::Application
|
51
|
-
# config.action_view.sanitized_allowed_attributes = 'id', 'class', 'style'
|
52
|
-
# end
|
53
|
-
#
|
54
|
-
# Please note that sanitizing user-provided text does not guarantee that the
|
55
|
-
# resulting markup is valid (conforming to a document type) or even well-formed.
|
56
|
-
# The output may still contain e.g. unescaped '<', '>', '&' characters and
|
57
|
-
# confuse browsers.
|
58
|
-
#
|
59
|
-
def sanitize(html, options = {})
|
60
|
-
self.class.white_list_sanitizer.sanitize(html, options).try(:html_safe)
|
61
|
-
end
|
62
|
-
|
63
|
-
# Sanitizes a block of CSS code. Used by +sanitize+ when it comes across a style attribute.
|
64
|
-
def sanitize_css(style)
|
65
|
-
self.class.white_list_sanitizer.sanitize_css(style)
|
66
|
-
end
|
67
|
-
|
68
|
-
# Strips all HTML tags from the +html+, including comments. This uses the
|
69
|
-
# html-scanner tokenizer and so its HTML parsing ability is limited by
|
70
|
-
# that of html-scanner.
|
71
|
-
#
|
72
|
-
# ==== Examples
|
73
|
-
#
|
74
|
-
# strip_tags("Strip <i>these</i> tags!")
|
75
|
-
# # => Strip these tags!
|
76
|
-
#
|
77
|
-
# strip_tags("<b>Bold</b> no more! <a href='more.html'>See more here</a>...")
|
78
|
-
# # => Bold no more! See more here...
|
79
|
-
#
|
80
|
-
# strip_tags("<div id='top-bar'>Welcome to my website!</div>")
|
81
|
-
# # => Welcome to my website!
|
82
|
-
def strip_tags(html)
|
83
|
-
self.class.full_sanitizer.sanitize(html)
|
84
|
-
end
|
85
|
-
|
86
|
-
# Strips all link tags from +text+ leaving just the link text.
|
87
|
-
#
|
88
|
-
# ==== Examples
|
89
|
-
# strip_links('<a href="http://www.rubyonrails.org">Ruby on Rails</a>')
|
90
|
-
# # => Ruby on Rails
|
91
|
-
#
|
92
|
-
# strip_links('Please e-mail me at <a href="mailto:me@email.com">me@email.com</a>.')
|
93
|
-
# # => Please e-mail me at me@email.com.
|
94
|
-
#
|
95
|
-
# strip_links('Blog: <a href="http://www.myblog.com/" class="nav" target=\"_blank\">Visit</a>.')
|
96
|
-
# # => Blog: Visit.
|
97
|
-
def strip_links(html)
|
98
|
-
self.class.link_sanitizer.sanitize(html)
|
99
|
-
end
|
100
|
-
|
101
|
-
module ClassMethods #:nodoc:
|
102
|
-
attr_writer :full_sanitizer, :link_sanitizer, :white_list_sanitizer
|
103
|
-
|
104
|
-
def sanitized_protocol_separator
|
105
|
-
white_list_sanitizer.protocol_separator
|
106
|
-
end
|
107
|
-
|
108
|
-
def sanitized_uri_attributes
|
109
|
-
white_list_sanitizer.uri_attributes
|
110
|
-
end
|
111
|
-
|
112
|
-
def sanitized_bad_tags
|
113
|
-
white_list_sanitizer.bad_tags
|
114
|
-
end
|
115
|
-
|
116
|
-
def sanitized_allowed_tags
|
117
|
-
white_list_sanitizer.allowed_tags
|
118
|
-
end
|
119
|
-
|
120
|
-
def sanitized_allowed_attributes
|
121
|
-
white_list_sanitizer.allowed_attributes
|
122
|
-
end
|
123
|
-
|
124
|
-
def sanitized_allowed_css_properties
|
125
|
-
white_list_sanitizer.allowed_css_properties
|
126
|
-
end
|
127
|
-
|
128
|
-
def sanitized_allowed_css_keywords
|
129
|
-
white_list_sanitizer.allowed_css_keywords
|
130
|
-
end
|
131
|
-
|
132
|
-
def sanitized_shorthand_css_properties
|
133
|
-
white_list_sanitizer.shorthand_css_properties
|
134
|
-
end
|
135
|
-
|
136
|
-
def sanitized_allowed_protocols
|
137
|
-
white_list_sanitizer.allowed_protocols
|
138
|
-
end
|
139
|
-
|
140
|
-
def sanitized_protocol_separator=(value)
|
141
|
-
white_list_sanitizer.protocol_separator = value
|
142
|
-
end
|
143
|
-
|
144
|
-
# Gets the HTML::FullSanitizer instance used by +strip_tags+. Replace with
|
145
|
-
# any object that responds to +sanitize+.
|
146
|
-
#
|
147
|
-
# class Application < Rails::Application
|
148
|
-
# config.action_view.full_sanitizer = MySpecialSanitizer.new
|
149
|
-
# end
|
150
|
-
#
|
151
|
-
def full_sanitizer
|
152
|
-
@full_sanitizer ||= HTML::FullSanitizer.new
|
153
|
-
end
|
154
|
-
|
155
|
-
# Gets the HTML::LinkSanitizer instance used by +strip_links+. Replace with
|
156
|
-
# any object that responds to +sanitize+.
|
157
|
-
#
|
158
|
-
# class Application < Rails::Application
|
159
|
-
# config.action_view.link_sanitizer = MySpecialSanitizer.new
|
160
|
-
# end
|
161
|
-
#
|
162
|
-
def link_sanitizer
|
163
|
-
@link_sanitizer ||= HTML::LinkSanitizer.new
|
164
|
-
end
|
165
|
-
|
166
|
-
# Gets the HTML::WhiteListSanitizer instance used by sanitize and +sanitize_css+.
|
167
|
-
# Replace with any object that responds to +sanitize+.
|
168
|
-
#
|
169
|
-
# class Application < Rails::Application
|
170
|
-
# config.action_view.white_list_sanitizer = MySpecialSanitizer.new
|
171
|
-
# end
|
172
|
-
#
|
173
|
-
def white_list_sanitizer
|
174
|
-
@white_list_sanitizer ||= HTML::WhiteListSanitizer.new
|
175
|
-
end
|
176
|
-
|
177
|
-
# Adds valid HTML attributes that the +sanitize+ helper checks for URIs.
|
178
|
-
#
|
179
|
-
# class Application < Rails::Application
|
180
|
-
# config.action_view.sanitized_uri_attributes = 'lowsrc', 'target'
|
181
|
-
# end
|
182
|
-
#
|
183
|
-
def sanitized_uri_attributes=(attributes)
|
184
|
-
HTML::WhiteListSanitizer.uri_attributes.merge(attributes)
|
185
|
-
end
|
186
|
-
|
187
|
-
# Adds to the Set of 'bad' tags for the +sanitize+ helper.
|
188
|
-
#
|
189
|
-
# class Application < Rails::Application
|
190
|
-
# config.action_view.sanitized_bad_tags = 'embed', 'object'
|
191
|
-
# end
|
192
|
-
#
|
193
|
-
def sanitized_bad_tags=(attributes)
|
194
|
-
HTML::WhiteListSanitizer.bad_tags.merge(attributes)
|
195
|
-
end
|
196
|
-
|
197
|
-
# Adds to the Set of allowed tags for the +sanitize+ helper.
|
198
|
-
#
|
199
|
-
# class Application < Rails::Application
|
200
|
-
# config.action_view.sanitized_allowed_tags = 'table', 'tr', 'td'
|
201
|
-
# end
|
202
|
-
#
|
203
|
-
def sanitized_allowed_tags=(attributes)
|
204
|
-
HTML::WhiteListSanitizer.allowed_tags.merge(attributes)
|
205
|
-
end
|
206
|
-
|
207
|
-
# Adds to the Set of allowed HTML attributes for the +sanitize+ helper.
|
208
|
-
#
|
209
|
-
# class Application < Rails::Application
|
210
|
-
# config.action_view.sanitized_allowed_attributes = 'onclick', 'longdesc'
|
211
|
-
# end
|
212
|
-
#
|
213
|
-
def sanitized_allowed_attributes=(attributes)
|
214
|
-
HTML::WhiteListSanitizer.allowed_attributes.merge(attributes)
|
215
|
-
end
|
216
|
-
|
217
|
-
# Adds to the Set of allowed CSS properties for the #sanitize and +sanitize_css+ helpers.
|
218
|
-
#
|
219
|
-
# class Application < Rails::Application
|
220
|
-
# config.action_view.sanitized_allowed_css_properties = 'expression'
|
221
|
-
# end
|
222
|
-
#
|
223
|
-
def sanitized_allowed_css_properties=(attributes)
|
224
|
-
HTML::WhiteListSanitizer.allowed_css_properties.merge(attributes)
|
225
|
-
end
|
226
|
-
|
227
|
-
# Adds to the Set of allowed CSS keywords for the +sanitize+ and +sanitize_css+ helpers.
|
228
|
-
#
|
229
|
-
# class Application < Rails::Application
|
230
|
-
# config.action_view.sanitized_allowed_css_keywords = 'expression'
|
231
|
-
# end
|
232
|
-
#
|
233
|
-
def sanitized_allowed_css_keywords=(attributes)
|
234
|
-
HTML::WhiteListSanitizer.allowed_css_keywords.merge(attributes)
|
235
|
-
end
|
236
|
-
|
237
|
-
# Adds to the Set of allowed shorthand CSS properties for the +sanitize+ and +sanitize_css+ helpers.
|
238
|
-
#
|
239
|
-
# class Application < Rails::Application
|
240
|
-
# config.action_view.sanitized_shorthand_css_properties = 'expression'
|
241
|
-
# end
|
242
|
-
#
|
243
|
-
def sanitized_shorthand_css_properties=(attributes)
|
244
|
-
HTML::WhiteListSanitizer.shorthand_css_properties.merge(attributes)
|
245
|
-
end
|
246
|
-
|
247
|
-
# Adds to the Set of allowed protocols for the +sanitize+ helper.
|
248
|
-
#
|
249
|
-
# class Application < Rails::Application
|
250
|
-
# config.action_view.sanitized_allowed_protocols = 'ssh', 'feed'
|
251
|
-
# end
|
252
|
-
#
|
253
|
-
def sanitized_allowed_protocols=(attributes)
|
254
|
-
HTML::WhiteListSanitizer.allowed_protocols.merge(attributes)
|
255
|
-
end
|
256
|
-
end
|
257
|
-
end
|
258
|
-
end
|
259
|
-
end
|
@@ -1,160 +0,0 @@
|
|
1
|
-
require 'active_support/core_ext/object/blank'
|
2
|
-
require 'active_support/core_ext/string/output_safety'
|
3
|
-
require 'set'
|
4
|
-
|
5
|
-
module ActionView
|
6
|
-
# = Action View Tag Helpers
|
7
|
-
module Helpers #:nodoc:
|
8
|
-
# Provides methods to generate HTML tags programmatically when you can't use
|
9
|
-
# a Builder. By default, they output XHTML compliant tags.
|
10
|
-
module TagHelper
|
11
|
-
extend ActiveSupport::Concern
|
12
|
-
include CaptureHelper
|
13
|
-
|
14
|
-
BOOLEAN_ATTRIBUTES = %w(disabled readonly multiple checked autobuffer
|
15
|
-
autoplay controls loop selected hidden scoped async
|
16
|
-
defer reversed ismap seemless muted required
|
17
|
-
autofocus novalidate formnovalidate open pubdate).to_set
|
18
|
-
BOOLEAN_ATTRIBUTES.merge(BOOLEAN_ATTRIBUTES.map {|attribute| attribute.to_sym })
|
19
|
-
|
20
|
-
PRE_CONTENT_STRINGS = {
|
21
|
-
:textarea => "\n"
|
22
|
-
}
|
23
|
-
|
24
|
-
# Returns an empty HTML tag of type +name+ which by default is XHTML
|
25
|
-
# compliant. Set +open+ to true to create an open tag compatible
|
26
|
-
# with HTML 4.0 and below. Add HTML attributes by passing an attributes
|
27
|
-
# hash to +options+. Set +escape+ to false to disable attribute value
|
28
|
-
# escaping.
|
29
|
-
#
|
30
|
-
# ==== Options
|
31
|
-
# You can use symbols or strings for the attribute names.
|
32
|
-
#
|
33
|
-
# Use +true+ with boolean attributes that can render with no value, like
|
34
|
-
# +disabled+ and +readonly+.
|
35
|
-
#
|
36
|
-
# HTML5 <tt>data-*</tt> attributes can be set with a single +data+ key
|
37
|
-
# pointing to a hash of sub-attributes.
|
38
|
-
#
|
39
|
-
# To play nicely with JavaScript conventions sub-attributes are dasherized.
|
40
|
-
# For example, a key +user_id+ would render as <tt>data-user-id</tt> and
|
41
|
-
# thus accessed as <tt>dataset.userId</tt>.
|
42
|
-
#
|
43
|
-
# Values are encoded to JSON, with the exception of strings and symbols.
|
44
|
-
# This may come in handy when using jQuery's HTML5-aware <tt>.data()<tt>
|
45
|
-
# from 1.4.3.
|
46
|
-
#
|
47
|
-
# ==== Examples
|
48
|
-
# tag("br")
|
49
|
-
# # => <br />
|
50
|
-
#
|
51
|
-
# tag("br", nil, true)
|
52
|
-
# # => <br>
|
53
|
-
#
|
54
|
-
# tag("input", :type => 'text', :disabled => true)
|
55
|
-
# # => <input type="text" disabled="disabled" />
|
56
|
-
#
|
57
|
-
# tag("img", :src => "open & shut.png")
|
58
|
-
# # => <img src="open & shut.png" />
|
59
|
-
#
|
60
|
-
# tag("img", {:src => "open & shut.png"}, false, false)
|
61
|
-
# # => <img src="open & shut.png" />
|
62
|
-
#
|
63
|
-
# tag("div", :data => {:name => 'Stephen', :city_state => %w(Chicago IL)})
|
64
|
-
# # => <div data-name="Stephen" data-city-state="["Chicago","IL"]" />
|
65
|
-
def tag(name, options = nil, open = false, escape = true)
|
66
|
-
"<#{name}#{tag_options(options, escape) if options}#{open ? ">" : " />"}".html_safe
|
67
|
-
end
|
68
|
-
|
69
|
-
# Returns an HTML block tag of type +name+ surrounding the +content+. Add
|
70
|
-
# HTML attributes by passing an attributes hash to +options+.
|
71
|
-
# Instead of passing the content as an argument, you can also use a block
|
72
|
-
# in which case, you pass your +options+ as the second parameter.
|
73
|
-
# Set escape to false to disable attribute value escaping.
|
74
|
-
#
|
75
|
-
# ==== Options
|
76
|
-
# The +options+ hash is used with attributes with no value like (<tt>disabled</tt> and
|
77
|
-
# <tt>readonly</tt>), which you can give a value of true in the +options+ hash. You can use
|
78
|
-
# symbols or strings for the attribute names.
|
79
|
-
#
|
80
|
-
# ==== Examples
|
81
|
-
# content_tag(:p, "Hello world!")
|
82
|
-
# # => <p>Hello world!</p>
|
83
|
-
# content_tag(:div, content_tag(:p, "Hello world!"), :class => "strong")
|
84
|
-
# # => <div class="strong"><p>Hello world!</p></div>
|
85
|
-
# content_tag("select", options, :multiple => true)
|
86
|
-
# # => <select multiple="multiple">...options...</select>
|
87
|
-
#
|
88
|
-
# <%= content_tag :div, :class => "strong" do -%>
|
89
|
-
# Hello world!
|
90
|
-
# <% end -%>
|
91
|
-
# # => <div class="strong">Hello world!</div>
|
92
|
-
def content_tag(name, content_or_options_with_block = nil, options = nil, escape = true, &block)
|
93
|
-
if block_given?
|
94
|
-
options = content_or_options_with_block if content_or_options_with_block.is_a?(Hash)
|
95
|
-
content_tag_string(name, capture(&block), options, escape)
|
96
|
-
else
|
97
|
-
content_tag_string(name, content_or_options_with_block, options, escape)
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
|
-
# Returns a CDATA section with the given +content+. CDATA sections
|
102
|
-
# are used to escape blocks of text containing characters which would
|
103
|
-
# otherwise be recognized as markup. CDATA sections begin with the string
|
104
|
-
# <tt><![CDATA[</tt> and end with (and may not contain) the string <tt>]]></tt>.
|
105
|
-
#
|
106
|
-
# ==== Examples
|
107
|
-
# cdata_section("<hello world>")
|
108
|
-
# # => <![CDATA[<hello world>]]>
|
109
|
-
#
|
110
|
-
# cdata_section(File.read("hello_world.txt"))
|
111
|
-
# # => <![CDATA[<hello from a text file]]>
|
112
|
-
def cdata_section(content)
|
113
|
-
"<![CDATA[#{content}]]>".html_safe
|
114
|
-
end
|
115
|
-
|
116
|
-
# Returns an escaped version of +html+ without affecting existing escaped entities.
|
117
|
-
#
|
118
|
-
# ==== Examples
|
119
|
-
# escape_once("1 < 2 & 3")
|
120
|
-
# # => "1 < 2 & 3"
|
121
|
-
#
|
122
|
-
# escape_once("<< Accept & Checkout")
|
123
|
-
# # => "<< Accept & Checkout"
|
124
|
-
def escape_once(html)
|
125
|
-
ActiveSupport::Multibyte.clean(html.to_s).gsub(/[\"><]|&(?!([a-zA-Z]+|(#\d+));)/) { |special| ERB::Util::HTML_ESCAPE[special] }
|
126
|
-
end
|
127
|
-
|
128
|
-
private
|
129
|
-
|
130
|
-
def content_tag_string(name, content, options, escape = true)
|
131
|
-
tag_options = tag_options(options, escape) if options
|
132
|
-
"<#{name}#{tag_options}>#{PRE_CONTENT_STRINGS[name.to_sym]}#{escape ? ERB::Util.h(content) : content}</#{name}>".html_safe
|
133
|
-
end
|
134
|
-
|
135
|
-
def tag_options(options, escape = true)
|
136
|
-
unless options.blank?
|
137
|
-
attrs = []
|
138
|
-
options.each_pair do |key, value|
|
139
|
-
if key.to_s == 'data' && value.is_a?(Hash)
|
140
|
-
value.each do |k, v|
|
141
|
-
unless v.is_a?(String) || v.is_a?(Symbol) || v.is_a?(BigDecimal)
|
142
|
-
v = v.to_json
|
143
|
-
end
|
144
|
-
v = ERB::Util.html_escape(v) if escape
|
145
|
-
attrs << %(data-#{k.to_s.dasherize}="#{v}")
|
146
|
-
end
|
147
|
-
elsif BOOLEAN_ATTRIBUTES.include?(key)
|
148
|
-
attrs << %(#{key}="#{key}") if value
|
149
|
-
elsif !value.nil?
|
150
|
-
final_value = value.is_a?(Array) ? value.join(" ") : value
|
151
|
-
final_value = ERB::Util.html_escape(final_value) if escape
|
152
|
-
attrs << %(#{key}="#{final_value}")
|
153
|
-
end
|
154
|
-
end
|
155
|
-
" #{attrs.sort * ' '}".html_safe unless attrs.empty?
|
156
|
-
end
|
157
|
-
end
|
158
|
-
end
|
159
|
-
end
|
160
|
-
end
|