diff --git a/src/main/java/org/olat/repository/RepositoryManager.java b/src/main/java/org/olat/repository/RepositoryManager.java index 432ebece1240012c68a7ba9df509287485396a60..0725828f44787c2336bbcf62eb87763df1bfb39a 100644 --- a/src/main/java/org/olat/repository/RepositoryManager.java +++ b/src/main/java/org/olat/repository/RepositoryManager.java @@ -41,6 +41,7 @@ import org.olat.admin.securitygroup.gui.IdentitiesAddEvent; import org.olat.basesecurity.BaseSecurity; import org.olat.basesecurity.BaseSecurityManager; import org.olat.basesecurity.Constants; +import org.olat.basesecurity.IdentityImpl; import org.olat.basesecurity.PolicyImpl; import org.olat.basesecurity.SecurityGroup; import org.olat.basesecurity.SecurityGroupMembershipImpl; @@ -77,6 +78,7 @@ import org.olat.core.util.vfs.VFSItem; import org.olat.core.util.vfs.VFSLeaf; import org.olat.core.util.vfs.VFSManager; import org.olat.course.assessment.manager.UserCourseInformationsManager; +import org.olat.group.BusinessGroupImpl; import org.olat.group.GroupLoggingAction; import org.olat.group.context.BGContext2Resource; import org.olat.group.model.BGResourceRelation; @@ -1335,20 +1337,35 @@ public class RepositoryManager extends BasicManager { //fxdiff VCRP-1,2: access control public boolean isMember(Identity identity, RepositoryEntry entry) { StringBuilder sb = new StringBuilder(); - sb.append("select count(v) from ").append(RepositoryEntry.class.getName()).append(" as v ") - .append(" where v.key=:repositoryEntryKey and v.key in (") - .append(" select vmember.key from ").append(RepositoryEntryMember.class.getName()).append(" vmember") - .append(" where vmember.key=:repositoryEntryKey and ") - .append(" (vmember.repoParticipantKey=:identityKey or vmember.repoTutorKey=:identityKey or vmember.repoOwnerKey=:identityKey") - .append(" or vmember.groupParticipantKey=:identityKey or vmember.groupOwnerKey=:identityKey)") + sb.append("select re.key, ident.key ") + .append("from ").append(RepositoryEntry.class.getName()).append(" as re, ") + .append(IdentityImpl.class.getName()).append(" as ident ") + .append("where ident.key=:identityKey and re.key=:repositoryEntryKey ") + .append(" and (exists (from ").append(SecurityGroupMembershipImpl.class.getName()).append(" as vmember ") + .append(" where ident=vmember.identity and vmember.securityGroup=re.participantGroup") + .append(" ) or exists (from ").append(SecurityGroupMembershipImpl.class.getName()).append(" as vmember ") + .append(" where ident=vmember.identity and vmember.securityGroup=re.tutorGroup") + .append(" ) or exists (from ").append(SecurityGroupMembershipImpl.class.getName()).append(" as vmember ") + .append(" where ident=vmember.identity and vmember.securityGroup=re.ownerGroup") + .append(" ) or exists (from ").append(SecurityGroupMembershipImpl.class.getName()).append(" as vmember, ") + .append(" ").append(BGResourceRelation.class.getName()).append(" as bresource, ") + .append(" ").append(BusinessGroupImpl.class.getName()).append(" as bgroup") + .append(" where bgroup.partipiciantGroup=vmember.securityGroup and re.olatResource=bresource.resource ") + .append(" and bgroup=bresource.group and ident=vmember.identity") + .append(" ) or exists (from ").append(SecurityGroupMembershipImpl.class.getName()).append(" as vmember, ") + .append(" ").append(BGResourceRelation.class.getName()).append(" as bresource, ") + .append(" ").append(BusinessGroupImpl.class.getName()).append(" as bgroup") + .append(" where bgroup.ownerGroup=vmember.securityGroup and re.olatResource=bresource.resource ") + .append(" and bgroup=bresource.group and ident=vmember.identity") + .append(" )") .append(" )"); - Number counter = dbInstance.getCurrentEntityManager().createQuery(sb.toString(), Number.class) + List<Object[]> counter = dbInstance.getCurrentEntityManager().createQuery(sb.toString(), Object[].class) .setParameter("identityKey", identity.getKey()) .setParameter("repositoryEntryKey", entry.getKey()) .setHint("org.hibernate.cacheable", Boolean.TRUE) - .getSingleResult(); - return counter.intValue() > 0; + .getResultList(); + return !counter.isEmpty(); } /** diff --git a/src/test/java/org/olat/repository/RepositoryManagerTest.java b/src/test/java/org/olat/repository/RepositoryManagerTest.java index b0c11e1886fbcf4c368bfb184195e6c80e5f4273..859d17cc602138ac7a783a5bac4d9f3f4da2f433 100644 --- a/src/test/java/org/olat/repository/RepositoryManagerTest.java +++ b/src/test/java/org/olat/repository/RepositoryManagerTest.java @@ -329,6 +329,52 @@ public class RepositoryManagerTest extends OlatTestCase { Assert.assertFalse(member2); } + @Test + public void isMember_v2() { + Identity id1 = JunitTestHelper.createAndPersistIdentityAsUser("re-is-member-1-lc-" + UUID.randomUUID().toString()); + Identity id2 = JunitTestHelper.createAndPersistIdentityAsUser("re-is-member-2-lc-" + UUID.randomUUID().toString()); + Identity id3 = JunitTestHelper.createAndPersistIdentityAsUser("re-is-member-3-lc-" + UUID.randomUUID().toString()); + Identity id4 = JunitTestHelper.createAndPersistIdentityAsUser("re-is-member-4-lc-" + UUID.randomUUID().toString()); + Identity id5 = JunitTestHelper.createAndPersistIdentityAsUser("re-is-member-5-lc-" + UUID.randomUUID().toString()); + Identity id6 = JunitTestHelper.createAndPersistIdentityAsUser("re-is-member-6-lc-" + UUID.randomUUID().toString()); + Identity idNull = JunitTestHelper.createAndPersistIdentityAsUser("re-is-member-null-lc-" + UUID.randomUUID().toString()); + RepositoryEntry re = JunitTestHelper.createAndPersistRepositoryEntry(); + BusinessGroup group1 = businessGroupService.createBusinessGroup(null, "member-1-g", "tg", null, null, false, false, re); + BusinessGroup group2 = businessGroupService.createBusinessGroup(null, "member-2-g", "tg", null, null, false, false, re); + BusinessGroup group3 = businessGroupService.createBusinessGroup(null, "member-3-g", "tg", null, null, true, false, re); + BusinessGroup groupNull = businessGroupService.createBusinessGroup(null, "member-null-g", "tg", null, null, true, false, null); + securityManager.addIdentityToSecurityGroup(id1, re.getOwnerGroup()); + securityManager.addIdentityToSecurityGroup(id2, re.getTutorGroup()); + securityManager.addIdentityToSecurityGroup(id3, re.getParticipantGroup()); + securityManager.addIdentityToSecurityGroup(id4, group1.getOwnerGroup()); + securityManager.addIdentityToSecurityGroup(id5, group2.getPartipiciantGroup()); + securityManager.addIdentityToSecurityGroup(id6, group3.getWaitingGroup()); + securityManager.addIdentityToSecurityGroup(idNull, groupNull.getPartipiciantGroup()); + dbInstance.commitAndCloseSession(); + + //id1 is owner + boolean member1 = repositoryManager.isMember(id1, re); + Assert.assertTrue(member1); + //id2 is tutor + boolean member2 = repositoryManager.isMember(id2, re); + Assert.assertTrue(member2); + //id3 is repo participant + boolean member3 = repositoryManager.isMember(id3, re); + Assert.assertTrue(member3); + //id4 is group coach + boolean member4= repositoryManager.isMember(id4, re); + Assert.assertTrue(member4); + //id5 is group participant + boolean member5 = repositoryManager.isMember(id5, re); + Assert.assertTrue(member5); + //id6 is waiting + boolean member6 = repositoryManager.isMember(id6, re); + Assert.assertFalse(member6); + //idNull is not member + boolean memberNull = repositoryManager.isMember(idNull, re); + Assert.assertFalse(memberNull); + } + @Test public void isOwnerOfRepositoryEntry() { //create a repository entry with an owner and a participant