package com.celements.menu.access;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.xwiki.component.annotation.Component;
import org.xwiki.component.annotation.Requirement;
import org.xwiki.context.Execution;
import org.xwiki.model.reference.DocumentReference;
import com.celements.web.service.IWebUtilsService;
import com.xpn.xwiki.XWikiContext;
import com.xpn.xwiki.XWikiException;
import com.xpn.xwiki.user.api.XWikiRightService;
@Component("celements.defaultMenuAccess")
public class DefaultMenuAccessProvider implements IMenuAccessProviderRole {
private static Log LOGGER = LogFactory.getFactory().getInstance(DefaultMenuAccessProvider.class);
@Requirement
IWebUtilsService webUtilsService;
@Requirement
Execution execution;
private XWikiContext getContext() {
return (XWikiContext) execution.getContext().getProperty("xwikicontext");
}
public boolean hasview(DocumentReference menuBarDocRef) throws NoAccessDefinedException,
XWikiException {
String database = getContext().getDatabase();
try {
getContext().setDatabase(getContext().getOriginalDatabase());
if (webUtilsService.getRefDefaultSerializer().serialize(menuBarDocRef).endsWith(
"Celements2.AdminMenu")) {
LOGGER.debug("hasview: AdminMenu [" + getContext().getUser() + "] isAdvancedAdmin ["
+ webUtilsService.isAdvancedAdmin() + "].");
return webUtilsService.isAdvancedAdmin();
} else if (webUtilsService.getRefDefaultSerializer().serialize(menuBarDocRef).endsWith(
"Celements2.LayoutMenu")) {
LOGGER.debug("hasview: LayoutMenu [" + getContext().getUser() + "] isLayoutEditor ["
+ webUtilsService.isLayoutEditor() + "] isAdvancedAdmin ["
+ webUtilsService.isAdvancedAdmin() + "].");
return webUtilsService.isLayoutEditor();
}
return hasCentralAndLocalView(menuBarDocRef);
} finally {
getContext().setDatabase(database);
}
}
public boolean denyView(DocumentReference menuBarDocRef) {
return false;
}
private boolean hasCentralAndLocalView(DocumentReference menuBarDocRef) throws XWikiException {
String database = getContext().getDatabase();
getContext().setDatabase("celements2web");
DocumentReference menuBar2webDocRef = new DocumentReference("celements2web",
menuBarDocRef.getLastSpaceReference().getName(), menuBarDocRef.getName());
String menuBar2webFullName = webUtilsService.getRefDefaultSerializer().serialize(
menuBar2webDocRef);
boolean centralView = !getContext().getWiki().exists(menuBar2webDocRef, getContext())
|| getContext().getWiki().getRightService().hasAccessLevel("view", getContext().getUser(),
menuBar2webFullName, getContext());
LOGGER.debug("hasview: centralView [" + menuBar2webFullName + "] for [" + getContext().getUser()
+ "] -> [" + centralView + "] on database [" + getContext().getDatabase() + "].");
getContext().setDatabase(getContext().getOriginalDatabase());
DocumentReference menuBarLocalDocRef = new DocumentReference(getContext().getOriginalDatabase(),
menuBarDocRef.getLastSpaceReference().getName(), menuBarDocRef.getName());
String menuBarFullName = webUtilsService.getRefDefaultSerializer().serialize(
menuBarLocalDocRef);
boolean localView = true;
if (getContext().getWiki().exists(menuBarLocalDocRef, getContext())) {
localView = getContext().getWiki().getRightService().hasAccessLevel("view",
getContext().getUser(), menuBarFullName, getContext());
} else if (XWikiRightService.GUEST_USER_FULLNAME.equals(getContext().getUser())) {
String menuBarLocalFullName = webUtilsService.getRefLocalSerializer().serialize(
menuBarLocalDocRef);
String prefParamName = "CelMenuBar-" + menuBarLocalFullName;
String cfgFallbackName = "celements.menubar.guestview." + menuBarLocalFullName;
localView = (getContext().getWiki().getXWikiPreferenceAsInt(prefParamName, cfgFallbackName, 0,
getContext()) == 1);
LOGGER.info("hasview: localView default for quest on [" + menuBarFullName + "] -> ["
+ localView + "] on database [" + getContext().getDatabase()
+ "]. Checked prefParamName [" + prefParamName + "] and cfgFallbackName ["
+ cfgFallbackName + "].");
}
LOGGER.debug("hasview: localView [" + menuBarFullName + "] for [" + getContext().getUser()
+ "] -> [" + localView + "] on database [" + getContext().getDatabase() + "].");
getContext().setDatabase(database);
boolean centralAndLocalView = centralView && localView;
return centralAndLocalView;
}
}