This is an automated email from the ASF dual-hosted git repository.

jshao pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/gravitino.git


The following commit(s) were added to refs/heads/main by this push:
     new c3172952c [#6060] fix(core): Add the check of requests related to 
authorization (#6065)
c3172952c is described below

commit c3172952c7d70671641eb36a020c3cd12a84f0a8
Author: roryqi <[email protected]>
AuthorDate: Fri Jan 3 17:36:57 2025 +0800

    [#6060] fix(core): Add the check of requests related to authorization 
(#6065)
    
    ### What changes were proposed in this pull request?
    
    Add the check of requests related to authorization
    
    ### Why are the changes needed?
    
    Fix: #6060
    ### Does this PR introduce _any_ user-facing change?
    
    No.
    
    ### How was this patch tested?
    Added UT.
---
 .../gravitino/dto/requests/RoleCreateRequest.java  |  9 ++++
 .../gravitino/server/web/rest/GroupOperations.java | 12 +++--
 .../gravitino/server/web/rest/OwnerOperations.java |  1 +
 .../server/web/rest/PermissionOperations.java      | 60 +++++++++++++---------
 .../gravitino/server/web/rest/RoleOperations.java  |  1 +
 .../gravitino/server/web/rest/UserOperations.java  | 12 +++--
 .../server/web/rest/TestGroupOperations.java       |  9 ++++
 .../server/web/rest/TestOwnerOperations.java       |  8 +++
 .../server/web/rest/TestPermissionOperations.java  | 47 ++++++++++++++++-
 .../server/web/rest/TestRoleOperations.java        | 31 ++++++++++-
 .../server/web/rest/TestUserOperations.java        |  9 ++++
 11 files changed, 163 insertions(+), 36 deletions(-)

diff --git 
a/common/src/main/java/org/apache/gravitino/dto/requests/RoleCreateRequest.java 
b/common/src/main/java/org/apache/gravitino/dto/requests/RoleCreateRequest.java
index 9d85c0c6e..0466d7d31 100644
--- 
a/common/src/main/java/org/apache/gravitino/dto/requests/RoleCreateRequest.java
+++ 
b/common/src/main/java/org/apache/gravitino/dto/requests/RoleCreateRequest.java
@@ -79,5 +79,14 @@ public class RoleCreateRequest implements RESTRequest {
     Preconditions.checkArgument(
         StringUtils.isNotBlank(name), "\"name\" field is required and cannot 
be empty");
     Preconditions.checkArgument(securableObjects != null, 
"\"securableObjects\" can't null ");
+    for (SecurableObjectDTO objectDTO : securableObjects) {
+      Preconditions.checkArgument(
+          StringUtils.isNotBlank(objectDTO.name()), "\" securable object 
name\" can't be blank");
+      Preconditions.checkArgument(
+          objectDTO.type() != null, "\" securable object type\" can't be 
null");
+      Preconditions.checkArgument(
+          objectDTO.privileges() != null && !objectDTO.privileges().isEmpty(),
+          "\"securable object privileges\" can't be null or empty");
+    }
   }
 }
diff --git 
a/server/src/main/java/org/apache/gravitino/server/web/rest/GroupOperations.java
 
b/server/src/main/java/org/apache/gravitino/server/web/rest/GroupOperations.java
index 12cf76993..95db0ca67 100644
--- 
a/server/src/main/java/org/apache/gravitino/server/web/rest/GroupOperations.java
+++ 
b/server/src/main/java/org/apache/gravitino/server/web/rest/GroupOperations.java
@@ -103,11 +103,13 @@ public class GroupOperations {
               TreeLockUtils.doWithTreeLock(
                   
NameIdentifier.of(AuthorizationUtils.ofGroupNamespace(metalake).levels()),
                   LockType.WRITE,
-                  () ->
-                      Utils.ok(
-                          new GroupResponse(
-                              DTOConverters.toDTO(
-                                  accessControlManager.addGroup(metalake, 
request.getName()))))));
+                  () -> {
+                    request.validate();
+                    return Utils.ok(
+                        new GroupResponse(
+                            DTOConverters.toDTO(
+                                accessControlManager.addGroup(metalake, 
request.getName()))));
+                  }));
     } catch (Exception e) {
       return ExceptionHandlers.handleGroupException(
           OperationType.ADD, request.getName(), metalake, e);
diff --git 
a/server/src/main/java/org/apache/gravitino/server/web/rest/OwnerOperations.java
 
b/server/src/main/java/org/apache/gravitino/server/web/rest/OwnerOperations.java
index ea5684b55..7dcfcfd06 100644
--- 
a/server/src/main/java/org/apache/gravitino/server/web/rest/OwnerOperations.java
+++ 
b/server/src/main/java/org/apache/gravitino/server/web/rest/OwnerOperations.java
@@ -113,6 +113,7 @@ public class OwnerOperations {
       return Utils.doAs(
           httpRequest,
           () -> {
+            request.validate();
             MetadataObjectUtil.checkMetadataObject(metalake, object);
             NameIdentifier objectIdent = 
MetadataObjectUtil.toEntityIdent(metalake, object);
             TreeLockUtils.doWithTreeLock(
diff --git 
a/server/src/main/java/org/apache/gravitino/server/web/rest/PermissionOperations.java
 
b/server/src/main/java/org/apache/gravitino/server/web/rest/PermissionOperations.java
index 38fcd7380..3ce1517a4 100644
--- 
a/server/src/main/java/org/apache/gravitino/server/web/rest/PermissionOperations.java
+++ 
b/server/src/main/java/org/apache/gravitino/server/web/rest/PermissionOperations.java
@@ -87,12 +87,14 @@ public class PermissionOperations {
                       TreeLockUtils.doWithTreeLock(
                           
NameIdentifier.of(AuthorizationUtils.ofRoleNamespace(metalake).levels()),
                           LockType.READ,
-                          () ->
-                              Utils.ok(
-                                  new UserResponse(
-                                      DTOConverters.toDTO(
-                                          
accessControlManager.grantRolesToUser(
-                                              metalake, 
request.getRoleNames(), user)))))));
+                          () -> {
+                            request.validate();
+                            return Utils.ok(
+                                new UserResponse(
+                                    DTOConverters.toDTO(
+                                        accessControlManager.grantRolesToUser(
+                                            metalake, request.getRoleNames(), 
user))));
+                          })));
     } catch (Exception e) {
       return ExceptionHandlers.handleUserPermissionOperationException(
           OperationType.GRANT, StringUtils.join(request.getRoleNames(), ","), 
user, e);
@@ -119,12 +121,14 @@ public class PermissionOperations {
                       TreeLockUtils.doWithTreeLock(
                           
NameIdentifier.of(AuthorizationUtils.ofRoleNamespace(metalake).levels()),
                           LockType.READ,
-                          () ->
-                              Utils.ok(
-                                  new GroupResponse(
-                                      DTOConverters.toDTO(
-                                          
accessControlManager.grantRolesToGroup(
-                                              metalake, 
request.getRoleNames(), group)))))));
+                          () -> {
+                            request.validate();
+                            return Utils.ok(
+                                new GroupResponse(
+                                    DTOConverters.toDTO(
+                                        accessControlManager.grantRolesToGroup(
+                                            metalake, request.getRoleNames(), 
group))));
+                          })));
     } catch (Exception e) {
       return ExceptionHandlers.handleGroupPermissionOperationException(
           OperationType.GRANT, StringUtils.join(request.getRoleNames(), ","), 
group, e);
@@ -151,12 +155,14 @@ public class PermissionOperations {
                       TreeLockUtils.doWithTreeLock(
                           
NameIdentifier.of(AuthorizationUtils.ofRoleNamespace(metalake).levels()),
                           LockType.READ,
-                          () ->
-                              Utils.ok(
-                                  new UserResponse(
-                                      DTOConverters.toDTO(
-                                          
accessControlManager.revokeRolesFromUser(
-                                              metalake, 
request.getRoleNames(), user)))))));
+                          () -> {
+                            request.validate();
+                            return Utils.ok(
+                                new UserResponse(
+                                    DTOConverters.toDTO(
+                                        
accessControlManager.revokeRolesFromUser(
+                                            metalake, request.getRoleNames(), 
user))));
+                          })));
     } catch (Exception e) {
       return ExceptionHandlers.handleUserPermissionOperationException(
           OperationType.REVOKE, StringUtils.join(request.getRoleNames(), ","), 
user, e);
@@ -183,12 +189,14 @@ public class PermissionOperations {
                       TreeLockUtils.doWithTreeLock(
                           
NameIdentifier.of(AuthorizationUtils.ofRoleNamespace(metalake).levels()),
                           LockType.READ,
-                          () ->
-                              Utils.ok(
-                                  new GroupResponse(
-                                      DTOConverters.toDTO(
-                                          
accessControlManager.revokeRolesFromGroup(
-                                              metalake, 
request.getRoleNames(), group)))))));
+                          () -> {
+                            request.validate();
+                            return Utils.ok(
+                                new GroupResponse(
+                                    DTOConverters.toDTO(
+                                        
accessControlManager.revokeRolesFromGroup(
+                                            metalake, request.getRoleNames(), 
group))));
+                          })));
     } catch (Exception e) {
       return ExceptionHandlers.handleGroupPermissionOperationException(
           OperationType.REVOKE, StringUtils.join(request.getRoleNames()), 
group, e);
@@ -214,6 +222,8 @@ public class PermissionOperations {
       return Utils.doAs(
           httpRequest,
           () -> {
+            privilegeGrantRequest.validate();
+
             for (PrivilegeDTO privilegeDTO : 
privilegeGrantRequest.getPrivileges()) {
               AuthorizationUtils.checkPrivilege(privilegeDTO, object, 
metalake);
             }
@@ -259,6 +269,8 @@ public class PermissionOperations {
       return Utils.doAs(
           httpRequest,
           () -> {
+            privilegeRevokeRequest.validate();
+
             for (PrivilegeDTO privilegeDTO : 
privilegeRevokeRequest.getPrivileges()) {
               AuthorizationUtils.checkPrivilege(privilegeDTO, object, 
metalake);
             }
diff --git 
a/server/src/main/java/org/apache/gravitino/server/web/rest/RoleOperations.java 
b/server/src/main/java/org/apache/gravitino/server/web/rest/RoleOperations.java
index bf82d78b6..9690afe13 100644
--- 
a/server/src/main/java/org/apache/gravitino/server/web/rest/RoleOperations.java
+++ 
b/server/src/main/java/org/apache/gravitino/server/web/rest/RoleOperations.java
@@ -127,6 +127,7 @@ public class RoleOperations {
       return Utils.doAs(
           httpRequest,
           () -> {
+            request.validate();
             Set<MetadataObject> metadataObjects = Sets.newHashSet();
             for (SecurableObjectDTO object : request.getSecurableObjects()) {
               MetadataObject metadataObject =
diff --git 
a/server/src/main/java/org/apache/gravitino/server/web/rest/UserOperations.java 
b/server/src/main/java/org/apache/gravitino/server/web/rest/UserOperations.java
index 24f34d652..518178cd3 100644
--- 
a/server/src/main/java/org/apache/gravitino/server/web/rest/UserOperations.java
+++ 
b/server/src/main/java/org/apache/gravitino/server/web/rest/UserOperations.java
@@ -129,11 +129,13 @@ public class UserOperations {
               TreeLockUtils.doWithTreeLock(
                   
NameIdentifier.of(AuthorizationUtils.ofGroupNamespace(metalake).levels()),
                   LockType.WRITE,
-                  () ->
-                      Utils.ok(
-                          new UserResponse(
-                              DTOConverters.toDTO(
-                                  accessControlManager.addUser(metalake, 
request.getName()))))));
+                  () -> {
+                    request.validate();
+                    return Utils.ok(
+                        new UserResponse(
+                            DTOConverters.toDTO(
+                                accessControlManager.addUser(metalake, 
request.getName()))));
+                  }));
     } catch (Exception e) {
       return ExceptionHandlers.handleUserException(
           OperationType.ADD, request.getName(), metalake, e);
diff --git 
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestGroupOperations.java
 
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestGroupOperations.java
index 77f0cf979..ac4f8c66a 100644
--- 
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestGroupOperations.java
+++ 
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestGroupOperations.java
@@ -116,6 +116,15 @@ public class TestGroupOperations extends JerseyTest {
 
     when(manager.addGroup(any(), any())).thenReturn(group);
 
+    // test with IllegalRequest
+    GroupAddRequest illegalReq = new GroupAddRequest("");
+    Response illegalResp =
+        target("/metalakes/metalake1/groups")
+            .request(MediaType.APPLICATION_JSON_TYPE)
+            .accept("application/vnd.gravitino.v1+json")
+            .post(Entity.entity(illegalReq, MediaType.APPLICATION_JSON_TYPE));
+    Assertions.assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), 
illegalResp.getStatus());
+
     Response resp =
         target("/metalakes/metalake1/groups")
             .request(MediaType.APPLICATION_JSON_TYPE)
diff --git 
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestOwnerOperations.java
 
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestOwnerOperations.java
index 0643ed9bf..dc7451a53 100644
--- 
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestOwnerOperations.java
+++ 
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestOwnerOperations.java
@@ -202,6 +202,14 @@ class TestOwnerOperations extends JerseyTest {
   @Test
   void testSetOwnerForObject() {
     when(metalakeDispatcher.metalakeExists(any())).thenReturn(true);
+    OwnerSetRequest invalidRequest = new OwnerSetRequest(null, 
Owner.Type.USER);
+    Response invalidResp =
+        target("/metalakes/metalake1/owners/metalake/metalake1")
+            .request(MediaType.APPLICATION_JSON_TYPE)
+            .accept("application/vnd.gravitino.v1+json")
+            .put(Entity.entity(invalidRequest, 
MediaType.APPLICATION_JSON_TYPE));
+    Assertions.assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), 
invalidResp.getStatus());
+
     OwnerSetRequest request = new OwnerSetRequest("test", Owner.Type.USER);
     Response resp =
         target("/metalakes/metalake1/owners/metalake/metalake1")
diff --git 
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestPermissionOperations.java
 
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestPermissionOperations.java
index 8876e9035..1f507cbbc 100644
--- 
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestPermissionOperations.java
+++ 
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestPermissionOperations.java
@@ -135,8 +135,15 @@ public class TestPermissionOperations extends JerseyTest {
             .build();
     when(manager.grantRolesToUser(any(), any(), any())).thenReturn(userEntity);
 
-    RoleGrantRequest request = new 
RoleGrantRequest(Lists.newArrayList("role1"));
+    RoleGrantRequest illegalReq = new RoleGrantRequest(null);
+    Response illegalResp =
+        target("/metalakes/metalake1/permissions/users/user/grant")
+            .request(MediaType.APPLICATION_JSON_TYPE)
+            .accept("application/vnd.gravitino.v1+json")
+            .put(Entity.entity(illegalReq, MediaType.APPLICATION_JSON_TYPE));
+    Assertions.assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), 
illegalResp.getStatus());
 
+    RoleGrantRequest request = new 
RoleGrantRequest(Lists.newArrayList("role1"));
     Response resp =
         target("/metalakes/metalake1/permissions/users/user/grant")
             .request(MediaType.APPLICATION_JSON_TYPE)
@@ -232,6 +239,15 @@ public class TestPermissionOperations extends JerseyTest {
             .build();
     when(manager.grantRolesToGroup(any(), any(), 
any())).thenReturn(groupEntity);
 
+    // Test with Illegal request
+    RoleGrantRequest illegalReq = new RoleGrantRequest(null);
+    Response illegalResp =
+        target("/metalakes/metalake1/permissions/groups/group/grant")
+            .request(MediaType.APPLICATION_JSON_TYPE)
+            .accept("application/vnd.gravitino.v1+json")
+            .put(Entity.entity(illegalReq, MediaType.APPLICATION_JSON_TYPE));
+    Assertions.assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), 
illegalResp.getStatus());
+
     RoleGrantRequest request = new 
RoleGrantRequest(Lists.newArrayList("role1"));
 
     Response resp =
@@ -331,6 +347,16 @@ public class TestPermissionOperations extends JerseyTest {
                 
AuditInfo.builder().withCreator("test").withCreateTime(Instant.now()).build())
             .build();
     when(manager.revokeRolesFromUser(any(), any(), 
any())).thenReturn(userEntity);
+
+    // Test with illegal request
+    RoleRevokeRequest illegalReq = new RoleRevokeRequest(null);
+    Response illegalResp =
+        target("/metalakes/metalake1/permissions/users/user1/revoke")
+            .request(MediaType.APPLICATION_JSON_TYPE)
+            .accept("application/vnd.gravitino.v1+json")
+            .put(Entity.entity(illegalReq, MediaType.APPLICATION_JSON_TYPE));
+    Assertions.assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), 
illegalResp.getStatus());
+
     RoleRevokeRequest request = new 
RoleRevokeRequest(Lists.newArrayList("role1"));
 
     Response resp =
@@ -393,6 +419,15 @@ public class TestPermissionOperations extends JerseyTest {
                 
AuditInfo.builder().withCreator("test").withCreateTime(Instant.now()).build())
             .build();
     when(manager.revokeRolesFromGroup(any(), any(), 
any())).thenReturn(groupEntity);
+    // Test with illegal request
+    RoleRevokeRequest illegalReq = new RoleRevokeRequest(null);
+    Response illegalResp =
+        target("/metalakes/metalake1/permissions/groups/group1/revoke")
+            .request(MediaType.APPLICATION_JSON_TYPE)
+            .accept("application/vnd.gravitino.v1+json")
+            .put(Entity.entity(illegalReq, MediaType.APPLICATION_JSON_TYPE));
+    Assertions.assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), 
illegalResp.getStatus());
+
     RoleRevokeRequest request = new 
RoleRevokeRequest(Lists.newArrayList("role1"));
 
     Response resp =
@@ -538,6 +573,16 @@ public class TestPermissionOperations extends JerseyTest {
             .build();
     when(manager.revokePrivilegesFromRole(any(), any(), any(), 
any())).thenReturn(roleEntity);
     when(metalakeDispatcher.metalakeExists(any())).thenReturn(true);
+
+    // Test with illegal request
+    PrivilegeRevokeRequest illegalReq = new PrivilegeRevokeRequest(null);
+    Response illegalResp =
+        
target("/metalakes/metalake1/permissions/roles/role1/metalake/metalake1/revoke")
+            .request(MediaType.APPLICATION_JSON_TYPE)
+            .accept("application/vnd.gravitino.v1+json")
+            .put(Entity.entity(illegalReq, MediaType.APPLICATION_JSON_TYPE));
+    Assertions.assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), 
illegalResp.getStatus());
+
     PrivilegeRevokeRequest request =
         new PrivilegeRevokeRequest(
             Lists.newArrayList(
diff --git 
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestRoleOperations.java
 
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestRoleOperations.java
index 6edd33393..06d9fcc27 100644
--- 
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestRoleOperations.java
+++ 
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestRoleOperations.java
@@ -29,6 +29,7 @@ import static org.mockito.Mockito.when;
 
 import com.google.common.collect.Lists;
 import java.io.IOException;
+import java.lang.reflect.Field;
 import java.time.Instant;
 import java.util.Collections;
 import java.util.concurrent.atomic.AtomicReference;
@@ -52,6 +53,7 @@ import org.apache.gravitino.catalog.FilesetDispatcher;
 import org.apache.gravitino.catalog.SchemaDispatcher;
 import org.apache.gravitino.catalog.TableDispatcher;
 import org.apache.gravitino.catalog.TopicDispatcher;
+import org.apache.gravitino.dto.authorization.PrivilegeDTO;
 import org.apache.gravitino.dto.authorization.RoleDTO;
 import org.apache.gravitino.dto.authorization.SecurableObjectDTO;
 import org.apache.gravitino.dto.requests.RoleCreateRequest;
@@ -142,7 +144,7 @@ public class TestRoleOperations extends JerseyTest {
   }
 
   @Test
-  public void testCreateRole() {
+  public void testCreateRole() throws IllegalAccessException, 
NoSuchFieldException {
     SecurableObject securableObject =
         SecurableObjects.ofCatalog("catalog", 
Lists.newArrayList(Privileges.UseCatalog.allow()));
     SecurableObject anotherSecurableObject =
@@ -161,6 +163,33 @@ public class TestRoleOperations extends JerseyTest {
     when(manager.createRole(any(), any(), any(), any())).thenReturn(role);
     when(catalogDispatcher.catalogExists(any())).thenReturn(true);
 
+    // Test with IllegalRequest
+    RoleCreateRequest illegalRequest = new RoleCreateRequest("role", 
Collections.emptyMap(), null);
+    Response illegalResp =
+        target("/metalakes/metalake1/roles")
+            .request(MediaType.APPLICATION_JSON_TYPE)
+            .accept("application/vnd.gravitino.v1+json")
+            .post(Entity.entity(illegalRequest, 
MediaType.APPLICATION_JSON_TYPE));
+    Assertions.assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), 
illegalResp.getStatus());
+
+    SecurableObjectDTO illegalObject =
+        DTOConverters.toDTO(
+            SecurableObjects.ofCatalog(
+                "illegal_catalog", 
Lists.newArrayList(Privileges.CreateSchema.deny())));
+    Field field = illegalObject.getClass().getDeclaredField("privileges");
+    field.setAccessible(true);
+    field.set(illegalObject, new PrivilegeDTO[] {});
+
+    illegalRequest =
+        new RoleCreateRequest(
+            "role", Collections.emptyMap(), new SecurableObjectDTO[] 
{illegalObject});
+    illegalResp =
+        target("/metalakes/metalake1/roles")
+            .request(MediaType.APPLICATION_JSON_TYPE)
+            .accept("application/vnd.gravitino.v1+json")
+            .post(Entity.entity(illegalRequest, 
MediaType.APPLICATION_JSON_TYPE));
+    Assertions.assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), 
illegalResp.getStatus());
+
     Response resp =
         target("/metalakes/metalake1/roles")
             .request(MediaType.APPLICATION_JSON_TYPE)
diff --git 
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestUserOperations.java
 
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestUserOperations.java
index 7f570e779..82bc59155 100644
--- 
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestUserOperations.java
+++ 
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestUserOperations.java
@@ -115,6 +115,15 @@ public class TestUserOperations extends JerseyTest {
 
     when(manager.addUser(any(), any())).thenReturn(user);
 
+    // test with IllegalRequest
+    UserAddRequest illegalReq = new UserAddRequest("");
+    Response illegalResp =
+        target("/metalakes/metalake1/users")
+            .request(MediaType.APPLICATION_JSON_TYPE)
+            .accept("application/vnd.gravitino.v1+json")
+            .post(Entity.entity(illegalReq, MediaType.APPLICATION_JSON_TYPE));
+    Assertions.assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), 
illegalResp.getStatus());
+
     Response resp =
         target("/metalakes/metalake1/users")
             .request(MediaType.APPLICATION_JSON_TYPE)

Reply via email to