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

madhan pushed a commit to branch ranger-2.8
in repository https://gitbox.apache.org/repos/asf/ranger.git


The following commit(s) were added to refs/heads/ranger-2.8 by this push:
     new 83e6ddc9e RANGER-5215: policy evaluation to apply same user/group name 
transformations as usersync (#751)
83e6ddc9e is described below

commit 83e6ddc9eb73ad8917c95efe1ef5c4e3e94dfc54
Author: dhavalshah9131 <[email protected]>
AuthorDate: Sun Nov 30 04:22:42 2025 +0530

    RANGER-5215: policy evaluation to apply same user/group name 
transformations as usersync (#751)
---
 agents-common/pom.xml                              |  19 +++
 .../ranger/plugin/policyengine/PolicyEngine.java   |   5 +-
 .../ranger/plugin/service/RangerAuthContext.java   | 140 +++++++++++++++++++++
 .../ranger/plugin/service/RangerBasePlugin.java    |  19 ++-
 .../service/RangerDefaultRequestProcessor.java     |  75 +++++++++++
 .../ranger/plugin/util/RangerCommonConstants.java  |   9 ++
 .../apache/ranger/plugin/util/ServicePolicies.java |   1 +
 distro/src/main/assembly/admin-web.xml             |   1 +
 distro/src/main/assembly/hbase-agent.xml           |   1 +
 distro/src/main/assembly/hdfs-agent.xml            |   1 +
 distro/src/main/assembly/hive-agent.xml            |   1 +
 distro/src/main/assembly/kms.xml                   |   2 +
 distro/src/main/assembly/knox-agent.xml            |   1 +
 distro/src/main/assembly/plugin-atlas.xml          |   1 +
 distro/src/main/assembly/plugin-elasticsearch.xml  |   1 +
 distro/src/main/assembly/plugin-kafka.xml          |   1 +
 distro/src/main/assembly/plugin-kms.xml            |   2 +
 distro/src/main/assembly/plugin-kylin.xml          |   1 +
 distro/src/main/assembly/plugin-ozone.xml          |   1 +
 distro/src/main/assembly/plugin-presto.xml         |   1 +
 distro/src/main/assembly/plugin-solr.xml           |   1 +
 distro/src/main/assembly/plugin-sqoop.xml          |   1 +
 distro/src/main/assembly/plugin-trino.xml          |   1 +
 distro/src/main/assembly/plugin-yarn.xml           |   1 +
 distro/src/main/assembly/ranger-tools.xml          |   2 +
 distro/src/main/assembly/sample-client.xml         |   1 +
 distro/src/main/assembly/storm-agent.xml           |   1 +
 distro/src/main/assembly/tagsync.xml               |   1 +
 distro/src/main/assembly/usersync.xml              |   1 +
 .../java/org/apache/ranger/biz/ServiceDBStore.java |  27 +++-
 .../main/java/org/apache/ranger/biz/XUserMgr.java  |   3 -
 .../org/apache/ranger/common/PropertiesUtil.java   | 102 +++++++++++++++
 .../ranger/common/RangerServicePoliciesCache.java  |   3 +
 .../java/org/apache/ranger/rest/ServiceREST.java   |   1 +
 ugsync-util/pom.xml                                |  18 +++
 .../ugsyncutil/transform}/AbstractMapper.java      |  27 ++--
 .../ranger/ugsyncutil/transform}/Mapper.java       |   6 +-
 .../apache/ranger/ugsyncutil/transform}/RegEx.java |  11 +-
 .../ugsyncutil/util/UgsyncCommonConstants.java     |  35 ++++++
 .../ranger/ugsyncutil/transform}/TestRegEx.java    |   2 +-
 .../unixusersync/config/UserGroupSyncConfig.java   |  36 ++----
 .../process/PolicyMgrUserGroupBuilder.java         |   8 +-
 .../usergroupsync/AbstractUserGroupSource.java     |  64 +++++-----
 .../process/TestFileSourceUserGroupBuilder.java    |  10 +-
 .../ranger/usergroupsync/TestLdapUserGroup.java    |   5 +-
 45 files changed, 544 insertions(+), 107 deletions(-)

diff --git a/agents-common/pom.xml b/agents-common/pom.xml
index d7b626015..95cf2557f 100644
--- a/agents-common/pom.xml
+++ b/agents-common/pom.xml
@@ -171,6 +171,25 @@
             <artifactId>ranger-plugins-cred</artifactId>
             <version>${project.version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.apache.ranger</groupId>
+            <artifactId>ugsync-util</artifactId>
+            <version>${project.version}</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>log4j</groupId>
+                    <artifactId>*</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.apache.logging.log4j</groupId>
+                    <artifactId>*</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.slf4j</groupId>
+                    <artifactId>*</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
         <dependency>
             <groupId>org.mockito</groupId>
             <artifactId>mockito-core</artifactId>
diff --git 
a/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/PolicyEngine.java
 
b/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/PolicyEngine.java
index 31e637583..af1888088 100644
--- 
a/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/PolicyEngine.java
+++ 
b/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/PolicyEngine.java
@@ -45,7 +45,6 @@
 import org.apache.ranger.plugin.util.ServiceDefUtil;
 import org.apache.ranger.plugin.util.ServicePolicies;
 import org.apache.ranger.plugin.util.StringTokenReplacer;
-import org.apache.ranger.plugin.util.RangerUserStore;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -213,9 +212,7 @@ public PolicyEngine(ServicePolicies servicePolicies, 
RangerPluginContext pluginC
             }
         }
 
-        RangerAuthContext currAuthContext = pluginContext.getAuthContext();
-        RangerUserStore   userStore       = currAuthContext != null ? 
currAuthContext.getUserStoreUtil().getUserStore() : null;
-        RangerAuthContext authContext     = new RangerAuthContext(null, 
zoneMatcher, roles, userStore);
+        RangerAuthContext authContext = new 
RangerAuthContext(pluginContext.getAuthContext(), zoneMatcher, roles);
 
         this.pluginContext.setAuthContext(authContext);
 
diff --git 
a/agents-common/src/main/java/org/apache/ranger/plugin/service/RangerAuthContext.java
 
b/agents-common/src/main/java/org/apache/ranger/plugin/service/RangerAuthContext.java
index 1bb4d6925..40e4d44e6 100644
--- 
a/agents-common/src/main/java/org/apache/ranger/plugin/service/RangerAuthContext.java
+++ 
b/agents-common/src/main/java/org/apache/ranger/plugin/service/RangerAuthContext.java
@@ -25,21 +25,47 @@
 import org.apache.ranger.plugin.contextenricher.RangerContextEnricher;
 import org.apache.ranger.plugin.policyengine.RangerPolicyEngine;
 import org.apache.ranger.plugin.policyengine.RangerSecurityZoneMatcher;
+import org.apache.ranger.plugin.util.RangerCommonConstants;
 import org.apache.ranger.plugin.util.RangerRoles;
 import org.apache.ranger.plugin.util.RangerRolesUtil;
 import org.apache.ranger.plugin.util.RangerUserStore;
 import org.apache.ranger.plugin.util.RangerUserStoreUtil;
