From: Jean-Philippe Lang Date: Wed, 31 Aug 2016 16:52:20 +0000 (+0000) Subject: Merged r15750 (#23655). X-Git-Tag: 3.1.7~10 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=8510f3f629ccf204f3f1e5cd648a4da2c9fbf2d9;p=redmine.git Merged r15750 (#23655). git-svn-id: http://svn.redmine.org/redmine/branches/3.1-stable@15767 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- diff --git a/app/models/project.rb b/app/models/project.rb index 101643137..54d8b11f4 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -190,7 +190,9 @@ class Project < ActiveRecord::Base if role.allowed_to?(permission) s = "#{Project.table_name}.is_public = #{connection.quoted_true}" if user.id - s = "(#{s} AND #{Project.table_name}.id NOT IN (SELECT project_id FROM #{Member.table_name} WHERE user_id = #{user.id}))" + group = role.anonymous? ? Group.anonymous : Group.non_member + principal_ids = [user.id, group.id].compact + s = "(#{s} AND #{Project.table_name}.id NOT IN (SELECT project_id FROM #{Member.table_name} WHERE user_id IN (#{principal_ids.join(',')})))" end statement_by_role[role] = s end diff --git a/test/unit/issue_test.rb b/test/unit/issue_test.rb index 9d4e4fe88..36327d828 100644 --- a/test/unit/issue_test.rb +++ b/test/unit/issue_test.rb @@ -319,6 +319,28 @@ class IssueTest < ActiveSupport::TestCase assert_equal false, Issue.where(:project_id => 1).first.visible?(user) end + def test_visible_scope_with_custom_non_member_role_having_restricted_permission + role = Role.generate!(:permissions => [:view_project]) + assert Role.non_member.has_permission?(:view_issues) + user = User.generate! + Member.create!(:principal => Group.non_member, :project_id => 1, :roles => [role]) + + issues = Issue.visible(user).to_a + assert issues.any? + assert_nil issues.detect {|issue| issue.project_id == 1} + end + + def test_visible_scope_with_custom_non_member_role_having_extended_permission + role = Role.generate!(:permissions => [:view_project, :view_issues]) + Role.non_member.remove_permission!(:view_issues) + user = User.generate! + Member.create!(:principal => Group.non_member, :project_id => 1, :roles => [role]) + + issues = Issue.visible(user).to_a + assert issues.any? + assert_not_nil issues.detect {|issue| issue.project_id == 1} + end + def test_visible_scope_for_member_with_groups_should_return_assigned_issues user = User.find(8) assert user.groups.any?