mneethiraj commented on code in PR #584:
URL: https://github.com/apache/ranger/pull/584#discussion_r2231326464


##########
agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPluginContext.java:
##########
@@ -40,6 +41,10 @@ public class RangerPluginContext {
     private final RangerPluginConfig                                           
              config;
     private final Map<String, Map<RangerPolicy.RangerPolicyResource, 
RangerResourceMatcher>> resourceMatchers = new HashMap<>();
     private final ReentrantReadWriteLock                                       
              lock             = new ReentrantReadWriteLock(true); // fair lock
+    private       Mapper                                                       
              userNameTransformInst;

Review Comment:
   I suggest moving new members to `RangerAuthContext` class.



##########
agents-common/src/main/java/org/apache/ranger/plugin/service/RangerDefaultRequestProcessor.java:
##########
@@ -157,6 +174,52 @@ public void enrich(RangerAccessRequest request) {
         }
     }
 
+    private String getTransformedUser(PolicyEngine policyEngine, 
RangerAccessRequest request) {
+        String user                   = request.getUser();
+        String userNameCaseConversion = 
policyEngine.getPluginContext().getUserNameCaseConversion();
+
+        if 
(UgsyncCommonConstants.UGSYNC_LOWER_CASE_CONVERSION_VALUE.equalsIgnoreCase(userNameCaseConversion))
 {

Review Comment:
   Consider avoiding string comparision on every authz call; instead have the 
configured parsed to a boolean in RangerAuthContext and access boolean from 
here.



##########
security-admin/src/main/java/org/apache/ranger/common/PropertiesUtil.java:
##########
@@ -526,4 +544,72 @@ protected void 
processProperties(ConfigurableListableBeanFactory beanFactory, Pr
 
         super.processProperties(beanFactory, props);
     }
+
+    private void updateRangerPluginsPropertiesForUserGroup(Properties props) {
+        if (propertiesMap != null) {
+            String userCaseConv = 
StringUtils.isEmpty(propertiesMap.get(RangerCommonConstants.PLUGINS_CONF_USERNAME_CASE_CONVERSION_PARAM))
+                    ? 
UgsyncCommonConstants.DEFAULT_UGSYNC_USERNAME_CASE_CONVERSION_VALUE
+                    : 
propertiesMap.get(RangerCommonConstants.PLUGINS_CONF_USERNAME_CASE_CONVERSION_PARAM);
+            
propertiesMap.put(RangerCommonConstants.PLUGINS_CONF_USERNAME_CASE_CONVERSION_PARAM,
 userCaseConv);
+            
props.put(RangerCommonConstants.PLUGINS_CONF_USERNAME_CASE_CONVERSION_PARAM, 
userCaseConv);
+
+            String groupCaseConv = 
StringUtils.isEmpty(propertiesMap.get(RangerCommonConstants.PLUGINS_CONF_GROUPNAME_CASE_CONVERSION_PARAM))
+                    ? 
UgsyncCommonConstants.DEFAULT_UGSYNC_GROUPNAME_CASE_CONVERSION_VALUE
+                    : 
propertiesMap.get(RangerCommonConstants.PLUGINS_CONF_GROUPNAME_CASE_CONVERSION_PARAM);
+            
propertiesMap.put(RangerCommonConstants.PLUGINS_CONF_GROUPNAME_CASE_CONVERSION_PARAM,
 groupCaseConv);
+            
props.put(RangerCommonConstants.PLUGINS_CONF_GROUPNAME_CASE_CONVERSION_PARAM, 
groupCaseConv);
+
+            String userHandler = 
StringUtils.isEmpty(propertiesMap.get(RangerCommonConstants.PLUGINS_CONF_MAPPING_USERNAME_HANDLER))
+                    ? 
UgsyncCommonConstants.DEFAULT_SYNC_MAPPING_USERNAME_HANDLER
+                    : 
propertiesMap.get(RangerCommonConstants.PLUGINS_CONF_MAPPING_USERNAME_HANDLER);
+            
propertiesMap.put(RangerCommonConstants.PLUGINS_CONF_MAPPING_USERNAME_HANDLER, 
userHandler);
+            
props.put(RangerCommonConstants.PLUGINS_CONF_MAPPING_USERNAME_HANDLER, 
userHandler);
+
+            String groupHandler = 
StringUtils.isEmpty(propertiesMap.get(RangerCommonConstants.PLUGINS_CONF_MAPPING_GROUPNAME_HANDLER))
+                    ? 
UgsyncCommonConstants.DEFAULT_SYNC_MAPPING_GROUPNAME_HANDLER
+                    : 
propertiesMap.get(RangerCommonConstants.PLUGINS_CONF_MAPPING_GROUPNAME_HANDLER);
+            
propertiesMap.put(RangerCommonConstants.PLUGINS_CONF_MAPPING_GROUPNAME_HANDLER, 
groupHandler);
+            
props.put(RangerCommonConstants.PLUGINS_CONF_MAPPING_GROUPNAME_HANDLER, 
groupHandler);
+
+            
propertiesMap.put(RangerCommonConstants.PLUGINS_CONF_MAPPING_SEPARATOR, 
getRegexSeparator());
+            props.put(RangerCommonConstants.PLUGINS_CONF_MAPPING_SEPARATOR, 
getRegexSeparator());
+
+            
propertiesMap.putAll(getAllRegexPatternsConfig(RangerCommonConstants.PLUGINS_CONF_MAPPING_USERNAME));
+            
props.putAll(getAllRegexPatternsConfig(RangerCommonConstants.PLUGINS_CONF_MAPPING_USERNAME));
+
+            
propertiesMap.putAll(getAllRegexPatternsConfig(RangerCommonConstants.PLUGINS_CONF_MAPPING_GROUPNAME));
+            
props.putAll(getAllRegexPatternsConfig(RangerCommonConstants.PLUGINS_CONF_MAPPING_GROUPNAME));
+        }
+    }
+
+    private static String getRegexSeparator() {
+        String ret = UgsyncCommonConstants.DEFAULT_MAPPING_SEPARATOR;
+        String val = 
PropertiesUtil.getProperty(RangerCommonConstants.PLUGINS_CONF_MAPPING_SEPARATOR);
+        if (StringUtils.isNotEmpty(val)) {
+            if (val.length() == 1) {
+                ret = val;
+            } else {
+                LOG.warn("More than one character found in RegEx Separator, 
using default RegEx Separator");
+            }
+        }
+        LOG.info(String.format("Using %s as the RegEx Separator", ret));

Review Comment:
   Replace use of `String.format` with parameterized log message.



##########
ugsync-util/src/main/java/org/apache/ranger/ugsyncutil/transform/RegEx.java:
##########
@@ -69,7 +62,7 @@ public String transform(String attrValue) {
         return result;
     }
 
-    protected void populateReplacementPatterns(String baseProperty, 
List<String> regexPatterns, String regexSeparator) {
+    public void populateReplacementPatterns(String baseProperty, List<String> 
regexPatterns, String regexSeparator) {

Review Comment:
   This is referenced from this class, and its test class `TestRegEx`. I 
suggest changing visibility to package-private i.e. remove `public`. Btw, there 
is a typo in the test class package name: 
`org.apache.ranger.ugsynutil.transform` => 
`org.apache.ranger.ugsyncutil.transform` (missing `c` in `ugsyncutil`).



##########
agents-common/src/main/java/org/apache/ranger/plugin/service/RangerDefaultRequestProcessor.java:
##########
@@ -157,6 +174,52 @@ public void enrich(RangerAccessRequest request) {
         }
     }
 
+    private String getTransformedUser(PolicyEngine policyEngine, 
RangerAccessRequest request) {
+        String user                   = request.getUser();
+        String userNameCaseConversion = 
policyEngine.getPluginContext().getUserNameCaseConversion();
+
+        if 
(UgsyncCommonConstants.UGSYNC_LOWER_CASE_CONVERSION_VALUE.equalsIgnoreCase(userNameCaseConversion))
 {
+            user = user.toLowerCase();
+        } else if 
(UgsyncCommonConstants.UGSYNC_UPPER_CASE_CONVERSION_VALUE.equalsIgnoreCase(userNameCaseConversion))
 {
+            user = user.toUpperCase();
+        }
+
+        Mapper userNameTransformInst = 
policyEngine.getPluginContext().getUserNameTransformInst();
+        if (userNameTransformInst != null) {
+            String transformedUser = userNameTransformInst.transform(user);
+            LOG.debug("Original username = {}, Transformed username = {}", 
request.getUser(), transformedUser);
+            return transformedUser;
+        }
+
+        return user;
+    }
+
+    private Set<String> getTransformedGroups(PolicyEngine policyEngine, 
RangerAccessRequest request) {
+        Mapper groupNameTransformInst = 
policyEngine.getPluginContext().getGroupNameTransformInst();
+        String caseConversion         = 
policyEngine.getPluginContext().getGroupNameCaseConversion();
+
+        if (groupNameTransformInst == null || request.getUserGroups() == null) 
{
+            return request.getUserGroups();
+        }
+
+        return request.getUserGroups().stream()
+                .filter(Objects::nonNull)
+                .map(group -> {
+                    String originalGroup = group;
+
+                    if 
(UgsyncCommonConstants.UGSYNC_LOWER_CASE_CONVERSION_VALUE.equalsIgnoreCase(caseConversion))
 {

Review Comment:
   Consider avoiding string comparision on every authz call, and for each 
group; instead have the configured parsed to a boolean in RangerAuthContext and 
access boolean from here.



##########
ugsync/src/main/java/org/apache/ranger/unixusersync/config/UserGroupSyncConfig.java:
##########
@@ -1435,6 +1396,37 @@ public boolean isSyncSourceValidationEnabled() {
         return isSyncSourceValidationEnabled;
     }
 
+    public Map<String, String> getNameTransformationRules() {

Review Comment:
   Methods  `getNameTransformationRules()` and `getAllRegexPatternsConfig()` 
don't seem to be used. Please review and remove.



##########
agents-common/src/main/java/org/apache/ranger/plugin/service/RangerDefaultRequestProcessor.java:
##########
@@ -157,6 +174,52 @@ public void enrich(RangerAccessRequest request) {
         }
     }
 
+    private String getTransformedUser(PolicyEngine policyEngine, 
RangerAccessRequest request) {
+        String user                   = request.getUser();
+        String userNameCaseConversion = 
policyEngine.getPluginContext().getUserNameCaseConversion();
+
+        if 
(UgsyncCommonConstants.UGSYNC_LOWER_CASE_CONVERSION_VALUE.equalsIgnoreCase(userNameCaseConversion))
 {
+            user = user.toLowerCase();
+        } else if 
(UgsyncCommonConstants.UGSYNC_UPPER_CASE_CONVERSION_VALUE.equalsIgnoreCase(userNameCaseConversion))
 {
+            user = user.toUpperCase();
+        }
+
+        Mapper userNameTransformInst = 
policyEngine.getPluginContext().getUserNameTransformInst();
+        if (userNameTransformInst != null) {
+            String transformedUser = userNameTransformInst.transform(user);
+            LOG.debug("Original username = {}, Transformed username = {}", 
request.getUser(), transformedUser);
+            return transformedUser;
+        }
+
+        return user;
+    }
+
+    private Set<String> getTransformedGroups(PolicyEngine policyEngine, 
RangerAccessRequest request) {
+        Mapper groupNameTransformInst = 
policyEngine.getPluginContext().getGroupNameTransformInst();
+        String caseConversion         = 
policyEngine.getPluginContext().getGroupNameCaseConversion();
+
+        if (groupNameTransformInst == null || request.getUserGroups() == null) 
{

Review Comment:
   When `groupNameTransformInst` is null, `return` at line 202 will result in 
case-conversion to be not applied. Please review and update.



##########
ugsync-util/pom.xml:
##########
@@ -47,6 +47,28 @@
             <groupId>com.google.code.gson</groupId>
             <artifactId>gson</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.apache.logging.log4j</groupId>

Review Comment:
   Are libraries `log4j-api` and `log4j-over-slf4j` needed in ugsync-util 
module? If not, please remove these dependencies.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: dev-unsubscr...@ranger.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org

Reply via email to