+import org.apache.ranger.ugsyncutil.transform.Mapper;
+import org.apache.ranger.ugsyncutil.util.UgsyncCommonConstants.CaseConversion;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
+import java.util.ArrayList;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 
+import static 
org.apache.ranger.ugsyncutil.util.UgsyncCommonConstants.toCaseConversion;
+
 public class RangerAuthContext {
+    private static final Logger LOG = 
LoggerFactory.getLogger(RangerAuthContext.class);
+
     private final Map<RangerContextEnricher, Object> requestContextEnrichers;
     private final RangerSecurityZoneMatcher          zoneMatcher;
     private       RangerRolesUtil                    rolesUtil;
     private       RangerUserStoreUtil                userStoreUtil;
+    private       Mapper                             userNameTransformer;
+    private       Mapper                             groupNameTransformer;
+    private       CaseConversion                     userNameCaseConversion;
+    private       CaseConversion                     groupNameCaseConversion;
+
+    public RangerAuthContext(RangerAuthContext prevContext, 
RangerSecurityZoneMatcher zoneMatcher, RangerRoles roles) {
+        this(null, zoneMatcher, roles, prevContext != null ? 
prevContext.getUserStoreUtil().getUserStore() : null);
+
+        if (prevContext != null) {
+            this.userNameTransformer     = prevContext.userNameTransformer;
+            this.groupNameTransformer    = prevContext.groupNameTransformer;
+            this.userNameCaseConversion  = prevContext.userNameCaseConversion;
+            this.groupNameCaseConversion = prevContext.groupNameCaseConversion;
+        }
+    }
 
     public RangerAuthContext(Map<RangerContextEnricher, Object> 
requestContextEnrichers, RangerSecurityZoneMatcher zoneMatcher, RangerRoles 
roles, RangerUserStore userStore) {
         this.requestContextEnrichers = requestContextEnrichers != null ? 
requestContextEnrichers : new ConcurrentHashMap<>();
@@ -127,4 +153,118 @@ public RangerUserStoreUtil getUserStoreUtil() {
     public void setUserStore(RangerUserStore userStore) {
         this.userStoreUtil = new RangerUserStoreUtil(userStore);
     }
+
+    public Mapper getUserNameTransformer() {
+        return userNameTransformer;
+    }
+
+    public Mapper getGroupNameTransformer() {
+        return groupNameTransformer;
+    }
+
+    public CaseConversion getUserNameCaseConversion() {
+        return userNameCaseConversion;
+    }
+
+    public CaseConversion getGroupNameCaseConversion() {
+        return groupNameCaseConversion;
+    }
+
+    public void onServiceConfigsUpdate(Map<String, String> serviceConfigs) {
+        String userNameCaseConversion  = null;
+        String groupNameCaseConversion = null;
+        Mapper userNameTransformer     = null;
+        Mapper groupNameTransformer    = null;
+
+        if (MapUtils.isNotEmpty(serviceConfigs)) {
+            LOG.debug("==> onServiceConfigsUpdate({})", 
serviceConfigs.keySet());
+
+            userNameCaseConversion  = 
serviceConfigs.get(RangerCommonConstants.PLUGINS_CONF_USERNAME_CASE_CONVERSION_PARAM);
+            groupNameCaseConversion = 
serviceConfigs.get(RangerCommonConstants.PLUGINS_CONF_GROUPNAME_CASE_CONVERSION_PARAM);
+
+            String mappingUserNameHandler = 
serviceConfigs.get(RangerCommonConstants.PLUGINS_CONF_MAPPING_USERNAME_HANDLER);
+
+            if (mappingUserNameHandler != null) {
+                try {
+                    Class<Mapper> regExClass = (Class<Mapper>) 
Class.forName(mappingUserNameHandler);
+
+                    userNameTransformer = regExClass.newInstance();
+
+                    String baseProperty = 
RangerCommonConstants.PLUGINS_CONF_MAPPING_USERNAME;
+
+                    userNameTransformer.init(baseProperty, 
getAllRegexPatterns(baseProperty, serviceConfigs), 
serviceConfigs.get(RangerCommonConstants.PLUGINS_CONF_MAPPING_SEPARATOR));
+                } catch (ClassNotFoundException cne) {
+                    LOG.error("Failed to load {}", mappingUserNameHandler, 
cne);
+                } catch (Throwable te) {
+                    LOG.error("Failed to instantiate {}", 
mappingUserNameHandler, te);
+                }
+            }
+
+            String mappingGroupNameHandler = 
serviceConfigs.get(RangerCommonConstants.PLUGINS_CONF_MAPPING_GROUPNAME_HANDLER);
+
+            if (mappingGroupNameHandler != null) {
+                try {
+                    Class<Mapper> regExClass = (Class<Mapper>) 
Class.forName(mappingGroupNameHandler);
+
+                    groupNameTransformer = regExClass.newInstance();
+
+                    String baseProperty = 
RangerCommonConstants.PLUGINS_CONF_MAPPING_GROUPNAME;
+
+                    groupNameTransformer.init(baseProperty, 
getAllRegexPatterns(baseProperty, serviceConfigs), 
serviceConfigs.get(RangerCommonConstants.PLUGINS_CONF_MAPPING_SEPARATOR));
+                } catch (ClassNotFoundException cne) {
+                    LOG.error("Failed to load {}", mappingGroupNameHandler, 
cne);
+                } catch (Throwable te) {
+                    LOG.error("Failed to instantiate {}", 
mappingGroupNameHandler, te);
+                }
+            }
+        }
+
+        setUserNameCaseConversion(userNameCaseConversion);
+        setGroupNameCaseConversion(groupNameCaseConversion);
+        setUserNameTransformer(userNameTransformer);
+        setGroupNameTransformer(groupNameTransformer);
+    }
+
+    private void setUserNameTransformer(Mapper userNameTransformer) {
+        this.userNameTransformer = userNameTransformer;
+    }
+
+    private void setGroupNameTransformer(Mapper groupNameTransformer) {
+        this.groupNameTransformer = groupNameTransformer;
+    }
+
+    private void setUserNameCaseConversion(String userNameCaseConversion) {
+        this.userNameCaseConversion = toCaseConversion(userNameCaseConversion);
+    }
+
+    private void setGroupNameCaseConversion(String groupNameCaseConversion) {
+        this.groupNameCaseConversion = 
toCaseConversion(groupNameCaseConversion);
+    }
+
+    private List<String> getAllRegexPatterns(String baseProperty, Map<String, 
String> serviceConfig) {
+        LOG.debug("==> getAllRegexPatterns({})", baseProperty);
+
+        List<String> regexPatterns = new ArrayList<>();
+        String       baseRegex     = serviceConfig != null ? 
serviceConfig.get(baseProperty) : null;
+
+        LOG.debug("baseRegex = {}, pluginConfig = {}", baseRegex, 
serviceConfig == null ? null : serviceConfig.keySet());
+
+        if (baseRegex != null) {
+            regexPatterns.add(baseRegex);
+
+            for (int i = 1; true; i++) {
+                String nextRegex = serviceConfig.get(baseProperty + "." + i);
+
+                if (nextRegex == null) {
+                    break;
+                }
+
+                regexPatterns.add(nextRegex);
+            }
+        }
+
+        LOG.debug("<== getAllRegexPatterns({}): ret={}", baseProperty, 
regexPatterns);
+
+        return regexPatterns;
+    }
 }
diff --git 
a/agents-common/src/main/java/org/apache/ranger/plugin/service/RangerBasePlugin.java
 
b/agents-common/src/main/java/org/apache/ranger/plugin/service/RangerBasePlugin.java
index b02915b00..9f8b4f9b6 100644
--- 
a/agents-common/src/main/java/org/apache/ranger/plugin/service/RangerBasePlugin.java
+++ 
b/agents-common/src/main/java/org/apache/ranger/plugin/service/RangerBasePlugin.java
@@ -356,7 +356,6 @@ public void setPolicies(ServicePolicies policies) {
                if (LOG.isDebugEnabled()) {
                        LOG.debug("==> setPolicies(" + policies + ")");
                }
-               this.serviceConfigs = (policies != null && 
policies.getServiceConfig() != null) ? policies.getServiceConfig() : new 
HashMap<>();
                if (pluginConfig.isEnableImplicitUserStoreEnricher() && 
policies != null && !ServiceDefUtil.isUserStoreEnricherPresent(policies)) {
                        String retrieverClassName = 
pluginConfig.get(RangerUserStoreEnricher.USERSTORE_RETRIEVER_CLASSNAME_OPTION, 
RangerAdminUserStoreRetriever.class.getCanonicalName());
                        String retrieverPollIntMs = 
pluginConfig.get(RangerUserStoreEnricher.USERSTORE_REFRESHER_POLLINGINTERVAL_OPTION,
 Integer.toString(60 * 1000));
@@ -370,8 +369,8 @@ public void setPolicies(ServicePolicies policies) {
                                isUserStoreEnricherAddedImplcitly = 
ServiceDefUtil.addUserStoreEnricherIfNeeded(policies, retrieverClassName, 
retrieverPollIntMs);
                        }
                }
-
-               String isSyncPolicyRefresh = this.pluginConfig == null ? null : 
this.serviceConfigs.get(this.pluginConfig.getPropertyPrefix() + 
".policy.refresh.synchronous");
+//             String isSyncPolicyRefresh = this.pluginConfig == null ? null : 
this.serviceConfigs.get(this.pluginConfig.getPropertyPrefix() + 
".policy.refresh.synchronous");
+               String isSyncPolicyRefresh = this.pluginConfig == null ? null : 
(this.serviceConfigs == null ? null : 
this.serviceConfigs.get(this.pluginConfig.getPropertyPrefix() + 
".policy.refresh.synchronous"));
                this.synchronousPolicyRefresh = 
Boolean.parseBoolean(isSyncPolicyRefresh);
                if (this.synchronousPolicyRefresh) {
                        LOG.info("synchronousPolicyRefresh = {}", 
this.synchronousPolicyRefresh);
@@ -500,6 +499,8 @@ public void setPolicies(ServicePolicies policies) {
                                                
newPolicyEngine.setTrustedProxyAddresses(pluginConfig.getTrustedProxyAddresses());
                                        }
 
+                    setServiceConfigs(policies.getServiceConfig());
+
                                        LOG.info("Switching policy engine from 
[" + getPolicyVersion() + "]");
                                        this.policyEngine       = 
newPolicyEngine;
                                        LOG.info("Switched policy engine to [" 
+ getPolicyVersion() + "]");
@@ -1422,6 +1423,18 @@ private static void overrideACLs(final 
RangerResourceACLs chainedResourceACLs, R
                }
        }
 
+    private void setServiceConfigs(Map<String, String> serviceConfigs) {
+        Map<String, String> oldServiceConfigs = this.serviceConfigs;
+
+        this.serviceConfigs = serviceConfigs != null ? serviceConfigs : new 
HashMap<>();
+
+        RangerAuthContext authContext = this.pluginContext.getAuthContext();
+
+        if (authContext != null && !Objects.equals(oldServiceConfigs, 
this.serviceConfigs)) {
+            authContext.onServiceConfigsUpdate(this.serviceConfigs);
+        }
+    }
+
        private static AuditProviderFactory getAuditProviderFactory(String 
serviceName) {
                AuditProviderFactory ret = AuditProviderFactory.getInstance();
 
diff --git 
a/agents-common/src/main/java/org/apache/ranger/plugin/service/RangerDefaultRequestProcessor.java
 
b/agents-common/src/main/java/org/apache/ranger/plugin/service/RangerDefaultRequestProcessor.java
index c381ad467..5669872e8 100644
--- 
a/agents-common/src/main/java/org/apache/ranger/plugin/service/RangerDefaultRequestProcessor.java
+++ 
b/agents-common/src/main/java/org/apache/ranger/plugin/service/RangerDefaultRequestProcessor.java
@@ -31,15 +31,20 @@
 import org.apache.ranger.plugin.policyengine.RangerMutableResource;
 import org.apache.ranger.plugin.policyengine.RangerPluginContext;
 import org.apache.ranger.plugin.util.RangerAccessRequestUtil;
+import org.apache.ranger.plugin.util.RangerCommonConstants;
 import org.apache.ranger.plugin.util.RangerPerfTracer;
 import org.apache.ranger.plugin.util.RangerUserStoreUtil;
+import org.apache.ranger.ugsyncutil.transform.Mapper;
+import org.apache.ranger.ugsyncutil.util.UgsyncCommonConstants;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Objects;
 import java.util.Set;
+import java.util.stream.Collectors;
 
 public class RangerDefaultRequestProcessor implements 
RangerAccessRequestProcessor {
 
@@ -103,6 +108,17 @@ public void preProcess(RangerAccessRequest request) {
                     reqImpl.setClusterType(pluginContext.getClusterType());
                 }
 
+                RangerPluginConfig config = 
policyEngine.getPluginContext().getConfig();
+
+                boolean isNameTransformationSupported = 
config.getBoolean(config.getPropertyPrefix() + 
RangerCommonConstants.PLUGIN_CONFIG_SUFFIX_NAME_TRANSFORMATION, false);
+
+                LOG.debug("isNameTransformationSupported = {}", 
isNameTransformationSupported);
+
+                if (isNameTransformationSupported) {
+                    reqImpl.setUser(getTransformedUser(policyEngine, request));
+                    reqImpl.setUserGroups(getTransformedGroups(policyEngine, 
request));
+                }
+
                 convertEmailToUsername(reqImpl);
 
                 updateUserGroups(reqImpl);
@@ -166,6 +182,65 @@ public void enrich(RangerAccessRequest request) {
         }
     }
 
+    private String getTransformedUser(PolicyEngine policyEngine, 
RangerAccessRequest request) {
+        RangerAuthContext authContext     = 
policyEngine.getPluginContext().getAuthContext();
+        boolean           toLowerCase     = 
authContext.getUserNameCaseConversion() == 
UgsyncCommonConstants.CaseConversion.TO_LOWER;
+        boolean           toUpperCase     = 
authContext.getUserNameCaseConversion() == 
UgsyncCommonConstants.CaseConversion.TO_UPPER;
+        Mapper            nameTransformer = 
authContext.getUserNameTransformer();
+
+        if (toLowerCase || toUpperCase || nameTransformer != null) {
+            String user = request.getUser();
+
+            if (toLowerCase) {
+                user = user.toLowerCase();
+            } else if (toUpperCase) {
+                user = user.toUpperCase();
+            }
+
+            if (nameTransformer != null) {
+                user = nameTransformer.transform(user);
+            }
+
+            LOG.debug("Original username = {}, Transformed username = {}", 
request.getUser(), user);
+
+            return user;
+        }
+
+        return request.getUser();
+    }
+
+    private Set<String> getTransformedGroups(PolicyEngine policyEngine, 
RangerAccessRequest request) {
+        if (CollectionUtils.isNotEmpty(request.getUserGroups())) {
+            RangerAuthContext authContext     = 
policyEngine.getPluginContext().getAuthContext();
+            boolean           toLowerCase     = 
authContext.getGroupNameCaseConversion() == 
UgsyncCommonConstants.CaseConversion.TO_LOWER;
+            boolean           toUpperCase     = 
authContext.getGroupNameCaseConversion() == 
UgsyncCommonConstants.CaseConversion.TO_UPPER;
+            Mapper            nameTransformer = 
authContext.getGroupNameTransformer();
+
+            if (toLowerCase || toUpperCase || nameTransformer != null) {
+                return request.getUserGroups().stream()
+                        .filter(Objects::nonNull)
+                        .map(group -> {
+                            String originalGroup = group;
+
+                            if (toLowerCase) {
+                                group = group.toLowerCase();
+                            } else if (toUpperCase) {
+                                group = group.toUpperCase();
+                            }
+
+                            String transformedGroup = 
nameTransformer.transform(group);
+
+                            LOG.debug("Original group name = {}, Transformed 
group name = {}", originalGroup, transformedGroup);
+
+                            return transformedGroup;
+                        })
+                        .collect(Collectors.toSet());
+            }
+        }
+
+        return request.getUserGroups();
+    }
+
     private void setResourceServiceDef(RangerAccessRequest request) {
         RangerAccessResource resource = request.getResource();
 
diff --git 
a/agents-common/src/main/java/org/apache/ranger/plugin/util/RangerCommonConstants.java
 
b/agents-common/src/main/java/org/apache/ranger/plugin/util/RangerCommonConstants.java
index 9d6e1f0b5..8a0ba8d71 100644
--- 
a/agents-common/src/main/java/org/apache/ranger/plugin/util/RangerCommonConstants.java
+++ 
b/agents-common/src/main/java/org/apache/ranger/plugin/util/RangerCommonConstants.java
@@ -39,6 +39,15 @@ private RangerCommonConstants() {
 
        public static final String RANGER_ADMIN_SUFFIX_IN_PLACE_TAG_UPDATES     
= ".supports.in.place.tag.updates";
        public static final String PLUGIN_CONFIG_SUFFIX_IN_PLACE_TAG_UPDATES    
= ".supports.in.place.tag.updates";
+       public static final String PLUGIN_CONFIG_SUFFIX_NAME_TRANSFORMATION     
= ".supports.name.transformation";
+
+       public static final String  PLUGINS_CONF_USERNAME_CASE_CONVERSION_PARAM 
         = "ranger.plugins.conf.ldap.username.caseconversion";
+       public static final String  
PLUGINS_CONF_GROUPNAME_CASE_CONVERSION_PARAM         = 
"ranger.plugins.conf.ldap.groupname.caseconversion";
+       public static final String  PLUGINS_CONF_MAPPING_USERNAME               
         = "ranger.plugins.conf.mapping.username.regex";
+       public static final String  PLUGINS_CONF_MAPPING_GROUPNAME              
         = "ranger.plugins.conf.mapping.groupname.regex";
+       public static final String  PLUGINS_CONF_MAPPING_USERNAME_HANDLER       
         = "ranger.plugins.conf.mapping.username.handler";
+       public static final String  PLUGINS_CONF_MAPPING_GROUPNAME_HANDLER      
         = "ranger.plugins.conf.mapping.groupname.handler";
+       public static final String  PLUGINS_CONF_MAPPING_SEPARATOR              
         = "ranger.plugins.conf.mapping.regex.separator";
 
        public static final String RANGER_SUPPORTS_TAGS_DEDUP                   
= ".supports.tags.dedup";
 
diff --git 
a/agents-common/src/main/java/org/apache/ranger/plugin/util/ServicePolicies.java
 
b/agents-common/src/main/java/org/apache/ranger/plugin/util/ServicePolicies.java
index 51480fae3..9ccd0d64d 100644
--- 
a/agents-common/src/main/java/org/apache/ranger/plugin/util/ServicePolicies.java
+++ 
b/agents-common/src/main/java/org/apache/ranger/plugin/util/ServicePolicies.java
@@ -444,6 +444,7 @@ static public ServicePolicies copyHeader(ServicePolicies 
source) {
                ret.setPolicyVersion(source.getPolicyVersion());
                ret.setAuditMode(source.getAuditMode());
                ret.setServiceDef(source.getServiceDef());
+               ret.setServiceConfig(source.getServiceConfig() != null ? new 
HashMap<>(source.getServiceConfig()) : null);
                ret.setPolicyUpdateTime(source.getPolicyUpdateTime());
                ret.setSecurityZones(source.getSecurityZones());
                ret.setPolicies(Collections.emptyList());
diff --git a/distro/src/main/assembly/admin-web.xml 
b/distro/src/main/assembly/admin-web.xml
index d07025a2c..0ebe3164b 100644
--- a/distro/src/main/assembly/admin-web.xml
+++ b/distro/src/main/assembly/admin-web.xml
@@ -237,6 +237,7 @@
           
<include>org.eclipse.jdt.core.compiler:ecj:jar:P20140317-1600</include>
           
<include>org.apache.hadoop:hadoop-auth:jar:${hadoop.version}</include>
           <include>org.apache.ranger:ranger-plugins-common</include>
+          <include>org.apache.ranger:ugsync-util</include>
           <include>org.slf4j:slf4j-api:jar:${slf4j.version}</include>
           <include>org.apache.hadoop:hadoop-common</include>
           <include>commons-logging:commons-logging</include>
diff --git a/distro/src/main/assembly/hbase-agent.xml 
b/distro/src/main/assembly/hbase-agent.xml
index 874972afd..3748b371b 100644
--- a/distro/src/main/assembly/hbase-agent.xml
+++ b/distro/src/main/assembly/hbase-agent.xml
@@ -46,6 +46,7 @@
         <include>org.apache.ranger:ranger-audit-dest-solr</include>
         <include>org.apache.ranger:ranger-plugins-cred</include>
         <include>org.apache.ranger:ranger-plugins-common</include>
+        <include>org.apache.ranger:ugsync-util</include>
         <include>org.apache.ranger:ranger-hbase-plugin</include>
       </includes>
       <binaries>
diff --git a/distro/src/main/assembly/hdfs-agent.xml 
b/distro/src/main/assembly/hdfs-agent.xml
index aed5c9ee7..f45c091d6 100644
--- a/distro/src/main/assembly/hdfs-agent.xml
+++ b/distro/src/main/assembly/hdfs-agent.xml
@@ -74,6 +74,7 @@
         <include>org.apache.ranger:ranger-audit-dest-solr</include>
         <include>org.apache.ranger:ranger-plugins-cred</include>
         <include>org.apache.ranger:ranger-plugins-common</include>
+        <include>org.apache.ranger:ugsync-util</include>
         <include>org.apache.ranger:ranger-hdfs-plugin</include>
       </includes>
       <binaries>
diff --git a/distro/src/main/assembly/hive-agent.xml 
b/distro/src/main/assembly/hive-agent.xml
index 76c699b17..f5f8b5bf2 100644
--- a/distro/src/main/assembly/hive-agent.xml
+++ b/distro/src/main/assembly/hive-agent.xml
@@ -46,6 +46,7 @@
         <include>org.apache.ranger:ranger-audit-dest-solr</include>
         <include>org.apache.ranger:ranger-plugins-cred</include>
         <include>org.apache.ranger:ranger-plugins-common</include>
+        <include>org.apache.ranger:ugsync-util</include>
         <include>org.apache.ranger:ranger-hive-plugin</include>
       </includes>
       <binaries>
diff --git a/distro/src/main/assembly/kms.xml b/distro/src/main/assembly/kms.xml
index f74f055d0..0d64d6caf 100755
--- a/distro/src/main/assembly/kms.xml
+++ b/distro/src/main/assembly/kms.xml
@@ -214,6 +214,7 @@
                     
<include>org.apache.hadoop:hadoop-auth:jar:${hadoop.version}</include>
                     
<include>org.apache.solr:solr-solrj:jar:${solr.version}</include>
                     <include>org.apache.ranger:ranger-plugins-common</include>
+                    <include>org.apache.ranger:ugsync-util</include>
                     
<include>com.kstruct:gethostname4j:jar:${kstruct.gethostname4j.version}</include>
                     <include>net.java.dev.jna:jna:jar:${jna.version}</include>
                     
<include>net.java.dev.jna:jna-platform:jar:${jna-platform.version}</include>
@@ -283,6 +284,7 @@
                 <include>org.apache.ranger:ranger-audit-dest-solr</include>
                 <include>org.apache.ranger:ranger-plugins-cred</include>
                 <include>org.apache.ranger:ranger-plugins-common</include>
+                <include>org.apache.ranger:ugsync-util</include>
                 <include>org.apache.ranger:ranger-kms-plugin</include>
             </includes>
             <binaries>
diff --git a/distro/src/main/assembly/knox-agent.xml 
b/distro/src/main/assembly/knox-agent.xml
index c4f409687..d407777bf 100644
--- a/distro/src/main/assembly/knox-agent.xml
+++ b/distro/src/main/assembly/knox-agent.xml
@@ -47,6 +47,7 @@
         <include>org.apache.ranger:ranger-audit-dest-solr</include>
         <include>org.apache.ranger:ranger-plugins-cred</include>
         <include>org.apache.ranger:ranger-plugins-common</include>
+        <include>org.apache.ranger:ugsync-util</include>
         <include>org.apache.ranger:ranger-knox-plugin</include>
       </includes>
       <binaries>
diff --git a/distro/src/main/assembly/plugin-atlas.xml 
b/distro/src/main/assembly/plugin-atlas.xml
index e58f4d75c..5d6b24adc 100644
--- a/distro/src/main/assembly/plugin-atlas.xml
+++ b/distro/src/main/assembly/plugin-atlas.xml
@@ -47,6 +47,7 @@
         <include>org.apache.ranger:ranger-audit-dest-solr</include>
         <include>org.apache.ranger:ranger-plugins-cred</include>
         <include>org.apache.ranger:ranger-plugins-common</include>
+        <include>org.apache.ranger:ugsync-util</include>
         <include>org.apache.ranger:ranger-atlas-plugin</include>
       </includes>
       <binaries>
diff --git a/distro/src/main/assembly/plugin-elasticsearch.xml 
b/distro/src/main/assembly/plugin-elasticsearch.xml
index 069c1f262..d98234ad9 100644
--- a/distro/src/main/assembly/plugin-elasticsearch.xml
+++ b/distro/src/main/assembly/plugin-elasticsearch.xml
@@ -52,6 +52,7 @@
         <include>org.apache.ranger:ranger-audit-dest-hdfs</include>
         <include>org.apache.ranger:ranger-plugins-cred</include>
         <include>org.apache.ranger:ranger-plugins-common</include>
+        <include>org.apache.ranger:ugsync-util</include>
         <include>org.apache.ranger:ranger-elasticsearch-plugin</include>
       </includes>
       <binaries>
diff --git a/distro/src/main/assembly/plugin-kafka.xml 
b/distro/src/main/assembly/plugin-kafka.xml
index 1069dfcb8..722e36782 100644
--- a/distro/src/main/assembly/plugin-kafka.xml
+++ b/distro/src/main/assembly/plugin-kafka.xml
@@ -43,6 +43,7 @@
                                
<include>org.apache.ranger:ranger-kafka-plugin</include>
                                
<include>org.apache.ranger:ranger-plugins-cred</include>
                                
<include>org.apache.ranger:ranger-plugins-common</include>
+                               <include>org.apache.ranger:ugsync-util</include>
                        </includes>
                        <binaries>
                                
<outputDirectory>lib/ranger-kafka-plugin-impl</outputDirectory>
diff --git a/distro/src/main/assembly/plugin-kms.xml 
b/distro/src/main/assembly/plugin-kms.xml
index 28060ee86..2d334528c 100755
--- a/distro/src/main/assembly/plugin-kms.xml
+++ b/distro/src/main/assembly/plugin-kms.xml
@@ -46,6 +46,7 @@
         <include>org.apache.ranger:ranger-audit-dest-solr</include>
         <include>org.apache.ranger:ranger-plugins-cred</include>
         <include>org.apache.ranger:ranger-plugins-common</include>
+        <include>org.apache.ranger:ugsync-util</include>
         <include>org.apache.ranger:ranger-kms-plugin</include>
       </includes>
       <binaries>
@@ -84,6 +85,7 @@
       <includes>
         <include>org.apache.ranger:ranger-plugins-installer</include>
         <include>org.apache.ranger:credentialbuilder</include>
+        <include>org.apache.ranger:ugsync-util</include>
       </includes>
       <binaries>
         <outputDirectory>install/lib</outputDirectory>
diff --git a/distro/src/main/assembly/plugin-kylin.xml 
b/distro/src/main/assembly/plugin-kylin.xml
index d70c5fba5..8b2b73748 100644
--- a/distro/src/main/assembly/plugin-kylin.xml
+++ b/distro/src/main/assembly/plugin-kylin.xml
@@ -46,6 +46,7 @@
         <include>org.apache.ranger:ranger-audit-dest-solr</include>
         <include>org.apache.ranger:ranger-plugins-cred</include>
         <include>org.apache.ranger:ranger-plugins-common</include>
+        <include>org.apache.ranger:ugsync-util</include>
         <include>org.apache.ranger:ranger-kylin-plugin</include>
       </includes>
       <binaries>
diff --git a/distro/src/main/assembly/plugin-ozone.xml 
b/distro/src/main/assembly/plugin-ozone.xml
index 931743936..786da9359 100644
--- a/distro/src/main/assembly/plugin-ozone.xml
+++ b/distro/src/main/assembly/plugin-ozone.xml
@@ -81,6 +81,7 @@
                 <include>org.apache.ranger:ranger-audit-dest-solr</include>
                 <include>org.apache.ranger:ranger-plugins-cred</include>
                 <include>org.apache.ranger:ranger-plugins-common</include>
+                <include>org.apache.ranger:ugsync-util</include>
                 <include>org.apache.ranger:ranger-ozone-plugin</include>
             </includes>
             <binaries>
diff --git a/distro/src/main/assembly/plugin-presto.xml 
b/distro/src/main/assembly/plugin-presto.xml
index c50324c6a..2db3de477 100644
--- a/distro/src/main/assembly/plugin-presto.xml
+++ b/distro/src/main/assembly/plugin-presto.xml
@@ -58,6 +58,7 @@
                 <include>org.apache.ranger:ranger-audit-dest-solr</include>
                 <include>org.apache.ranger:ranger-plugins-cred</include>
                 <include>org.apache.ranger:ranger-plugins-common</include>
+                <include>org.apache.ranger:ugsync-util</include>
                 <include>org.apache.ranger:ranger-presto-plugin</include>
             </includes>
             <binaries>
diff --git a/distro/src/main/assembly/plugin-solr.xml 
b/distro/src/main/assembly/plugin-solr.xml
index c32678db5..d1b4471a1 100644
--- a/distro/src/main/assembly/plugin-solr.xml
+++ b/distro/src/main/assembly/plugin-solr.xml
@@ -41,6 +41,7 @@
         <include>org.apache.ranger:ranger-audit-dest-solr</include>
         <include>org.apache.ranger:ranger-plugins-cred</include>
         <include>org.apache.ranger:ranger-plugins-common</include>
+        <include>org.apache.ranger:ugsync-util</include>
         <include>org.apache.ranger:ranger-solr-plugin</include>
       </includes>
       <binaries>
diff --git a/distro/src/main/assembly/plugin-sqoop.xml 
b/distro/src/main/assembly/plugin-sqoop.xml
index ee9d16346..b1ade54bf 100644
--- a/distro/src/main/assembly/plugin-sqoop.xml
+++ b/distro/src/main/assembly/plugin-sqoop.xml
@@ -46,6 +46,7 @@
         <include>org.apache.ranger:ranger-audit-dest-solr</include>
         <include>org.apache.ranger:ranger-plugins-cred</include>
         <include>org.apache.ranger:ranger-plugins-common</include>
+        <include>org.apache.ranger:ugsync-util</include>
         <include>org.apache.ranger:ranger-sqoop-plugin</include>
       </includes>
       <binaries>
diff --git a/distro/src/main/assembly/plugin-trino.xml 
b/distro/src/main/assembly/plugin-trino.xml
index b272de0fe..3b591c836 100644
--- a/distro/src/main/assembly/plugin-trino.xml
+++ b/distro/src/main/assembly/plugin-trino.xml
@@ -31,6 +31,7 @@
                 <include>org.apache.ranger:ranger-audit-dest-solr</include>
                 <include>org.apache.ranger:ranger-plugins-cred</include>
                 <include>org.apache.ranger:ranger-plugins-common</include>
+                <include>org.apache.ranger:ugsync-util</include>
                 <include>org.apache.ranger:ranger-trino-plugin</include>
             </includes>
             <binaries>
diff --git a/distro/src/main/assembly/plugin-yarn.xml 
b/distro/src/main/assembly/plugin-yarn.xml
index 5fb62d364..d719eb8f7 100644
--- a/distro/src/main/assembly/plugin-yarn.xml
+++ b/distro/src/main/assembly/plugin-yarn.xml
@@ -46,6 +46,7 @@
         <include>org.apache.ranger:ranger-audit-dest-solr</include>
         <include>org.apache.ranger:ranger-plugins-cred</include>
         <include>org.apache.ranger:ranger-plugins-common</include>
+        <include>org.apache.ranger:ugsync-util</include>
         <include>org.apache.ranger:ranger-yarn-plugin</include>
       </includes>
       <binaries>
diff --git a/distro/src/main/assembly/ranger-tools.xml 
b/distro/src/main/assembly/ranger-tools.xml
index 0ab496076..78f085afc 100644
--- a/distro/src/main/assembly/ranger-tools.xml
+++ b/distro/src/main/assembly/ranger-tools.xml
@@ -69,6 +69,8 @@
               <include>org.apache.ranger:ranger-audit-dest-hdfs</include>
               <include>org.apache.ranger:ranger-audit-dest-solr</include>
               <include>org.apache.ranger:ranger-plugins-common</include>
+              <include>org.apache.ranger:ugsync-util</include>
+              <include>org.apache.ranger:ranger-plugins-audit</include>
               
<include>com.kstruct:gethostname4j:jar:${kstruct.gethostname4j.version}</include>
               <include>net.java.dev.jna:jna:jar:${jna.version}</include>
               
<include>net.java.dev.jna:jna-platform:jar:${jna-platform.version}</include>
diff --git a/distro/src/main/assembly/sample-client.xml 
b/distro/src/main/assembly/sample-client.xml
index 132154ffd..5cbff941a 100644
--- a/distro/src/main/assembly/sample-client.xml
+++ b/distro/src/main/assembly/sample-client.xml
@@ -29,6 +29,7 @@
                 <include>org.apache.ranger:sample-client</include>
                 <include>org.apache.ranger:ranger-intg</include>
                 <include>org.apache.ranger:ranger-plugins-common</include>
+                <include>org.apache.ranger:ugsync-util</include>
                 <include>org.apache.ranger:ranger-plugins-cred</include>
             </includes>
             <binaries>
diff --git a/distro/src/main/assembly/storm-agent.xml 
b/distro/src/main/assembly/storm-agent.xml
index 350fa1b7b..c9d9fe46f 100644
--- a/distro/src/main/assembly/storm-agent.xml
+++ b/distro/src/main/assembly/storm-agent.xml
@@ -46,6 +46,7 @@
         <include>org.apache.ranger:ranger-audit-dest-solr</include>
         <include>org.apache.ranger:ranger-plugins-cred</include>
         <include>org.apache.ranger:ranger-plugins-common</include>
+        <include>org.apache.ranger:ugsync-util</include>
         <include>org.apache.ranger:ranger-storm-plugin</include>
       </includes>
       <binaries>
diff --git a/distro/src/main/assembly/tagsync.xml 
b/distro/src/main/assembly/tagsync.xml
index 09d1aedb6..f3c12fe2d 100644
--- a/distro/src/main/assembly/tagsync.xml
+++ b/distro/src/main/assembly/tagsync.xml
@@ -57,6 +57,7 @@
                                                        
<include>org.apache.ranger:credentialbuilder</include>
                                                        
<include>org.apache.ranger:ranger-plugins-cred</include>
                                                        
<include>org.apache.ranger:ranger-plugins-common</include>
+                                                       
<include>org.apache.ranger:ugsync-util</include>
                                                        
<include>org.apache.ranger:ranger-util</include>
                                                        
<include>org.apache.zookeeper:zookeeper:jar:${zookeeper.version}</include>
                                                        
<include>com.fasterxml.jackson.core:jackson-annotations:jar:${atlas.jackson.version}</include>
diff --git a/distro/src/main/assembly/usersync.xml 
b/distro/src/main/assembly/usersync.xml
index ca9f8a81c..8b0c71cee 100644
--- a/distro/src/main/assembly/usersync.xml
+++ b/distro/src/main/assembly/usersync.xml
@@ -56,6 +56,7 @@
                                                        
<include>org.apache.httpcomponents:httpclient:jar:${httpcomponents.httpclient.version}</include>
                                                        
<include>commons-codec:commons-codec</include>
                                                        
<include>org.apache.ranger:ranger-plugins-common</include>
+                                                       
<include>org.apache.ranger:ugsync-util</include>
                                                        
<include>org.apache.ranger:ranger-common-ha:jar:${project.version}</include>
                                                        
<include>org.apache.curator:curator-framework:jar:${curator.version}</include>
                                                        
<include>org.apache.curator:curator-recipes:jar:${curator.version}</include>
diff --git 
a/security-admin/src/main/java/org/apache/ranger/biz/ServiceDBStore.java 
b/security-admin/src/main/java/org/apache/ranger/biz/ServiceDBStore.java
index b3216fd3d..dc3802748 100644
--- a/security-admin/src/main/java/org/apache/ranger/biz/ServiceDBStore.java
+++ b/security-admin/src/main/java/org/apache/ranger/biz/ServiceDBStore.java
@@ -267,6 +267,7 @@ public class ServiceDBStore extends AbstractServiceStore {
 
        private static final String RANGER_PLUGIN_CONFIG_PREFIX = 
"ranger.plugin.";
        public static final String RANGER_PLUGIN_AUDIT_FILTERS  = 
"ranger.plugin.audit.filters";
+       public static final String RANGER_PLUGINS_CONFIG_CONF_PREFIX = 
"ranger.plugins.conf.";
 
        private static final String  DEFAULT_CSV_SANITIZATION_PATTERN = 
"^[=+\\-@\\t\\r]";
        private static final Pattern CSV_SANITIZATION_PATTERN = 
Pattern.compile(PropertiesUtil.getProperty("ranger.admin.csv.sanitization.pattern",
 DEFAULT_CSV_SANITIZATION_PATTERN));
@@ -366,6 +367,7 @@ public class ServiceDBStore extends AbstractServiceStore {
 
        private static volatile boolean legacyServiceDefsInitDone = false;
        private Boolean populateExistingBaseFields = false;
+       private final String  optionUgsyncConfigChange = "ugsyncConfigChange";
 
        public static final String HIDDEN_PASSWORD_STR = "*****";
        public static final String CONFIG_KEY_PASSWORD = "password";
@@ -1739,8 +1741,8 @@ public RangerService updateService(RangerService service, 
Map<String, Object> op
                        service.setGuid(existing.getGuid());
                        service.setVersion(existing.getVersion());
                        service = svcService.update(service);
-
-                       if (hasTagServiceValueChanged || hasIsEnabledChanged || 
hasServiceConfigForPluginChanged) {
+                       Boolean isUgsyncConfigChange = options != null && 
options.get(optionUgsyncConfigChange) != null ? (Boolean) 
options.get(optionUgsyncConfigChange) : Boolean.FALSE;
+                       if (hasTagServiceValueChanged || hasIsEnabledChanged || 
hasServiceConfigForPluginChanged || isUgsyncConfigChange) {
                                updatePolicyVersion(service, 
RangerPolicyDelta.CHANGE_TYPE_SERVICE_CHANGE, null,false);
                        }
                }
@@ -3056,8 +3058,8 @@ public ServicePolicies getServicePoliciesIfUpdated(String 
serviceName, Long last
                        }
 
                }
-
                if (LOG.isDebugEnabled()) {
+                       LOG.debug("getServicePoliciesIfUpdated({}, {}, {}): 
configs = {}", serviceName, lastKnownVersion, needsBackwardCompatibility, ret 
== null ? null : ret.getServiceConfig());
                        LOG.debug("<== 
ServiceDBStore.getServicePoliciesIfUpdated(" + serviceName + ", " + 
lastKnownVersion + ", " + needsBackwardCompatibility + "): count=" + ((ret == 
null || ret.getPolicies() == null) ? 0 : ret.getPolicies().size()));
                }
 
@@ -3091,7 +3093,9 @@ public ServicePolicies getServicePolicyDeltas(String 
serviceName, Long lastKnown
                        }
                        ret = getServicePolicies(serviceName, lastKnownVersion, 
true, SUPPORTS_POLICY_DELTAS, cachedPolicyVersion);
                }
-
+               if (LOG.isDebugEnabled()) {
+                       LOG.debug("<== 
ServiceDBStore.getServicePolicyDeltas({}, {}): ret = {}", serviceName, 
lastKnownVersion, ret == null ? ret : ret.getServiceConfig());
+               }
                return ret;
        }
 
@@ -3160,6 +3164,7 @@ private ServicePolicies getServicePolicies(String 
serviceName, Long lastKnownVer
                if (ret != null) {
                        ret.setPolicyUpdateTime(serviceVersionInfoDbObj == null 
? null : serviceVersionInfoDbObj.getPolicyUpdateTime());
                        ret.setAuditMode(auditMode);
+                       
ret.setServiceConfig(getServiceConfigForPlugin(serviceDbObj.getId()));
                        if (ret.getTagPolicies() != null) {
                                
ret.getTagPolicies().setPolicyUpdateTime(tagServiceVersionInfoDbObj == null ? 
null : tagServiceVersionInfoDbObj.getPolicyUpdateTime());
                                ret.getTagPolicies().setAuditMode(auditMode);
@@ -3173,6 +3178,7 @@ private ServicePolicies getServicePolicies(String 
serviceName, Long lastKnownVer
 
                                
tagPolicies.setServiceId(tagServiceDbObj.getId());
                                
tagPolicies.setServiceName(tagServiceDbObj.getName());
+                               
tagPolicies.setServiceConfig(getServiceConfigForPlugin(tagServiceDbObj.getId()));
                                
tagPolicies.setPolicyVersion(tagServiceVersionInfoDbObj == null ? null : 
tagServiceVersionInfoDbObj.getPolicyVersion());
                                
tagPolicies.setPolicyUpdateTime(tagServiceVersionInfoDbObj == null ? null : 
tagServiceVersionInfoDbObj.getPolicyUpdateTime());
                                
tagPolicies.setPolicies(getServicePoliciesFromDb(tagServiceDbObj));
@@ -3185,6 +3191,7 @@ private ServicePolicies getServicePolicies(String 
serviceName, Long lastKnownVer
 
                        ret.setServiceId(serviceDbObj.getId());
                        ret.setServiceName(serviceDbObj.getName());
+                       
ret.setServiceConfig(getServiceConfigForPlugin(ret.getServiceId()));
                        ret.setPolicyVersion(serviceVersionInfoDbObj == null ? 
null : serviceVersionInfoDbObj.getPolicyVersion());
                        ret.setPolicyUpdateTime(serviceVersionInfoDbObj == null 
? null : serviceVersionInfoDbObj.getPolicyUpdateTime());
                        ret.setPolicies(policies);
@@ -3194,6 +3201,7 @@ private ServicePolicies getServicePolicies(String 
serviceName, Long lastKnownVer
                }
 
                if (LOG.isDebugEnabled()) {
+                       LOG.debug("ServiceDBStore.getServicePolicies({}, {}): 
ret = {}", serviceName, lastKnownVersion, ret == null ? null : 
ret.getServiceConfig());
                        LOG.debug("<== ServiceDBStore.getServicePolicies(" + 
serviceName + ", " + lastKnownVersion + "): count=" + ((ret == null || 
ret.getPolicies() == null) ? 0 : ret.getPolicies().size()) + ", delta-count=" + 
((ret == null || ret.getPolicyDeltas() == null) ? 0 : 
ret.getPolicyDeltas().size()));
                }
 
@@ -6059,6 +6067,9 @@ public String toString() {
 
        @Override
        public Map<String, String> getServiceConfigForPlugin(Long serviceId) {
+               if(LOG.isDebugEnabled()){
+                       LOG.debug("==> 
ServiceDBStore.getServiceConfigForPlugin({})", serviceId);
+               }
                Map<String, String> configs = new HashMap<>();
                List<XXServiceConfigMap> xxServiceConfigMaps = 
daoMgr.getXXServiceConfigMap().findByServiceId(serviceId);
                if (CollectionUtils.isNotEmpty(xxServiceConfigMaps)) {
@@ -6068,6 +6079,14 @@ public Map<String, String> 
getServiceConfigForPlugin(Long serviceId) {
                                }
                        }
                }
+               Map<String, String> rangerPluginsPrefixConfig = 
PropertiesUtil.getConfigMapWithPrefix(RANGER_PLUGINS_CONFIG_CONF_PREFIX);
+
+               if (MapUtils.isNotEmpty(rangerPluginsPrefixConfig)) {
+                       configs.putAll(rangerPluginsPrefixConfig);
+               }
+               if(LOG.isDebugEnabled()){
+                       LOG.debug("<== 
ServiceDBStore.getServiceConfigForPlugin({}): configs = {}", serviceId, 
configs.keySet());
+               }
                return configs;
        }
 
diff --git a/security-admin/src/main/java/org/apache/ranger/biz/XUserMgr.java 
b/security-admin/src/main/java/org/apache/ranger/biz/XUserMgr.java
index a82d6d6c4..a2e9a336e 100755
--- a/security-admin/src/main/java/org/apache/ranger/biz/XUserMgr.java
+++ b/security-admin/src/main/java/org/apache/ranger/biz/XUserMgr.java
@@ -138,9 +138,6 @@ public class XUserMgr extends XUserMgrBase {
        @Autowired
        ServiceDBStore svcStore;
 
-       @Autowired
-       GUIDUtil guidUtil;
-
        @Autowired
        XUgsyncAuditInfoService xUgsyncAuditInfoService;
 
diff --git 
a/security-admin/src/main/java/org/apache/ranger/common/PropertiesUtil.java 
b/security-admin/src/main/java/org/apache/ranger/common/PropertiesUtil.java
index 7a3185c52..f0efdfe0c 100644
--- a/security-admin/src/main/java/org/apache/ranger/common/PropertiesUtil.java
+++ b/security-admin/src/main/java/org/apache/ranger/common/PropertiesUtil.java
@@ -37,6 +37,7 @@
 import org.apache.ranger.biz.RangerBizUtil;
 import org.apache.ranger.credentialapi.CredentialReader;
 import org.apache.ranger.plugin.util.RangerCommonConstants;
+import org.apache.ranger.ugsyncutil.util.UgsyncCommonConstants;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeansException;
@@ -67,6 +68,7 @@ protected void processProperties(
            propertiesMap.put(keyStr, 
System.getProperties().getProperty(keyStr).trim());
        }
 
+       updateRangerPluginsPropertiesForUserGroup(props);
        // Let's add our properties now
        keySet = props.keySet();
        for (Object key : keySet) {
@@ -444,4 +446,104 @@ public static Properties getProps() {
                }
                return ret;
        }
+
+
+       public static Map<String, String> getConfigMapWithPrefix(String 
confPrefix) {
+               Map<String, String> configMap = new HashMap<>();
+
+               for (Map.Entry<String, String> entry : 
getPropertiesMap().entrySet()) {
+                       String key = entry.getKey();
+
+                       if (key.startsWith(confPrefix)) {
+                               if (StringUtils.isNotEmpty(entry.getValue())) {
+                                       configMap.put(key, entry.getValue());
+                               }
+                       }
+               }
+
+               return configMap;
+       }
+
+       private void updateRangerPluginsPropertiesForUserGroup(Properties 
props) {
+               if (propertiesMap != null) {
+                       String userCaseConv  = 
propertiesMap.get(RangerCommonConstants.PLUGINS_CONF_USERNAME_CASE_CONVERSION_PARAM);
+                       String groupCaseConv = 
propertiesMap.get(RangerCommonConstants.PLUGINS_CONF_GROUPNAME_CASE_CONVERSION_PARAM);
+                       String userHandler   = 
propertiesMap.get(RangerCommonConstants.PLUGINS_CONF_MAPPING_USERNAME_HANDLER);
+                       String groupHandler  = 
propertiesMap.get(RangerCommonConstants.PLUGINS_CONF_MAPPING_GROUPNAME_HANDLER);
+
+                       if (StringUtils.isEmpty(userCaseConv)) {
+                               userCaseConv = 
UgsyncCommonConstants.DEFAULT_UGSYNC_USERNAME_CASE_CONVERSION_VALUE;
+                       }
+
+                       if (StringUtils.isEmpty(groupCaseConv)) {
+                               groupCaseConv = 
UgsyncCommonConstants.DEFAULT_UGSYNC_GROUPNAME_CASE_CONVERSION_VALUE;
+                       }
+
+                       if (StringUtils.isEmpty(userHandler)) {
+                               userHandler = 
UgsyncCommonConstants.DEFAULT_SYNC_MAPPING_USERNAME_HANDLER;
+                       }
+
+                       if (StringUtils.isEmpty(groupHandler)) {
+                               groupHandler = 
UgsyncCommonConstants.DEFAULT_SYNC_MAPPING_GROUPNAME_HANDLER;
+                       }
+
+                       Map<String, String> userNameRegex = 
getAllRegexPatternsConfig(RangerCommonConstants.PLUGINS_CONF_MAPPING_USERNAME);
+                       Map<String, String> groupNameRegex = 
getAllRegexPatternsConfig(RangerCommonConstants.PLUGINS_CONF_MAPPING_GROUPNAME);
+
+                       
propertiesMap.put(RangerCommonConstants.PLUGINS_CONF_USERNAME_CASE_CONVERSION_PARAM,
 userCaseConv);
+                       
propertiesMap.put(RangerCommonConstants.PLUGINS_CONF_GROUPNAME_CASE_CONVERSION_PARAM,
 groupCaseConv);
+                       
propertiesMap.put(RangerCommonConstants.PLUGINS_CONF_MAPPING_USERNAME_HANDLER, 
userHandler);
+                       
propertiesMap.put(RangerCommonConstants.PLUGINS_CONF_MAPPING_GROUPNAME_HANDLER, 
groupHandler);
+                       
propertiesMap.put(RangerCommonConstants.PLUGINS_CONF_MAPPING_SEPARATOR, 
getRegexSeparator());
+                       propertiesMap.putAll(userNameRegex);
+                       propertiesMap.putAll(groupNameRegex);
+
+                       
props.put(RangerCommonConstants.PLUGINS_CONF_USERNAME_CASE_CONVERSION_PARAM, 
userCaseConv);
+                       
props.put(RangerCommonConstants.PLUGINS_CONF_GROUPNAME_CASE_CONVERSION_PARAM, 
groupCaseConv);
+                       
props.put(RangerCommonConstants.PLUGINS_CONF_MAPPING_USERNAME_HANDLER, 
userHandler);
+                       
props.put(RangerCommonConstants.PLUGINS_CONF_MAPPING_GROUPNAME_HANDLER, 
groupHandler);
+                       
props.put(RangerCommonConstants.PLUGINS_CONF_MAPPING_SEPARATOR, 
getRegexSeparator());
+                       props.putAll(userNameRegex);
+                       props.putAll(groupNameRegex);
+               }
+       }
+
+       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 '{}'", val, ret);
+                       }
+               }
+
+               LOG.info("Using {} as the RegEx Separator", ret);
+
+               return ret;
+       }
+
+       private static Map<String, String> getAllRegexPatternsConfig(String 
baseProperty) {
+               Map<String, String> regexPatterns = new HashMap<>();
+               String              baseRegex     = 
PropertiesUtil.getProperty(baseProperty);
+
+               if (baseRegex != null) {
+                       regexPatterns.put(baseProperty, baseRegex);
+
+                       for (int i = 1; true; i++) {
+                               String nextProperty = baseProperty + "." + i;
+                               String nextRegex    = 
PropertiesUtil.getProperty(nextProperty);
+
+                               if (nextRegex == null) {
+                                       break;
+                               }
+
+                               regexPatterns.put(nextProperty, nextRegex);
+                       }
+               }
+
+               return regexPatterns;
+       }
 }
diff --git 
a/security-admin/src/main/java/org/apache/ranger/common/RangerServicePoliciesCache.java
 
b/security-admin/src/main/java/org/apache/ranger/common/RangerServicePoliciesCache.java
index a1330cf0e..76c979383 100644
--- 
a/security-admin/src/main/java/org/apache/ranger/common/RangerServicePoliciesCache.java
+++ 
b/security-admin/src/main/java/org/apache/ranger/common/RangerServicePoliciesCache.java
@@ -369,7 +369,10 @@ ServicePolicies getLatestOrCached(String serviceName, 
ServiceStore serviceStore,
                                                                if 
(isDeltaCacheReinitialized) {
                                                                        
this.deltaCache = new ServicePolicyDeltasCache(lastKnownVersion, 
servicePoliciesForDeltas);
                                                                }
+                                                               
LOG.debug("servicePoliciesForDeltas = {}", 
servicePoliciesForDeltas.getServiceConfig());
                                                                ret = 
servicePoliciesForDeltas;
+
+                                                               LOG.debug("ret 
= {}", ret.getServiceConfig());
                                                        } else {
                                                                
LOG.warn("Deltas were requested for service:[" + serviceName + "], but could 
not get them!! lastKnownVersion:[" + lastKnownVersion + "]; Returning cached 
ServicePolicies:[" + (servicePolicies != null ? 
servicePolicies.getPolicyVersion() : -1L) + "]");
 
diff --git 
a/security-admin/src/main/java/org/apache/ranger/rest/ServiceREST.java 
b/security-admin/src/main/java/org/apache/ranger/rest/ServiceREST.java
index d3fe90a0e..1e11d5234 100644
--- a/security-admin/src/main/java/org/apache/ranger/rest/ServiceREST.java
+++ b/security-admin/src/main/java/org/apache/ranger/rest/ServiceREST.java
@@ -3281,6 +3281,7 @@ public ServicePolicies getSecureServicePoliciesIfUpdated(
                        boolean logError = httpCode != 
HttpServletResponse.SC_NOT_MODIFIED;
                        throw restErrorUtil.createRESTException(httpCode, 
logMsg, logError);
                }
+               LOG.debug("ServiceREST.getSecureServicePoliciesIfUpdated(): 
configs ={}", ret == null ? ret : ret.getServiceConfig());
                if (LOG.isDebugEnabled()) {
                        LOG.debug("<== 
ServiceREST.getSecureServicePoliciesIfUpdated(" + serviceName + ", " + 
lastKnownVersion + ", " + lastActivationTime + ", " + pluginId + ", " + 
clusterName + ", " + supportsPolicyDeltas + "): count=" + ((ret == null || 
ret.getPolicies() == null) ? 0 : ret.getPolicies().size()));
                }
diff --git a/ugsync-util/pom.xml b/ugsync-util/pom.xml
index 51f559216..fb1bab7fc 100644
--- a/ugsync-util/pom.xml
+++ b/ugsync-util/pom.xml
@@ -47,6 +47,23 @@
             <groupId>com.google.code.gson</groupId>
             <artifactId>gson</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+            <version>${slf4j-api.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter-api</artifactId>
+            <version>${junit.jupiter.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.junit.vintage</groupId>
+            <artifactId>junit-vintage-engine</artifactId>
+            <version>${junit.jupiter.version}</version>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
     <profiles>
@@ -71,6 +88,7 @@
                     <artifactId>jaxb-api</artifactId>
                     <version>2.3.1</version>
                 </dependency>
+
             </dependencies>
         </profile>
     </profiles>
diff --git 
a/ugsync/src/main/java/org/apache/ranger/usergroupsync/AbstractMapper.java 
b/ugsync-util/src/main/java/org/apache/ranger/ugsyncutil/transform/AbstractMapper.java
similarity index 67%
rename from 
ugsync/src/main/java/org/apache/ranger/usergroupsync/AbstractMapper.java
rename to 
ugsync-util/src/main/java/org/apache/ranger/ugsyncutil/transform/AbstractMapper.java
index bbbc3c4d1..bc3ef4497 100644
--- a/ugsync/src/main/java/org/apache/ranger/usergroupsync/AbstractMapper.java
+++ 
b/ugsync-util/src/main/java/org/apache/ranger/ugsyncutil/transform/AbstractMapper.java
@@ -17,25 +17,24 @@
  * under the License.
  */
 
-package org.apache.ranger.usergroupsync;
+package org.apache.ranger.ugsyncutil.transform;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public abstract class AbstractMapper implements Mapper {
-       
-       protected static final Logger logger = 
LoggerFactory.getLogger(AbstractMapper.class);
-
-       @Override
-       public void init(String baseProperty) {
-               // TODO Auto-generated method stub
+import java.util.List;
 
-       }
+public abstract class AbstractMapper implements Mapper {
+    protected static final Logger logger = 
LoggerFactory.getLogger(AbstractMapper.class);
 
-       @Override
-       public String transform(String attrValue) {
-               // TODO Auto-generated method stub
-               return null;
-       }
+    @Override
+    public void init(String baseProperty, List<String> regexPatterns, String 
regexSeparator) {
+        // TODO Auto-generated method stub
+    }
 
+    @Override
+    public String transform(String attrValue) {
+        // TODO Auto-generated method stub
+        return null;
+    }
 }
diff --git a/ugsync/src/main/java/org/apache/ranger/usergroupsync/Mapper.java 
b/ugsync-util/src/main/java/org/apache/ranger/ugsyncutil/transform/Mapper.java
similarity index 84%
rename from ugsync/src/main/java/org/apache/ranger/usergroupsync/Mapper.java
rename to 
ugsync-util/src/main/java/org/apache/ranger/ugsyncutil/transform/Mapper.java
index 696c66530..f2314407a 100644
--- a/ugsync/src/main/java/org/apache/ranger/usergroupsync/Mapper.java
+++ 
b/ugsync-util/src/main/java/org/apache/ranger/ugsyncutil/transform/Mapper.java
@@ -17,10 +17,12 @@
  * under the License.
  */
 
-package org.apache.ranger.usergroupsync;
+package org.apache.ranger.ugsyncutil.transform;
+
+import java.util.List;
 
 public interface Mapper {
-       void init(String baseProperty);
+    void init(String baseProperty, List<String> regexPatterns, String 
regexSeparator);
 
     String transform(String attrValue);
 }
diff --git a/ugsync/src/main/java/org/apache/ranger/usergroupsync/RegEx.java 
b/ugsync-util/src/main/java/org/apache/ranger/ugsyncutil/transform/RegEx.java
similarity index 85%
rename from ugsync/src/main/java/org/apache/ranger/usergroupsync/RegEx.java
rename to 
ugsync-util/src/main/java/org/apache/ranger/ugsyncutil/transform/RegEx.java
index 9e5ca4ca5..6190a85b0 100644
--- a/ugsync/src/main/java/org/apache/ranger/usergroupsync/RegEx.java
+++ 
b/ugsync-util/src/main/java/org/apache/ranger/ugsyncutil/transform/RegEx.java
@@ -17,17 +17,14 @@
  * under the License.
  */
 
-package org.apache.ranger.usergroupsync;
+package org.apache.ranger.ugsyncutil.transform;
 
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
-import org.apache.ranger.unixusersync.config.UserGroupSyncConfig;
-
 public class RegEx extends AbstractMapper {
-       private UserGroupSyncConfig config = UserGroupSyncConfig.getInstance();
        private LinkedHashMap<String, String> replacementPattern;
 
        public LinkedHashMap<String, String> getReplacementPattern() {
@@ -35,18 +32,16 @@ public LinkedHashMap<String, String> 
getReplacementPattern() {
        }
 
        @Override
-       public void init (String baseProperty) {
+       public void init (String baseProperty, List<String> regexPatterns, 
String regexSeparator) {
                logger.info("Initializing for " + baseProperty);
                try {
-                       List<String> regexPatterns = 
config.getAllRegexPatterns(baseProperty);
-                       String regexSeparator = config.getRegexSeparator();
                        populateReplacementPatterns(baseProperty, 
regexPatterns, regexSeparator);
                } catch (Throwable t) {
                        logger.error("Failed to initialize " + baseProperty, 
t.fillInStackTrace());
                }
        }
 
-       protected void populateReplacementPatterns(String baseProperty, 
List<String> regexPatterns, String regexSeparator) throws Throwable {
+       void populateReplacementPatterns(String baseProperty, List<String> 
regexPatterns, String regexSeparator) throws Throwable {
                replacementPattern = new LinkedHashMap<String, String>();
                String regex = String.format("s%s([^%s]*)%s([^%s]*)%s(g)?", 
regexSeparator, regexSeparator, regexSeparator, regexSeparator, regexSeparator);
                Pattern p = Pattern.compile(regex);
diff --git 
a/ugsync-util/src/main/java/org/apache/ranger/ugsyncutil/util/UgsyncCommonConstants.java
 
b/ugsync-util/src/main/java/org/apache/ranger/ugsyncutil/util/UgsyncCommonConstants.java
index f20bf9196..eb132b6ab 100644
--- 
a/ugsync-util/src/main/java/org/apache/ranger/ugsyncutil/util/UgsyncCommonConstants.java
+++ 
b/ugsync-util/src/main/java/org/apache/ranger/ugsyncutil/util/UgsyncCommonConstants.java
@@ -20,10 +20,45 @@
 package org.apache.ranger.ugsyncutil.util;
 
 public class UgsyncCommonConstants {
+    public enum CaseConversion { NONE, TO_LOWER, TO_UPPER }
 
     public static final String ORIGINAL_NAME = "original_name";
     public static final String FULL_NAME = "full_name";
     public static final String SYNC_SOURCE = "sync_source";
     public static final String LDAP_URL = "ldap_url";
 
+    public static final String UGSYNC_NONE_CASE_CONVERSION_VALUE = "none";
+    public static final String UGSYNC_LOWER_CASE_CONVERSION_VALUE = "lower";
+    public static final String UGSYNC_UPPER_CASE_CONVERSION_VALUE = "upper";
+
+    public static final String UGSYNC_USERNAME_CASE_CONVERSION_PARAM = 
"ranger.usersync.ldap.username.caseconversion";
+    public static final String DEFAULT_UGSYNC_USERNAME_CASE_CONVERSION_VALUE = 
UGSYNC_NONE_CASE_CONVERSION_VALUE;
+
+    public static final String UGSYNC_GROUPNAME_CASE_CONVERSION_PARAM = 
"ranger.usersync.ldap.groupname.caseconversion";
+    public static final String DEFAULT_UGSYNC_GROUPNAME_CASE_CONVERSION_VALUE 
= UGSYNC_NONE_CASE_CONVERSION_VALUE;
+
+    public static final String SYNC_MAPPING_USERNAME = 
"ranger.usersync.mapping.username.regex";
+
+    public static final String SYNC_MAPPING_GROUPNAME = 
"ranger.usersync.mapping.groupname.regex";
+
+    public static final String SYNC_MAPPING_USERNAME_HANDLER = 
"ranger.usersync.mapping.username.handler";
+    public static final String DEFAULT_SYNC_MAPPING_USERNAME_HANDLER = 
"org.apache.ranger.ugsyncutil.transform.RegEx";
+
+    public static final String SYNC_MAPPING_GROUPNAME_HANDLER = 
"ranger.usersync.mapping.groupname.handler";
+    public static final String DEFAULT_SYNC_MAPPING_GROUPNAME_HANDLER = 
"org.apache.ranger.ugsyncutil.transform.RegEx";
+
+    public static final String SYNC_MAPPING_SEPARATOR = 
"ranger.usersync.mapping.regex.separator";
+
+    public static final String DEFAULT_MAPPING_SEPARATOR = "/";
+
+    public static CaseConversion toCaseConversion(String value) {
+        if (UGSYNC_LOWER_CASE_CONVERSION_VALUE.equalsIgnoreCase(value)) {
+            return CaseConversion.TO_LOWER;
+        } else if (UGSYNC_UPPER_CASE_CONVERSION_VALUE.equalsIgnoreCase(value)) 
{
+            return CaseConversion.TO_UPPER;
+        } else {
+            return CaseConversion.NONE;
+        }
+    }
+
 }
diff --git 
a/ugsync/src/test/java/org/apache/ranger/usergroupsync/TestRegEx.java 
b/ugsync-util/src/test/java/org/apache/ranger/ugsyncutil/transform/TestRegEx.java
similarity index 99%
rename from ugsync/src/test/java/org/apache/ranger/usergroupsync/TestRegEx.java
rename to 
ugsync-util/src/test/java/org/apache/ranger/ugsyncutil/transform/TestRegEx.java
index 1be5fc4ab..cc531c649 100644
--- a/ugsync/src/test/java/org/apache/ranger/usergroupsync/TestRegEx.java
+++ 
b/ugsync-util/src/test/java/org/apache/ranger/ugsyncutil/transform/TestRegEx.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package org.apache.ranger.usergroupsync;
+package org.apache.ranger.ugsyncutil.transform;
 
 import static org.junit.Assert.*;
 
diff --git 
a/ugsync/src/main/java/org/apache/ranger/unixusersync/config/UserGroupSyncConfig.java
 
b/ugsync/src/main/java/org/apache/ranger/unixusersync/config/UserGroupSyncConfig.java
index c65e08ffa..bdcae4b75 100644
--- 
a/ugsync/src/main/java/org/apache/ranger/unixusersync/config/UserGroupSyncConfig.java
+++ 
b/ugsync/src/main/java/org/apache/ranger/unixusersync/config/UserGroupSyncConfig.java
@@ -37,6 +37,7 @@
 import org.apache.ranger.credentialapi.CredentialReader;
 import org.apache.ranger.plugin.util.RangerCommonConstants;
 import org.apache.ranger.plugin.util.XMLUtils;
+import org.apache.ranger.ugsyncutil.util.UgsyncCommonConstants;
 import org.apache.ranger.unixusersync.ha.UserSyncHAInitializerImpl;
 import org.apache.ranger.usergroupsync.UserGroupSink;
 import org.apache.ranger.usergroupsync.UserGroupSource;
@@ -247,19 +248,6 @@ public class UserGroupSyncConfig  {
        private static final String LGSYNC_REFERRAL = 
"ranger.usersync.ldap.referral";
        private static final String DEFAULT_LGSYNC_REFERRAL = "follow";
 
-       public static final String SYNC_MAPPING_USERNAME = 
"ranger.usersync.mapping.username.regex";
-
-       public static final String SYNC_MAPPING_GROUPNAME = 
"ranger.usersync.mapping.groupname.regex";
-
-       private static final String SYNC_MAPPING_USERNAME_HANDLER = 
"ranger.usersync.mapping.username.handler";
-       private static final String DEFAULT_SYNC_MAPPING_USERNAME_HANDLER = 
"org.apache.ranger.usergroupsync.RegEx";
-
-       private static final String SYNC_MAPPING_GROUPNAME_HANDLER = 
"ranger.usersync.mapping.groupname.handler";
-       private static final String DEFAULT_SYNC_MAPPING_GROUPNAME_HANDLER = 
"org.apache.ranger.usergroupsync.RegEx";
-
-       private static final String SYNC_MAPPING_SEPARATOR = 
"ranger.usersync.mapping.regex.separator";
-
-       private static final String DEFAULT_MAPPING_SEPARATOR = "/";
     private static final String ROLE_ASSIGNMENT_LIST_DELIMITER = 
"ranger.usersync.role.assignment.list.delimiter";
 
     private static final String USERS_GROUPS_ASSIGNMENT_LIST_DELIMITER = 
"ranger.usersync.users.groups.assignment.list.delimiter";
@@ -1068,19 +1056,19 @@ public List<String> getAllRegexPatterns(String 
baseProperty) throws Throwable {
        }
 
        public String getUserSyncMappingUserNameHandler() {
-               String val =  prop.getProperty(SYNC_MAPPING_USERNAME_HANDLER);
+               String val =  
prop.getProperty(UgsyncCommonConstants.SYNC_MAPPING_USERNAME_HANDLER);
 
                if(val == null) {
-                       val = DEFAULT_SYNC_MAPPING_USERNAME_HANDLER;
+                       val = 
UgsyncCommonConstants.DEFAULT_SYNC_MAPPING_USERNAME_HANDLER;
                }
                return val;
        }
 
        public String getUserSyncMappingGroupNameHandler() {
-               String val =  prop.getProperty(SYNC_MAPPING_GROUPNAME_HANDLER);
+               String val =  
prop.getProperty(UgsyncCommonConstants.SYNC_MAPPING_GROUPNAME_HANDLER);
 
                if(val == null) {
-                       val = DEFAULT_SYNC_MAPPING_GROUPNAME_HANDLER;
+                       val = 
UgsyncCommonConstants.DEFAULT_SYNC_MAPPING_GROUPNAME_HANDLER;
                }
                return val;
        }
@@ -1168,14 +1156,10 @@ public boolean isStartTlsEnabled() {
        }
 
        public boolean isDeltaSyncEnabled() {
-               boolean deltaSyncEnabled;
                String val = prop.getProperty(LGSYNC_LDAP_DELTASYNC_ENABLED);
-               if(val == null || val.trim().isEmpty()) {
-                       deltaSyncEnabled = 
DEFAULT_LGSYNC_LDAP_DELTASYNC_ENABLED;
-               } else {
-                       deltaSyncEnabled  = Boolean.valueOf(val);
-               }
-               return deltaSyncEnabled;
+
+               return StringUtils.isBlank(val) ? 
DEFAULT_LGSYNC_LDAP_DELTASYNC_ENABLED : Boolean.parseBoolean(val);
+
        }
 
        /* Used only for unit testing */
@@ -1368,8 +1352,8 @@ public boolean isUserSyncNameValidationEnabled() {
        }
 
        public String getRegexSeparator() {
-               String ret = DEFAULT_MAPPING_SEPARATOR;
-               String val = prop.getProperty(SYNC_MAPPING_SEPARATOR);
+               String ret = UgsyncCommonConstants.DEFAULT_MAPPING_SEPARATOR;
+               String val = 
prop.getProperty(UgsyncCommonConstants.SYNC_MAPPING_SEPARATOR);
                if(StringUtils.isNotEmpty(val)) {
                        if (val.length() == 1) {
                                ret = val;
diff --git 
a/ugsync/src/main/java/org/apache/ranger/unixusersync/process/PolicyMgrUserGroupBuilder.java
 
b/ugsync/src/main/java/org/apache/ranger/unixusersync/process/PolicyMgrUserGroupBuilder.java
index 277d33b20..5746d793e 100644
--- 
a/ugsync/src/main/java/org/apache/ranger/unixusersync/process/PolicyMgrUserGroupBuilder.java
+++ 
b/ugsync/src/main/java/org/apache/ranger/unixusersync/process/PolicyMgrUserGroupBuilder.java
@@ -160,22 +160,22 @@ public PolicyMgrUserGroupBuilder() {
 
                String userNameCaseConversion = 
config.getUserNameCaseConversion();
 
-               if 
(UserGroupSyncConfig.UGSYNC_NONE_CASE_CONVERSION_VALUE.equalsIgnoreCase(userNameCaseConversion))
 {
+               if 
(UgsyncCommonConstants.UGSYNC_NONE_CASE_CONVERSION_VALUE.equalsIgnoreCase(userNameCaseConversion))
 {
                        userNameCaseConversionFlag = false;
                }
                else {
                        userNameCaseConversionFlag = true;
-                       userNameLowerCaseFlag = 
UserGroupSyncConfig.UGSYNC_LOWER_CASE_CONVERSION_VALUE.equalsIgnoreCase(userNameCaseConversion);
+                       userNameLowerCaseFlag = 
UgsyncCommonConstants.UGSYNC_LOWER_CASE_CONVERSION_VALUE.equalsIgnoreCase(userNameCaseConversion);
                }
 
                String groupNameCaseConversion = 
config.getGroupNameCaseConversion();
 
-               if 
(UserGroupSyncConfig.UGSYNC_NONE_CASE_CONVERSION_VALUE.equalsIgnoreCase(groupNameCaseConversion))
 {
+               if 
(UgsyncCommonConstants.UGSYNC_NONE_CASE_CONVERSION_VALUE.equalsIgnoreCase(groupNameCaseConversion))
 {
                        groupNameCaseConversionFlag = false;
                }
                else {
                        groupNameCaseConversionFlag = true;
-                       groupNameLowerCaseFlag = 
UserGroupSyncConfig.UGSYNC_LOWER_CASE_CONVERSION_VALUE.equalsIgnoreCase(groupNameCaseConversion);
+                       groupNameLowerCaseFlag = 
UgsyncCommonConstants.UGSYNC_LOWER_CASE_CONVERSION_VALUE.equalsIgnoreCase(groupNameCaseConversion);
                }
        }
 
diff --git 
a/ugsync/src/main/java/org/apache/ranger/usergroupsync/AbstractUserGroupSource.java
 
b/ugsync/src/main/java/org/apache/ranger/usergroupsync/AbstractUserGroupSource.java
index 18d2d3ef7..4e171e17b 100644
--- 
a/ugsync/src/main/java/org/apache/ranger/usergroupsync/AbstractUserGroupSource.java
+++ 
b/ugsync/src/main/java/org/apache/ranger/usergroupsync/AbstractUserGroupSource.java
@@ -18,54 +18,54 @@
  */
 package org.apache.ranger.usergroupsync;
 
+import org.apache.ranger.ugsyncutil.transform.Mapper;
+import org.apache.ranger.ugsyncutil.util.UgsyncCommonConstants;
 import org.apache.ranger.unixusersync.config.UserGroupSyncConfig;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public abstract class AbstractUserGroupSource {
-
     private static final Logger LOG = 
LoggerFactory.getLogger(AbstractUserGroupSource.class);
 
-    protected UserGroupSyncConfig config = UserGroupSyncConfig.getInstance();
+    protected final UserGroupSyncConfig config = 
UserGroupSyncConfig.getInstance();
+    protected final Mapper              userNameRegExInst;
+    protected final Mapper              groupNameRegExInst;
 
-    protected Mapper userNameRegExInst = null;
-    protected Mapper groupNameRegExInst = null;
+    public AbstractUserGroupSource() {
+        String mappingUserNameHandler  = 
config.getUserSyncMappingUserNameHandler();
+        String mappingGroupNameHandler = 
config.getUserSyncMappingGroupNameHandler();
+        Mapper userNameRegExInst       = null;
+        Mapper groupNameRegExInst      = null;
 
+        if (mappingUserNameHandler != null) {
+            try {
+                Class<Mapper> regExClass = (Class<Mapper>) 
Class.forName(mappingUserNameHandler);
 
-    public AbstractUserGroupSource() {
-        String mappingUserNameHandler = 
config.getUserSyncMappingUserNameHandler();
-        try {
-            if (mappingUserNameHandler != null) {
-                Class<Mapper> regExClass = 
(Class<Mapper>)Class.forName(mappingUserNameHandler);
                 userNameRegExInst = regExClass.newInstance();
-                if (userNameRegExInst != null) {
-                    
userNameRegExInst.init(UserGroupSyncConfig.SYNC_MAPPING_USERNAME);
-                } else {
-                    LOG.error("RegEx handler instance for username is null!");
-                }
+
+                
userNameRegExInst.init(UgsyncCommonConstants.SYNC_MAPPING_USERNAME, 
config.getAllRegexPatterns(UgsyncCommonConstants.SYNC_MAPPING_USERNAME), 
config.getRegexSeparator());
+            } catch (ClassNotFoundException cne) {
+                LOG.error("Failed to load {}: {}", mappingUserNameHandler, 
cne);
+            } catch (Throwable te) {
+                LOG.error("Failed to instantiate {}: {}", 
mappingUserNameHandler, te);
             }
-        } catch (ClassNotFoundException cne) {
-            LOG.error("Failed to load " + mappingUserNameHandler + " " + cne);
-        } catch (Throwable te) {
-            LOG.error("Failed to instantiate " + mappingUserNameHandler + " " 
+ te);
         }
 
-        String mappingGroupNameHandler = 
config.getUserSyncMappingGroupNameHandler();
-        try {
-            if (mappingGroupNameHandler != null) {
-                Class<Mapper> regExClass = 
(Class<Mapper>)Class.forName(mappingGroupNameHandler);
+        if (mappingGroupNameHandler != null) {
+            try {
+                Class<Mapper> regExClass = (Class<Mapper>) 
Class.forName(mappingGroupNameHandler);
+
                 groupNameRegExInst = regExClass.newInstance();
-                if (groupNameRegExInst != null) {
-                    
groupNameRegExInst.init(UserGroupSyncConfig.SYNC_MAPPING_GROUPNAME);
-                } else {
-                    LOG.error("RegEx handler instance for groupname is null!");
-                }
+
+                
groupNameRegExInst.init(UgsyncCommonConstants.SYNC_MAPPING_GROUPNAME, 
config.getAllRegexPatterns(UgsyncCommonConstants.SYNC_MAPPING_GROUPNAME), 
config.getRegexSeparator());
+            } catch (ClassNotFoundException cne) {
+                LOG.error("Failed to load {}: {}", mappingGroupNameHandler, 
cne);
+            } catch (Throwable te) {
+                LOG.error("Failed to instantiate {}: {}", 
mappingGroupNameHandler, te);
             }
-        } catch (ClassNotFoundException cne) {
-            LOG.error("Failed to load " + mappingGroupNameHandler + " " + cne);
-        } catch (Throwable te) {
-            LOG.error("Failed to instantiate " + mappingGroupNameHandler + " " 
+ te);
         }
-    }
 
+        this.userNameRegExInst  = userNameRegExInst;
+        this.groupNameRegExInst = groupNameRegExInst;
+    }
 }
diff --git 
a/ugsync/src/test/java/org/apache/ranger/unixusersync/process/TestFileSourceUserGroupBuilder.java
 
b/ugsync/src/test/java/org/apache/ranger/unixusersync/process/TestFileSourceUserGroupBuilder.java
index 6b01ba7ad..4cdbe03e6 100644
--- 
a/ugsync/src/test/java/org/apache/ranger/unixusersync/process/TestFileSourceUserGroupBuilder.java
+++ 
b/ugsync/src/test/java/org/apache/ranger/unixusersync/process/TestFileSourceUserGroupBuilder.java
@@ -21,6 +21,7 @@
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.assertEquals;
 
+import org.apache.ranger.ugsyncutil.util.UgsyncCommonConstants;
 import org.apache.ranger.unixusersync.config.UserGroupSyncConfig;
 import org.apache.ranger.usergroupsync.PolicyMgrUserGroupBuilderTest;
 import org.junit.Test;
@@ -90,7 +91,8 @@ public void 
testUpdateSinkFromCsvFileMisSpelledDelimiterProperty() throws Throwa
         sink.init();
         fileBuilder.updateSink(sink);
 
-        assertEquals(4, sink.getTotalUsers());
+        assertEquals(4,
+                sink.getTotalUsers());
         assertEquals(2, sink.getTotalGroups());
 
         assertTrue(sink.getAllUsers().contains("user1"));
@@ -135,10 +137,10 @@ public void testUpdateSinkWithUserAndGroupMapping() 
throws Throwable {
         config.setProperty(UserGroupSyncConfig.UGSYNC_SOURCE_FILE_PROC, 
"src/test/resources/usergroups-dns.csv");
         config.setProperty(UserGroupSyncConfig.UGSYNC_SOURCE_FILE_DELIMITERER, 
"|");
 
-        config.setProperty(UserGroupSyncConfig.SYNC_MAPPING_USERNAME, 
"s/[=]/_/g");
-        config.setProperty(UserGroupSyncConfig.SYNC_MAPPING_USERNAME + ".1", 
"s/[,]//g");
+        config.setProperty(UgsyncCommonConstants.SYNC_MAPPING_USERNAME, 
"s/[=]/_/g");
+        config.setProperty(UgsyncCommonConstants.SYNC_MAPPING_USERNAME + ".1", 
"s/[,]//g");
 
-        config.setProperty(UserGroupSyncConfig.SYNC_MAPPING_GROUPNAME, 
"s/[=]//g");
+        config.setProperty(UgsyncCommonConstants.SYNC_MAPPING_GROUPNAME, 
"s/[=]//g");
 
         FileSourceUserGroupBuilder fileBuilder = new 
FileSourceUserGroupBuilder();
         fileBuilder.init();
diff --git 
a/ugsync/src/test/java/org/apache/ranger/usergroupsync/TestLdapUserGroup.java 
b/ugsync/src/test/java/org/apache/ranger/usergroupsync/TestLdapUserGroup.java
index 2011b5b75..6a7258852 100644
--- 
a/ugsync/src/test/java/org/apache/ranger/usergroupsync/TestLdapUserGroup.java
+++ 
b/ugsync/src/test/java/org/apache/ranger/usergroupsync/TestLdapUserGroup.java
@@ -32,6 +32,7 @@
 import org.apache.directory.server.ldap.LdapServer;
 import org.apache.directory.server.protocol.shared.transport.TcpTransport;
 import org.apache.ranger.ldapusersync.process.LdapUserGroupBuilder;
+import org.apache.ranger.ugsyncutil.util.UgsyncCommonConstants;
 import org.apache.ranger.unixusersync.config.UserGroupSyncConfig;
 import org.junit.After;
 import org.junit.Assert;
@@ -405,8 +406,8 @@ public void testUpdateSinkWithUserGroupMapping() throws 
Throwable {
                config.setGroupSearchEnabled(true);
                config.setGroupSearchFirstEnabled(false);
 
-               config.setProperty(UserGroupSyncConfig.SYNC_MAPPING_USERNAME, 
"s/[=]/_/g");
-               config.setProperty(UserGroupSyncConfig.SYNC_MAPPING_GROUPNAME, 
"s/[=]/_/g");
+               config.setProperty(UgsyncCommonConstants.SYNC_MAPPING_USERNAME, 
"s/[=]/_/g");
+               
config.setProperty(UgsyncCommonConstants.SYNC_MAPPING_GROUPNAME, "s/[=]/_/g");
                sink = new PolicyMgrUserGroupBuilderTest();
 
                ldapBuilder.init();

Reply via email to