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

siyao pushed a commit to branch HDDS-4944
in repository https://gitbox.apache.org/repos/asf/ozone.git


The following commit(s) were added to refs/heads/HDDS-4944 by this push:
     new 43deaa8  HDDS-6366. [Multi-Tenant] Disallow specifying custom accessId 
in OzoneManager (#3166)
43deaa8 is described below

commit 43deaa84243a5b28c256b0a7938729560d58145c
Author: Siyao Meng <[email protected]>
AuthorDate: Tue Mar 8 05:25:09 2022 -0800

    HDDS-6366. [Multi-Tenant] Disallow specifying custom accessId in 
OzoneManager (#3166)
---
 .../ozone/om/multitenant/TestMultiTenantVolume.java    |  2 +-
 .../hadoop/ozone/shell/TestOzoneTenantShell.java       | 18 ++++++++++++++++--
 .../apache/hadoop/ozone/om/OMMultiTenantManager.java   |  8 ++++++++
 .../hadoop/ozone/om/OMMultiTenantManagerImpl.java      |  5 +++++
 .../s3/tenant/OMTenantAssignUserAccessIdRequest.java   | 10 ++++++++++
 .../om/request/s3/security/TestS3GetSecretRequest.java |  6 ++++++
 6 files changed, 46 insertions(+), 3 deletions(-)

diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/multitenant/TestMultiTenantVolume.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/multitenant/TestMultiTenantVolume.java
index 0a068c8..a8aabc0 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/multitenant/TestMultiTenantVolume.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/multitenant/TestMultiTenantVolume.java
@@ -58,7 +58,7 @@ public class TestMultiTenantVolume {
   private static final String TENANT_ID = "tenant";
   private static final String USER_PRINCIPAL = "username";
   private static final String BUCKET_NAME = "bucket";
-  private static final String ACCESS_ID = UUID.randomUUID().toString();
+  private static final String ACCESS_ID = "tenant$username";
 
   @BeforeClass
   public static void initClusterProvider() throws Exception {
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/shell/TestOzoneTenantShell.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/shell/TestOzoneTenantShell.java
index 6aa868f..f3aa9f4 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/shell/TestOzoneTenantShell.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/shell/TestOzoneTenantShell.java
@@ -556,16 +556,30 @@ public class TestOzoneTenantShell {
     checkOutput(err, "Assigned 'bob' to 'research' with accessId"
         + " 'research$bob'.\n", true);
 
-    // Attempt to assign the user to the same tenant under another accessId,
-    //  should fail.
+    // Attempt to assign the user to the tenant again
+    executeHA(tenantShell, new String[] {
+        "user", "assign", "bob", "--tenant=research",
+        "--accessId=research$bob"});
+    checkOutput(out, "", false);
+    checkOutput(err, "Failed to assign 'bob' to 'research': "
+        + "accessId 'research$bob' already exists!\n", true);
+
+    // Attempt to assign the user to the tenant with a custom accessId
     executeHA(tenantShell, new String[] {
         "user", "assign", "bob", "--tenant=research",
         "--accessId=research$bob42"});
     checkOutput(out, "", false);
+    // HDDS-6366: Disallow specifying custom accessId.
+    checkOutput(err, "Failed to assign 'bob' to 'research': "
+        + "Invalid accessId 'research$bob42'. "
+        + "Specifying a custom access ID disallowed. "
+        + "Expected accessId to be assigned is 'research$bob'\n", true);
+    /*  Once HDDS-6366 is lifted, the following check should be used instead
     checkOutput(err, "Failed to assign 'bob' to 'research': "
         + "The same user is not allowed to be assigned to the same tenant "
         + "more than once. User 'bob' is already assigned to tenant 'research' 
"
         + "with accessId 'research$bob'.\n", true);
+    */
 
     executeHA(tenantShell, new String[] {"list"});
     checkOutput(out, "dev\nfinance\nresearch\n", true);
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OMMultiTenantManager.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OMMultiTenantManager.java
index bdd8ab7..5cade68 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OMMultiTenantManager.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OMMultiTenantManager.java
@@ -145,6 +145,14 @@ public interface OMMultiTenantManager {
   String getUserNameGivenAccessId(String accessId);
 
   /**
+   * Get the default Access ID string given tenant name and user name.
+   * @param tenantId tenant name
+   * @param userPrincipal user name
+   * @return access ID in the form of tenantName$username
+   */
+  String getDefaultAccessId(String tenantId, String userPrincipal);
+
+  /**
    * Given a user, return their S3-Secret Key.
    * @param accessID
    * @return S3 secret Key
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OMMultiTenantManagerImpl.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OMMultiTenantManagerImpl.java
index fd2045e..e7ff438 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OMMultiTenantManagerImpl.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OMMultiTenantManagerImpl.java
@@ -17,6 +17,7 @@
  */
 package org.apache.hadoop.ozone.om;
 
+import static org.apache.hadoop.ozone.OzoneConsts.TENANT_ID_USERNAME_DELIMITER;
 import static 
org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.INVALID_ACCESS_ID;
 import static 
org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.TENANT_AUTHORIZER_ERROR;
 import static 
org.apache.hadoop.ozone.om.multitenant.AccessPolicy.AccessGrantType.ALLOW;
@@ -355,6 +356,10 @@ public class OMMultiTenantManagerImpl implements 
OMMultiTenantManager {
     return null;
   }
 
+  public String getDefaultAccessId(String tenantId, String userPrincipal) {
+    return tenantId + TENANT_ID_USERNAME_DELIMITER + userPrincipal;
+  }
+
   @Override
   public String getUserSecret(String accessID) throws IOException {
     return "";
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantAssignUserAccessIdRequest.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantAssignUserAccessIdRequest.java
index 69c77ef..c96eedc 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantAssignUserAccessIdRequest.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantAssignUserAccessIdRequest.java
@@ -138,6 +138,16 @@ public class OMTenantAssignUserAccessIdRequest extends 
OMClientRequest {
           OMException.ResultCodes.INVALID_TENANT_ID);
     }
 
+    // HDDS-6366: Disallow specifying custom accessId.
+    final String expectedAccessId = ozoneManager.getMultiTenantManager()
+        .getDefaultAccessId(tenantId, userPrincipal);
+    if (!accessId.equals(expectedAccessId)) {
+      throw new OMException("Invalid accessId '" + accessId + "'. "
+          + "Specifying a custom access ID disallowed. "
+          + "Expected accessId to be assigned is '" + expectedAccessId + "'",
+          OMException.ResultCodes.INVALID_ACCESS_ID);
+    }
+
     // Check accessId validity.
     if (accessId.contains(SERIALIZATION_SPLIT_KEY)) {
       throw new OMException("Invalid accessId '" + accessId +
diff --git 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/s3/security/TestS3GetSecretRequest.java
 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/s3/security/TestS3GetSecretRequest.java
index c4f638f..4813254 100644
--- 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/s3/security/TestS3GetSecretRequest.java
+++ 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/s3/security/TestS3GetSecretRequest.java
@@ -359,6 +359,12 @@ public class TestS3GetSecretRequest {
 
     // 2. AssignUserToTenantRequest: Assign "[email protected]" to "finance".
     ++txLogIndex;
+
+    // Additional mock setup needed for pass accessId check
+    
when(ozoneManager.getMultiTenantManager()).thenReturn(omMultiTenantManager);
+    when(omMultiTenantManager.getDefaultAccessId(TENANT_ID, USER_BOB))
+        .thenReturn(ACCESS_ID_BOB);
+
     // Run preExecute
     OMTenantAssignUserAccessIdRequest omTenantAssignUserAccessIdRequest =
         new OMTenantAssignUserAccessIdRequest(

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to