Skip to content

Commit f8ef61d

Browse files
committed
Merge pull request #142 from matthewd/absolute_asset_path_error
Ensure supplied asset paths don't contain "/assets/"
2 parents 45cab24 + d8d3532 commit f8ef61d

File tree

2 files changed

+38
-2
lines changed

2 files changed

+38
-2
lines changed

lib/sprockets/rails/helper.rb

+22-2
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,14 @@ def initialize(source)
3030
end
3131
end
3232

33+
class AbsoluteAssetPathError < ArgumentError
34+
def initialize(bad_path, good_path, prefix)
35+
msg = "Asset names passed to helpers should not include the #{prefix.inspect} prefix. " <<
36+
"Instead of #{bad_path.inspect}, use #{good_path.inspect}"
37+
super(msg)
38+
end
39+
end
40+
3341
include ActionView::Helpers::AssetUrlHelper
3442
include ActionView::Helpers::AssetTagHelper
3543

@@ -169,15 +177,27 @@ def check_dependencies!(dep)
169177
rescue Sprockets::FileNotFound
170178
end
171179

172-
# Raise errors when source does not exist or is not in the precompiled list
180+
# Raise errors when source is not in the precompiled list, or
181+
# incorrectly contains the assets_prefix.
173182
def check_errors_for(source, options)
183+
return unless self.raise_runtime_errors
184+
174185
source = source.to_s
175-
return source if !self.raise_runtime_errors || source.blank? || source =~ URI_REGEXP
186+
return if source.blank? || source =~ URI_REGEXP
187+
176188
asset = lookup_asset_for_path(source, options)
177189

178190
if asset && asset_needs_precompile?(asset.logical_path, asset.pathname.to_s)
179191
raise AssetFilteredError.new(asset.logical_path)
180192
end
193+
194+
full_prefix = File.join(self.assets_prefix || "/", '')
195+
if !asset && source.start_with?(full_prefix)
196+
short_path = source[full_prefix.size, source.size]
197+
if lookup_asset_for_path(short_path, options)
198+
raise AbsoluteAssetPathError.new(source, short_path, full_prefix)
199+
end
200+
end
181201
end
182202

183203
# Returns true when an asset will not be available after precompile is run

test/test_helper.rb

+16
Original file line numberDiff line numberDiff line change
@@ -380,6 +380,22 @@ def test_public_folder_fallback_works_correctly
380380
@view.javascript_include_tag("asset-does-not-exist-foo.js")
381381
end
382382

383+
def test_absolute_asset_path_error
384+
Sprockets::Rails::Helper.raise_runtime_errors = true
385+
@view.assets_environment = @assets
386+
387+
assert_equal "/assets/foo-#{@foo_js_digest}.js", @view.asset_path("foo.js")
388+
assert_raises(Sprockets::Rails::Helper::AbsoluteAssetPathError) do
389+
@view.asset_path("/assets/foo.js")
390+
end
391+
392+
assert_equal "/unknown.js", @view.asset_path("unknown.js")
393+
assert_equal "/assets/unknown.js", @view.asset_path("/assets/unknown.js")
394+
395+
Sprockets::Rails::Helper.raise_runtime_errors = false
396+
assert_equal "/assets/foo.js", @view.asset_path("/assets/foo.js")
397+
end
398+
383399
def test_asset_not_precompiled_error
384400
Sprockets::Rails::Helper.raise_runtime_errors = true
385401
Sprockets::Rails::Helper.precompile = [ lambda {|logical_path| false } ]

0 commit comments

Comments
 (0)