summaryrefslogtreecommitdiff
path: root/test/paths_test.rb
diff options
context:
space:
mode:
authorDan Allen <dan.j.allen@gmail.com>2018-04-04 04:41:44 -0600
committerDan Allen <dan.j.allen@gmail.com>2018-04-11 23:12:07 -0600
commit04e4a763a32e5b507be1fec37d313c2e4c1651bf (patch)
treed29d471fe775723dfa376f43ebe84aca34505d2e /test/paths_test.rb
parentfbad021ee84230ee9e67a2b7b6b132ef8328c849 (diff)
resolves #2642 resolve parent references in start path when resolving system path
Diffstat (limited to 'test/paths_test.rb')
-rw-r--r--test/paths_test.rb65
1 files changed, 57 insertions, 8 deletions
diff --git a/test/paths_test.rb b/test/paths_test.rb
index dc6d46cb..904ae8f6 100644
--- a/test/paths_test.rb
+++ b/test/paths_test.rb
@@ -109,6 +109,22 @@ context 'Path Resolver' do
@resolver = Asciidoctor::PathResolver.new
end
+ test 'raises security error if jail is not an absolute path' do
+ begin
+ @resolver.system_path('images/tiger.png', '/etc', 'foo')
+ flunk 'Expecting SecurityError to be raised'
+ rescue SecurityError
+ end
+ end
+
+ test 'raises security error if jail is not a canoncial path' do
+ begin
+ @resolver.system_path('images/tiger.png', '/etc', %(#{JAIL}/../foo))
+ flunk 'Expecting SecurityError to be raised'
+ rescue SecurityError
+ end
+ end
+
test 'prevents access to paths outside of jail' do
result, warnings = redirect_streams do |_, err|
[(@resolver.system_path '../../../../../css', %(#{JAIL}/assets/stylesheets), JAIL), err.string]
@@ -120,7 +136,7 @@ context 'Path Resolver' do
[(@resolver.system_path '/../../../../../css', %(#{JAIL}/assets/stylesheets), JAIL), err.string]
end
assert_equal %(#{JAIL}/css), result
- assert_includes warnings, 'path has illegal reference to ancestor of jail'
+ assert_includes warnings, 'path is outside of jail'
result, warnings = redirect_streams do |_, err|
[(@resolver.system_path '../../../css', '../../..', JAIL), err.string]
@@ -146,15 +162,30 @@ context 'Path Resolver' do
assert_equal "#{JAIL}/stylesheets", @resolver.system_path('', "#{JAIL}/assets/../stylesheets", JAIL)
end
+ test 'expands parent references in start path if target is not empty' do
+ assert_equal "#{JAIL}/stylesheets/site.css", @resolver.system_path('site.css', "#{JAIL}/assets/../stylesheets", JAIL)
+ end
+
test 'resolves start path if target is dot' do
assert_equal "#{JAIL}/assets/stylesheets", @resolver.system_path('.', "#{JAIL}/assets/stylesheets", JAIL)
assert_equal "#{JAIL}/assets/stylesheets", @resolver.system_path('./', "#{JAIL}/assets/stylesheets", JAIL)
end
- test 'treats absolute target as relative when jail is specified' do
- assert_equal "#{JAIL}/assets/stylesheets", @resolver.system_path('/', "#{JAIL}/assets/stylesheets", JAIL)
- assert_equal "#{JAIL}/assets/stylesheets/foo", @resolver.system_path('/foo', "#{JAIL}/assets/stylesheets", JAIL)
- assert_equal "#{JAIL}/assets/foo", @resolver.system_path('/../foo', "#{JAIL}/assets/stylesheets", JAIL)
+ test 'treats absolute target outside of jail as relative when jail is specified' do
+ result, warnings = redirect_streams do |_, err|
+ [(@resolver.system_path '/', "#{JAIL}/assets/stylesheets", JAIL), err.string]
+ end
+ assert_equal JAIL, result
+
+ result, warnings = redirect_streams do |_, err|
+ [(@resolver.system_path '/foo', "#{JAIL}/assets/stylesheets", JAIL), err.string]
+ end
+ assert_equal "#{JAIL}/foo", result
+
+ result, warnings = redirect_streams do |_, err|
+ [(@resolver.system_path '/../foo', "#{JAIL}/assets/stylesheets", JAIL), err.string]
+ end
+ assert_equal "#{JAIL}/foo", result
end
test 'allows use of absolute target or start if resolved path is sub-path of jail' do
@@ -170,20 +201,38 @@ context 'Path Resolver' do
assert_equal "#{JAIL}/images/tiger.png", @resolver.system_path('images/tiger.png', nil, JAIL)
end
- test 'raises security error if start is not contained within jail' do
+ test 'warns if start is not contained within jail' do
+ result, warnings = redirect_streams do |_, err|
+ [(@resolver.system_path 'images/tiger.png', '/etc', JAIL), err.string]
+ end
+ assert_equal %(#{JAIL}/images/tiger.png), result
+ assert_includes warnings, 'start path is outside of jail'
+
+ result, warnings = redirect_streams do |_, err|
+ [(@resolver.system_path '.', '/etc', JAIL), err.string]
+ end
+ assert_equal JAIL, result
+ assert_includes warnings, 'start path is outside of jail'
+ end
+
+ test 'raises security error if start is not contained within jail and recover is disabled' do
begin
- @resolver.system_path('images/tiger.png', '/etc', JAIL)
+ @resolver.system_path('images/tiger.png', '/etc', JAIL, :recover => false)
flunk 'Expecting SecurityError to be raised'
rescue SecurityError
end
begin
- @resolver.system_path('.', '/etc', JAIL)
+ @resolver.system_path('.', '/etc', JAIL, :recover => false)
flunk 'Expecting SecurityError to be raised'
rescue SecurityError
end
end
+ test 'expands parent references in absolute path if jail is not specified' do
+ assert_equal '/etc/stylesheet.css', @resolver.system_path('/usr/share/../../etc/stylesheet.css')
+ end
+
test 'resolves absolute directory if jail is not specified' do
assert_equal '/usr/share/stylesheet.css', @resolver.system_path('/usr/share/stylesheet.css', '/home/dallen/docs/assets/stylesheets')
end