setting to exclude rel nofollow from particular domains

This commit is contained in:
Sam Saffron 2013-02-11 18:58:19 +11:00
parent 80929ead4b
commit f68f59c24f
4 changed files with 17 additions and 3 deletions

View File

@ -30,8 +30,6 @@ class SiteSetting < ActiveRecord::Base
client_setting(:max_topic_title_length, 255) client_setting(:max_topic_title_length, 255)
client_setting(:flush_timings_secs, 5) client_setting(:flush_timings_secs, 5)
# settings only available server side # settings only available server side
setting(:auto_track_topics_after, 60000) setting(:auto_track_topics_after, 60000)
setting(:long_polling_interval, 15000) setting(:long_polling_interval, 15000)
@ -92,6 +90,7 @@ class SiteSetting < ActiveRecord::Base
setting(:allow_duplicate_topic_titles, false) setting(:allow_duplicate_topic_titles, false)
setting(:add_rel_nofollow_to_user_content, true) setting(:add_rel_nofollow_to_user_content, true)
setting(:exclude_rel_nofollow_domains, '')
setting(:post_excerpt_maxlength, 300) setting(:post_excerpt_maxlength, 300)
setting(:post_onebox_maxlength, 500) setting(:post_onebox_maxlength, 500)
setting(:best_of_score_threshold, 15) setting(:best_of_score_threshold, 15)

View File

@ -220,6 +220,7 @@ en:
category_featured_topics: "number of topics displayed in the category list" category_featured_topics: "number of topics displayed in the category list"
popup_delay: "Length of time in ms before popups appear on the screen" popup_delay: "Length of time in ms before popups appear on the screen"
add_rel_nofollow_to_user_content: "Add rel nofollow to all submitted user content, except for internal links (including parent domains) changing this requires you update all your baked markdown" add_rel_nofollow_to_user_content: "Add rel nofollow to all submitted user content, except for internal links (including parent domains) changing this requires you update all your baked markdown"
exclude_rel_nofollow_domains: "A comma delimited list of domains where nofollow is not added (tld.com will automatically allow sub.tld.com as well)"
post_excerpt_maxlength: "Maximum length in chars of a post's excerpt." post_excerpt_maxlength: "Maximum length in chars of a post's excerpt."
post_onebox_maxlength: "Maximum length of a oneboxed discourse post." post_onebox_maxlength: "Maximum length of a oneboxed discourse post."
category_post_template: "The post template that appears once you create a category" category_post_template: "The post template that appears once you create a category"

View File

@ -180,6 +180,11 @@ module PrettyText
end end
def self.add_rel_nofollow_to_user_content(html) def self.add_rel_nofollow_to_user_content(html)
whitelist = []
l = SiteSetting.exclude_rel_nofollow_domains
if l.present?
whitelist = l.split(",")
end
site_uri = nil site_uri = nil
doc = Nokogiri::HTML.fragment(html) doc = Nokogiri::HTML.fragment(html)
doc.css("a").each do |l| doc.css("a").each do |l|
@ -188,7 +193,7 @@ module PrettyText
uri = URI(href) uri = URI(href)
site_uri ||= URI(Discourse.base_url) site_uri ||= URI(Discourse.base_url)
if !uri.host.present? || uri.host.ends_with?(site_uri.host) if !uri.host.present? || uri.host.ends_with?(site_uri.host) || whitelist.any?{|u| uri.host.ends_with?(u)}
# we are good no need for nofollow # we are good no need for nofollow
else else
l["rel"] = "nofollow" l["rel"] = "nofollow"

View File

@ -79,6 +79,7 @@ test
describe "rel nofollow" do describe "rel nofollow" do
before do before do
SiteSetting.stubs(:add_rel_nofollow_to_user_content).returns(true) SiteSetting.stubs(:add_rel_nofollow_to_user_content).returns(true)
SiteSetting.stubs(:exclude_rel_nofollow_domains).returns("foo.com,bar.com")
end end
it "should inject nofollow in all user provided links" do it "should inject nofollow in all user provided links" do
@ -92,6 +93,14 @@ test
it "should not inject nofollow in all subdomain links" do it "should not inject nofollow in all subdomain links" do
(PrettyText.cook("<a href='#{Discourse.base_url.sub('http://', 'http://bla.')}/test.html'>cnn</a>") !~ /nofollow/).should be_true (PrettyText.cook("<a href='#{Discourse.base_url.sub('http://', 'http://bla.')}/test.html'>cnn</a>") !~ /nofollow/).should be_true
end end
it "should not inject nofollow for foo.com" do
(PrettyText.cook("<a href='http://foo.com/test.html'>cnn</a>") !~ /nofollow/).should be_true
end
it "should not inject nofollow for bar.foo.com" do
(PrettyText.cook("<a href='http://bar.foo.com/test.html'>cnn</a>") !~ /nofollow/).should be_true
end
end end
describe "Excerpt" do describe "Excerpt" do