/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.core.structure.menuitem; import com.enonic.cms.core.security.AbstractAccessResolver; import com.enonic.cms.core.security.group.GroupEntity; import com.enonic.cms.core.security.group.GroupMembershipSearcher; import com.enonic.cms.core.security.user.UserEntity; import com.enonic.cms.store.dao.GroupDao; public class MenuItemAccessResolver extends AbstractAccessResolver<MenuItemEntity, MenuItemAccessType> { public MenuItemAccessResolver( GroupDao groupDao ) { super( groupDao ); } public void checkAccessToAddContentToSection( UserEntity executor, MenuItemEntity section, String message ) { if ( !hasAddContentToSectionAccess( executor, section ) ) { throw new MenuItemAccessException( message, executor.getQualifiedName(), MenuItemAccessType.ADD, section.getKey() ); } } public void checkAccessToApproveContentInSection( UserEntity executor, MenuItemEntity section, String message ) { if ( !hasApproveContentInSectionAccess( executor, section ) ) { throw new MenuItemAccessException( message, executor.getQualifiedName(), MenuItemAccessType.PUBLISH, section.getKey() ); } } public void checkAccessToUnapproveContentInSection( final UserEntity executor, final MenuItemEntity section, final String message ) { if ( !hasUnapproveContentInSectionAccess( executor, section ) ) { throw new MenuItemAccessException( message, executor.getQualifiedName(), MenuItemAccessType.PUBLISH, section.getKey() ); } } public void checkAccessToRemoveUnapprovedContentFromSection( UserEntity executor, MenuItemEntity section, String message ) { if ( !hasRemoveUnapprovedContentFromSectionAccess( executor, section ) ) { throw new MenuItemAccessException( message, executor.getQualifiedName(), MenuItemAccessType.ADD, section.getKey() ); } } public boolean hasAccess( UserEntity executor, MenuItemEntity menuItem, MenuItemAccessType accessType ) { return doHasAccess( executor, menuItem, accessType ); } public boolean hasApproveContentInSectionAccess( UserEntity executor, MenuItemEntity section ) { return doHasAccess( executor, section, MenuItemAccessType.PUBLISH ); } public boolean hasUnapproveContentInSectionAccess( UserEntity executor, MenuItemEntity section ) { return doHasAccess( executor, section, MenuItemAccessType.PUBLISH ); } public boolean hasAddContentToSectionAccess( UserEntity executor, MenuItemEntity section ) { return doHasAccess( executor, section, MenuItemAccessType.ADD ); } public boolean hasRemoveUnapprovedContentFromSectionAccess( UserEntity executor, MenuItemEntity section ) { return doHasAccess( executor, section, MenuItemAccessType.ADD ); } @Override protected boolean hasAccess( final MenuItemEntity menuItem, final GroupEntity group, final MenuItemAccessType menuItemAccessType, final boolean checkMemberships ) { if ( group == null ) { throw new IllegalArgumentException( "Given group cannot be null" ); } if ( menuItem.hasAccess( group, menuItemAccessType ) ) { return true; } if ( !checkMemberships ) { return false; } // Check through all memberships of userGroup GroupMembershipSearcher searcher = new GroupMembershipSearcher() { public boolean isGroupFound( GroupEntity traversedGroup ) { return menuItem.hasAccess( traversedGroup, menuItemAccessType ); } }; return searcher.startSearch( group ); } }