From 6a09f49e71e00e27f0503d74a6af56f87b47b9a1 Mon Sep 17 00:00:00 2001 From: Enno Brehm Date: Thu, 26 Apr 2012 17:26:26 +0200 Subject: [PATCH] Implement API endpoint to query permissions. --- app/controllers/api_controller.rb | 17 ++++++++++++ app/views/api/permissions.builder | 9 +++++++ config/routes.rb | 1 + test/functional/api_controller_test.rb | 37 ++++++++++++++++++++++++++ 4 files changed, 64 insertions(+) create mode 100644 app/views/api/permissions.builder diff --git a/app/controllers/api_controller.rb b/app/controllers/api_controller.rb index 002bd73b8..602b79d69 100644 --- a/app/controllers/api_controller.rb +++ b/app/controllers/api_controller.rb @@ -2,6 +2,7 @@ class ApiController < ApplicationController skip_before_filter :verify_authenticity_token before_filter :check_api_readable, :except => [:capabilities] + before_filter :setup_user_auth, :only => [:permissions] after_filter :compress_output around_filter :api_call_handle_error, :api_call_timeout @@ -289,4 +290,20 @@ class ApiController < ApplicationController render :text => doc.to_s, :content_type => "text/xml" end + + # External apps that use the api are able to query which permissions + # they have. This currently returns a list of permissions granted to the current user: + # * if authenticated via OAuth, this list will contain all permissions granted by the user to the access_token. + # * if authenticated via basic auth all permissions are granted, so the list will contain all permissions. + # * unauthenticated users have no permissions, so the list will be empty. + def permissions + @permissions = case + when current_token.present? + ClientApplication.all_permissions.select { |p| current_token.read_attribute(p) } + when @user + ClientApplication.all_permissions + else + [] + end + end end diff --git a/app/views/api/permissions.builder b/app/views/api/permissions.builder new file mode 100644 index 000000000..066f56788 --- /dev/null +++ b/app/views/api/permissions.builder @@ -0,0 +1,9 @@ +# create list of permissions +xml.instruct! :xml, :version=>"1.0" +xml.osm("version" => "#{API_VERSION}", "generator" => "OpenStreetMap Server") do + xml.permissions do + @permissions.each do |permission| + xml.permission :name => permission + end + end +end diff --git a/config/routes.rb b/config/routes.rb index bc4c12c97..c24ba05e3 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -2,6 +2,7 @@ OpenStreetMap::Application.routes.draw do # API match 'api/capabilities' => 'api#capabilities', :via => :get match 'api/0.6/capabilities' => 'api#capabilities', :via => :get + match 'api/0.6/permissions' => 'api#permissions', :via => :get match 'api/0.6/changeset/create' => 'changeset#create', :via => :put match 'api/0.6/changeset/:id/upload' => 'changeset#upload', :via => :post, :id => /\d+/ diff --git a/test/functional/api_controller_test.rb b/test/functional/api_controller_test.rb index adc433fe0..d3e1d5485 100644 --- a/test/functional/api_controller_test.rb +++ b/test/functional/api_controller_test.rb @@ -298,4 +298,41 @@ class ApiControllerTest < ActionController::TestCase end end end + + def test_permissions_anonymous + get :permissions + assert_response :success + assert_select "osm > permissions", :count => 1 do + assert_select "permission", :count => 0 + end + end + + def test_permissions_basic_auth + basic_authorization(users(:normal_user).email, "test") + get :permissions + assert_response :success + assert_select "osm > permissions", :count => 1 do + assert_select "permission", :count => ClientApplication.all_permissions.size + ClientApplication.all_permissions.each do |p| + assert_select "permission[name=#{p}]", :count => 1 + end + end + end + + def test_permissions_oauth + @request.env["oauth.token"] = AccessToken.new do |token| + # Just to test a few + token.allow_read_prefs = true + token.allow_write_api = true + token.allow_read_gpx = false + end + get :permissions + assert_response :success + assert_select "osm > permissions", :count => 1 do + assert_select "permission", :count => 2 + assert_select "permission[name=allow_read_prefs]", :count => 1 + assert_select "permission[name=allow_write_api]", :count => 1 + assert_select "permission[name=allow_read_gpx]", :count => 0 + end + end end -- 2.43.2