Add support for RFC 1738 special characters in page names.

Escape all links and redirects to support this. Some changes to app.rb
necessary for correct routing by Sinatra.
This commit is contained in:
Paul Baumgart
2010-09-01 22:02:19 -07:00
parent 7c70174725
commit 5fcb5d971a
8 changed files with 29 additions and 21 deletions
+10 -9
View File
@@ -1,3 +1,4 @@
require 'cgi'
require 'sinatra' require 'sinatra'
require 'gollum' require 'gollum'
require 'mustache/sinatra' require 'mustache/sinatra'
@@ -39,8 +40,8 @@ module Precious
show_page_or_file('Home') show_page_or_file('Home')
end end
get '/edit/:name' do get '/edit/*' do
@name = params[:name] @name = params[:splat].first
wiki = Gollum::Wiki.new(settings.gollum_path) wiki = Gollum::Wiki.new(settings.gollum_path)
if page = wiki.page(@name) if page = wiki.page(@name)
@page = page @page = page
@@ -51,8 +52,8 @@ module Precious
end end
end end
post '/edit/:name' do post '/edit/*' do
name = params[:name] name = params[:splat].first
wiki = Gollum::Wiki.new(settings.gollum_path) wiki = Gollum::Wiki.new(settings.gollum_path)
page = wiki.page(name) page = wiki.page(name)
format = params[:format].intern format = params[:format].intern
@@ -60,10 +61,10 @@ module Precious
wiki.update_page(page, name, format, params[:content], commit_message) wiki.update_page(page, name, format, params[:content], commit_message)
redirect "/#{Gollum::Page.cname name}" redirect "/#{CGI.escape(Gollum::Page.cname(name))}"
end end
post '/create/:name' do post '/create/*' do
name = params[:page] name = params[:page]
wiki = Gollum::Wiki.new(settings.gollum_path) wiki = Gollum::Wiki.new(settings.gollum_path)
@@ -71,7 +72,7 @@ module Precious
begin begin
wiki.write_page(name, format, params[:content], commit_message) wiki.write_page(name, format, params[:content], commit_message)
redirect "/#{name}" redirect "/#{CGI.escape(name)}"
rescue Gollum::DuplicatePageError => e rescue Gollum::DuplicatePageError => e
@message = "Duplicate page: #{e.message}" @message = "Duplicate page: #{e.message}"
mustache :error mustache :error
@@ -97,10 +98,10 @@ module Precious
post '/compare/:name' do post '/compare/:name' do
@versions = params[:versions] || [] @versions = params[:versions] || []
if @versions.size < 2 if @versions.size < 2
redirect "/history/#{params[:name]}" redirect "/history/#{CGI.escape(params[:name])}"
else else
redirect "/compare/%s/%s...%s" % [ redirect "/compare/%s/%s...%s" % [
params[:name], CGI.escape(params[:name]),
@versions.last, @versions.last,
@versions.first] @versions.first]
end end
@@ -1,7 +1,7 @@
<div class="guide"> <div class="guide">
<div class="main"> <div class="main">
<div class="actions"> <div class="actions">
<a href="/{{name}}">&laquo; Back</a> <a href="/{{escaped_name}}">&laquo; Back</a>
</div> </div>
<h1>{{title}}: {{before}} &rarr; {{after}}</h1> <h1>{{title}}: {{before}} &rarr; {{after}}</h1>
<div id="files"> <div id="files">
@@ -2,7 +2,7 @@
<a href="/">&laquo; Home</a> <a href="/">&laquo; Home</a>
<h1>{{title}}</h1> <h1>{{title}}</h1>
<form class="new_wiki" method="post" action="/create/{{name}}"> <form class="new_wiki" method="post" action="/create/{{escaped_name}}">
<div> <div>
<label> <label>
Title<br /> Title<br />
+2 -2
View File
@@ -1,8 +1,8 @@
<div class="write"> <div class="write">
<a href="/{{name}}">&laquo; Back</a> <a href="/{{escaped_name}}">&laquo; Back</a>
<h1>{{title}}</h1> <h1>{{title}}</h1>
<form class="edit_wiki" method="post" action="/edit/{{name}}"> <form class="edit_wiki" method="post" action="/edit/{{escaped_name}}">
<div> <div>
<label> <label>
Title<br /> Title<br />
@@ -1,10 +1,10 @@
<div class="guide"> <div class="guide">
<div class="main"> <div class="main">
<div class="actions"> <div class="actions">
<a href="/{{name}}">&laquo; Back</a> <a href="/{{escaped_name}}">&laquo; Back</a>
</div> </div>
<h1>{{title}}</h1> <h1>{{title}}</h1>
<form id="history" method="post" action="/compare/{{name}}"> <form id="history" method="post" action="/compare/{{escaped_name}}">
<table class="commits" cellpadding="0" cellspacing="0"> <table class="commits" cellpadding="0" cellspacing="0">
<tr> <tr>
<th colspan="5"> <th colspan="5">
@@ -17,7 +17,7 @@
<input name="versions[]" type="checkbox" value="{{id}}" /> <input name="versions[]" type="checkbox" value="{{id}}" />
</td> </td>
<td class="sha"> <td class="sha">
<a href="/{{name}}/{{id}}">{{id7}}</a> <a href="/{{escaped_name}}/{{id}}">{{id7}}</a>
</td> </td>
<td nowrap class="author"> <td nowrap class="author">
<img src="http://www.gravatar.com/avatar/{{gravatar}}?s=16" alt="Gravatar" /> <img src="http://www.gravatar.com/avatar/{{gravatar}}?s=16" alt="Gravatar" />
+3 -3
View File
@@ -1,7 +1,7 @@
<div class="guide"> <div class="guide">
<div class="main"> <div class="main">
<div class="actions"> <div class="actions">
<a href="/">Home</a> | <a href="/edit/{{name}}">Edit</a> <a href="/">Home</a> | <a href="/edit/{{escaped_name}}">Edit</a>
</div> </div>
<h1>{{title}}</h1> <h1>{{title}}</h1>
<div class="content wikistyle gollum {{format}}"> <div class="content wikistyle gollum {{format}}">
@@ -18,10 +18,10 @@
<div style="float: left;"> <div style="float: left;">
<small>Last edited by <b>{{author}}</b>, {{date}}</small> <small>Last edited by <b>{{author}}</b>, {{date}}</small>
<div class="actions"> <div class="actions">
<a href="/">Home</a> | <a href="/edit/{{name}}">Edit</a> <a href="/">Home</a> | <a href="/edit/{{escaped_name}}">Edit</a>
</div> </div>
</div> </div>
<div style="float: right;"> <div style="float: right;">
<a href="/history/{{name}}">View Revision History</a> <a href="/history/{{escaped_name}}">View Revision History</a>
</div> </div>
</div> </div>
+6
View File
@@ -1,3 +1,5 @@
require 'cgi'
module Precious module Precious
module Views module Views
class Layout < Mustache class Layout < Mustache
@@ -6,6 +8,10 @@ module Precious
attr_reader :name attr_reader :name
def escaped_name
CGI.escape(@name)
end
def title def title
"Home" "Home"
end end
+3 -2
View File
@@ -1,4 +1,5 @@
require 'digest/sha1' require 'digest/sha1'
require 'cgi'
module Gollum module Gollum
class Markup class Markup
@@ -267,10 +268,10 @@ module Gollum
%{<a href="#{name}">#{name}</a>} %{<a href="#{name}">#{name}</a>}
else else
if page = @wiki.page(cname) if page = @wiki.page(cname)
link = ::File.join(@wiki.base_path, Page.cname(page.name)) link = ::File.join(@wiki.base_path, CGI.escape(Page.cname(page.name)))
presence = "present" presence = "present"
else else
link = ::File.join(@wiki.base_path, cname) link = ::File.join(@wiki.base_path, CGI.escape(cname))
presence = "absent" presence = "absent"
end end
%{<a class="internal #{presence}" href="#{link}">#{name}</a>} %{<a class="internal #{presence}" href="#{link}">#{name}</a>}