Commit 3c4fe9d3ebd90deb158100cc82e2651f05f743a6
1 parent
c8f6e434
Exists in
master
and in
29 other branches
ActionItem5: added the management of members of a profile and the protect helper…
… to protect actions from unathorized access git-svn-id: https://svn.colivre.coop.br/svn/noosfero/trunk@507 3f533792-8f58-4932-b0fe-aaf55b0a4547
Showing
10 changed files
with
88 additions
and
3 deletions
Show diff stats
app/controllers/application.rb
| ... | ... | @@ -51,4 +51,16 @@ class ApplicationController < ActionController::Base |
| 51 | 51 | verify :method => :post, :only => actions, :redirect_to => redirect |
| 52 | 52 | end |
| 53 | 53 | |
| 54 | + # Declares the +permission+ need to be able to access +action+. | |
| 55 | + # | |
| 56 | + # * +action+ must be a symbol or string with the name of the action | |
| 57 | + # * +permission+ must be a symbol or string naming the needed permission. | |
| 58 | + # * +target+ is the object over witch the user would need the specified permission. | |
| 59 | + def self.protect(actions, permission, target = nil) | |
| 60 | + before_filter :only => actions do |controller| | |
| 61 | + unless controller.send(:logged_in?) and controller.send(:current_user).person.has_permission?(permission, target) | |
| 62 | + controller.send(:render, {:file => 'app/views/shared/access_denied.rhtml', :layout => true}) | |
| 63 | + end | |
| 64 | + end | |
| 65 | + end | |
| 54 | 66 | end | ... | ... |
app/controllers/profile_admin/enterprise_controller.rb
| ... | ... | @@ -2,7 +2,8 @@ |
| 2 | 2 | class EnterpriseController < ProfileAdminController |
| 3 | 3 | |
| 4 | 4 | before_filter :logon, :my_enterprises |
| 5 | - | |
| 5 | + protect([:edit, :update, :activate, :destroy], 'edit_enterprise', @profile) | |
| 6 | + | |
| 6 | 7 | # Redirects to show if there is only one action and to list otherwise |
| 7 | 8 | def index |
| 8 | 9 | if @person.enterprises.size == 1 |
| ... | ... | @@ -10,6 +11,8 @@ class EnterpriseController < ProfileAdminController |
| 10 | 11 | else |
| 11 | 12 | redirect_to :action => 'list' |
| 12 | 13 | end |
| 14 | + @vitual_communities = VirtualCommunity.find(:all) | |
| 15 | + @validation_entities = Organization.find(:all) | |
| 13 | 16 | end |
| 14 | 17 | |
| 15 | 18 | # Lists all enterprises |
| ... | ... | @@ -104,7 +107,7 @@ class EnterpriseController < ProfileAdminController |
| 104 | 107 | if @enterprise.approve |
| 105 | 108 | flash[:notice] = _('Enterprise successfuly approved') |
| 106 | 109 | else |
| 107 | - flash[:notice] = _('Failed to approve the enterprise') | |
| 110 | + flash[:notice] = _('Failed to approve the htmlenterprise') | |
| 108 | 111 | end |
| 109 | 112 | redirect_to :action => 'index' |
| 110 | 113 | end | ... | ... |
app/controllers/profile_admin/profile_member_controller.rb
0 → 100644
| ... | ... | @@ -0,0 +1,23 @@ |
| 1 | +class ProfileMemberController < ApplicationController | |
| 2 | + | |
| 3 | + def index | |
| 4 | + @members = @profile.people | |
| 5 | + end | |
| 6 | + | |
| 7 | + def affiliate | |
| 8 | + @member = Person.find(params[:id]) | |
| 9 | + @roles = Role.find(:all).select{ |r| r.has_kind?(:profile) } | |
| 10 | + end | |
| 11 | + | |
| 12 | + def give_role | |
| 13 | + @person = Person.find(params[:person]) | |
| 14 | + @role = Role.find(params[:role]) | |
| 15 | + if @profile.affiliate(@person, @role) | |
| 16 | + redirect_to :action => 'index' | |
| 17 | + else | |
| 18 | + @member = Person.find(params[:person]) | |
| 19 | + @roles = Role.find(:all).select{ |r| r.has_kind?(:profile) } | |
| 20 | + render :action => 'affiliate' | |
| 21 | + end | |
| 22 | + end | |
| 23 | +end | ... | ... |
app/models/profile.rb
| ... | ... | @@ -103,6 +103,10 @@ class Profile < ActiveRecord::Base |
| 103 | 103 | end |
| 104 | 104 | |
| 105 | 105 | def affiliate(person, role) |
| 106 | - RoleAssignment.new(:person => person, :role => role, :resource => self).save | |
| 106 | + unless RoleAssignment.find(:first, :conditions => {:person_id => person, :role_id => role, :resource_id => self, :resource_type => self.class.base_class.name}) | |
| 107 | + RoleAssignment.new(:person => person, :role => role, :resource => self).save | |
| 108 | + else | |
| 109 | + false | |
| 110 | + end | |
| 107 | 111 | end |
| 108 | 112 | end | ... | ... |
app/models/role.rb
| ... | ... | @@ -5,6 +5,8 @@ class Role < ActiveRecord::Base |
| 5 | 5 | 'edit_profile' => N_('Edit profile'), |
| 6 | 6 | 'post_content' => N_('Post content'), |
| 7 | 7 | 'destroy_profile' => N_('Destroy profile'), |
| 8 | + 'manage_membership' => N_('Manage membership'), | |
| 9 | + 'moderate_content' => N_('Moderate content'), | |
| 8 | 10 | }, |
| 9 | 11 | :system => { |
| 10 | 12 | } |
| ... | ... | @@ -35,4 +37,8 @@ class Role < ActiveRecord::Base |
| 35 | 37 | def has_permission?(perm) |
| 36 | 38 | permissions.include?(perm) |
| 37 | 39 | end |
| 40 | + | |
| 41 | + def has_kind?(kind) | |
| 42 | + permissions.any?{ |p| PERMISSIONS[kind][p] } | |
| 43 | + end | |
| 38 | 44 | end | ... | ... |
| ... | ... | @@ -0,0 +1,7 @@ |
| 1 | +<h2> <%= @member.name %> </h2> | |
| 2 | + | |
| 3 | +<% form_tag( {:action => 'give_role'}, {:method => :post}) do %> | |
| 4 | + <%= select_tag 'role', options_for_select(@roles.map{|r|[r.name,r.id]}) %> | |
| 5 | + <%= hidden_field_tag 'person', current_user.person.id %> | |
| 6 | + <%= submit_tag _('Affiliate') %> | |
| 7 | +<% end %> | ... | ... |
| ... | ... | @@ -0,0 +1 @@ |
| 1 | +<h2> <%= _('Access denied') %> </h2> | ... | ... |
| ... | ... | @@ -0,0 +1,18 @@ |
| 1 | +require File.dirname(__FILE__) + '/../test_helper' | |
| 2 | +require 'profile_member_controller' | |
| 3 | + | |
| 4 | +# Re-raise errors caught by the controller. | |
| 5 | +class ProfileMemberController; def rescue_action(e) raise e end; end | |
| 6 | + | |
| 7 | +class ProfileMemberControllerTest < Test::Unit::TestCase | |
| 8 | + def setup | |
| 9 | + @controller = ProfileMemberController.new | |
| 10 | + @request = ActionController::TestRequest.new | |
| 11 | + @response = ActionController::TestResponse.new | |
| 12 | + end | |
| 13 | + | |
| 14 | + # Replace this with your real tests. | |
| 15 | + def test_truth | |
| 16 | + assert true | |
| 17 | + end | |
| 18 | +end | ... | ... |