]> git.openstreetmap.org Git - rails.git/blobdiff - app/abilities/api_ability.rb
Merge remote-tracking branch 'upstream/pull/5479'
[rails.git] / app / abilities / api_ability.rb
index 36cfee0bbd7c997970d79ead0722b93c0964fc1c..3fe180eeb96fd323c63121e9ba34b5a027a32e87 100644 (file)
@@ -3,12 +3,16 @@
 class ApiAbility
   include CanCan::Ability
 
-  def initialize(user)
+  def initialize(token)
     can :read, [:version, :capability, :permission, :map]
 
     if Settings.status != "database_offline"
+      user = User.find(token.resource_owner_id) if token
+
+      can [:read, :feed, :search], Note
+      can :create, Note unless token
+
       can [:read, :download], Changeset
-      can [:read, :create, :feed, :search], Note
       can :read, Tracepoint
       can :read, User
       can :read, Node
@@ -18,22 +22,33 @@ class ApiAbility
       can :read, UserBlock
 
       if user&.active?
-        can [:comment, :close, :reopen], Note
-        can [:read, :create, :update, :destroy], Trace
-        can [:details, :gpx_files], User
-        can [:read, :update, :update_all, :destroy], UserPreference
+        can [:create, :comment, :close, :reopen], Note if scope?(token, :write_notes)
+        can [:create, :destroy], NoteSubscription if scope?(token, :write_notes)
+
+        can :read, Trace if scope?(token, :read_gpx)
+        can [:create, :update, :destroy], Trace if scope?(token, :write_gpx)
+
+        can :details, User if scope?(token, :read_prefs)
+        can :gpx_files, User if scope?(token, :read_gpx)
+
+        can :read, UserPreference if scope?(token, :read_prefs)
+        can [:update, :update_all, :destroy], UserPreference if scope?(token, :write_prefs)
+
+        can [:read, :update, :destroy], Message if scope?(token, :consume_messages)
+        can :create, Message if scope?(token, :send_messages)
 
         if user.terms_agreed?
-          can [:create, :update, :upload, :close, :subscribe, :unsubscribe], Changeset
-          can :create, ChangesetComment
-          can [:create, :update, :delete], [Node, Way, Relation]
+          can [:create, :update, :upload, :close, :subscribe, :unsubscribe], Changeset if scope?(token, :write_api)
+          can :create, ChangesetComment if scope?(token, :write_api)
+          can [:create, :update, :delete], [Node, Way, Relation] if scope?(token, :write_api)
         end
 
         if user.moderator?
-          can [:destroy, :restore], ChangesetComment
-          can :destroy, Note
+          can [:destroy, :restore], ChangesetComment if scope?(token, :write_api)
+
+          can :destroy, Note if scope?(token, :write_notes)
 
-          can :redact, [OldNode, OldWay, OldRelation] if user.terms_agreed?
+          can :redact, [OldNode, OldWay, OldRelation] if user&.terms_agreed? && scope?(token, :write_redactions)
         end
       end
     end
@@ -65,4 +80,10 @@ class ApiAbility
     # See the wiki for details:
     # https://github.com/CanCanCommunity/cancancan/wiki/Defining-Abilities
   end
+
+  private
+
+  def scope?(token, scope)
+    token&.includes_scope?(scope)
+  end
 end