Commit c3964d52b7b31078610c90ba237a7b97e3b7dd55
Exists in
theme-brasil-digital-from-staging
and in
9 other branches
Merge branch 'AI3191-private_environment' into rails3_stable
Conflicts: app/models/environment.rb
Showing
9 changed files
with
103 additions
and
6 deletions
Show diff stats
Gemfile.lock
... | ... | @@ -61,7 +61,7 @@ GEM |
61 | 61 | database_cleaner (1.2.0) |
62 | 62 | diff-lcs (1.1.3) |
63 | 63 | erubis (2.7.0) |
64 | - eventmachine (1.0.3) | |
64 | + eventmachine (0.12.11) | |
65 | 65 | fast_gettext (0.6.8) |
66 | 66 | ffi (1.0.11) |
67 | 67 | gherkin (2.4.21) |
... | ... | @@ -75,7 +75,7 @@ GEM |
75 | 75 | i18n (>= 0.4.0) |
76 | 76 | mime-types (~> 1.16) |
77 | 77 | treetop (~> 1.4.8) |
78 | - metaclass (0.0.4) | |
78 | + metaclass (0.0.1) | |
79 | 79 | mime-types (1.19) |
80 | 80 | mocha (0.11.3) |
81 | 81 | metaclass (~> 0.0.1) | ... | ... |
app/controllers/admin/features_controller.rb
... | ... | @@ -91,4 +91,10 @@ class FeaturesController < AdminController |
91 | 91 | redirect_to :action => 'manage_fields' |
92 | 92 | end |
93 | 93 | |
94 | + def search_members | |
95 | + arg = params[:q].downcase | |
96 | + result = environment.people.find(:all, :conditions => ['LOWER(name) LIKE ?', "%#{arg}%"]) | |
97 | + render :text => prepare_to_token_input(result).to_json | |
98 | + end | |
99 | + | |
94 | 100 | end | ... | ... |
app/controllers/application_controller.rb
... | ... | @@ -7,6 +7,12 @@ class ApplicationController < ActionController::Base |
7 | 7 | before_filter :detect_stuff_by_domain |
8 | 8 | before_filter :init_noosfero_plugins |
9 | 9 | before_filter :allow_cross_domain_access |
10 | + before_filter :login_required, :if => :private_environment? | |
11 | + before_filter :verify_members_whitelist, :if => :user | |
12 | + | |
13 | + def verify_members_whitelist | |
14 | + render_access_denied unless user.is_admin? || environment.in_whitelist?(user) | |
15 | + end | |
10 | 16 | |
11 | 17 | after_filter :set_csrf_cookie |
12 | 18 | |
... | ... | @@ -187,4 +193,8 @@ class ApplicationController < ActionController::Base |
187 | 193 | {:results => scope.paginate(paginate_options)} |
188 | 194 | end |
189 | 195 | |
196 | + def private_environment? | |
197 | + @environment.enabled?(:restrict_to_members) | |
198 | + end | |
199 | + | |
190 | 200 | end | ... | ... |
app/helpers/token_helper.rb
... | ... | @@ -18,6 +18,7 @@ module TokenHelper |
18 | 18 | options[:on_add] ||= 'null' |
19 | 19 | options[:on_delete] ||= 'null' |
20 | 20 | options[:on_ready] ||= 'null' |
21 | + options[:query_param] ||= 'q' | |
21 | 22 | |
22 | 23 | result = text_field_tag(name, nil, text_field_options.merge(html_options.merge({:id => element_id}))) |
23 | 24 | result += javascript_tag("jQuery('##{element_id}') |
... | ... | @@ -30,7 +31,7 @@ module TokenHelper |
30 | 31 | searchDelay: #{options[:search_delay].to_json}, |
31 | 32 | preventDuplicates: #{options[:prevent_duplicates].to_json}, |
32 | 33 | backspaceDeleteItem: #{options[:backspace_delete_item].to_json}, |
33 | - queryParam: #{name.to_json}, | |
34 | + queryParam: #{options[:query_param].to_json}, | |
34 | 35 | tokenLimit: #{options[:token_limit].to_json}, |
35 | 36 | onResult: #{options[:on_result]}, |
36 | 37 | onAdd: #{options[:on_add]}, |
... | ... | @@ -48,4 +49,4 @@ module TokenHelper |
48 | 49 | result |
49 | 50 | end |
50 | 51 | |
51 | -end | |
52 | 52 | \ No newline at end of file |
53 | +end | ... | ... |
app/models/environment.rb
... | ... | @@ -3,7 +3,7 @@ |
3 | 3 | # domains. |
4 | 4 | class Environment < ActiveRecord::Base |
5 | 5 | |
6 | - attr_accessible :name, :is_default, :signup_welcome_text_subject, :signup_welcome_text_body, :terms_of_use, :message_for_disabled_enterprise, :news_amount_by_folder, :default_language, :languages, :description, :organization_approval_method, :enabled_plugins, :enabled_features, :disabled_blocks, :redirection_after_login, :redirection_after_signup, :contact_email, :theme, :reports_lower_bound, :noreply_email, :signup_welcome_screen_body | |
6 | + attr_accessible :name, :is_default, :signup_welcome_text_subject, :signup_welcome_text_body, :terms_of_use, :message_for_disabled_enterprise, :news_amount_by_folder, :default_language, :languages, :description, :organization_approval_method, :enabled_plugins, :enabled_features, :disabled_blocks, :redirection_after_login, :redirection_after_signup, :contact_email, :theme, :reports_lower_bound, :noreply_email, :signup_welcome_screen_body, :members_whitelist_enabled, :members_whitelist | |
7 | 7 | |
8 | 8 | has_many :users |
9 | 9 | |
... | ... | @@ -132,7 +132,8 @@ class Environment < ActiveRecord::Base |
132 | 132 | 'send_welcome_email_to_new_users' => _('Send welcome e-mail to new users'), |
133 | 133 | 'allow_change_of_redirection_after_login' => _('Allow users to set the page to redirect after login'), |
134 | 134 | 'display_my_communities_on_user_menu' => _('Display on menu the list of communities the user can manage'), |
135 | - 'display_my_enterprises_on_user_menu' => _('Display on menu the list of enterprises the user can manage') | |
135 | + 'display_my_enterprises_on_user_menu' => _('Display on menu the list of enterprises the user can manage'), | |
136 | + 'restrict_to_members' => _('Show content only to members') | |
136 | 137 | } |
137 | 138 | end |
138 | 139 | |
... | ... | @@ -305,6 +306,17 @@ class Environment < ActiveRecord::Base |
305 | 306 | settings[:signup_welcome_screen_body].present? |
306 | 307 | end |
307 | 308 | |
309 | + settings_items :members_whitelist_enabled, :type => :boolean, :default => false | |
310 | + settings_items :members_whitelist, :type => Array, :default => [] | |
311 | + | |
312 | + def in_whitelist?(person) | |
313 | + !members_whitelist_enabled || members_whitelist.include?(person.id) | |
314 | + end | |
315 | + | |
316 | + def members_whitelist=(members) | |
317 | + settings[:members_whitelist] = members.split(',').map(&:to_i) | |
318 | + end | |
319 | + | |
308 | 320 | def news_amount_by_folder=(amount) |
309 | 321 | settings[:news_amount_by_folder] = amount.to_i |
310 | 322 | end | ... | ... |
app/views/features/index.html.erb
... | ... | @@ -37,6 +37,18 @@ 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="option"> | |
42 | + <%= check_box :environment, :members_whitelist_enabled %> | |
43 | + <label><%= _('Enable whitelist') %></label> | |
44 | + </div> | |
45 | + <div class="input"> | |
46 | + <div class="info"><%= _('Allow these people to access this environment:') %></div> | |
47 | + <% tokenized_members = prepare_to_token_input(environment.people.find(:all, :conditions => {:id => environment.members_whitelist})) %> | |
48 | + <%= token_input_field_tag('environment[members_whitelist]', 'search-members', {:action => 'search_members'}, {:focus => false, :hint_text => _('Type in a search term for a user'), :pre_populate => tokenized_members}) %> | |
49 | + </div> | |
50 | +<hr/> | |
51 | + | |
40 | 52 | <div> |
41 | 53 | <% button_bar do %> |
42 | 54 | <%= submit_button('save', _('Save changes')) %> | ... | ... |
script/quick-start
... | ... | @@ -52,6 +52,7 @@ else |
52 | 52 | # special case Debian-based systems; in others people will have to install |
53 | 53 | # lsb-release by themselves |
54 | 54 | if which apt-get >/dev/null 2>&1; then |
55 | + sudo apt-get update | |
55 | 56 | sudo apt-get -y install lsb-release |
56 | 57 | else |
57 | 58 | complain "E: lsb_release not available! (Try installing the lsb-release package)" | ... | ... |
test/functional/application_controller_test.rb
... | ... | @@ -557,4 +557,51 @@ class ApplicationControllerTest < ActionController::TestCase |
557 | 557 | assert_no_tag :tag => 'meta', :attributes => { :property => 'article:published_time' } |
558 | 558 | assert_no_tag :tag => 'meta', :attributes => { :property => 'og:image' } |
559 | 559 | end |
560 | + | |
561 | + should 'redirect to login if environment is restrict to members' do | |
562 | + Environment.default.enable(:restrict_to_members) | |
563 | + get :index | |
564 | + assert_redirected_to :controller => 'account', :action => 'login' | |
565 | + end | |
566 | + | |
567 | + should 'do not allow member not included in whitelist to access an environment' do | |
568 | + user = create_user | |
569 | + e = Environment.default | |
570 | + e.members_whitelist_enabled = true | |
571 | + e.save! | |
572 | + login_as(user.login) | |
573 | + get :index | |
574 | + assert_response :forbidden | |
575 | + end | |
576 | + | |
577 | + should 'allow member in whitelist to access an environment' do | |
578 | + user = create_user | |
579 | + e = Environment.default | |
580 | + e.members_whitelist_enabled = true | |
581 | + e.members_whitelist = "#{user.person.id}" | |
582 | + e.save! | |
583 | + login_as(user.login) | |
584 | + get :index | |
585 | + assert_response :success | |
586 | + end | |
587 | + | |
588 | + should 'allow members to access an environment if whitelist is disabled' do | |
589 | + user = create_user | |
590 | + e = Environment.default | |
591 | + e.members_whitelist_enabled = false | |
592 | + e.save! | |
593 | + login_as(user.login) | |
594 | + get :index | |
595 | + assert_response :success | |
596 | + end | |
597 | + | |
598 | + should 'allow admin to access an environment if whitelist is enabled' do | |
599 | + e = Environment.default | |
600 | + e.members_whitelist_enabled = true | |
601 | + e.save! | |
602 | + login_as(create_admin_user(e)) | |
603 | + get :index | |
604 | + assert_response :success | |
605 | + end | |
606 | + | |
560 | 607 | end | ... | ... |
test/functional/features_controller_test.rb
... | ... | @@ -146,4 +146,12 @@ class FeaturesControllerTest < ActionController::TestCase |
146 | 146 | assert_equal true, e.custom_community_fields['contact_person']['required'] |
147 | 147 | end |
148 | 148 | |
149 | + should 'search members' do | |
150 | + uses_host 'anhetegua.net' | |
151 | + person = fast_create(Person, :environment_id => Environment.find(2).id) | |
152 | + xhr :get, :search_members, :q => person.name[0..2] | |
153 | + json_response = ActiveSupport::JSON.decode(@response.body) | |
154 | + assert_includes json_response, {"id"=>person.id, "name"=>person.name} | |
155 | + end | |
156 | + | |
149 | 157 | end | ... | ... |