diff --git a/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/authorization/AuthorizationUtils.java b/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/authorization/AuthorizationUtils.java index 88164580d8ef86..fd23ca4db4439e 100644 --- a/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/authorization/AuthorizationUtils.java +++ b/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/authorization/AuthorizationUtils.java @@ -531,6 +531,14 @@ public static boolean isViewDatasetOperationsAuthorized( new EntitySpec(resourceUrn.getEntityType(), resourceUrn.toString())); } + public static boolean isViewEntityPageAuthorized( + final QueryContext context, final Urn resourceUrn) { + return AuthUtil.isAuthorized( + context.getOperationContext(), + PoliciesConfig.VIEW_ENTITY_PAGE_PRIVILEGE, + new EntitySpec(resourceUrn.getEntityType(), resourceUrn.toString())); + } + public static boolean canManageAssetSummary(@Nonnull QueryContext context, @Nonnull Urn urn) { final DisjunctivePrivilegeGroup orPrivilegeGroups = new DisjunctivePrivilegeGroup( diff --git a/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/entity/EntityPrivilegesResolver.java b/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/entity/EntityPrivilegesResolver.java index 075158ea96185f..be75dbc9911377 100644 --- a/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/entity/EntityPrivilegesResolver.java +++ b/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/entity/EntityPrivilegesResolver.java @@ -192,5 +192,6 @@ private void addCommonPrivileges( result.setCanEditDescription(DescriptionUtils.isAuthorizedToUpdateDescription(context, urn)); result.setCanEditLinks(LinkUtils.isAuthorizedToUpdateLinks(context, urn)); result.setCanManageAssetSummary(AuthorizationUtils.canManageAssetSummary(context, urn)); + result.setCanViewEntityPage(AuthorizationUtils.isViewEntityPageAuthorized(context, urn)); } } diff --git a/datahub-graphql-core/src/main/resources/auth.graphql b/datahub-graphql-core/src/main/resources/auth.graphql index 667a8506f5946d..ac13f284693f56 100644 --- a/datahub-graphql-core/src/main/resources/auth.graphql +++ b/datahub-graphql-core/src/main/resources/auth.graphql @@ -368,6 +368,11 @@ type EntityPrivileges { Whether the user can manage asset summary """ canManageAssetSummary: Boolean + + """ + Whether the user can view the entity page + """ + canViewEntityPage: Boolean } """ diff --git a/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/entity/EntityPrivilegesResolverTest.java b/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/entity/EntityPrivilegesResolverTest.java index 04b9a1a3dcd002..7441f06b5ce309 100644 --- a/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/entity/EntityPrivilegesResolverTest.java +++ b/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/entity/EntityPrivilegesResolverTest.java @@ -238,4 +238,60 @@ public void testGetDataJobSuccessWithoutPermissions() throws Exception { assertFalse(result.getCanEditLineage()); } + + @Test + public void testCanViewEntityPageWithPermissions() throws Exception { + final Dataset dataset = new Dataset(); + dataset.setUrn(datasetUrn); + + EntityClient mockClient = Mockito.mock(EntityClient.class); + DataFetchingEnvironment mockEnv = setUpTestWithPermissions(dataset); + + EntityPrivilegesResolver resolver = new EntityPrivilegesResolver(mockClient); + EntityPrivileges result = resolver.get(mockEnv).get(); + + assertTrue(result.getCanViewEntityPage()); + } + + @Test + public void testCanViewEntityPageWithoutPermissions() throws Exception { + final Dataset dataset = new Dataset(); + dataset.setUrn(datasetUrn); + + EntityClient mockClient = Mockito.mock(EntityClient.class); + DataFetchingEnvironment mockEnv = setUpTestWithoutPermissions(dataset); + + EntityPrivilegesResolver resolver = new EntityPrivilegesResolver(mockClient); + EntityPrivileges result = resolver.get(mockEnv).get(); + + assertFalse(result.getCanViewEntityPage()); + } + + @Test + public void testCanViewEntityPageForChartWithPermissions() throws Exception { + final Chart chart = new Chart(); + chart.setUrn(chartUrn); + + EntityClient mockClient = Mockito.mock(EntityClient.class); + DataFetchingEnvironment mockEnv = setUpTestWithPermissions(chart); + + EntityPrivilegesResolver resolver = new EntityPrivilegesResolver(mockClient); + EntityPrivileges result = resolver.get(mockEnv).get(); + + assertTrue(result.getCanViewEntityPage()); + } + + @Test + public void testCanViewEntityPageForChartWithoutPermissions() throws Exception { + final Chart chart = new Chart(); + chart.setUrn(chartUrn); + + EntityClient mockClient = Mockito.mock(EntityClient.class); + DataFetchingEnvironment mockEnv = setUpTestWithoutPermissions(chart); + + EntityPrivilegesResolver resolver = new EntityPrivilegesResolver(mockClient); + EntityPrivileges result = resolver.get(mockEnv).get(); + + assertFalse(result.getCanViewEntityPage()); + } }