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:
@@ -222,6 +222,7 @@ module Precious
|
|||||||
# not /docs/Home because write_page will append /docs
|
# not /docs/Home because write_page will append /docs
|
||||||
@path = @path.sub(page_dir, '/') if @path.start_with? page_dir
|
@path = @path.sub(page_dir, '/') if @path.start_with? page_dir
|
||||||
end
|
end
|
||||||
|
@path = clean_path(@path)
|
||||||
|
|
||||||
page = wikip.page
|
page = wikip.page
|
||||||
if page
|
if page
|
||||||
|
|||||||
@@ -25,6 +25,13 @@ module Precious
|
|||||||
[nil,''].include?(param) ? nil : CGI.unescape(param)
|
[nil,''].include?(param) ? nil : CGI.unescape(param)
|
||||||
end
|
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 slashes from the start of string.
|
||||||
# Remove all double slashes
|
# Remove all double slashes
|
||||||
def clean_url url
|
def clean_url url
|
||||||
|
|||||||
@@ -300,6 +300,25 @@ context "Frontend" do
|
|||||||
assert last_response.ok?
|
assert last_response.ok?
|
||||||
end
|
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
|
test "edit returns nil for non-existant page" do
|
||||||
# post '/edit' fails. post '/edit/' works.
|
# post '/edit' fails. post '/edit/' works.
|
||||||
page = 'not-real-page'
|
page = 'not-real-page'
|
||||||
|
|||||||
@@ -9,5 +9,17 @@ context "Precious::Helpers" do
|
|||||||
assert_equal 'Mordor', extract_path('Mordor/Sauron')
|
assert_equal 'Mordor', extract_path('Mordor/Sauron')
|
||||||
assert_equal 'Mordor/Sauron', extract_path('Mordor/Sauron/Evil')
|
assert_equal 'Mordor/Sauron', extract_path('Mordor/Sauron/Evil')
|
||||||
end
|
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
|
end
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user