Commit ad4168270e404f539af297b5f6c68c50b00784bd
1 parent
d3d8d79a
Exists in
master
and in
21 other branches
api: consider admin role when querying visible organizations for person
Showing
2 changed files
with
62 additions
and
11 deletions
Show diff stats
app/models/organization.rb
| @@ -8,11 +8,28 @@ class Organization < Profile | @@ -8,11 +8,28 @@ class Organization < Profile | ||
| 8 | :display => %w[compact] | 8 | :display => %w[compact] |
| 9 | } | 9 | } |
| 10 | 10 | ||
| 11 | + # An Organization is considered visible to a given person if one of the | ||
| 12 | + # following conditions are met: | ||
| 13 | + # 1) The user is an environment administrator. | ||
| 14 | + # 2) The user is an administrator of the organization. | ||
| 15 | + # 3) The user is a member of the organization and the organization is | ||
| 16 | + # visible. | ||
| 17 | + # 4) The user is not a member of the organization but the organization is | ||
| 18 | + # visible, public and enabled. | ||
| 11 | scope :visible_for_person, lambda { |person| | 19 | scope :visible_for_person, lambda { |person| |
| 12 | - joins('LEFT JOIN "role_assignments" ON "role_assignments"."resource_id" = "profiles"."id" AND "role_assignments"."resource_type" = \'Profile\'') | 20 | + joins('LEFT JOIN "role_assignments" ON ("role_assignments"."resource_id" = "profiles"."id" |
| 21 | + AND "role_assignments"."resource_type" = \'Profile\') OR ( | ||
| 22 | + "role_assignments"."resource_id" = "profiles"."environment_id" AND | ||
| 23 | + "role_assignments"."resource_type" = \'Environment\' )') | ||
| 24 | + .joins('LEFT JOIN "roles" ON "role_assignments"."role_id" = "roles"."id"') | ||
| 13 | .where( | 25 | .where( |
| 14 | - ['( ( role_assignments.accessor_type = ? AND role_assignments.accessor_id = ? ) OR | ||
| 15 | - (profiles.public_profile = ?)) AND (profiles.visible = ?)', Profile.name, person.id, true, true] | 26 | + ['( (roles.key = ? OR roles.key = ?) AND role_assignments.accessor_type = ? AND role_assignments.accessor_id = ? ) |
| 27 | + OR | ||
| 28 | + ( ( ( role_assignments.accessor_type = ? AND role_assignments.accessor_id = ? ) OR | ||
| 29 | + ( profiles.public_profile = ? AND profiles.enabled = ? ) ) AND | ||
| 30 | + ( profiles.visible = ? ) )', | ||
| 31 | + 'profile_admin', 'environment_administrator', Profile.name, person.id, | ||
| 32 | + Profile.name, person.id, true, true, true] | ||
| 16 | ).uniq | 33 | ).uniq |
| 17 | } | 34 | } |
| 18 | 35 |
test/unit/organization_test.rb
| @@ -479,23 +479,57 @@ class OrganizationTest < ActiveSupport::TestCase | @@ -479,23 +479,57 @@ class OrganizationTest < ActiveSupport::TestCase | ||
| 479 | 479 | ||
| 480 | should 'fetch organizations there are visible for a user' do | 480 | should 'fetch organizations there are visible for a user' do |
| 481 | person = create_user('some-person').person | 481 | person = create_user('some-person').person |
| 482 | + admin = create_user('some-admin').person | ||
| 483 | + env_admin = create_user('env-admin').person | ||
| 484 | + | ||
| 482 | o1 = fast_create(Organization, :public_profile => true , :visible => true ) | 485 | o1 = fast_create(Organization, :public_profile => true , :visible => true ) |
| 486 | + o1.add_admin(admin) | ||
| 483 | o1.add_member(person) | 487 | o1.add_member(person) |
| 488 | + | ||
| 484 | o2 = fast_create(Organization, :public_profile => true , :visible => true ) | 489 | o2 = fast_create(Organization, :public_profile => true , :visible => true ) |
| 485 | o3 = fast_create(Organization, :public_profile => false, :visible => true ) | 490 | o3 = fast_create(Organization, :public_profile => false, :visible => true ) |
| 491 | + | ||
| 486 | o4 = fast_create(Organization, :public_profile => false, :visible => true) | 492 | o4 = fast_create(Organization, :public_profile => false, :visible => true) |
| 493 | + o4.add_admin(admin) | ||
| 487 | o4.add_member(person) | 494 | o4.add_member(person) |
| 495 | + | ||
| 488 | o5 = fast_create(Organization, :public_profile => true , :visible => false) | 496 | o5 = fast_create(Organization, :public_profile => true , :visible => false) |
| 489 | - o6 = fast_create(Organization, :public_profile => false, :visible => false) | 497 | + o5.add_admin(admin) |
| 498 | + o5.add_member(person) | ||
| 499 | + | ||
| 500 | + o6 = fast_create(Enterprise, :enabled => false, :visible => true) | ||
| 501 | + o6.add_admin(admin) | ||
| 502 | + | ||
| 503 | + o7 = fast_create(Organization, :public_profile => false, :visible => false) | ||
| 504 | + | ||
| 505 | + Environment.default.add_admin(env_admin) | ||
| 506 | + | ||
| 507 | + person_orgs = Organization.visible_for_person(person) | ||
| 508 | + admin_orgs = Organization.visible_for_person(admin) | ||
| 509 | + env_admin_orgs = Organization.visible_for_person(env_admin) | ||
| 510 | + | ||
| 511 | + assert_includes person_orgs, o1 | ||
| 512 | + assert_includes admin_orgs, o1 | ||
| 513 | + assert_includes env_admin_orgs, o1 | ||
| 514 | + | ||
| 515 | + assert_includes person_orgs, o2 | ||
| 516 | + assert_includes env_admin_orgs, o2 | ||
| 517 | + assert_not_includes person_orgs, o3 | ||
| 518 | + assert_includes env_admin_orgs, o3 | ||
| 519 | + | ||
| 520 | + assert_includes person_orgs, o4 | ||
| 521 | + assert_includes admin_orgs, o4 | ||
| 522 | + assert_includes env_admin_orgs, o4 | ||
| 523 | + | ||
| 524 | + assert_not_includes person_orgs, o5 | ||
| 525 | + assert_includes admin_orgs, o5 | ||
| 526 | + assert_includes env_admin_orgs, o5 | ||
| 490 | 527 | ||
| 491 | - organizations = Organization.visible_for_person(person) | 528 | + assert_not_includes person_orgs, o6 |
| 529 | + assert_includes admin_orgs, o6 | ||
| 492 | 530 | ||
| 493 | - assert_includes organizations, o1 | ||
| 494 | - assert_includes organizations, o2 | ||
| 495 | - assert_not_includes organizations, o3 | ||
| 496 | - assert_includes organizations, o4 | ||
| 497 | - assert_not_includes organizations, o5 | ||
| 498 | - assert_not_includes organizations, o6 | 531 | + assert_not_includes person_orgs, o7 |
| 532 | + assert_includes env_admin_orgs, o7 | ||
| 499 | end | 533 | end |
| 500 | 534 | ||
| 501 | end | 535 | end |