Allow a configurable delay to keep diary entries from being published in feeds
authorAndy Allan <git@gravitystorm.co.uk>
Wed, 29 May 2019 14:56:15 +0000 (16:56 +0200)
committerAndy Allan <git@gravitystorm.co.uk>
Wed, 29 May 2019 14:56:15 +0000 (16:56 +0200)
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.

app/controllers/diary_entries_controller.rb
config/settings.yml
config/settings/test.yml
test/controllers/diary_entries_controller_test.rb

index fb1e7b702a6aa92250f24eb914be3633c4ca4cfc..121f74723e8f9ce38ae8990ceb57692400bdd0d1 100644 (file)
@@ -166,6 +166,10 @@ class DiaryEntriesController < ApplicationController
     else
       @entries = DiaryEntry.joins(:user).where(:users => { :status => %w[active confirmed] })
 
     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)
       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
         @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
 
     @entries = @entries.visible.includes(:user).order("created_at DESC").limit(20)
   end
 
index 6031f06547f91406e9b607a0613561ced31dfd37..51d3ed2c9e1f792949e1eb47bf8e2308063863a1 100644 (file)
@@ -57,6 +57,8 @@ nearby_users: 30
 nearby_radius: 50
 # Spam threshold
 spam_threshold: 50
 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
 # Default legale (jurisdiction location) for contributor terms
 default_legale: GB
 # Use the built-in jobs queue for importing traces
index 022c9324633250247b2088d66b1d7853c973998f..e9a506c414fc1b4ce5a8676934e33456efa72399 100644 (file)
@@ -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") %>
 # 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
 # Geonames credentials for testing
 geonames_username: "dummy"
 # External authentication credentials for testing
index b1f2216c792e26eb39778be0e738f48982e62e43..6d7ca304aa3f6da83224aba7333db3c254694dad 100644 (file)
@@ -664,6 +664,18 @@ class DiaryEntriesControllerTest < ActionController::TestCase
     assert_match "<title>&lt;script&gt;</title>", response.body
   end
 
     assert_match "<title>&lt;script&gt;</title>", 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)
   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
       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
 end