package com.celements.rights.access; import static org.easymock.EasyMock.*; import static org.junit.Assert.*; import java.util.Arrays; import java.util.Collections; import org.junit.Before; import org.junit.Test; import org.xwiki.model.reference.AttachmentReference; import org.xwiki.model.reference.DocumentReference; import org.xwiki.model.reference.SpaceReference; import org.xwiki.model.reference.WikiReference; import com.celements.common.test.AbstractBridgedComponentTestCase; import com.celements.rights.access.internal.IEntityReferenceRandomCompleterRole; import com.celements.web.service.IWebUtilsService; import com.xpn.xwiki.XWiki; import com.xpn.xwiki.XWikiContext; import com.xpn.xwiki.XWikiException; import com.xpn.xwiki.doc.XWikiDocument; import com.xpn.xwiki.user.api.XWikiGroupService; import com.xpn.xwiki.user.api.XWikiRightService; import com.xpn.xwiki.user.api.XWikiUser; import com.xpn.xwiki.user.impl.xwiki.XWikiRightServiceImpl; import com.xpn.xwiki.web.Utils; public class DefaultRightsAccessFacadeTest extends AbstractBridgedComponentTestCase { private XWiki xwiki; private XWikiContext context; private DefaultRightsAccessFacade rightsAccess; private XWikiGroupService groupSrvMock; private IWebUtilsService webUtilsService; @Before public void setUp_DefaultRightsAccessFacadeTest() throws Exception { context = getContext(); xwiki = getWikiMock(); rightsAccess = (DefaultRightsAccessFacade) Utils.getComponent(IRightsAccessFacadeRole.class); webUtilsService = Utils.getComponent(IWebUtilsService.class); groupSrvMock = createMockAndAddToDefault(XWikiGroupService.class); expect(xwiki.getGroupService(same(context))).andReturn(groupSrvMock).anyTimes(); expect(xwiki.isVirtualMode()).andReturn(true).anyTimes(); expect(xwiki.getWikiOwner(eq(context.getDatabase()), same(context))).andReturn( "xwiki:XWiki.Admin").anyTimes(); expect(xwiki.getMaxRecursiveSpaceChecks(same(context))).andReturn(0).anyTimes(); expect(xwiki.isReadOnly()).andReturn(false).anyTimes(); } @Test @Deprecated public void testHasAccessLevel_document_edit_true_deprecated() throws Exception { XWikiRightService xwikiRightsService = new XWikiRightServiceImpl(); expect(xwiki.getRightService()).andReturn(xwikiRightsService).anyTimes(); XWikiUser user = new XWikiUser("XWiki.TestUser"); String spaceName = "MySpace"; WikiReference wikiRef = new WikiReference(context.getDatabase()); SpaceReference spaceRef = new SpaceReference(spaceName, wikiRef); DocumentReference docRef = new DocumentReference("MyTestDoc", spaceRef); XWikiDocument testDoc = new XWikiDocument(docRef); expect(xwiki.getDocument(eq(docRef), same(context))).andReturn(testDoc).anyTimes(); String docFN = context.getDatabase() + ":MySpace.MyTestDoc"; expect(xwiki.getDocument(eq(docFN), same(context))).andReturn(testDoc).anyTimes(); prepareEmptyGroupMembers(user); prepareMasterRights(); prepareSpaceRights(spaceRef); replayDefault(); assertTrue(rightsAccess.hasAccessLevel("edit", user, docRef)); verifyDefault(); } @Test @Deprecated public void testHasAccessLevel_document_edit_Guest_false_deprecated() throws Exception { XWikiRightService xwikiRightsService = new XWikiRightServiceImpl(); expect(xwiki.getRightService()).andReturn(xwikiRightsService).anyTimes(); XWikiUser user = new XWikiUser(XWikiRightService.GUEST_USER_FULLNAME); String spaceName = "MySpace"; WikiReference wikiRef = new WikiReference(context.getDatabase()); SpaceReference spaceRef = new SpaceReference(spaceName, wikiRef); DocumentReference docRef = new DocumentReference("MyTestDoc", spaceRef); XWikiDocument testDoc = new XWikiDocument(docRef); expect(xwiki.getDocument(eq(docRef), same(context))).andReturn(testDoc).anyTimes(); String docFN = context.getDatabase() + ":MySpace.MyTestDoc"; expect(xwiki.getDocument(eq(docFN), same(context))).andReturn(testDoc).anyTimes(); prepareEmptyGroupMembers(user); prepareMasterRights(); prepareSpaceRights(spaceRef); replayDefault(); assertFalse(rightsAccess.hasAccessLevel("edit", user, docRef)); verifyDefault(); } @Test @Deprecated public void testHasAccessLevel_wiki_edit_false_deprecated() throws Exception { XWikiUser user = new XWikiUser("XWiki.TestUser"); WikiReference wikiRef = new WikiReference(context.getDatabase()); replayDefault(); assertFalse(rightsAccess.hasAccessLevel("edit", user, wikiRef)); verifyDefault(); } @Test public void testHasAccessLevel_wiki_edit_false() throws Exception { XWikiUser user = new XWikiUser("XWiki.TestUser"); WikiReference wikiRef = new WikiReference(context.getDatabase()); replayDefault(); assertFalse(rightsAccess.hasAccessLevel(wikiRef, EAccessLevel.EDIT, user)); verifyDefault(); } @Test public void testHasAccessLevel_docRef() throws Exception { DocumentReference docRef = new DocumentReference(context.getDatabase(), "MySpace", "MyDocument"); EAccessLevel level = EAccessLevel.EDIT; XWikiRightService mockRightsService = createMockAndAddToDefault(XWikiRightService.class); expect(xwiki.getRightService()).andReturn(mockRightsService).anyTimes(); expect(mockRightsService.hasAccessLevel(eq(level.getIdentifier()), eq(getContext().getUser()), eq(webUtilsService.serializeRef(docRef)), same(context))).andReturn(true).once(); replayDefault(); assertTrue(rightsAccess.hasAccessLevel(docRef, level)); verifyDefault(); } @SuppressWarnings("deprecation") @Test public void testHasAccessLevel_document_edit_true() throws Exception { XWikiRightService xwikiRightsService = new XWikiRightServiceImpl(); expect(xwiki.getRightService()).andReturn(xwikiRightsService).anyTimes(); XWikiUser user = new XWikiUser("XWiki.TestUser"); String spaceName = "MySpace"; WikiReference wikiRef = new WikiReference(context.getDatabase()); SpaceReference spaceRef = new SpaceReference(spaceName, wikiRef); DocumentReference docRef = new DocumentReference("MyTestDoc", spaceRef); XWikiDocument testDoc = new XWikiDocument(docRef); expect(xwiki.getDocument(eq(docRef), same(context))).andReturn(testDoc).anyTimes(); String docFN = context.getDatabase() + ":MySpace.MyTestDoc"; expect(xwiki.getDocument(eq(docFN), same(context))).andReturn(testDoc).anyTimes(); prepareEmptyGroupMembers(user); prepareMasterRights(); prepareSpaceRights(spaceRef); replayDefault(); assertTrue(rightsAccess.hasAccessLevel(docRef, EAccessLevel.EDIT, user)); verifyDefault(); } @Test public void testHasAccessLevel_document_edit_Guest_false() throws Exception { XWikiRightService xwikiRightsService = new XWikiRightServiceImpl(); expect(xwiki.getRightService()).andReturn(xwikiRightsService).anyTimes(); XWikiUser user = new XWikiUser(XWikiRightService.GUEST_USER_FULLNAME); String spaceName = "MySpace"; WikiReference wikiRef = new WikiReference(context.getDatabase()); SpaceReference spaceRef = new SpaceReference(spaceName, wikiRef); DocumentReference docRef = new DocumentReference("MyTestDoc", spaceRef); prepareEmptyGroupMembers(user); prepareMasterRights(); prepareSpaceRights(spaceRef); replayDefault(); assertFalse(rightsAccess.hasAccessLevel(docRef, EAccessLevel.EDIT, user)); verifyDefault(); } @Test public void testHasAccessLevel_spaceRef() throws Exception { SpaceReference spaceRef = new SpaceReference("MySpace", webUtilsService.getWikiRef()); DocumentReference docRef = new DocumentReference("untitled1", spaceRef); EAccessLevel level = EAccessLevel.EDIT; XWikiRightService mockRightsService = createMockAndAddToDefault(XWikiRightService.class); IEntityReferenceRandomCompleterRole randomCompleterMock = createMockAndAddToDefault( IEntityReferenceRandomCompleterRole.class); rightsAccess.randomCompleter = randomCompleterMock; expect(randomCompleterMock.randomCompleteSpaceRef(eq(spaceRef))).andReturn(docRef).once(); expect(xwiki.getRightService()).andReturn(mockRightsService).anyTimes(); expect(mockRightsService.hasAccessLevel(eq(level.getIdentifier()), eq(getContext().getUser()), eq(webUtilsService.serializeRef(docRef)), same(context))).andReturn(true).once(); prepareSpaceRights(spaceRef); replayDefault(); assertTrue(rightsAccess.hasAccessLevel(spaceRef, level)); verifyDefault(); } @Test public void testHasAccessLevel_attRef() throws Exception { DocumentReference docRef = new DocumentReference(context.getDatabase(), "MySpace", "MyDocument"); AttachmentReference attRef = new AttachmentReference("file", docRef); EAccessLevel level = EAccessLevel.EDIT; XWikiRightService mockRightsService = createMockAndAddToDefault(XWikiRightService.class); expect(xwiki.getRightService()).andReturn(mockRightsService).anyTimes(); expect(mockRightsService.hasAccessLevel(eq(level.getIdentifier()), eq(getContext().getUser()), eq(webUtilsService.serializeRef(docRef)), same(context))).andReturn(true).once(); replayDefault(); assertTrue(rightsAccess.hasAccessLevel(attRef, level)); verifyDefault(); } @Test public void testHasAccessLevel_wikiRefRef() throws Exception { EAccessLevel level = EAccessLevel.EDIT; replayDefault(); assertFalse(rightsAccess.hasAccessLevel(webUtilsService.getWikiRef(), level)); verifyDefault(); } @Test public void testHasAccessLevel_user() throws Exception { DocumentReference docRef = new DocumentReference(context.getDatabase(), "MySpace", "MyDocument"); EAccessLevel level = EAccessLevel.VIEW; XWikiUser user = new XWikiUser("MySpace.MyUser"); XWikiRightService mockRightsService = createMockAndAddToDefault(XWikiRightService.class); expect(xwiki.getRightService()).andReturn(mockRightsService).anyTimes(); expect(mockRightsService.hasAccessLevel(eq(level.getIdentifier()), eq(user.getUser()), eq( webUtilsService.serializeRef(docRef)), same(context))).andReturn(false).once(); replayDefault(); assertFalse(rightsAccess.hasAccessLevel(docRef, level, user)); verifyDefault(); } @Deprecated private void prepareSpaceRights(SpaceReference spaceRef) throws XWikiException { String webPrefDocName = "WebPreferences"; DocumentReference spacePrefDocRef = new DocumentReference(webPrefDocName, spaceRef); XWikiDocument spacePrefDoc = new XWikiDocument(spacePrefDocRef); spacePrefDoc.setNew(false); expect(xwiki.getDocument(eq(spaceRef.getName()), eq(webPrefDocName), same(context))).andReturn( spacePrefDoc).anyTimes(); } private void prepareEmptyGroupMembers(XWikiUser user) throws XWikiException { DocumentReference userRef = webUtilsService.resolveDocumentReference(user.getUser()); if (XWikiRightService.GUEST_USER.equals(userRef.getName())) { expect(groupSrvMock.getAllGroupsReferencesForMember(eq(userRef), eq(0), eq(0), same( context))).andReturn(Collections.<DocumentReference>emptyList()).anyTimes(); } else { DocumentReference xwikiAllGroupRef = new DocumentReference(context.getDatabase(), "XWiki", "XWikiAllGroup"); expect(groupSrvMock.getAllGroupsReferencesForMember(eq(userRef), eq(0), eq(0), same( context))).andReturn(Arrays.asList(xwikiAllGroupRef)).anyTimes(); expect(groupSrvMock.getAllGroupsReferencesForMember(eq(xwikiAllGroupRef), eq(0), eq(0), same( context))).andReturn(Collections.<DocumentReference>emptyList()).anyTimes(); } } @Deprecated private void prepareMasterRights() throws XWikiException { DocumentReference wikiPrefDocRef = new DocumentReference(context.getDatabase(), "XWiki", "XWikiPreferences"); XWikiDocument wikiPrefDoc = new XWikiDocument(wikiPrefDocRef); wikiPrefDoc.setNew(false); expect(xwiki.getDocument(eq("XWiki.XWikiPreferences"), same(context))).andReturn( wikiPrefDoc).anyTimes(); expect(xwiki.getXWikiPreference(eq("authenticate_edit"), eq(""), same(context))).andReturn( "yes").anyTimes(); expect(xwiki.getXWikiPreferenceAsInt(eq("authenticate_edit"), eq(0), same(context))).andReturn( 1).anyTimes(); expect(xwiki.getSpacePreference(eq("authenticate_edit"), eq(""), same(context))).andReturn( "").anyTimes(); expect(xwiki.getSpacePreferenceAsInt(eq("authenticate_edit"), eq(0), same(context))).andReturn( 0).anyTimes(); } }