Commit da0396de56254f90861d5567cffb6fb22a0ae35d
1 parent
ede53a92
Exists in
master
and in
29 other branches
admins: avoid problems with empty roles or environment on resources
Showing
3 changed files
with
15 additions
and
9 deletions
Show diff stats
app/models/environment.rb
@@ -86,7 +86,9 @@ class Environment < ActiveRecord::Base | @@ -86,7 +86,9 @@ class Environment < ActiveRecord::Base | ||
86 | end | 86 | end |
87 | 87 | ||
88 | def admins | 88 | def admins |
89 | - Person.members_of(self).all(:conditions => ['role_assignments.role_id = ?', Environment::Roles.admin(self).id]) | 89 | + admin_role = Environment::Roles.admin(self) |
90 | + return [] if admin_role.blank? | ||
91 | + Person.members_of(self).all(:conditions => ['role_assignments.role_id = ?', admin_role.id]) | ||
90 | end | 92 | end |
91 | 93 | ||
92 | # returns the available features for a Environment, in the form of a | 94 | # returns the available features for a Environment, in the form of a |
app/models/person.rb
@@ -33,16 +33,17 @@ class Person < Profile | @@ -33,16 +33,17 @@ class Person < Profile | ||
33 | { :select => 'DISTINCT profiles.*', :conditions => ['"profiles"."id" NOT IN (SELECT DISTINCT profiles.id FROM "profiles" INNER JOIN "friendships" ON "friendships"."person_id" = "profiles"."id" WHERE "friendships"."friend_id" IN (%s))' % resources.map(&:id)] } | 33 | { :select => 'DISTINCT profiles.*', :conditions => ['"profiles"."id" NOT IN (SELECT DISTINCT profiles.id FROM "profiles" INNER JOIN "friendships" ON "friendships"."person_id" = "profiles"."id" WHERE "friendships"."friend_id" IN (%s))' % resources.map(&:id)] } |
34 | } | 34 | } |
35 | 35 | ||
36 | - def has_permission_with_admin?(permission, profile) | ||
37 | - return true if profile.admins.include?(self) || profile.environment.admins.include?(self) | ||
38 | - has_permission_without_admin?(permission, profile) | 36 | + def has_permission_with_admin?(permission, resource) |
37 | + return true if resource.blank? || resource.admins.include?(self) | ||
38 | + return true if resource.kind_of?(Profile) && resource.environment.admins.include?(self) | ||
39 | + has_permission_without_admin?(permission, resource) | ||
39 | end | 40 | end |
40 | alias_method_chain :has_permission?, :admin | 41 | alias_method_chain :has_permission?, :admin |
41 | 42 | ||
42 | - def has_permission_with_plugins?(permission, profile) | ||
43 | - permissions = [has_permission_without_plugins?(permission, profile)] | 43 | + def has_permission_with_plugins?(permission, resource) |
44 | + permissions = [has_permission_without_plugins?(permission, resource)] | ||
44 | permissions += plugins.map do |plugin| | 45 | permissions += plugins.map do |plugin| |
45 | - plugin.has_permission?(self, permission, profile) | 46 | + plugin.has_permission?(self, permission, resource) |
46 | end | 47 | end |
47 | permissions.include?(true) | 48 | permissions.include?(true) |
48 | end | 49 | end |
app/models/profile.rb
@@ -795,7 +795,10 @@ private :generate_url, :url_options | @@ -795,7 +795,10 @@ private :generate_url, :url_options | ||
795 | end | 795 | end |
796 | 796 | ||
797 | def admins | 797 | def admins |
798 | - self.members_by_role(Profile::Roles.admin(environment.id)) | 798 | + return [] if environment.blank? |
799 | + admin_role = Profile::Roles.admin(environment.id) | ||
800 | + return [] if admin_role.blank? | ||
801 | + self.members_by_role(admin_role) | ||
799 | end | 802 | end |
800 | 803 | ||
801 | def enable_contact? | 804 | def enable_contact? |
@@ -803,7 +806,7 @@ private :generate_url, :url_options | @@ -803,7 +806,7 @@ private :generate_url, :url_options | ||
803 | end | 806 | end |
804 | 807 | ||
805 | include Noosfero::Plugin::HotSpot | 808 | include Noosfero::Plugin::HotSpot |
806 | - | 809 | + |
807 | def folder_types | 810 | def folder_types |
808 | types = Article.folder_types | 811 | types = Article.folder_types |
809 | plugins.dispatch(:content_types).each {|type| | 812 | plugins.dispatch(:content_types).each {|type| |