]> git.openstreetmap.org Git - rails.git/commitdiff
Add additional limits on sending messages
authorTom Hughes <tom@compton.nu>
Wed, 31 Mar 2021 21:29:31 +0000 (22:29 +0100)
committerTom Hughes <tom@compton.nu>
Wed, 31 Mar 2021 21:40:34 +0000 (22:40 +0100)
Additional limits apply to new accounts and accounts with
unresolved issues reported against them.

Fixes #3135

app/controllers/messages_controller.rb
app/models/issue.rb
app/models/user.rb

index dea5c3b075eb41502c9185b4b96d02a3988b0b3c..dacd002612ec4c0ee11cdd1b6943c6cc6d7e4966 100644 (file)
@@ -26,7 +26,7 @@ class MessagesController < ApplicationController
     @message.sender = current_user
     @message.sent_on = Time.now.getutc
 
-    if current_user.sent_messages.where("sent_on >= ?", Time.now.getutc - 1.hour).count >= Settings.max_messages_per_hour
+    if current_user.sent_messages.where("sent_on >= ?", Time.now.getutc - 1.hour).count >= current_user.max_messages_per_hour
       flash.now[:error] = t ".limit_exceeded"
       render :action => "new"
     elsif @message.save
index c0707728ee329bd17e19e1caba98980e085561d1..c94fe56a7d47b30c33f9ac3d51cfe6c1bee81afd 100644 (file)
@@ -46,7 +46,7 @@ class Issue < ApplicationRecord
 
   before_validation :set_reported_user
 
-  scope :with_status, ->(issue_status) { where(:status => statuses[issue_status]) }
+  scope :with_status, ->(issue_status) { where(:status => issue_status) }
   scope :visible_to, ->(user) { where(:assigned_role => user.roles.map(&:role)) }
 
   def read_reports
index 42fa40e538da528c8149c8bedcfa6f7504adab2a..26a9f33e153bf04c92d81335577bf37ded97bd27 100644 (file)
@@ -296,6 +296,15 @@ class User < ApplicationRecord
     digest.hexdigest
   end
 
+  def max_messages_per_hour
+    account_age_in_seconds = Time.now.utc - creation_time
+    account_age_in_hours = account_age_in_seconds / 3600
+    recent_messages = messages.where("sent_on >= ?", Time.now.utc - 3600).count
+    active_reports = issues.with_status(:open).sum(:reports_count)
+    max_messages = account_age_in_hours.ceil + recent_messages - active_reports * 10
+    max_messages.clamp(0, Settings.max_messages_per_hour)
+  end
+
   private
 
   def set_defaults