Commit 4cb1363d9240f238416f25cdeddfb0b4e01905a4

Authored by Rodrigo Souto
1 parent eafa036d

api: expose plugin endpoints only if enabled on the environment

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)
test/unit/api/api_test.rb 0 → 100644
@@ -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 &lt; ActiveSupport::TestCase @@ -161,6 +161,13 @@ class APIHelpersTest &lt; 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)