This is an automated email from the ASF dual-hosted git repository.
ramackri pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ranger.git
The following commit(s) were added to refs/heads/master by this push:
new f195fde0c RANGER-5681: Align GDS secure download endpoint
authorization with other secure download APIs (#1067)
f195fde0c is described below
commit f195fde0c5d730f432ce594db189a83d6aad1eb9
Author: Vyom Mani Tiwari <[email protected]>
AuthorDate: Wed Jul 15 15:35:33 2026 +0530
RANGER-5681: Align GDS secure download endpoint authorization with other
secure download APIs (#1067)
---
.../main/java/org/apache/ranger/rest/GdsREST.java | 36 +++--
.../java/org/apache/ranger/rest/TestGdsREST.java | 145 ++++++++++++++++++---
2 files changed, 153 insertions(+), 28 deletions(-)
diff --git a/security-admin/src/main/java/org/apache/ranger/rest/GdsREST.java
b/security-admin/src/main/java/org/apache/ranger/rest/GdsREST.java
index fbc367f45..1e0140c01 100755
--- a/security-admin/src/main/java/org/apache/ranger/rest/GdsREST.java
+++ b/security-admin/src/main/java/org/apache/ranger/rest/GdsREST.java
@@ -1787,21 +1787,37 @@ public ServiceGdsInfo
getSecureServiceGdsInfoIfUpdated(@PathParam("serviceName")
int httpCode = HttpServletResponse.SC_OK;
Long downloadedVersion = null;
String logMsg = null;
+ boolean isAllowed = false;
try {
- bizUtil.failUnauthenticatedDownloadIfNotAllowed();
-
- boolean isValid =
serviceUtil.isValidateHttpsAuthentication(serviceName, request);
+ boolean isValid = serviceUtil.isValidService(serviceName, request);
if (isValid) {
- ret = gdsStore.getGdsInfoIfUpdated(serviceName,
lastKnownVersion);
-
- if (ret == null) {
- downloadedVersion = lastKnownVersion;
- httpCode = HttpServletResponse.SC_NOT_MODIFIED;
- logMsg = "No change since last update";
+ if (bizUtil.isAdmin()) {
+ isAllowed = true;
} else {
- downloadedVersion = ret.getGdsVersion();
+ RangerService rangerService =
serviceDBStore.getServiceByName(serviceName);
+ if (rangerService != null) {
+ isAllowed = bizUtil.isUserAllowed(rangerService,
ServiceREST.Allowed_User_List_For_Download);
+ if (!isAllowed) {
+ isAllowed = bizUtil.isUserAllowed(rangerService,
ServiceREST.Allowed_User_List_For_Grant_Revoke);
+ }
+ }
+ }
+ if (isAllowed) {
+ ret = gdsStore.getGdsInfoIfUpdated(serviceName,
lastKnownVersion);
+ if (ret == null) {
+ downloadedVersion = lastKnownVersion;
+ httpCode =
HttpServletResponse.SC_NOT_MODIFIED;
+ logMsg = "No change since last update";
+ } else {
+ downloadedVersion = ret.getGdsVersion();
+ }
+ } else {
+
LOG.error("GdsREST.getSecureServiceGdsInfoIfUpdated(serviceName={}) failed as
User doesn't have permission to download GDS data", serviceName);
+
+ httpCode = HttpServletResponse.SC_FORBIDDEN;
+ logMsg = "User doesn't have permission to download GDS
data";
}
}
} catch (WebApplicationException webException) {
diff --git
a/security-admin/src/test/java/org/apache/ranger/rest/TestGdsREST.java
b/security-admin/src/test/java/org/apache/ranger/rest/TestGdsREST.java
index 1d709340a..29f993c63 100644
--- a/security-admin/src/test/java/org/apache/ranger/rest/TestGdsREST.java
+++ b/security-admin/src/test/java/org/apache/ranger/rest/TestGdsREST.java
@@ -75,6 +75,7 @@
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.ArgumentMatchers.any;
@@ -1361,7 +1362,7 @@ public void
testGetServiceGdsInfoIfUpdatedGenericException() throws Exception {
}
@Test
- public void testGetSecureServiceGdsInfoIfUpdated() throws Exception {
+ public void testGetSecureServiceGdsInfoIfUpdated_AdminAllowed() throws
Exception {
String serviceName = "testService";
Long lastKnownVersion = 1L;
Long lastActivationTime = 0L;
@@ -1372,28 +1373,136 @@ public void testGetSecureServiceGdsInfoIfUpdated()
throws Exception {
ServiceGdsInfo expected = new ServiceGdsInfo();
expected.setGdsVersion(2L);
- doNothing().when(bizUtil).failUnauthenticatedDownloadIfNotAllowed();
- when(serviceUtil.isValidateHttpsAuthentication(serviceName,
request)).thenReturn(true);
+ when(serviceUtil.isValidService(serviceName,
request)).thenReturn(true);
+ when(bizUtil.isAdmin()).thenReturn(true);
+ when(gdsStore.getGdsInfoIfUpdated(serviceName,
lastKnownVersion)).thenReturn(expected);
+ ServiceGdsInfo result =
gdsREST.getSecureServiceGdsInfoIfUpdated(serviceName, lastKnownVersion,
lastActivationTime,
+ pluginId, clusterName, pluginCapabilities, request);
+
+ assertNotNull(result);
+ assertEquals(expected.getGdsVersion(), result.getGdsVersion());
+ verify(gdsStore).getGdsInfoIfUpdated(serviceName, lastKnownVersion);
+ verify(serviceDBStore, Mockito.never()).getServiceByName(anyString());
+ }
+
+ @Test
+ public void
testGetSecureServiceGdsInfoIfUpdated_NonAdminAllowedViaDownloadList() throws
Exception {
+ String serviceName = serviceHive;
+ Long lastKnownVersion = 1L;
+ RangerService rangerService = new RangerService();
+ rangerService.setId(1L);
+ rangerService.setName(serviceName);
+
+ ServiceGdsInfo expected = new ServiceGdsInfo();
+ expected.setGdsVersion(3L);
+
+ when(serviceUtil.isValidService(serviceName,
request)).thenReturn(true);
+ when(bizUtil.isAdmin()).thenReturn(false);
+
when(serviceDBStore.getServiceByName(serviceName)).thenReturn(rangerService);
+ when(bizUtil.isUserAllowed(rangerService,
ServiceREST.Allowed_User_List_For_Download)).thenReturn(true);
+ when(gdsStore.getGdsInfoIfUpdated(serviceName,
lastKnownVersion)).thenReturn(expected);
+
+ ServiceGdsInfo result =
gdsREST.getSecureServiceGdsInfoIfUpdated(serviceName, lastKnownVersion, 0L,
"p1", "c1", "caps", request);
+
+ assertNotNull(result);
+ assertEquals(expected.getGdsVersion(), result.getGdsVersion());
+ verify(bizUtil).isUserAllowed(rangerService,
ServiceREST.Allowed_User_List_For_Download);
+ verify(bizUtil, Mockito.never()).isUserAllowed(rangerService,
ServiceREST.Allowed_User_List_For_Grant_Revoke);
+ }
+
+ @Test
+ public void
testGetSecureServiceGdsInfoIfUpdated_NonAdminAllowedViaGrantRevokeList() throws
Exception {
+ String serviceName = serviceHive;
+ Long lastKnownVersion = 1L;
+ RangerService rangerService = new RangerService();
+ rangerService.setId(2L);
+ rangerService.setName(serviceName);
+
+ ServiceGdsInfo expected = new ServiceGdsInfo();
+ expected.setGdsVersion(4L);
+
+ when(serviceUtil.isValidService(serviceName,
request)).thenReturn(true);
+ when(bizUtil.isAdmin()).thenReturn(false);
+
when(serviceDBStore.getServiceByName(serviceName)).thenReturn(rangerService);
+ when(bizUtil.isUserAllowed(rangerService,
ServiceREST.Allowed_User_List_For_Download)).thenReturn(false);
+ when(bizUtil.isUserAllowed(rangerService,
ServiceREST.Allowed_User_List_For_Grant_Revoke)).thenReturn(true);
when(gdsStore.getGdsInfoIfUpdated(serviceName,
lastKnownVersion)).thenReturn(expected);
ServiceGdsInfo result =
gdsREST.getSecureServiceGdsInfoIfUpdated(serviceName, lastKnownVersion,
- lastActivationTime, pluginId, clusterName, pluginCapabilities,
request);
+ 0L, "p1", "c1", "caps", request);
assertNotNull(result);
assertEquals(expected.getGdsVersion(), result.getGdsVersion());
- verify(gdsStore).getGdsInfoIfUpdated(serviceName, lastKnownVersion);
+ verify(bizUtil).isUserAllowed(rangerService,
ServiceREST.Allowed_User_List_For_Download);
+ verify(bizUtil).isUserAllowed(rangerService,
ServiceREST.Allowed_User_List_For_Grant_Revoke);
+ }
+
+ @Test
+ public void testGetSecureServiceGdsInfoIfUpdated_NonAdminForbidden()
throws Exception {
+ String serviceName = serviceHive;
+ Long lastKnownVersion = 1L;
+ RangerService rangerService = new RangerService();
+ rangerService.setId(3L);
+ rangerService.setName(serviceName);
+
+ when(serviceUtil.isValidService(serviceName,
request)).thenReturn(true);
+ when(bizUtil.isAdmin()).thenReturn(false);
+
when(serviceDBStore.getServiceByName(serviceName)).thenReturn(rangerService);
+ when(bizUtil.isUserAllowed(rangerService,
ServiceREST.Allowed_User_List_For_Download)).thenReturn(false);
+ when(bizUtil.isUserAllowed(rangerService,
ServiceREST.Allowed_User_List_For_Grant_Revoke)).thenReturn(false);
+ doNothing().when(assetMgr).createPluginInfo(anyString(), anyString(),
any(HttpServletRequest.class),
+ anyInt(), any(), any(), anyLong(), anyInt(), anyString(),
anyString());
+
when(restErrorUtil.createRESTException(eq(HttpServletResponse.SC_FORBIDDEN),
anyString(), eq(true)))
+ .thenThrow(new WebApplicationException());
+ assertThrows(WebApplicationException.class, () ->
gdsREST.getSecureServiceGdsInfoIfUpdated(serviceName, lastKnownVersion,
+ 0L, "p1", "c1", "caps", request));
+ verify(gdsStore, Mockito.never()).getGdsInfoIfUpdated(anyString(),
anyLong());
}
@Test
- public void testGetSecureServiceGdsInfoIfUpdatedGenericException() throws
Exception {
- String serviceName = "svc";
- Long lastKnownVersion = 1L;
- String pluginId = "p1";
- String clusterName = "c1";
- String pluginCapabilities = "caps";
+ public void
testGetSecureServiceGdsInfoIfUpdated_ServiceNotFoundForbidden() throws
Exception {
+ String serviceName = "missingSvc";
+ Long lastKnownVersion = 1L;
- doNothing().when(bizUtil).failUnauthenticatedDownloadIfNotAllowed();
- when(serviceUtil.isValidateHttpsAuthentication(serviceName,
request)).thenReturn(true);
+ when(serviceUtil.isValidService(serviceName,
request)).thenReturn(true);
+ when(bizUtil.isAdmin()).thenReturn(false);
+ when(serviceDBStore.getServiceByName(serviceName)).thenReturn(null);
+ doNothing().when(assetMgr).createPluginInfo(anyString(), anyString(),
any(HttpServletRequest.class),
+ anyInt(), any(), any(), anyLong(), anyInt(), anyString(),
anyString());
+
when(restErrorUtil.createRESTException(eq(HttpServletResponse.SC_FORBIDDEN),
anyString(), eq(true)))
+ .thenThrow(new WebApplicationException());
+ assertThrows(WebApplicationException.class, () ->
+ gdsREST.getSecureServiceGdsInfoIfUpdated(serviceName,
lastKnownVersion, 0L, "p1", "c1", "caps", request));
+ verify(gdsStore, Mockito.never()).getGdsInfoIfUpdated(anyString(),
anyLong());
+ }
+
+ @Test
+ public void
testGetSecureServiceGdsInfoIfUpdated_InvalidServiceReturnsNull() throws
Exception {
+ String serviceName = "invalidSvc";
+ Long lastKnownVersion = 1L;
+
+ when(serviceUtil.isValidService(serviceName,
request)).thenReturn(false);
+ doNothing().when(assetMgr).createPluginInfo(anyString(), anyString(),
any(HttpServletRequest.class),
+ anyInt(), any(), any(), anyLong(), anyInt(), anyString(),
anyString());
+
+ ServiceGdsInfo result =
gdsREST.getSecureServiceGdsInfoIfUpdated(serviceName, lastKnownVersion,
+ 0L, "p1", "c1", "caps", request);
+
+ assertEquals(null, result);
+ verify(bizUtil, Mockito.never()).isAdmin();
+ verify(gdsStore, Mockito.never()).getGdsInfoIfUpdated(anyString(),
anyLong());
+ }
+
+ @Test
+ public void testGetSecureServiceGdsInfoIfUpdatedGenericException() throws
Exception {
+ String serviceName = "svc";
+ Long lastKnownVersion = 1L;
+ RangerService rangerService = new RangerService();
+ rangerService.setId(4L);
+ rangerService.setName(serviceName);
+
+ when(serviceUtil.isValidService(serviceName,
request)).thenReturn(true);
+ when(bizUtil.isAdmin()).thenReturn(true);
when(gdsStore.getGdsInfoIfUpdated(serviceName,
lastKnownVersion)).thenThrow(new RuntimeException("err"));
doNothing().when(assetMgr).createPluginInfo(
Mockito.anyString(),
@@ -1409,7 +1518,7 @@ public void
testGetSecureServiceGdsInfoIfUpdatedGenericException() throws Except
when(restErrorUtil.createRESTException(Mockito.anyInt(),
Mockito.anyString(), Mockito.anyBoolean())).thenThrow(new
WebApplicationException());
assertThrows(WebApplicationException.class,
- () -> gdsREST.getSecureServiceGdsInfoIfUpdated(serviceName,
lastKnownVersion, 0L, pluginId, clusterName, pluginCapabilities, request));
+ () -> gdsREST.getSecureServiceGdsInfoIfUpdated(serviceName,
lastKnownVersion, 0L, "p1", "c1", "caps", request));
}
@Test
@@ -2327,16 +2436,16 @@ public void
testGetServiceGdsInfoIfUpdated_AuthInvalidReturnsNull() throws Excep
doNothing().when(assetMgr).createPluginInfo(anyString(), anyString(),
any(HttpServletRequest.class), anyInt(), any(), any(), anyLong(), anyInt(),
anyString(), anyString());
ServiceGdsInfo result =
gdsREST.getServiceGdsInfoIfUpdated(serviceName, lastKnownVersion, 0L, "p1",
"c1", "caps", request);
- assertEquals(null, result);
+ assertNull(result);
}
@Test
public void testGetSecureServiceGdsInfoIfUpdated_NotModified() throws
Exception {
String serviceName = "svc-secure-nomod";
- Long lastKnownVersion = 7L;
+ Long lastKnownVersion = 7L;
- doNothing().when(bizUtil).failUnauthenticatedDownloadIfNotAllowed();
- when(serviceUtil.isValidateHttpsAuthentication(serviceName,
request)).thenReturn(true);
+ when(serviceUtil.isValidService(serviceName,
request)).thenReturn(true);
+ when(bizUtil.isAdmin()).thenReturn(true);
when(gdsStore.getGdsInfoIfUpdated(serviceName,
lastKnownVersion)).thenReturn(null);
doNothing().when(assetMgr).createPluginInfo(anyString(), anyString(),
any(HttpServletRequest.class), anyInt(), any(), any(), anyLong(), anyInt(),
anyString(), anyString());
when(restErrorUtil.createRESTException(eq(HttpServletResponse.SC_NOT_MODIFIED),
anyString(), eq(false))).thenThrow(new WebApplicationException());