/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.core.portal.image; import org.joda.time.DateTime; import com.google.common.base.Preconditions; import com.enonic.cms.core.content.ContentEntity; import com.enonic.cms.core.content.ContentVersionEntity; import com.enonic.cms.core.content.access.ContentAccessResolver; import com.enonic.cms.core.content.binary.ContentBinaryDataEntity; import com.enonic.cms.core.image.ImageRequest; import com.enonic.cms.core.preview.PreviewContext; import com.enonic.cms.core.preview.PreviewService; import com.enonic.cms.core.security.user.UserEntity; import com.enonic.cms.store.dao.ContentDao; public class ImageRequestAccessResolver { public enum Access { OK, CONTENT_NOT_FOUND, CONTENT_VERSION_NOT_FOUND, CONTENT_BINARYDATA_NOT_FOUND, NO_ACCESS_TO_CONTENT, CONTENT_NOT_ONLINE, VERSION_IS_NOT_MAIN_VERSION } private ContentAccessResolver contentAccessResolver; private ContentDao contentDao; private UserEntity imageRequester; private boolean requireOnlineNow = false; private DateTime now; private PreviewService previewService; private boolean requireMainVersion = false; public ImageRequestAccessResolver( ContentDao contentDao, ContentAccessResolver contentAccessResolver ) { Preconditions.checkNotNull( contentDao ); Preconditions.checkNotNull( contentAccessResolver ); this.contentDao = contentDao; this.contentAccessResolver = contentAccessResolver; } public ImageRequestAccessResolver imageRequester( UserEntity requester ) { this.imageRequester = requester; return this; } public ImageRequestAccessResolver requireOnlineNow( DateTime now, PreviewService previewService ) { this.previewService = previewService; this.requireOnlineNow = true; this.now = now; return this; } public ImageRequestAccessResolver requireMainVersion() { this.requireMainVersion = true; return this; } public Access isAccessible( final ImageRequest imageRequest ) { Preconditions.checkNotNull( imageRequester ); if ( imageRequest.getContentKey() != null ) { return isContentImageAccessible( imageRequest ); } else { // Give always access to user image return Access.OK; } } private Access isContentImageAccessible( final ImageRequest imageRequest ) { ContentEntity content = contentDao.findByKey( imageRequest.getContentKey() ); if ( content == null ) { return Access.CONTENT_NOT_FOUND; } else if ( content.isDeleted() ) { return Access.CONTENT_NOT_FOUND; } Access accessToContent = userRightsToContent( content ); if ( accessToContent != Access.OK ) { return accessToContent; } final BinaryDataForImageRequestResolver binaryDataForImageRequestResolver = new BinaryDataForImageRequestResolver( contentDao ); final ContentVersionEntity contentVersion = binaryDataForImageRequestResolver.resolveVersion( content, imageRequest ); if ( contentVersion == null ) { return Access.CONTENT_VERSION_NOT_FOUND; } final ContentBinaryDataEntity contentBinaryData = binaryDataForImageRequestResolver.resolveContentBinaryData( contentVersion, imageRequest ); if ( contentBinaryData == null ) { return Access.CONTENT_BINARYDATA_NOT_FOUND; } if ( requireOnlineNow ) { Access onlineCheck = checkOnline( content ); if ( onlineCheck != Access.OK ) { return onlineCheck; } } if ( requireMainVersion ) { if ( !content.getMainVersion().equals( contentVersion ) ) { return Access.VERSION_IS_NOT_MAIN_VERSION; } } return Access.OK; } private Access userRightsToContent( final ContentEntity content ) { if ( !contentAccessResolver.hasReadContentAccess( imageRequester, content ) ) { return Access.NO_ACCESS_TO_CONTENT; } return Access.OK; } private Access checkOnline( final ContentEntity content ) { if ( previewService.isInPreview() ) { PreviewContext previewContext = previewService.getPreviewContext(); if ( previewContext.isPreviewingContent() && previewContext.getContentPreviewContext().treatContentAsAvailableEvenIfOffline( content.getKey() ) ) { // when in preview, the content doesn't need to be online return Access.OK; } } if ( !content.isOnline( now ) ) { return Access.CONTENT_NOT_ONLINE; } return Access.OK; } }