package com.celements.rights.access;
import static org.easymock.EasyMock.*;
import static org.junit.Assert.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
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.objects.BaseObject;
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 DefaultRightsAccessFacade_SpaceTest extends AbstractBridgedComponentTestCase {
private XWiki xwiki;
private XWikiContext context;
private DefaultRightsAccessFacade rightsAccess;
private XWikiGroupService groupSrvMock;
private IWebUtilsService webUtilsService;
private IEntityReferenceRandomCompleterRole randomCompleterMock;
@Before
public void setUp_DefaultRightsAccessFacadeTest() throws Exception {
randomCompleterMock = registerComponentMock(IEntityReferenceRandomCompleterRole.class);
context = getContext();
xwiki = getWikiMock();
rightsAccess = (DefaultRightsAccessFacade) Utils.getComponent(IRightsAccessFacadeRole.class);
webUtilsService = Utils.getComponent(IWebUtilsService.class);
XWikiRightService xwikiRightsService = new XWikiRightServiceImpl();
expect(xwiki.getRightService()).andReturn(xwikiRightsService).anyTimes();
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
public void testHasAccessLevel_space_edit_false() throws Exception {
XWikiUser user = new XWikiUser("XWiki.TestUser");
String spaceName = "MySpace";
WikiReference wikiRef = new WikiReference(context.getDatabase());
SpaceReference spaceRef = new SpaceReference(spaceName, wikiRef);
prepareEmptyGroupMembers(user, Collections.<DocumentReference>emptyList());
prepareMasterRights();
XWikiDocument spaceDoc = prepareSpaceRights(spaceRef);
String docName = "987asdfku2";
DocumentReference docRef = new DocumentReference(docName, spaceRef);
expect(randomCompleterMock.randomCompleteSpaceRef(eq(spaceRef))).andReturn(docRef);
XWikiDocument testDoc = new XWikiDocument(docRef);
expect(xwiki.getDocument(eq(docRef), same(context))).andReturn(testDoc).anyTimes();
String docFN = context.getDatabase() + ":" + spaceName + "." + docName;
expect(xwiki.getDocument(eq(docFN), same(context))).andReturn(testDoc).anyTimes();
BaseObject rightsObj = new BaseObject();
DocumentReference rightsClassRef = new DocumentReference(context.getDatabase(), "XWiki",
"XWikiGlobalRights");
rightsObj.setDocumentReference(spaceDoc.getDocumentReference());
rightsObj.setXClassReference(rightsClassRef);
rightsObj.setNumber(0);
rightsObj.setStringValue("users", "");
rightsObj.setStringValue("groups", "XWiki.Editors");
rightsObj.setStringValue("levels", "edit");
rightsObj.setIntValue("allow", 1);
spaceDoc.addXObject(rightsObj);
replayDefault();
assertFalse(rightsAccess.hasAccessLevel("edit", user, spaceRef));
verifyDefault();
}
@Test
public void testHasAccessLevel_space_edit_true() throws Exception {
XWikiUser user = new XWikiUser("XWiki.TestUser");
String spaceName = "MySpace";
WikiReference wikiRef = new WikiReference(context.getDatabase());
SpaceReference spaceRef = new SpaceReference(spaceName, wikiRef);
prepareEmptyGroupMembers(user, Arrays.asList(new DocumentReference(context.getDatabase(),
"XWiki", "Editors")));
prepareMasterRights();
XWikiDocument spaceDoc = prepareSpaceRights(spaceRef);
String docName = "987asdfku2";
DocumentReference docRef = new DocumentReference(docName, spaceRef);
expect(randomCompleterMock.randomCompleteSpaceRef(eq(spaceRef))).andReturn(docRef);
XWikiDocument testDoc = new XWikiDocument(docRef);
expect(xwiki.getDocument(eq(docRef), same(context))).andReturn(testDoc).anyTimes();
String docFN = context.getDatabase() + ":" + spaceName + "." + docName;
expect(xwiki.getDocument(eq(docFN), same(context))).andReturn(testDoc).anyTimes();
BaseObject rightsObj = new BaseObject();
DocumentReference rightsClassRef = new DocumentReference(context.getDatabase(), "XWiki",
"XWikiGlobalRights");
rightsObj.setDocumentReference(spaceDoc.getDocumentReference());
rightsObj.setXClassReference(rightsClassRef);
rightsObj.setNumber(0);
rightsObj.setStringValue("users", "");
rightsObj.setStringValue("groups", "XWiki.Editors");
rightsObj.setStringValue("levels", "edit");
rightsObj.setIntValue("allow", 1);
spaceDoc.addXObject(rightsObj);
replayDefault();
assertTrue(rightsAccess.hasAccessLevel("edit", user, spaceRef));
verifyDefault();
}
private XWikiDocument 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();
return spacePrefDoc;
}
private void prepareEmptyGroupMembers(XWikiUser user, List<DocumentReference> additionalGroups)
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");
List<DocumentReference> groupList = new ArrayList<>(additionalGroups);
groupList.add(xwikiAllGroupRef);
expect(groupSrvMock.getAllGroupsReferencesForMember(eq(userRef), eq(0), eq(0), same(
context))).andReturn(groupList).anyTimes();
expect(groupSrvMock.getAllGroupsReferencesForMember(eq(xwikiAllGroupRef), eq(0), eq(0), same(
context))).andReturn(Collections.<DocumentReference>emptyList()).anyTimes();
for (DocumentReference groupRef : additionalGroups) {
expect(groupSrvMock.getAllGroupsReferencesForMember(eq(groupRef), eq(0), eq(0), same(
context))).andReturn(Collections.<DocumentReference>emptyList()).anyTimes();
}
}
}
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();
}
}