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

dineshkumar-yadav pushed a commit to branch ranger-2.10
in repository https://gitbox.apache.org/repos/asf/ranger.git


The following commit(s) were added to refs/heads/ranger-2.10 by this push:
     new 77fe6151c RANGER-5824: Align Sqoop Ranger authorizer with other 
plugins (#1299)
77fe6151c is described below

commit 77fe6151c8ba40af8ee4fc562740c4b6013eb0a1
Author: Dineshkumar Yadav <[email protected]>
AuthorDate: Fri Oct 9 20:40:19 2026 +0530

    RANGER-5824: Align Sqoop Ranger authorizer with other plugins (#1299)
    
    Co-authored-by: Dineshkumar Yadav <[email protected]>
---
 .../sqoop/authorizer/RangerSqoopAuthorizer.java    |  31 +++--
 .../RangerSqoopAuthorizerFailClosedTest.java       | 137 +++++++++++++++++++++
 2 files changed, 159 insertions(+), 9 deletions(-)

diff --git 
a/plugin-sqoop/src/main/java/org/apache/ranger/authorization/sqoop/authorizer/RangerSqoopAuthorizer.java
 
b/plugin-sqoop/src/main/java/org/apache/ranger/authorization/sqoop/authorizer/RangerSqoopAuthorizer.java
index 6557c8902..5ea75fcfa 100644
--- 
a/plugin-sqoop/src/main/java/org/apache/ranger/authorization/sqoop/authorizer/RangerSqoopAuthorizer.java
+++ 
b/plugin-sqoop/src/main/java/org/apache/ranger/authorization/sqoop/authorizer/RangerSqoopAuthorizer.java
@@ -101,15 +101,28 @@ public void checkPrivileges(MPrincipal principal, 
List<MPrivilege> privileges) t
 
                RangerSqoopPlugin plugin = sqoopPlugin;
 
-               if (plugin != null) {
-                       for (MPrivilege privilege : privileges) {
-                               RangerSqoopAccessRequest request = new 
RangerSqoopAccessRequest(principal, privilege, clientIPAddress);
-
-                               RangerAccessResult result = 
plugin.isAccessAllowed(request);
-                               if (result != null && !result.getIsAllowed()) {
-                                       throw new 
SqoopException(SecurityError.AUTH_0014, "principal=" + principal
-                                                       + " does not have 
privileges for : " + privilege);
-                               }
+               if (plugin == null) {
+                       LOG.error("Ranger Sqoop plugin is not initialized; 
denying access for principal={}", principal);
+
+                       throw new SqoopException(SecurityError.AUTH_0014, 
"Ranger authorization plugin is not initialized");
+               }
+
+               for (MPrivilege privilege : privileges) {
+                       RangerSqoopAccessRequest request = new 
RangerSqoopAccessRequest(principal, privilege, clientIPAddress);
+
+                       RangerAccessResult result = 
plugin.isAccessAllowed(request);
+
+                       if (result == null) {
+                               LOG.error("Ranger plugin returned null for 
request={}; denying access for principal={}", request,
+                                               principal);
+
+                               throw new 
SqoopException(SecurityError.AUTH_0014, "principal=" + principal
+                                               + " does not have privileges 
for : " + privilege);
+                       }
+
+                       if (!result.getIsAllowed()) {
+                               throw new 
SqoopException(SecurityError.AUTH_0014, "principal=" + principal
+                                               + " does not have privileges 
for : " + privilege);
                        }
                }
 
diff --git 
a/plugin-sqoop/src/test/java/org/apache/ranger/authorization/sqoop/authorizer/RangerSqoopAuthorizerFailClosedTest.java
 
b/plugin-sqoop/src/test/java/org/apache/ranger/authorization/sqoop/authorizer/RangerSqoopAuthorizerFailClosedTest.java
new file mode 100644
index 000000000..f04c7044e
--- /dev/null
+++ 
b/plugin-sqoop/src/test/java/org/apache/ranger/authorization/sqoop/authorizer/RangerSqoopAuthorizerFailClosedTest.java
@@ -0,0 +1,137 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ranger.authorization.sqoop.authorizer;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.lang.reflect.Field;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.ranger.plugin.policyengine.RangerAccessRequest;
+import org.apache.ranger.plugin.policyengine.RangerAccessResult;
+import org.apache.sqoop.common.SqoopException;
+import org.apache.sqoop.model.MPrincipal;
+import org.apache.sqoop.model.MPrivilege;
+import org.apache.sqoop.model.MResource;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Verifies authorization when the Ranger plugin is unavailable or returns no 
decision.
+ */
+public class RangerSqoopAuthorizerFailClosedTest {
+       private static final String TEST_USER = "test-user";
+
+       private RangerSqoopAuthorizer authorizer;
+
+       private RangerSqoopPlugin sqoopPluginBefore;
+
+       @Before
+       public void setUp() throws Exception {
+               sqoopPluginBefore = (RangerSqoopPlugin) 
getSqoopPluginField().get(null);
+               authorizer        = new RangerSqoopAuthorizer();
+       }
+
+       @After
+       public void tearDown() throws Exception {
+               getSqoopPluginField().set(null, sqoopPluginBefore);
+       }
+
+       @Test(expected = SqoopException.class)
+       public void checkPrivilegesDeniesWhenPluginReturnsNull() throws 
Exception {
+               RangerSqoopPlugin plugin = mock(RangerSqoopPlugin.class);
+
+               
when(plugin.isAccessAllowed(any(RangerAccessRequest.class))).thenReturn(null);
+
+               setSqoopPlugin(plugin);
+
+               authorizer.checkPrivileges(buildUserPrincipal(), 
buildReadConnectorPrivilege());
+       }
+
+       @Test(expected = SqoopException.class)
+       public void checkPrivilegesDeniesWhenPluginIsNull() throws Exception {
+               setSqoopPlugin(null);
+
+               authorizer.checkPrivileges(buildUserPrincipal(), 
buildReadConnectorPrivilege());
+       }
+
+       @Test(expected = SqoopException.class)
+       public void checkPrivilegesDeniesWhenPluginReturnsNotAllowed() throws 
Exception {
+               RangerSqoopPlugin  plugin = mock(RangerSqoopPlugin.class);
+               RangerAccessResult result = mock(RangerAccessResult.class);
+
+               when(result.getIsAllowed()).thenReturn(false);
+               
when(plugin.isAccessAllowed(any(RangerAccessRequest.class))).thenReturn(result);
+
+               setSqoopPlugin(plugin);
+
+               authorizer.checkPrivileges(buildUserPrincipal(), 
buildReadConnectorPrivilege());
+       }
+
+       @Test
+       public void checkPrivilegesAllowsWhenPluginReturnsAllowed() throws 
Exception {
+               RangerSqoopPlugin  plugin = mock(RangerSqoopPlugin.class);
+               RangerAccessResult result = mock(RangerAccessResult.class);
+
+               when(result.getIsAllowed()).thenReturn(true);
+               
when(plugin.isAccessAllowed(any(RangerAccessRequest.class))).thenReturn(result);
+
+               setSqoopPlugin(plugin);
+
+               authorizer.checkPrivileges(buildUserPrincipal(), 
buildReadConnectorPrivilege());
+       }
+
+       private static Field getSqoopPluginField() throws NoSuchFieldException {
+               Field field = 
RangerSqoopAuthorizer.class.getDeclaredField("sqoopPlugin");
+
+               field.setAccessible(true);
+
+               return field;
+       }
+
+       private static void setSqoopPlugin(RangerSqoopPlugin plugin) throws 
Exception {
+               getSqoopPluginField().set(null, plugin);
+       }
+
+       private static MPrincipal buildUserPrincipal() {
+               MPrincipal principal = mock(MPrincipal.class);
+
+               
when(principal.getType()).thenReturn(MPrincipal.TYPE.USER.name());
+               when(principal.getName()).thenReturn(TEST_USER);
+
+               return principal;
+       }
+
+       private static List<MPrivilege> buildReadConnectorPrivilege() {
+               MResource resource = mock(MResource.class);
+
+               
when(resource.getType()).thenReturn(MResource.TYPE.CONNECTOR.name());
+               when(resource.getName()).thenReturn("hdfs-connector");
+
+               MPrivilege privilege = mock(MPrivilege.class);
+
+               when(privilege.getResource()).thenReturn(resource);
+               when(privilege.getAction()).thenReturn("read");
+
+               return Collections.singletonList(privilege);
+       }
+}

Reply via email to