Commit 4cb1363d9240f238416f25cdeddfb0b4e01905a4
1 parent
eafa036d
Exists in
api_tasks
and in
4 other branches
api: expose plugin endpoints only if enabled on the environment
Showing
7 changed files
with
74 additions
and
7 deletions
Show diff stats
app/controllers/public/api_controller.rb
| @@ -2,12 +2,18 @@ class ApiController < PublicController | @@ -2,12 +2,18 @@ class ApiController < PublicController | ||
| 2 | 2 | ||
| 3 | no_design_blocks | 3 | no_design_blocks |
| 4 | 4 | ||
| 5 | + helper_method :endpoints | ||
| 6 | + | ||
| 5 | def index | 7 | def index |
| 6 | - @api = Noosfero::API.api_class | ||
| 7 | end | 8 | end |
| 8 | 9 | ||
| 9 | def playground | 10 | def playground |
| 10 | - @api = Noosfero::API.api_class | 11 | + end |
| 12 | + | ||
| 13 | + private | ||
| 14 | + | ||
| 15 | + def endpoints | ||
| 16 | + Noosfero::API::API.endpoints(environment) | ||
| 11 | end | 17 | end |
| 12 | 18 | ||
| 13 | end | 19 | end |
app/views/api/index.html.erb
| @@ -4,7 +4,7 @@ | @@ -4,7 +4,7 @@ | ||
| 4 | <%= s_('api-playground|Try the %s') % link_to('API Playground', '/api/playground') %> | 4 | <%= s_('api-playground|Try the %s') % link_to('API Playground', '/api/playground') %> |
| 5 | </div> | 5 | </div> |
| 6 | 6 | ||
| 7 | -<%= @api.endpoints.map do |endpoint| | 7 | +<%= endpoints.map do |endpoint| |
| 8 | app = endpoint.options[:app].to_s | 8 | app = endpoint.options[:app].to_s |
| 9 | unless app.blank? | 9 | unless app.blank? |
| 10 | content_tag(:h2, app.split('::').last.to_s, title: app) + | 10 | content_tag(:h2, app.split('::').last.to_s, title: app) + |
app/views/api/playground.html.erb
| @@ -2,7 +2,7 @@ | @@ -2,7 +2,7 @@ | ||
| 2 | 2 | ||
| 3 | <script> | 3 | <script> |
| 4 | var endpoints = <%= | 4 | var endpoints = <%= |
| 5 | -@api.endpoints.map do |endpoint| | 5 | +endpoints.map do |endpoint| |
| 6 | app = endpoint.options[:app].to_s | 6 | app = endpoint.options[:app].to_s |
| 7 | unless app.blank? | 7 | unless app.blank? |
| 8 | endpoint.routes.map do |route| | 8 | endpoint.routes.map do |route| |
lib/noosfero/api/api.rb
| @@ -28,6 +28,7 @@ module Noosfero | @@ -28,6 +28,7 @@ module Noosfero | ||
| 28 | 28 | ||
| 29 | before { setup_multitenancy } | 29 | before { setup_multitenancy } |
| 30 | before { detect_stuff_by_domain } | 30 | before { detect_stuff_by_domain } |
| 31 | + before { filter_disabled_plugins_endpoints } | ||
| 31 | after { set_session_cookie } | 32 | after { set_session_cookie } |
| 32 | 33 | ||
| 33 | version 'v1' | 34 | version 'v1' |
| @@ -57,10 +58,26 @@ module Noosfero | @@ -57,10 +58,26 @@ module Noosfero | ||
| 57 | end | 58 | end |
| 58 | end | 59 | end |
| 59 | end | 60 | end |
| 60 | - end | ||
| 61 | 61 | ||
| 62 | - def self.api_class | ||
| 63 | - API | 62 | + def self.endpoint_unavailable?(endpoint, environment) |
| 63 | + api_class = endpoint.options[:app] || endpoint.options[:for] | ||
| 64 | + if api_class.present? | ||
| 65 | + klass = api_class.name.deconstantize.constantize | ||
| 66 | + return klass < Noosfero::Plugin && !environment.plugin_enabled?(klass) | ||
| 67 | + end | ||
| 68 | + end | ||
| 69 | + | ||
| 70 | + class << self | ||
| 71 | + def endpoints_with_plugins(environment = nil) | ||
| 72 | + if environment.present? | ||
| 73 | + cloned_endpoints = endpoints_without_plugins.dup | ||
| 74 | + cloned_endpoints.delete_if { |endpoint| endpoint_unavailable?(endpoint, environment) } | ||
| 75 | + else | ||
| 76 | + endpoints_without_plugins | ||
| 77 | + end | ||
| 78 | + end | ||
| 79 | + alias_method_chain :endpoints, :plugins | ||
| 80 | + end | ||
| 64 | end | 81 | end |
| 65 | end | 82 | end |
| 66 | end | 83 | end |
lib/noosfero/api/helpers.rb
| @@ -127,6 +127,10 @@ module Noosfero | @@ -127,6 +127,10 @@ module Noosfero | ||
| 127 | # error helpers # | 127 | # error helpers # |
| 128 | ########################################## | 128 | ########################################## |
| 129 | 129 | ||
| 130 | + def not_found! | ||
| 131 | + render_api_error!('404 Not found', 404) | ||
| 132 | + end | ||
| 133 | + | ||
| 130 | def forbidden! | 134 | def forbidden! |
| 131 | render_api_error!('403 Forbidden', 403) | 135 | render_api_error!('403 Forbidden', 403) |
| 132 | end | 136 | end |
| @@ -184,6 +188,10 @@ module Noosfero | @@ -184,6 +188,10 @@ module Noosfero | ||
| 184 | end | 188 | end |
| 185 | end | 189 | end |
| 186 | 190 | ||
| 191 | + def filter_disabled_plugins_endpoints | ||
| 192 | + not_found! if Noosfero::API::API.endpoint_unavailable?(self, !@environment) | ||
| 193 | + end | ||
| 194 | + | ||
| 187 | private | 195 | private |
| 188 | 196 | ||
| 189 | def parser_params(params) | 197 | def parser_params(params) |
| @@ -0,0 +1,29 @@ | @@ -0,0 +1,29 @@ | ||
| 1 | +require File.dirname(__FILE__) + '/test_helper' | ||
| 2 | + | ||
| 3 | +class MyPlugin < Noosfero::Plugin;end | ||
| 4 | +class MyPlugin::API;end | ||
| 5 | + | ||
| 6 | +class APITest < ActiveSupport::TestCase | ||
| 7 | + | ||
| 8 | + should 'endpoint should not be available if its plugin is unavailable' do | ||
| 9 | + endpoint = mock() | ||
| 10 | + environment = Environment.default | ||
| 11 | + environment.stubs(:plugin_enabled?).returns(false) | ||
| 12 | + endpoint.stubs(:options).returns({:for => MyPlugin::API}) | ||
| 13 | + | ||
| 14 | + assert Noosfero::API::API.endpoint_unavailable?(endpoint, environment) | ||
| 15 | + end | ||
| 16 | + | ||
| 17 | + should 'endpoint should be available if its plugin is available' do | ||
| 18 | + class MyPlugin < Noosfero::Plugin;end | ||
| 19 | + class MyPlugin::API;end | ||
| 20 | + | ||
| 21 | + endpoint = mock() | ||
| 22 | + environment = Environment.default | ||
| 23 | + environment.stubs(:plugin_enabled?).returns(true) | ||
| 24 | + endpoint.stubs(:options).returns({:for => MyPlugin::API}) | ||
| 25 | + | ||
| 26 | + assert !Noosfero::API::API.endpoint_unavailable?(endpoint, environment) | ||
| 27 | + end | ||
| 28 | + | ||
| 29 | +end |
test/unit/api/helpers_test.rb
| @@ -161,6 +161,13 @@ class APIHelpersTest < ActiveSupport::TestCase | @@ -161,6 +161,13 @@ class APIHelpersTest < ActiveSupport::TestCase | ||
| 161 | assert_nil make_conditions_with_parameter[:type] | 161 | assert_nil make_conditions_with_parameter[:type] |
| 162 | end | 162 | end |
| 163 | 163 | ||
| 164 | + should 'render not_found if endpoint is unavailable' do | ||
| 165 | + Noosfero::API::API.stubs(:endpoint_unavailable?).returns(true) | ||
| 166 | + self.expects(:not_found!) | ||
| 167 | + | ||
| 168 | + filter_disabled_plugins_endpoints | ||
| 169 | + end | ||
| 170 | + | ||
| 164 | protected | 171 | protected |
| 165 | 172 | ||
| 166 | def error!(info, status) | 173 | def error!(info, status) |