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

jerryshao pushed a commit to branch branch-1.3
in repository https://gitbox.apache.org/repos/asf/gravitino.git


The following commit(s) were added to refs/heads/branch-1.3 by this push:
     new 810777fce7 [Cherry-pick to branch-1.3] [#12269] fix(authz): Allow 
catalog owners to grant schema privileges (#12673) (#12701)
810777fce7 is described below

commit 810777fce75c9e41c6847b618a253830e988a1ca
Author: github-actions[bot] 
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Fri Aug 28 17:06:57 2026 +0800

    [Cherry-pick to branch-1.3] [#12269] fix(authz): Allow catalog owners to 
grant schema privileges (#12673) (#12701)
    
    **Cherry-pick Information:**
    - Original commit: c79996e7a882147bbe93660edc2bc771a2fb2292
    - Target branch: `branch-1.3`
    - Status: ✅ Clean cherry-pick (no conflicts)
    
    Signed-off-by: 1fanwang <[email protected]>
    Co-authored-by: Stefan Wang <[email protected]>
---
 .../authorization/jcasbin/JcasbinAuthorizer.java   |  7 ++++---
 .../jcasbin/TestJcasbinAuthorizer.java             | 24 ++++++++++++++++++++++
 2 files changed, 28 insertions(+), 3 deletions(-)

diff --git 
a/server-common/src/main/java/org/apache/gravitino/server/authorization/jcasbin/JcasbinAuthorizer.java
 
b/server-common/src/main/java/org/apache/gravitino/server/authorization/jcasbin/JcasbinAuthorizer.java
index 84945fc0bf..cac20f036a 100644
--- 
a/server-common/src/main/java/org/apache/gravitino/server/authorization/jcasbin/JcasbinAuthorizer.java
+++ 
b/server-common/src/main/java/org/apache/gravitino/server/authorization/jcasbin/JcasbinAuthorizer.java
@@ -539,9 +539,10 @@ public class JcasbinAuthorizer implements 
GravitinoAuthorizer {
 
     MetadataObject metadataObject = MetadataObjects.parse(fullName, 
metadataType);
     do {
-      if (isOwner(currentPrincipal, metalake, metadataObject, requestContext)) 
{
-        return hasParentUsagePermission(
-            currentPrincipal, metalake, metadataObject, metalakeObject, 
requestContext);
+      if (isOwner(currentPrincipal, metalake, metadataObject, requestContext)
+          && hasParentUsagePermission(
+              currentPrincipal, metalake, metadataObject, metalakeObject, 
requestContext)) {
+        return true;
       }
     } while ((metadataObject = MetadataObjects.parent(metadataObject)) != 
null);
     return false;
diff --git 
a/server-common/src/test/java/org/apache/gravitino/server/authorization/jcasbin/TestJcasbinAuthorizer.java
 
b/server-common/src/test/java/org/apache/gravitino/server/authorization/jcasbin/TestJcasbinAuthorizer.java
index b067751a2e..25f0f5c45e 100644
--- 
a/server-common/src/test/java/org/apache/gravitino/server/authorization/jcasbin/TestJcasbinAuthorizer.java
+++ 
b/server-common/src/test/java/org/apache/gravitino/server/authorization/jcasbin/TestJcasbinAuthorizer.java
@@ -2197,6 +2197,30 @@ public class TestJcasbinAuthorizer {
         "Owner should be able to manage privileges without checking DENY 
MANAGE_GRANTS");
   }
 
+  @Test
+  public void testHasSetOwnerPermissionAllowsSchemaAndCatalogOwner() throws 
Exception {
+    MetadataObject metalakeObject =
+        MetadataObjects.of(ImmutableList.of(METALAKE), 
MetadataObject.Type.METALAKE);
+    metadataIdConverterMockedStatic
+        .when(() -> MetadataIdConverter.getID(eq(metalakeObject), 
eq(METALAKE)))
+        .thenReturn(Optional.of(USER_METALAKE_ID));
+    when(ownerMetaMapper.selectOwnerByMetadataObjectIdAndType(eq(CATALOG_ID), 
eq("SCHEMA")))
+        .thenReturn(new OwnerInfo(USER_ID, "USER"));
+    when(ownerMetaMapper.selectOwnerByMetadataObjectIdAndType(eq(CATALOG_ID), 
eq("CATALOG")))
+        .thenReturn(new OwnerInfo(USER_ID, "USER"));
+    getOwnerRelCache(jcasbinAuthorizer).invalidateAll();
+
+    try {
+      assertTrue(
+          jcasbinAuthorizer.hasSetOwnerPermission(
+              METALAKE, "SCHEMA", "testCatalog.testSchema", new 
AuthorizationRequestContext()));
+    } finally {
+      metadataIdConverterMockedStatic
+          .when(() -> MetadataIdConverter.getID(eq(metalakeObject), 
eq(METALAKE)))
+          .thenReturn(Optional.of(CATALOG_ID));
+    }
+  }
+
   @Test
   public void testHasSetOwnerPermissionRejectsDenyUseCatalogForTableOwner() 
throws Exception {
     makeCompletableFutureUseCurrentThread(jcasbinAuthorizer);

Reply via email to