Merge pull request #698 from ddeyoung/improve-page-create

Leaving off the leading slash in a page name with a subdirectory will corrupt the repository
This commit is contained in:
bootstraponline
2013-05-27 10:47:31 -07:00
4 changed files with 51 additions and 12 deletions
+1
View File
@@ -222,6 +222,7 @@ module Precious
# not /docs/Home because write_page will append /docs
@path = @path.sub(page_dir, '/') if @path.start_with? page_dir
end
@path = clean_path(@path)
page = wikip.page
if page
+7
View File
@@ -25,6 +25,13 @@ module Precious
[nil,''].include?(param) ? nil : CGI.unescape(param)
end
# Ensure path begins with a single leading slash
def clean_path(path)
if path
(path[0] != '/' ? path.insert(0, '/') : path).gsub(/\/{2,}/,'/')
end
end
# Remove all slashes from the start of string.
# Remove all double slashes
def clean_url url
+19
View File
@@ -300,6 +300,25 @@ context "Frontend" do
assert last_response.ok?
end
test "create sets the correct path for a relative path subdirectory" do
dir = "foodir"
name = "#{dir}/bar"
get "/create/#{name}"
assert_match(/\/#{dir}/, last_response.body)
assert_no_match(/[^\/]#{dir}/, last_response.body)
end
test "create sets the correct path for a relative path subdirectory with the page file directory set" do
Precious::App.set(:wiki_options, {:page_file_dir => "foo"})
dir = "bardir"
name = "#{dir}/baz"
get "/create/foo/#{name}"
assert_match(/\/#{dir}/, last_response.body)
assert_no_match(/[^\/]#{dir}/, last_response.body)
# reset page_file_dir
Precious::App.set(:wiki_options, {:page_file_dir => nil})
end
test "edit returns nil for non-existant page" do
# post '/edit' fails. post '/edit/' works.
page = 'not-real-page'
+12
View File
@@ -9,5 +9,17 @@ context "Precious::Helpers" do
assert_equal 'Mordor', extract_path('Mordor/Sauron')
assert_equal 'Mordor/Sauron', extract_path('Mordor/Sauron/Evil')
end
test "clean path without leading slash" do
assert_equal '/Mordor', clean_path('Mordor')
end
test "clean path with leading slash" do
assert_equal '/Mordor', clean_path('/Mordor')
end
test "clean path with double leading slash" do
assert_equal '/Mordor', clean_path('//Mordor')
end
end