diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/preprocessor/AssetPreProcessor.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/preprocessor/AssetPreProcessor.java index 791b19fca8..29be4db090 100644 --- a/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/preprocessor/AssetPreProcessor.java +++ b/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/preprocessor/AssetPreProcessor.java @@ -56,36 +56,36 @@ public void processAttributes(AtlasStruct entityStruct, EntityMutationContext co switch (operation) { case CREATE: - processCreateAsset(entity, vertex); + processCreateAsset(entity, vertex, operation); break; case UPDATE: - processUpdateAsset(entity, vertex); + processUpdateAsset(entity, vertex, operation); break; } } - private void processCreateAsset(AtlasEntity entity, AtlasVertex vertex) throws AtlasBaseException { + private void processCreateAsset(AtlasEntity entity, AtlasVertex vertex, EntityMutations.EntityOperation operation) throws AtlasBaseException { AtlasPerfMetrics.MetricRecorder metricRecorder = RequestContext.get().startMetricRecord("processCreateAsset"); - processDomainLinkAttribute(entity, vertex); + processDomainLinkAttribute(entity, vertex, operation); RequestContext.get().endMetricRecord(metricRecorder); } - private void processUpdateAsset(AtlasEntity entity, AtlasVertex vertex) throws AtlasBaseException { + private void processUpdateAsset(AtlasEntity entity, AtlasVertex vertex, EntityMutations.EntityOperation operation) throws AtlasBaseException { AtlasPerfMetrics.MetricRecorder metricRecorder = RequestContext.get().startMetricRecord("processUpdateAsset"); - processDomainLinkAttribute(entity, vertex); + processDomainLinkAttribute(entity, vertex, operation); RequestContext.get().endMetricRecord(metricRecorder); } - private void processDomainLinkAttribute(AtlasEntity entity, AtlasVertex vertex) throws AtlasBaseException { + private void processDomainLinkAttribute(AtlasEntity entity, AtlasVertex vertex, EntityMutations.EntityOperation operation) throws AtlasBaseException { if(entity.hasAttribute(DOMAIN_GUIDS)){ validateDomainAssetLinks(entity); - isAuthorized(vertex); + isAuthorized(vertex, operation, entity); } } @@ -116,16 +116,22 @@ private void validateDomainAssetLinks(AtlasEntity entity) throws AtlasBaseExcept } } - private void isAuthorized(AtlasVertex vertex) throws AtlasBaseException { - AtlasEntityHeader sourceEntity = retrieverNoRelation.toAtlasEntityHeaderWithClassifications(vertex); + private void isAuthorized(AtlasVertex vertex, EntityMutations.EntityOperation operation, AtlasEntity entity) throws AtlasBaseException { + AtlasEntityHeader sourceEntity; + + if (operation == EntityMutations.EntityOperation.CREATE) { + sourceEntity = new AtlasEntityHeader(entity); + } else { + sourceEntity = retrieverNoRelation.toAtlasEntityHeaderWithClassifications(vertex); + } - // source -> UPDATE + READ AtlasAuthorizationUtils.verifyAccess(new AtlasEntityAccessRequest(typeRegistry, AtlasPrivilege.ENTITY_UPDATE, sourceEntity), "update on source Entity, link/unlink operation denied: ", sourceEntity.getAttribute(NAME)); AtlasAuthorizationUtils.verifyAccess(new AtlasEntityAccessRequest(typeRegistry, AtlasPrivilege.ENTITY_READ, sourceEntity), "read on source Entity, link/unlink operation denied: ", sourceEntity.getAttribute(NAME)); - } } + +