Implement API endpoint to query permissions.

This commit is contained in:
Enno Brehm 2012-04-26 17:26:26 +02:00 committed by Tom Hughes
parent 7b613f0920
commit 6a09f49e71
4 changed files with 64 additions and 0 deletions

View file

@ -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

View file

@ -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

View file

@ -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+/

View file

@ -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