From: Andy Allan Date: Wed, 29 May 2019 14:56:15 +0000 (+0200) Subject: Allow a configurable delay to keep diary entries from being published in feeds X-Git-Tag: live~2609^2 X-Git-Url: https://git.openstreetmap.org/rails.git/commitdiff_plain/6ed749e7ebad5eeff04ccf1a8f33c078b9f46031?ds=sidebyside Allow a configurable delay to keep diary entries from being published in feeds This is to provide another tool to help spam fighting. The configuration value is set to zero hours for new deploys in order to be 'least surprising'. You can change the setting without interfering with your test suite. --- diff --git a/app/controllers/diary_entries_controller.rb b/app/controllers/diary_entries_controller.rb index fb1e7b702..121f74723 100644 --- a/app/controllers/diary_entries_controller.rb +++ b/app/controllers/diary_entries_controller.rb @@ -166,6 +166,10 @@ class DiaryEntriesController < ApplicationController else @entries = DiaryEntry.joins(:user).where(:users => { :status => %w[active confirmed] }) + # Items can't be flagged as deleted in the RSS format. + # For the general feeds, allow a delay before publishing, to help spam fighting + @entries = @entries.where("created_at < :time", :time => Settings.diary_feed_delay.hours.ago) + if params[:language] @entries = @entries.where(:language_code => params[:language]) @title = t("diary_entries.feed.language.title", :language_name => Language.find(params[:language]).english_name) @@ -177,7 +181,6 @@ class DiaryEntriesController < ApplicationController @link = url_for :action => "index", :host => Settings.server_url, :protocol => Settings.server_protocol end end - @entries = @entries.visible.includes(:user).order("created_at DESC").limit(20) end diff --git a/config/settings.yml b/config/settings.yml index 6031f0654..51d3ed2c9 100644 --- a/config/settings.yml +++ b/config/settings.yml @@ -57,6 +57,8 @@ nearby_users: 30 nearby_radius: 50 # Spam threshold spam_threshold: 50 +# Delay diary entries from appearing in the feed for this many hours +diary_feed_delay: 0 # Default legale (jurisdiction location) for contributor terms default_legale: GB # Use the built-in jobs queue for importing traces diff --git a/config/settings/test.yml b/config/settings/test.yml index 022c93246..e9a506c41 100644 --- a/config/settings/test.yml +++ b/config/settings/test.yml @@ -1,6 +1,8 @@ # Trace directories for testing gpx_trace_dir: <%= Rails.root.join("test", "gpx", "traces") %> gpx_image_dir: <%= Rails.root.join("test", "gpx", "images") %> +# Ignore the diary feed delay unless we're specifically testing it +diary_feed_delay: 0 # Geonames credentials for testing geonames_username: "dummy" # External authentication credentials for testing diff --git a/test/controllers/diary_entries_controller_test.rb b/test/controllers/diary_entries_controller_test.rb index b1f2216c7..6d7ca304a 100644 --- a/test/controllers/diary_entries_controller_test.rb +++ b/test/controllers/diary_entries_controller_test.rb @@ -664,6 +664,18 @@ class DiaryEntriesControllerTest < ActionController::TestCase assert_match "<script>", response.body end + def test_feed_delay + create(:diary_entry, :created_at => 7.hours.ago) + create(:diary_entry, :created_at => 5.hours.ago) + get :rss, :params => { :format => :rss } + assert_select "rss>channel>item", :count => 2 + + with_diary_feed_delay(6) do + get :rss, :params => { :format => :rss } + assert_select "rss>channel>item", :count => 1 + end + end + def test_show user = create(:user) suspended_user = create(:user, :suspended) @@ -897,4 +909,13 @@ class DiaryEntriesControllerTest < ActionController::TestCase assert_select "a[href=?]", "/user/#{ERB::Util.u(entry.user.display_name)}/diary/#{entry.id}" end end + + def with_diary_feed_delay(value) + diary_feed_delay = Settings.diary_feed_delay + Settings.diary_feed_delay = value + + yield + + Settings.diary_feed_delay = diary_feed_delay + end end