RSS feeds are now smart about password-protected webs

This commit is contained in:
Alexey Verkhovsky 2005-04-03 07:31:11 +00:00
parent bdb77c7108
commit 6f8b5b44d3
6 changed files with 61 additions and 10 deletions

View file

@ -8,6 +8,9 @@
"textile link":LinkToSomePlace will not look insane. "textile link":LinkToSomePlace will not look insane.
RSS feeds accept query parameters, sush as RSS feeds accept query parameters, sush as
http://localhost:2500/wiki/rss_with_headlines?start=2005-02-18&end=2005-02-19&limit=10 http://localhost:2500/wiki/rss_with_headlines?start=2005-02-18&end=2005-02-19&limit=10
RSS feed wiuth page contents for a password-protected web behaves as follows:
if the web is published, RSS feed links to the published version of the web
otherwise, the feed is not available
Madeleine will check every hour if there are new commands in the log or 24 hours have Madeleine will check every hour if there are new commands in the log or 24 hours have
passed since last snapshot, and take snapshot if either of these conditions is true passed since last snapshot, and take snapshot if either of these conditions is true
Madeleine will also not log read-only operations, resulting in a better performance Madeleine will also not log read-only operations, resulting in a better performance

View file

@ -28,10 +28,8 @@ class ApplicationController < ActionController::Base
end end
def check_authorization def check_authorization
if in_a_web? and if in_a_web? and needs_authorization?(@action_name) and not authorized? and
not authorized? and redirect_to :controller => 'wiki', :action => 'login', :web => @web_name
not %w( login authenticate published ).include?(@action_name)
redirect_to :action => 'login', :web => @web_name
return false return false
end end
end end
@ -126,4 +124,8 @@ class ApplicationController < ActionController::Base
$instiki_wiki_service $instiki_wiki_service
end end
def needs_authorization?(action)
not %w( login authenticate published rss_with_content rss_with_headlines ).include?(action)
end
end end

View file

@ -75,6 +75,7 @@ class WikiController < ApplicationController
end end
def feeds def feeds
@rss_with_content_allowed = rss_with_content_allowed?
# show the template # show the template
end end
@ -91,7 +92,12 @@ class WikiController < ApplicationController
end end
def rss_with_content def rss_with_content
render_rss(hide_description = false, *parse_rss_params) if rss_with_content_allowed?
render_rss(hide_description = false, *parse_rss_params)
else
render_text 'RSS feed with content for this web is blocked for security reasons. ' +
'The web is password-protected and not published', '403 Forbidden'
end
end end
def rss_with_headlines def rss_with_headlines
@ -326,6 +332,8 @@ class WikiController < ApplicationController
@hide_description = hide_description @hide_description = hide_description
@response.headers['Content-Type'] = 'text/xml' @response.headers['Content-Type'] = 'text/xml'
@link_action = @web.password ? 'published' : 'show'
render 'wiki/rss_feed' render 'wiki/rss_feed'
end end
@ -343,6 +351,10 @@ class WikiController < ApplicationController
@template.render_file(template_name) @template.render_file(template_name)
end end
def rss_with_content_allowed?
@web.password.nil? or @web.published
end
def truncate(text, length = 30, truncate_string = '...') def truncate(text, length = 30, truncate_string = '...')
if text.length > length then text[0..(length - 3)] + truncate_string else text end if text.length > length then text[0..(length - 3)] + truncate_string else text end
end end

View file

@ -4,7 +4,7 @@
<ul id="feedsList"> <ul id="feedsList">
<li> <li>
<% unless @web.password and not @web.published %> <% if @rss_with_content_allowed %>
<%= link_to 'Full content (RSS 2.0)', :web => @web.address, :action => :rss_with_content %> <%= link_to 'Full content (RSS 2.0)', :web => @web.address, :action => :rss_with_content %>
<% end %> <% end %>
</li> </li>

View file

@ -2,7 +2,7 @@
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"> <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel> <channel>
<title><%= @web.name %></title> <title><%= @web.name %></title>
<link><%= url_for :only_path => false, :web => @web_name, :action => 'show', :id => 'HomePage' %></link> <link><%= url_for :only_path => false, :web => @web_name, :action => @link_action, :id => 'HomePage' %></link>
<description>An Instiki wiki</description> <description>An Instiki wiki</description>
<language>en-us</language> <language>en-us</language>
<ttl>40</ttl> <ttl>40</ttl>
@ -10,11 +10,11 @@
<item> <item>
<title><%= page.plain_name %></title> <title><%= page.plain_name %></title>
<% unless @hide_description %> <% unless @hide_description %>
<description><%= CGI.escapeHTML(page.display_content) %></description> <description><%= h page.display_content %></description>
<% end %> <% end %>
<pubDate><%= page.created_at.strftime "%a, %e %b %Y %H:%M:%S %Z" %></pubDate> <pubDate><%= page.created_at.strftime "%a, %e %b %Y %H:%M:%S %Z" %></pubDate>
<guid><%= url_for :only_path => false, :web => @web_name, :action => 'show', :id => page.name %></guid> <guid><%= url_for :only_path => false, :web => @web_name, :action => @link_action, :id => page.name %></guid>
<link><%= url_for :only_path => false, :web => @web_name, :action => 'show', :id => page.name %></link> <link><%= url_for :only_path => false, :web => @web_name, :action => @link_action, :id => page.name %></link>
<dc:creator><%= WikiWords.separate(page.author) %></dc:creator> <dc:creator><%= WikiWords.separate(page.author) %></dc:creator>
</item> </item>
<% end %> <% end %>

View file

@ -369,6 +369,16 @@ class WikiControllerTest < Test::Unit::TestCase
assert !r.template_objects['hide_description'] assert !r.template_objects['hide_description']
end end
def test_rss_with_content_when_blocked
setup_wiki_with_three_pages
@web.password = 'aaa'
@web.published = false
r = process 'rss_with_content', 'web' => 'wiki1'
assert_equal 403, r.response_code
end
def test_rss_with_headlines def test_rss_with_headlines
setup_wiki_with_three_pages setup_wiki_with_three_pages
@ -400,6 +410,30 @@ class WikiControllerTest < Test::Unit::TestCase
assert_template_xpath_match '/rss/channel/item/link', expected_page_links assert_template_xpath_match '/rss/channel/item/link', expected_page_links
end end
def test_rss_switch_links_to_published
setup_wiki_with_three_pages
@web.password = 'aaa'
@web.published = true
@request.host = 'foo.bar.info'
@request.port = 80
r = process 'rss_with_headlines', 'web' => 'wiki1'
assert_success
xml = REXML::Document.new(r.body)
expected_page_links =
['http://foo.bar.info/wiki1/published/HomePage',
'http://foo.bar.info/wiki1/published/Oak',
'http://foo.bar.info/wiki1/published/Elephant']
assert_template_xpath_match '/rss/channel/link',
'http://foo.bar.info/wiki1/published/HomePage'
assert_template_xpath_match '/rss/channel/item/guid', expected_page_links
assert_template_xpath_match '/rss/channel/item/link', expected_page_links
end
def test_rss_with_params def test_rss_with_params
setup_wiki_with_30_pages setup_wiki_with_30_pages