]> git.openstreetmap.org Git - rails.git/blobdiff - app/controllers/api/changeset_comments_controller.rb
Really remove login.live.com from CSP allow list
[rails.git] / app / controllers / api / changeset_comments_controller.rb
index 21c854139c9bf9d684183461650be60af8c9ee12..756e56dccdfb706d8d6e7c4456683fcc232eb08c 100644 (file)
@@ -1,12 +1,13 @@
 module Api
   class ChangesetCommentsController < ApiController
 module Api
   class ChangesetCommentsController < ApiController
+    before_action :check_api_writable
+    before_action :check_api_readable, :except => [:create]
     before_action :authorize
 
     authorize_resource
 
     before_action :require_public_data, :only => [:create]
     before_action :authorize
 
     authorize_resource
 
     before_action :require_public_data, :only => [:create]
-    before_action :check_api_writable
-    before_action :check_api_readable, :except => [:create]
+    before_action :set_request_formats
     around_action :api_call_handle_error
     around_action :api_call_timeout
 
     around_action :api_call_handle_error
     around_action :api_call_timeout
 
@@ -16,6 +17,7 @@ module Api
       # Check the arguments are sane
       raise OSM::APIBadUserInput, "No id was given" unless params[:id]
       raise OSM::APIBadUserInput, "No text was given" if params[:text].blank?
       # Check the arguments are sane
       raise OSM::APIBadUserInput, "No id was given" unless params[:id]
       raise OSM::APIBadUserInput, "No text was given" if params[:text].blank?
+      raise OSM::APIRateLimitExceeded if rate_limit_exceeded?
 
       # Extract the arguments
       id = params[:id].to_i
 
       # Extract the arguments
       id = params[:id].to_i
@@ -23,7 +25,7 @@ module Api
 
       # Find the changeset and check it is valid
       changeset = Changeset.find(id)
 
       # Find the changeset and check it is valid
       changeset = Changeset.find(id)
-      raise OSM::APIChangesetNotYetClosedError, changeset if changeset.is_open?
+      raise OSM::APIChangesetNotYetClosedError, changeset if changeset.open?
 
       # Add a comment to the changeset
       comment = changeset.comments.create(:changeset => changeset,
 
       # Add a comment to the changeset
       comment = changeset.comments.create(:changeset => changeset,
@@ -32,7 +34,7 @@ module Api
 
       # Notify current subscribers of the new comment
       changeset.subscribers.visible.each do |user|
 
       # Notify current subscribers of the new comment
       changeset.subscribers.visible.each do |user|
-        Notifier.changeset_comment_notification(comment, user).deliver_later if current_user != user
+        UserMailer.changeset_comment_notification(comment, user).deliver_later if current_user != user
       end
 
       # Add the commenter to the subscribers if necessary
       end
 
       # Add the commenter to the subscribers if necessary
@@ -40,7 +42,12 @@ module Api
 
       # Return a copy of the updated changeset
       @changeset = changeset
 
       # Return a copy of the updated changeset
       @changeset = changeset
-      render "api/changesets/changeset"
+      render "api/changesets/show"
+
+      respond_to do |format|
+        format.xml
+        format.json
+      end
     end
 
     ##
     end
 
     ##
@@ -60,7 +67,12 @@ module Api
 
       # Return a copy of the updated changeset
       @changeset = comment.changeset
 
       # Return a copy of the updated changeset
       @changeset = comment.changeset
-      render "api/changesets/changeset"
+      render "api/changesets/show"
+
+      respond_to do |format|
+        format.xml
+        format.json
+      end
     end
 
     ##
     end
 
     ##
@@ -80,7 +92,22 @@ module Api
 
       # Return a copy of the updated changeset
       @changeset = comment.changeset
 
       # Return a copy of the updated changeset
       @changeset = comment.changeset
-      render "api/changesets/changeset"
+      render "api/changesets/show"
+
+      respond_to do |format|
+        format.xml
+        format.json
+      end
+    end
+
+    private
+
+    ##
+    # Check if the current user has exceed the rate limit for comments
+    def rate_limit_exceeded?
+      recent_comments = current_user.changeset_comments.where("created_at >= ?", Time.now.utc - 1.hour).count
+
+      recent_comments >= current_user.max_changeset_comments_per_hour
     end
   end
 end
     end
   end
 end