Skip to content

Commit be6930c

Browse files
committed
Allows SRI in localhost requests
This reverts commit 915d47a and add support to SRI in localhost request.
1 parent 915d47a commit be6930c

File tree

3 files changed

+103
-3
lines changed

3 files changed

+103
-3
lines changed

README.md

+2
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,8 @@ javascript_include_tag :application, integrity: true
158158
# => "<script src="/assets/application.js" integrity="sha256-TvVUHzSfftWg1rcfL6TIJ0XKEGrgLyEq6lEpcmrG9qs="></script>"
159159
```
160160

161+
Note that sprockets-rails only adds integrity hashes to assets when served in a secure context (over an HTTPS connection or localhost).
162+
161163

162164
## Contributing to Sprockets Rails
163165

lib/sprockets/rails/helper.rb

+14-3
Original file line numberDiff line numberDiff line change
@@ -178,12 +178,23 @@ def stylesheet_link_tag(*sources)
178178
# doesn't bleed into the tag attributes, but also check its value if
179179
# it's boolean-ish.
180180
def compute_integrity?(options)
181-
case options['integrity']
182-
when nil, false, true
183-
options.delete('integrity') == true
181+
if secure_subresource_integrity_context?
182+
case options['integrity']
183+
when nil, false, true
184+
options.delete('integrity') == true
185+
end
186+
else
187+
options.delete 'integrity'
188+
false
184189
end
185190
end
186191

192+
# Only serve integrity metadata for HTTPS requests:
193+
# http://www.w3.org/TR/SRI/#non-secure-contexts-remain-non-secure
194+
def secure_subresource_integrity_context?
195+
respond_to?(:request) && self.request && (self.request.local? || self.request.ssl?)
196+
end
197+
187198
# Enable split asset debugging. Eventually will be deprecated
188199
# and replaced by source maps in Sprockets 3.x.
189200
def request_debug_assets?

test/test_helper.rb

+87
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,93 @@ def test_stylesheet_path
205205
end
206206
end
207207

208+
class NoSSLHelperTest < NoHostHelperTest
209+
def setup
210+
super
211+
212+
@view.request = nil
213+
end
214+
215+
def test_javascript_include_tag_integrity
216+
assert_dom_equal %(<script src="/javascripts/static.js"></script>),
217+
@view.javascript_include_tag("static", integrity: true)
218+
assert_dom_equal %(<script src="/javascripts/static.js"></script>),
219+
@view.javascript_include_tag("static", integrity: false)
220+
assert_dom_equal %(<script src="/javascripts/static.js"></script>),
221+
@view.javascript_include_tag("static", integrity: nil)
222+
223+
assert_dom_equal %(<script src="/javascripts/static.js"></script>),
224+
@view.javascript_include_tag("static", integrity: "sha-256-TvVUHzSfftWg1rcfL6TIJ0XKEGrgLyEq6lEpcmrG9qs=")
225+
226+
assert_dom_equal %(<script src="/assets/foo.js"></script>),
227+
@view.javascript_include_tag("foo", integrity: true)
228+
end
229+
230+
def test_stylesheet_link_tag_integrity
231+
assert_dom_equal %(<link href="/stylesheets/static.css" media="screen" rel="stylesheet" />),
232+
@view.stylesheet_link_tag("static", integrity: true)
233+
assert_dom_equal %(<link href="/stylesheets/static.css" media="screen" rel="stylesheet" />),
234+
@view.stylesheet_link_tag("static", integrity: false)
235+
assert_dom_equal %(<link href="/stylesheets/static.css" media="screen" rel="stylesheet" />),
236+
@view.stylesheet_link_tag("static", integrity: nil)
237+
238+
assert_dom_equal %(<link href="/stylesheets/static.css" media="screen" rel="stylesheet" />),
239+
@view.stylesheet_link_tag("static", integrity: "sha-256-5YzTQPuOJz/EpeXfN/+v1sxsjAj/dw8q26abiHZM3A4=")
240+
241+
assert_dom_equal %(<link href="/assets/foo.css" media="screen" rel="stylesheet" />),
242+
@view.stylesheet_link_tag("foo", integrity: true)
243+
end
244+
end
245+
246+
class LocalhostHelperTest < NoHostHelperTest
247+
def setup
248+
super
249+
250+
@view.request = ActionDispatch::Request.new({
251+
"rack.url_scheme" => "http",
252+
"REMOTE_ADDR" => "127.0.0.1"
253+
})
254+
end
255+
256+
def test_javascript_include_tag_integrity
257+
super
258+
259+
assert_dom_equal %(<script src="/assets/foo.js"></script>),
260+
@view.javascript_include_tag("foo", integrity: false)
261+
assert_dom_equal %(<script src="/assets/foo.js"></script>),
262+
@view.javascript_include_tag("foo", integrity: nil)
263+
264+
assert_dom_equal %(<script src="/assets/foo.js" integrity="#{@foo_js_integrity}"></script>),
265+
@view.javascript_include_tag("foo", integrity: true)
266+
assert_dom_equal %(<script src="/assets/foo.js" integrity="#{@foo_js_integrity}"></script>),
267+
@view.javascript_include_tag("foo.js", integrity: true)
268+
assert_dom_equal %(<script src="/assets/foo.js" integrity="#{@foo_js_integrity}"></script>),
269+
@view.javascript_include_tag(:foo, integrity: true)
270+
271+
assert_dom_equal %(<script src="/assets/foo.js" integrity="#{@foo_js_integrity}"></script>\n<script src="/assets/bar.js" integrity="#{@bar_js_integrity}"></script>),
272+
@view.javascript_include_tag(:foo, :bar, integrity: true)
273+
end
274+
275+
def test_stylesheet_link_tag_integrity
276+
super
277+
278+
assert_dom_equal %(<link href="/assets/foo.css" media="screen" rel="stylesheet" />),
279+
@view.stylesheet_link_tag("foo", integrity: false)
280+
assert_dom_equal %(<link href="/assets/foo.css" media="screen" rel="stylesheet" />),
281+
@view.stylesheet_link_tag("foo", integrity: nil)
282+
283+
assert_dom_equal %(<link href="/assets/foo.css" media="screen" rel="stylesheet" integrity="#{@foo_css_integrity}" />),
284+
@view.stylesheet_link_tag("foo", integrity: true)
285+
assert_dom_equal %(<link href="/assets/foo.css" media="screen" rel="stylesheet" integrity="#{@foo_css_integrity}" />),
286+
@view.stylesheet_link_tag("foo.css", integrity: true)
287+
assert_dom_equal %(<link href="/assets/foo.css" media="screen" rel="stylesheet" integrity="#{@foo_css_integrity}" />),
288+
@view.stylesheet_link_tag(:foo, integrity: true)
289+
290+
assert_dom_equal %(<link href="/assets/foo.css" media="screen" rel="stylesheet" integrity="#{@foo_css_integrity}" />\n<link href="/assets/bar.css" media="screen" rel="stylesheet" integrity="sha256-Vd370+VAW4D96CVpZcjFLXyeHoagI0VHwofmzRXetuE=" />),
291+
@view.stylesheet_link_tag(:foo, :bar, integrity: true)
292+
end
293+
end
294+
208295
class RelativeHostHelperTest < HelperTest
209296
def setup
210297
super

0 commit comments

Comments
 (0)