Commit 623a401dbd8855e8b96d37d5795d75b29c62082d

Authored by Victor Costa
1 parent abde9210

Allow only members in a whitelist to access an anvironment

app/controllers/application_controller.rb
... ... @@ -5,6 +5,11 @@ class ApplicationController < ActionController::Base
5 5 before_filter :init_noosfero_plugins_controller_filters
6 6 before_filter :allow_cross_domain_access
7 7 before_filter :login_required, :if => :private_environment?
  8 + before_filter :verify_members_whitelist, :if => :user
  9 +
  10 + def verify_members_whitelist
  11 + render_access_denied unless user.is_admin? || environment.members_whitelist.blank? || environment.in_whitelist?(user)
  12 + end
8 13  
9 14 def allow_cross_domain_access
10 15 origin = request.headers['Origin']
... ...
app/models/environment.rb
... ... @@ -295,6 +295,16 @@ class Environment < ActiveRecord::Base
295 295 settings_items :access_control_allow_origin, :type => Array, :default => []
296 296 settings_items :access_control_allow_methods, :type => String
297 297  
  298 + settings_items :members_whitelist, :type => Array, :default => []
  299 +
  300 + def in_whitelist?(person)
  301 + members_whitelist.include?(person.identifier)
  302 + end
  303 +
  304 + def members_whitelist=(members)
  305 + settings[:members_whitelist] = members.split(',').map(&:strip).reject(&:blank?)
  306 + end
  307 +
298 308 def news_amount_by_folder=(amount)
299 309 settings[:news_amount_by_folder] = amount.to_i
300 310 end
... ...
app/views/features/index.rhtml
... ... @@ -37,6 +37,11 @@ Check all the features you want to enable for your environment, uncheck all the
37 37 <%= select_organization_approval_method('environment', 'organization_approval_method') %>
38 38 <hr/>
39 39  
  40 +<h3><%= _('Members Whitelist') %></h3>
  41 + <div class="info"><%= _('Allow these people to access this environment (separate with commas):') %></div>
  42 + <%= text_field :environment, :members_whitelist, :value => environment.members_whitelist.join(',') %>
  43 +<hr/>
  44 +
40 45 <div>
41 46 <% button_bar do %>
42 47 <%= submit_button('save', _('Save changes')) %>
... ...
test/functional/application_controller_test.rb
... ... @@ -581,4 +581,43 @@ class ApplicationControllerTest &lt; ActionController::TestCase
581 581 assert_redirected_to :controller => 'account', :action => 'login'
582 582 end
583 583  
  584 + should 'do allow member in whitelist to access an environment' do
  585 + user = create_user
  586 + e = Environment.default
  587 + e.members_whitelist = 'admin'
  588 + e.save!
  589 + login_as(user.login)
  590 + get :index
  591 + assert_response :forbidden
  592 + end
  593 +
  594 + should 'allow member in whitelist to access an environment' do
  595 + user = create_user
  596 + e = Environment.default
  597 + e.members_whitelist = user.person.identifier
  598 + e.save!
  599 + login_as(user.login)
  600 + get :index
  601 + assert_response :success
  602 + end
  603 +
  604 + should 'allow members to access an environment if whitelist is blank' do
  605 + user = create_user
  606 + e = Environment.default
  607 + e.members_whitelist = ''
  608 + e.save!
  609 + login_as(user.login)
  610 + get :index
  611 + assert_response :success
  612 + end
  613 +
  614 + should 'allow admin to access an environment' do
  615 + e = Environment.default
  616 + e.members_whitelist = 'ze'
  617 + e.save!
  618 + login_as(create_admin_user(e))
  619 + get :index
  620 + assert_response :success
  621 + end
  622 +
584 623 end
... ...