This is an automated email from the ASF dual-hosted git repository. dhavalshah9131 pushed a commit to branch ds_RANGER-5215_us in repository https://gitbox.apache.org/repos/asf/ranger.git
commit 1cb0138553e3931a9076e934eb51d1a6b3df4a5e Author: dhavalshah9131 <dhavalshah9...@gmail.com> AuthorDate: Mon Jun 2 17:01:27 2025 +0530 RANGER-5215 : Policy authroisation fails for Ranger Plugins in case of users/groups converted by Ranger userysnc as per given Regex --- agents-common/pom.xml | 19 + .../plugin/model/UgsyncNameTransformRules.java | 66 ++++ .../plugin/policyengine/RangerPluginContext.java | 39 +- .../policyengine/RangerPolicyEngineImpl.java | 73 ++++ .../service/RangerDefaultRequestProcessor.java | 68 +++- .../ranger/plugin/util/RangerCommonConstants.java | 29 +- .../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-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-solr.xml | 1 + distro/src/main/assembly/plugin-sqoop.xml | 1 + distro/src/main/assembly/plugin-trino.xml | 1 + distro/src/main/assembly/ranger-tools.xml | 1 + 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 | 329 +++++++++------- .../main/java/org/apache/ranger/biz/XUserMgr.java | 3 - .../ranger/common/RangerServicePoliciesCache.java | 10 +- .../java/org/apache/ranger/rest/ServiceREST.java | 6 + ugsync-util/pom.xml | 23 ++ .../ugsyncutil/transform}/AbstractMapper.java | 6 +- .../ranger/ugsyncutil/transform}/Mapper.java | 6 +- .../apache/ranger/ugsyncutil/transform}/RegEx.java | 23 +- .../ugsyncutil/util/UgsyncCommonConstants.java | 24 ++ .../ranger/ugsynutil/transform}/TestRegEx.java | 36 +- .../unixusersync/config/UserGroupSyncConfig.java | 415 ++++++++++----------- .../process/PolicyMgrUserGroupBuilder.java | 8 +- .../usergroupsync/AbstractUserGroupSource.java | 9 +- .../process/TestFileSourceUserGroupBuilder.java | 7 +- .../ranger/usergroupsync/TestLdapUserGroup.java | 5 +- 41 files changed, 803 insertions(+), 423 deletions(-) diff --git a/agents-common/pom.xml b/agents-common/pom.xml index 84396bba5..57c90a442 100644 --- a/agents-common/pom.xml +++ b/agents-common/pom.xml @@ -172,6 +172,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/model/UgsyncNameTransformRules.java b/agents-common/src/main/java/org/apache/ranger/plugin/model/UgsyncNameTransformRules.java new file mode 100644 index 000000000..4353fd44a --- /dev/null +++ b/agents-common/src/main/java/org/apache/ranger/plugin/model/UgsyncNameTransformRules.java @@ -0,0 +1,66 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + *=-0987654321`o6 bftware distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.ranger.plugin.model; + +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import org.apache.ranger.plugin.util.RangerUserStoreUtil; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlRootElement; + +import java.util.Map; + +@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY) +@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +@XmlRootElement +@XmlAccessorType(XmlAccessType.FIELD) +public class UgsyncNameTransformRules extends RangerBaseModelObject implements java.io.Serializable { + + private static final long serialVersionUID = 1L; + Map<String, String> nameTransformRules; + private final String name; + + public UgsyncNameTransformRules() {this(null, null, null);} + + public UgsyncNameTransformRules(String guid, String name, Map<String, String> nameTransformRules) { + super(); + setGuid(guid); + setId(Long.valueOf(1)); + setVersion(Long.valueOf(1)); + this.name = name; + this.nameTransformRules = nameTransformRules; + } + + public String getName() { + return name; + } + + public Map<String, String> getNameTransformRules() { + return nameTransformRules; + } + + @Override + public String toString() { + return "{nameTransformRules=" + RangerUserStoreUtil.getPrintableOptions(nameTransformRules) + + "}"; + } +} \ No newline at end of file diff --git a/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPluginContext.java b/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPluginContext.java index ae8be46f4..f20119661 100644 --- a/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPluginContext.java +++ b/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPluginContext.java @@ -27,6 +27,7 @@ import org.apache.ranger.plugin.resourcematcher.RangerResourceMatcher; import org.apache.ranger.plugin.service.RangerAuthContext; import org.apache.ranger.plugin.service.RangerAuthContextListener; +import org.apache.ranger.ugsyncutil.transform.Mapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -39,7 +40,11 @@ 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 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(true);// fair lock + private Mapper userNameTransformInst; + private Mapper groupNameTransformInst; + private String userNameCaseConversion; + private String groupNameCaseConversion; private RangerAuthContext authContext; private RangerAuthContextListener authContextListener; private RangerAdminClient adminClient; @@ -48,6 +53,38 @@ public RangerPluginContext(RangerPluginConfig config) { this.config = config; } + public Mapper getUserNameTransformInst() { + return userNameTransformInst; + } + + public void setUserNameTransformInst(Mapper userNameTransformInst) { + this.userNameTransformInst = userNameTransformInst; + } + + public Mapper getGroupNameTransformInst() { + return groupNameTransformInst; + } + + public void setGroupNameTransformInst(Mapper groupNameTransformInst) { + this.groupNameTransformInst = groupNameTransformInst; + } + + public String getUserNameCaseConversion() { + return userNameCaseConversion; + } + + public void setUserNameCaseConversion(String userNameCaseConversion) { + this.userNameCaseConversion = userNameCaseConversion; + } + + public String getGroupNameCaseConversion() { + return groupNameCaseConversion; + } + + public void setGroupNameCaseConversion(String groupNameCaseConversion) { + this.groupNameCaseConversion = groupNameCaseConversion; + } + public RangerPluginConfig getConfig() { return config; } diff --git a/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPolicyEngineImpl.java b/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPolicyEngineImpl.java index 15628e458..bc8538fbf 100644 --- a/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPolicyEngineImpl.java +++ b/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPolicyEngineImpl.java @@ -40,6 +40,7 @@ import org.apache.ranger.plugin.util.RangerReadWriteLock; import org.apache.ranger.plugin.util.RangerRoles; import org.apache.ranger.plugin.util.ServicePolicies; +import org.apache.ranger.ugsyncutil.transform.Mapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -83,6 +84,53 @@ public RangerPolicyEngineImpl(ServicePolicies servicePolicies, RangerPluginConte policyEngine = new PolicyEngine(servicePolicies, pluginContext, roles, isUseReadWriteLock); serviceConfig = new ServiceConfig(servicePolicies.getServiceConfig()); requestProcessor = new RangerDefaultRequestProcessor(policyEngine); + + Map<String, String> serviceConfigMap = servicePolicies.getServiceConfig(); + if (MapUtils.isNotEmpty(serviceConfigMap)) { + if (LOG.isDebugEnabled()) { + LOG.debug("==> RangerBasePlugin(" + serviceConfigMap.keySet() + ")"); + } + pluginContext.setUserNameCaseConversion(serviceConfigMap.get(RangerCommonConstants.PLUGINS_USERNAME_CASE_CONVERSION_PARAM)); + pluginContext.setGroupNameCaseConversion(serviceConfigMap.get(RangerCommonConstants.PLUGINS_GROUPNAME_CASE_CONVERSION_PARAM)); + String mappingUserNameHandler = serviceConfigMap.get(RangerCommonConstants.PLUGINS_MAPPING_USERNAME_HANDLER); + try { + if (mappingUserNameHandler != null) { + Class<Mapper> regExClass = (Class<Mapper>) Class.forName(mappingUserNameHandler); + Mapper userNameRegExInst = regExClass.newInstance(); + if (userNameRegExInst != null) { + String baseProperty = RangerCommonConstants.PLUGINS_MAPPING_USERNAME; + userNameRegExInst.init(baseProperty, getAllRegexPatterns(baseProperty, serviceConfigMap), + serviceConfigMap.get(RangerCommonConstants.PLUGINS_MAPPING_SEPARATOR)); + pluginContext.setUserNameTransformInst(userNameRegExInst); + } else { + LOG.error("RegEx handler instance for username is null!"); + } + } + } catch (ClassNotFoundException cne) { + LOG.error("Failed to load " + mappingUserNameHandler + " " + cne); + } catch (Throwable te) { + LOG.error("Failed to instantiate " + mappingUserNameHandler + " " + te); + } + String mappingGroupNameHandler = serviceConfigMap.get(RangerCommonConstants.PLUGINS_MAPPING_GROUPNAME_HANDLER); + try { + if (mappingGroupNameHandler != null) { + Class<Mapper> regExClass = (Class<Mapper>) Class.forName(mappingGroupNameHandler); + Mapper groupNameRegExInst = regExClass.newInstance(); + if (groupNameRegExInst != null) { + String baseProperty = RangerCommonConstants.PLUGINS_MAPPING_GROUPNAME; + groupNameRegExInst.init(baseProperty, getAllRegexPatterns(baseProperty, serviceConfigMap), + serviceConfigMap.get(RangerCommonConstants.PLUGINS_MAPPING_SEPARATOR)); + pluginContext.setGroupNameTransformInst(groupNameRegExInst); + } else { + LOG.error("RegEx handler instance for groupname is null!"); + } + } + } catch (ClassNotFoundException cne) { + LOG.error("Failed to load " + mappingGroupNameHandler + " " + cne); + } catch (Throwable te) { + LOG.error("Failed to instantiate " + mappingGroupNameHandler + " " + te); + } + } } private RangerPolicyEngineImpl(final PolicyEngine policyEngine, RangerPolicyEngineImpl other) { @@ -554,6 +602,31 @@ public RangerAccessRequestProcessor getRequestProcessor() { return requestProcessor; } + private List<String> getAllRegexPatterns(String baseProperty, Map<String, String> serviceConfig) throws Throwable { + List<String> regexPatterns = new ArrayList<String>(); + String baseRegex = serviceConfig.get(baseProperty); + if (LOG.isDebugEnabled()) { + LOG.debug("==> getAllRegexPatterns(" + baseProperty + ")"); + LOG.debug("baseRegex = " + baseRegex); + LOG.debug("pluginConfig = " + serviceConfig.keySet()); + } + if (baseRegex == null) { + return regexPatterns; + } + regexPatterns.add(baseRegex); + int i = 1; + String nextRegex = serviceConfig.get(baseProperty + "." + i); + while (nextRegex != null) { + regexPatterns.add(nextRegex); + i++; + nextRegex = serviceConfig.get(baseProperty + "." + i); + } + if (LOG.isDebugEnabled()) { + LOG.debug("<== getAllRegexPatterns(" + regexPatterns + ")"); + } + return regexPatterns; + } + private RangerAccessResult zoneAwareAccessEvaluationWithNoAudit(RangerAccessRequest request, int policyType) { LOG.debug("==> RangerPolicyEngineImpl.zoneAwareAccessEvaluationWithNoAudit({}, policyType={})", request, policyType); 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 33cfef0c2..226a4b3f6 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,24 +31,29 @@ 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 { private static final Logger LOG = LoggerFactory.getLogger(RangerDefaultRequestProcessor.class); private static final Logger PERF_CONTEXTENRICHER_REQUEST_LOG = RangerPerfTracer.getPerfLogger("contextenricher.request"); protected final PolicyEngine policyEngine; - private final boolean useRangerGroups; - private final boolean useOnlyRangerGroups; - private final boolean convertEmailToUser; + private final boolean useRangerGroups; + private final boolean useOnlyRangerGroups; + private final boolean convertEmailToUser; public RangerDefaultRequestProcessor(PolicyEngine policyEngine) { this.policyEngine = policyEngine; @@ -98,6 +103,63 @@ public void preProcess(RangerAccessRequest request) { reqImpl.setClusterType(pluginContext.getClusterType()); } + RangerPluginConfig config = policyEngine.getPluginContext().getConfig(); + if (LOG.isDebugEnabled()) { + LOG.debug("RangerPluginConfig = " + config.getPropertyPrefix()); + } + if (config != null) { + boolean isNameTransformationSupported = config.getBoolean(config.getPropertyPrefix() + RangerCommonConstants.PLUGIN_CONFIG_SUFFIX_NAME_TRANSFORMATION, false); + + if (LOG.isDebugEnabled()) { + LOG.debug("isNameTransformationSupported = " + isNameTransformationSupported); + } + if (isNameTransformationSupported) { + String user = request.getUser(); + if (policyEngine.getPluginContext().getUserNameCaseConversion().equalsIgnoreCase(UgsyncCommonConstants.UGSYNC_LOWER_CASE_CONVERSION_VALUE)) { + user = user.toLowerCase(); + } else if (policyEngine.getPluginContext().getUserNameCaseConversion().equalsIgnoreCase(UgsyncCommonConstants.UGSYNC_UPPER_CASE_CONVERSION_VALUE)) { + user = user.toUpperCase(); + } + Mapper userNameTransformInst = policyEngine.getPluginContext().getUserNameTransformInst(); + if (userNameTransformInst != null) { + String originalUser = request.getUser(); + String transformedUser = userNameTransformInst.transform(user); + + if (LOG.isDebugEnabled()) { + LOG.debug("Original username = {}, Transformed username = {}", originalUser, transformedUser); + } + + reqImpl.setUser(transformedUser); + } + Mapper groupNameTransformInst = policyEngine.getPluginContext().getGroupNameTransformInst(); + if (groupNameTransformInst != null) { + Set<String> transformedGroups = request.getUserGroups().stream() + .filter(Objects::nonNull) + .map(group -> { + String originalGroupName = group; + String conversionType = policyEngine.getPluginContext().getGroupNameCaseConversion(); + + if (UgsyncCommonConstants.UGSYNC_LOWER_CASE_CONVERSION_VALUE.equalsIgnoreCase(conversionType)) { + group = group.toLowerCase(); + } else if (UgsyncCommonConstants.UGSYNC_UPPER_CASE_CONVERSION_VALUE.equalsIgnoreCase(conversionType)) { + group = group.toUpperCase(); + } + + String transformedGroup = groupNameTransformInst.transform(group); + + if (LOG.isDebugEnabled()) { + LOG.debug("Original group name = {}, Transformed group name = {}", originalGroupName, transformedGroup); + } + + return transformedGroup; + }) + .collect(Collectors.toSet()); + + reqImpl.setUserGroups(transformedGroups); + } + } + } + convertEmailToUsername(reqImpl); updateUserGroups(reqImpl); 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 97f61b495..d6f74f576 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 @@ -20,16 +20,25 @@ package org.apache.ranger.plugin.util; public class RangerCommonConstants { - public static final String PROP_COOKIE_NAME = "ranger.admin.cookie.name"; - public static final String DEFAULT_COOKIE_NAME = "RANGERADMINSESSIONID"; - public static final String RANGER_ADMIN_SUFFIX_POLICY_DELTA = ".supports.policy.deltas"; - public static final String PLUGIN_CONFIG_SUFFIX_POLICY_DELTA = ".supports.policy.deltas"; - public static final String RANGER_ADMIN_SUFFIX_TAG_DELTA = ".supports.tag.deltas"; - public static final String PLUGIN_CONFIG_SUFFIX_TAG_DELTA = ".supports.tag.deltas"; - public static final String RANGER_ADMIN_SUFFIX_IN_PLACE_POLICY_UPDATES = ".supports.in.place.policy.updates"; - public static final String PLUGIN_CONFIG_SUFFIX_IN_PLACE_POLICY_UPDATES = ".supports.in.place.policy.updates"; - 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 PROP_COOKIE_NAME = "ranger.admin.cookie.name"; + public static final String DEFAULT_COOKIE_NAME = "RANGERADMINSESSIONID"; + public static final String RANGER_ADMIN_SUFFIX_POLICY_DELTA = ".supports.policy.deltas"; + public static final String PLUGIN_CONFIG_SUFFIX_POLICY_DELTA = ".supports.policy.deltas"; + public static final String RANGER_ADMIN_SUFFIX_TAG_DELTA = ".supports.tag.deltas"; + public static final String PLUGIN_CONFIG_SUFFIX_TAG_DELTA = ".supports.tag.deltas"; + public static final String RANGER_ADMIN_SUFFIX_IN_PLACE_POLICY_UPDATES = ".supports.in.place.policy.updates"; + public static final String PLUGIN_CONFIG_SUFFIX_IN_PLACE_POLICY_UPDATES = ".supports.in.place.policy.updates"; + 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_USERNAME_CASE_CONVERSION_PARAM = "ranger.plugins.ldap.username.caseconversion"; + public static final String PLUGINS_GROUPNAME_CASE_CONVERSION_PARAM = "ranger.plugins.ldap.groupname.caseconversion"; + public static final String PLUGINS_MAPPING_USERNAME = "ranger.plugins.mapping.username.regex"; + public static final String PLUGINS_MAPPING_GROUPNAME = "ranger.plugins.mapping.groupname.regex"; + public static final String PLUGINS_MAPPING_USERNAME_HANDLER = "ranger.plugins.mapping.username.handler"; + public static final String PLUGINS_MAPPING_GROUPNAME_HANDLER = "ranger.plugins.mapping.groupname.handler"; + public static final String PLUGINS_MAPPING_SEPARATOR = "ranger.plugins.mapping.regex.separator"; public static final String RANGER_SUPPORTS_TAGS_DEDUP = ".supports.tags.dedup"; public static final boolean RANGER_ADMIN_SUFFIX_POLICY_DELTA_DEFAULT = false; public static final boolean PLUGIN_CONFIG_SUFFIX_POLICY_DELTA_DEFAULT = false; 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 46bdcbfa5..77a216776 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 @@ -70,6 +70,7 @@ public static ServicePolicies copyHeader(ServicePolicies source) { ret.setPolicyVersion(source.getPolicyVersion()); ret.setAuditMode(source.getAuditMode()); ret.setServiceDef(source.getServiceDef()); + ret.setServiceConfig(source.getServiceConfig()); 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 e01362ef5..001b77ae0 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 497f1f853..9cac7ad5f 100644 --- a/distro/src/main/assembly/hbase-agent.xml +++ b/distro/src/main/assembly/hbase-agent.xml @@ -44,6 +44,7 @@ <include>org.apache.ranger:ranger-plugins-audit</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 8ab2c2f65..2faa1f3f3 100644 --- a/distro/src/main/assembly/hdfs-agent.xml +++ b/distro/src/main/assembly/hdfs-agent.xml @@ -73,6 +73,7 @@ <include>org.apache.ranger:ranger-plugins-audit</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 c26754bbb..c1edd2f94 100644 --- a/distro/src/main/assembly/hive-agent.xml +++ b/distro/src/main/assembly/hive-agent.xml @@ -44,6 +44,7 @@ <include>org.apache.ranger:ranger-plugins-audit</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 a51af0182..c4c064225 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> @@ -282,6 +283,7 @@ <include>org.apache.ranger:ranger-plugins-audit</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 ab21063de..54e656102 100644 --- a/distro/src/main/assembly/knox-agent.xml +++ b/distro/src/main/assembly/knox-agent.xml @@ -45,6 +45,7 @@ <include>org.apache.ranger:ranger-plugins-audit</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 9e45d6ba2..e2a79fe6d 100644 --- a/distro/src/main/assembly/plugin-atlas.xml +++ b/distro/src/main/assembly/plugin-atlas.xml @@ -45,6 +45,7 @@ <include>org.apache.ranger:ranger-plugins-audit</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-kafka.xml b/distro/src/main/assembly/plugin-kafka.xml index fef5dbccb..3e0781271 100644 --- a/distro/src/main/assembly/plugin-kafka.xml +++ b/distro/src/main/assembly/plugin-kafka.xml @@ -41,6 +41,7 @@ <include>org.apache.ranger:ranger-plugins-audit</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 1529b20ad..154a55fd5 100755 --- a/distro/src/main/assembly/plugin-kms.xml +++ b/distro/src/main/assembly/plugin-kms.xml @@ -44,6 +44,7 @@ <include>org.apache.ranger:ranger-plugins-audit</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> @@ -82,6 +83,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 6d7b29c8b..8c0aed4b9 100644 --- a/distro/src/main/assembly/plugin-kylin.xml +++ b/distro/src/main/assembly/plugin-kylin.xml @@ -44,6 +44,7 @@ <include>org.apache.ranger:ranger-plugins-audit</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 110b24a5b..d39063ca3 100644 --- a/distro/src/main/assembly/plugin-ozone.xml +++ b/distro/src/main/assembly/plugin-ozone.xml @@ -80,6 +80,7 @@ <include>org.apache.ranger:ranger-plugins-audit</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-solr.xml b/distro/src/main/assembly/plugin-solr.xml index 5f1b351d2..f97cc9899 100644 --- a/distro/src/main/assembly/plugin-solr.xml +++ b/distro/src/main/assembly/plugin-solr.xml @@ -39,6 +39,7 @@ <include>org.apache.ranger:ranger-plugins-audit</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 071b873e1..4c4482b91 100644 --- a/distro/src/main/assembly/plugin-sqoop.xml +++ b/distro/src/main/assembly/plugin-sqoop.xml @@ -44,6 +44,7 @@ <include>org.apache.ranger:ranger-plugins-audit</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 b889884af..30f358137 100644 --- a/distro/src/main/assembly/plugin-trino.xml +++ b/distro/src/main/assembly/plugin-trino.xml @@ -29,6 +29,7 @@ <include>org.apache.ranger:ranger-plugins-audit</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/ranger-tools.xml b/distro/src/main/assembly/ranger-tools.xml index f12159ff9..1d5d201a6 100644 --- a/distro/src/main/assembly/ranger-tools.xml +++ b/distro/src/main/assembly/ranger-tools.xml @@ -66,6 +66,7 @@ <include>org.codehaus.woodstox:stax2-api:jar:${codehaus.woodstox.stax2api.version}</include> <include>com.fasterxml.woodstox:woodstox-core:jar:${fasterxml.woodstox.version}</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> diff --git a/distro/src/main/assembly/sample-client.xml b/distro/src/main/assembly/sample-client.xml index 56f3677c2..7fc7317d8 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 6c8cbd6a8..fb80d9ea0 100644 --- a/distro/src/main/assembly/storm-agent.xml +++ b/distro/src/main/assembly/storm-agent.xml @@ -44,6 +44,7 @@ <include>org.apache.ranger:ranger-plugins-audit</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 da30a2d82..ce7942aa9 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 e6874a29a..c4e76c204 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 4f81e6b15..fbd7c9737 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 @@ -159,6 +159,7 @@ import org.apache.ranger.service.RangerServiceWithAssignedIdService; import org.apache.ranger.service.XGroupService; import org.apache.ranger.service.XUserService; +import org.apache.ranger.ugsyncutil.util.UgsyncCommonConstants; import org.apache.ranger.util.RestUtil; import org.apache.ranger.view.RangerExportPolicyList; import org.apache.ranger.view.RangerExportRoleList; @@ -222,150 +223,115 @@ @Component public class ServiceDBStore extends AbstractServiceStore { - private static final Logger LOG = LoggerFactory.getLogger(ServiceDBStore.class); - - public static final String SERVICE_ADMIN_USERS = "service.admin.users"; - public static final String SERVICE_ADMIN_GROUPS = "service.admin.groups"; - public static final String GDS_SERVICE_NAME = "_gds"; - public static final String CRYPT_ALGO = PropertiesUtil.getProperty("ranger.password.encryption.algorithm", PasswordUtils.DEFAULT_CRYPT_ALGO); - public static final String ENCRYPT_KEY = PropertiesUtil.getProperty("ranger.password.encryption.key", PasswordUtils.DEFAULT_ENCRYPT_KEY); - public static final String SALT = PropertiesUtil.getProperty("ranger.password.salt", PasswordUtils.DEFAULT_SALT); - public static final Integer ITERATION_COUNT = PropertiesUtil.getIntProperty("ranger.password.iteration.count", PasswordUtils.DEFAULT_ITERATION_COUNT); - public static final String RANGER_PLUGIN_AUDIT_FILTERS = "ranger.plugin.audit.filters"; - public static final String HIDDEN_PASSWORD_STR = "*****"; - public static final String CONFIG_KEY_PASSWORD = "password"; - public static final String ACCESS_TYPE_DECRYPT_EEK = "decrypteek"; - public static final String ACCESS_TYPE_GENERATE_EEK = "generateeek"; - public static final String ACCESS_TYPE_GET_METADATA = "getmetadata"; - - private static final String POLICY_ALLOW_EXCLUDE = "Policy Allow:Exclude"; - private static final String POLICY_ALLOW_INCLUDE = "Policy Allow:Include"; - private static final String POLICY_DENY_EXCLUDE = "Policy Deny:Exclude"; - private static final String POLICY_DENY_INCLUDE = "Policy Deny:Include"; - private static final String POLICY_TYPE_ACCESS = "Access"; - private static final String POLICY_TYPE_DATAMASK = "Masking"; - private static final String POLICY_TYPE_ROWFILTER = "Row Level Filter"; - private static final String HOSTNAME = "Host name"; - private static final String USER_NAME = "Exported by"; - private static final String RANGER_VERSION = "Ranger apache version"; - private static final String TIMESTAMP = "Export time"; - private static final String EXPORT_COUNT = "Exported count"; - private static final String SERVICE_CHECK_USER = "service.check.user"; - private static final String AMBARI_SERVICE_CHECK_USER = "ambari.service.check.user"; - private static final String RANGER_PLUGIN_CONFIG_PREFIX = "ranger.plugin."; - private static final String LINE_SEPARATOR = "\n"; - private static final String FILE_HEADER = "ID|Name|Resources|Roles|Groups|Users|Accesses|Service Type|Status|Policy Type|Delegate Admin|isRecursive|isExcludes|Service Name|Description|isAuditEnabled|Policy Conditions|Policy Condition Type|Masking Options|Row Filter Expr|Policy Label Name"; - private static final String COMMA_DELIMITER = "|"; - - 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)); - - private static final Comparator<RangerPolicyDelta> POLICY_DELTA_ID_COMPARATOR = new RangerPolicyDeltaComparator(); - - public static boolean SUPPORTS_POLICY_DELTAS; - public static boolean SUPPORTS_IN_PLACE_POLICY_UPDATES; - public static Integer RETENTION_PERIOD_IN_DAYS = 7; - public static Integer TAG_RETENTION_PERIOD_IN_DAYS = 3; - public static boolean SUPPORTS_PURGE_LOGIN_RECORDS; - public static Integer LOGIN_RECORDS_RETENTION_PERIOD_IN_DAYS; - public static boolean SUPPORTS_PURGE_TRANSACTION_RECORDS; - public static Integer TRANSACTION_RECORDS_RETENTION_PERIOD_IN_DAYS; - public static boolean SUPPORTS_PURGE_POLICY_EXPORT_LOGS; - public static Integer POLICY_EXPORT_LOGS_RETENTION_PERIOD_IN_DAYS; - - private static String LOCAL_HOSTNAME; - private static boolean isRolesDownloadedByService; - - private static volatile boolean legacyServiceDefsInitDone; - + public static final String SERVICE_ADMIN_USERS = "service.admin.users"; + public static final String SERVICE_ADMIN_GROUPS = "service.admin.groups"; + public static final String GDS_SERVICE_NAME = "_gds"; + public static final String CRYPT_ALGO = PropertiesUtil.getProperty("ranger.password.encryption.algorithm", PasswordUtils.DEFAULT_CRYPT_ALGO); + public static final String ENCRYPT_KEY = PropertiesUtil.getProperty("ranger.password.encryption.key", PasswordUtils.DEFAULT_ENCRYPT_KEY); + public static final String SALT = PropertiesUtil.getProperty("ranger.password.salt", PasswordUtils.DEFAULT_SALT); + public static final Integer ITERATION_COUNT = PropertiesUtil.getIntProperty("ranger.password.iteration.count", PasswordUtils.DEFAULT_ITERATION_COUNT); + public static final String RANGER_PLUGIN_AUDIT_FILTERS = "ranger.plugin.audit.filters"; + public static final String HIDDEN_PASSWORD_STR = "*****"; + public static final String CONFIG_KEY_PASSWORD = "password"; + public static final String ACCESS_TYPE_DECRYPT_EEK = "decrypteek"; + public static final String ACCESS_TYPE_GENERATE_EEK = "generateeek"; + public static final String ACCESS_TYPE_GET_METADATA = "getmetadata"; + private static final Logger LOG = LoggerFactory.getLogger(ServiceDBStore.class); + private static final String POLICY_ALLOW_EXCLUDE = "Policy Allow:Exclude"; + private static final String POLICY_ALLOW_INCLUDE = "Policy Allow:Include"; + private static final String POLICY_DENY_EXCLUDE = "Policy Deny:Exclude"; + private static final String POLICY_DENY_INCLUDE = "Policy Deny:Include"; + private static final String POLICY_TYPE_ACCESS = "Access"; + private static final String POLICY_TYPE_DATAMASK = "Masking"; + private static final String POLICY_TYPE_ROWFILTER = "Row Level Filter"; + private static final String HOSTNAME = "Host name"; + private static final String USER_NAME = "Exported by"; + private static final String RANGER_VERSION = "Ranger apache version"; + private static final String TIMESTAMP = "Export time"; + private static final String EXPORT_COUNT = "Exported count"; + private static final String SERVICE_CHECK_USER = "service.check.user"; + private static final String AMBARI_SERVICE_CHECK_USER = "ambari.service.check.user"; + private static final String RANGER_PLUGIN_CONFIG_PREFIX = "ranger.plugin."; + private static final String LINE_SEPARATOR = "\n"; + private static final String FILE_HEADER = "ID|Name|Resources|Roles|Groups|Users|Accesses|Service Type|Status|Policy Type|Delegate Admin|isRecursive|isExcludes|Service Name|Description|isAuditEnabled|Policy Conditions|Policy Condition Type|Masking Options|Row Filter Expr|Policy Label Name"; + private static final String COMMA_DELIMITER = "|"; + 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)); + private static final Comparator<RangerPolicyDelta> POLICY_DELTA_ID_COMPARATOR = new RangerPolicyDeltaComparator(); + public static boolean SUPPORTS_POLICY_DELTAS; + public static boolean SUPPORTS_IN_PLACE_POLICY_UPDATES; + public static Integer RETENTION_PERIOD_IN_DAYS = 7; + public static Integer TAG_RETENTION_PERIOD_IN_DAYS = 3; + public static boolean SUPPORTS_PURGE_LOGIN_RECORDS; + public static Integer LOGIN_RECORDS_RETENTION_PERIOD_IN_DAYS; + public static boolean SUPPORTS_PURGE_TRANSACTION_RECORDS; + public static Integer TRANSACTION_RECORDS_RETENTION_PERIOD_IN_DAYS; + public static boolean SUPPORTS_PURGE_POLICY_EXPORT_LOGS; + public static Integer POLICY_EXPORT_LOGS_RETENTION_PERIOD_IN_DAYS; + private static String LOCAL_HOSTNAME; + private static boolean isRolesDownloadedByService; + private static volatile boolean legacyServiceDefsInitDone; + private final String OPTION_UGSYNC_CONFIG_CHANGE = "ugsyncConfigChange"; @Autowired - RangerServiceDefService serviceDefService; - + RangerServiceDefService serviceDefService; @Autowired - RangerDaoManager daoMgr; - + RangerDaoManager daoMgr; @Autowired - RESTErrorUtil restErrorUtil; - + RESTErrorUtil restErrorUtil; @Autowired - RangerServiceService svcService; - + RangerServiceService svcService; @Autowired - StringUtil stringUtil; - + StringUtil stringUtil; @Autowired - RangerAuditFields<?> rangerAuditFields; - + RangerAuditFields<?> rangerAuditFields; @Autowired - RangerPolicyService policyService; - + RangerPolicyService policyService; @Autowired RangerPolicyLabelsService<XXPolicyLabel, ?> policyLabelsService; - @Autowired - XUserService xUserService; - + XUserService xUserService; @Autowired - XUserMgr xUserMgr; - + XUserMgr xUserMgr; @Autowired - XGroupService xGroupService; - + XGroupService xGroupService; @Autowired - PolicyRefUpdater policyRefUpdater; - + PolicyRefUpdater policyRefUpdater; @Autowired - RangerDataHistService dataHistService; - + RangerDataHistService dataHistService; @Autowired @Qualifier(value = "transactionManager") - PlatformTransactionManager txManager; - + PlatformTransactionManager txManager; @Autowired - RangerBizUtil bizUtil; - + RangerBizUtil bizUtil; @Autowired - RangerPolicyWithAssignedIdService assignedIdPolicyService; - + RangerPolicyWithAssignedIdService assignedIdPolicyService; @Autowired - RangerServiceWithAssignedIdService svcServiceWithAssignedId; - + RangerServiceWithAssignedIdService svcServiceWithAssignedId; @Autowired - RangerServiceDefWithAssignedIdService svcDefServiceWithAssignedId; - + RangerServiceDefWithAssignedIdService svcDefServiceWithAssignedId; @Autowired - RangerFactory factory; - + RangerFactory factory; @Autowired - JSONUtil jsonUtil; - + JSONUtil jsonUtil; @Autowired - ServiceMgr serviceMgr; - + ServiceMgr serviceMgr; @Autowired - AssetMgr assetMgr; - + AssetMgr assetMgr; @Autowired - RangerTransactionSynchronizationAdapter transactionSynchronizationAdapter; - + RangerTransactionSynchronizationAdapter transactionSynchronizationAdapter; @Autowired - RangerSecurityZoneServiceService securityZoneService; - + RangerSecurityZoneServiceService securityZoneService; @Autowired - TagDBStore tagStore; - + TagDBStore tagStore; @Autowired - UserMgr userMgr; - + UserMgr userMgr; @Autowired - SecurityZoneDBStore securityZoneStore; - + SecurityZoneDBStore securityZoneStore; @Autowired - GUIDUtil guidUtil; - - private boolean populateExistingBaseFields; - private ServicePredicateUtil predicateUtil; - private RangerAdminConfig config; + GUIDUtil guidUtil; + private boolean populateExistingBaseFields; + private ServicePredicateUtil predicateUtil; + private RangerAdminConfig config; public static void persistVersionChange(ServiceVersionUpdater serviceVersionUpdater) { RangerDaoManager daoMgr = serviceVersionUpdater.daoManager; @@ -374,9 +340,9 @@ public static void persistVersionChange(ServiceVersionUpdater serviceVersionUpda Long nextVersion = 1L; Date now = new Date(); - XXServiceVersionInfoDao serviceVersionInfoDao = daoMgr.getXXServiceVersionInfo(); - XXServiceVersionInfo serviceVersionInfoDbObj = serviceVersionInfoDao.findByServiceId(id); - XXService service = daoMgr.getXXService().getById(id); + XXServiceVersionInfoDao serviceVersionInfoDao = daoMgr.getXXServiceVersionInfo(); + XXServiceVersionInfo serviceVersionInfoDbObj = serviceVersionInfoDao.findByServiceId(id); + XXService service = daoMgr.getXXService().getById(id); if (serviceVersionInfoDbObj != null) { if (versionType == VERSION_TYPE.POLICY_VERSION) { @@ -1187,7 +1153,8 @@ public RangerService updateService(RangerService service, Map<String, Object> op service = svcService.update(service); - if (hasTagServiceValueChanged || hasIsEnabledChanged || hasServiceConfigForPluginChanged) { + Boolean isUgsyncConfigChange = options != null && options.get(OPTION_UGSYNC_CONFIG_CHANGE) != null ? (Boolean) options.get(OPTION_UGSYNC_CONFIG_CHANGE) : Boolean.FALSE; + if (hasTagServiceValueChanged || hasIsEnabledChanged || hasServiceConfigForPluginChanged || isUgsyncConfigChange) { updatePolicyVersion(service, RangerPolicyDelta.CHANGE_TYPE_SERVICE_CHANGE, null, false); } } @@ -1817,6 +1784,11 @@ public ServicePolicies getServicePoliciesIfUpdated(String serviceName, Long last ret.getTagPolicies().setServiceConfig(getServiceConfigForPlugin(ret.getTagPolicies().getServiceId())); } } + if (LOG.isDebugEnabled()) { + if (ret != null) { + LOG.debug("<== ServiceDBStore.getServicePoliciesIfUpdated(" + serviceName + ", " + lastKnownVersion + ", " + needsBackwardCompatibility + "): configs =" + ret.getServiceConfig()); + } + } LOG.debug("<== ServiceDBStore.getServicePoliciesIfUpdated({}, {}, {}): count={}", serviceName, lastKnownVersion, needsBackwardCompatibility, (ret == null || ret.getPolicies() == null) ? 0 : ret.getPolicies().size()); @@ -1841,6 +1813,11 @@ public ServicePolicies getServicePolicyDeltas(String serviceName, Long lastKnown ret = getServicePolicies(serviceName, lastKnownVersion, true, SUPPORTS_POLICY_DELTAS, cachedPolicyVersion); } + if (LOG.isDebugEnabled()) { + if (ret != null) { + LOG.debug("<=== ServiceDBStore.getServicePolicyDeltas(" + serviceName + ", " + lastKnownVersion + "): ret = " + ret.getServiceConfig()); + } + } return ret; } @@ -1909,6 +1886,9 @@ public long getPoliciesCount(final String serviceName) { @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); @@ -1919,6 +1899,13 @@ public Map<String, String> getServiceConfigForPlugin(Long serviceId) { } } } + Map<String, String> ugsyncConfigs = getLatestUgsyncConfig(); + if (MapUtils.isNotEmpty(ugsyncConfigs)) { + configs.putAll(ugsyncConfigs); + } + if (LOG.isDebugEnabled()) { + LOG.debug("==> ServiceDBStore.getServiceConfigForPlugin(" + serviceId + "): configs = " + configs.keySet()); + } return configs; } @@ -2810,8 +2797,8 @@ public void updateServiceAuditConfig(String searchUsrGrpRoleName, REMOVE_REF_TYP String jsonStr = xConfigMap.getConfigvalue() != null ? xConfigMap.getConfigvalue() : null; if (StringUtils.isNotBlank(jsonStr)) { - List<AuditFilter> auditFilters = JsonUtils.jsonToAuditFilterList(jsonStr); - int filterCount = auditFilters != null ? auditFilters.size() : 0; + List<AuditFilter> auditFilters = JsonUtils.jsonToAuditFilterList(jsonStr); + int filterCount = auditFilters != null ? auditFilters.size() : 0; if (filterCount > 0) { String userName = null; @@ -2860,6 +2847,53 @@ public void updateServiceAuditConfig(String searchUsrGrpRoleName, REMOVE_REF_TYP LOG.debug("<=== ServiceDBStore.updateServiceAuditConfig( searchUsrGrpRoleName : {} removeRefType : {})", searchUsrGrpRoleName, removeRefType); } + public Map<String, String> getLatestUgsyncConfig() { + Map<String, String> configs = new HashMap<String, String>(); + configs.put(RangerCommonConstants.PLUGINS_USERNAME_CASE_CONVERSION_PARAM, PropertiesUtil.getProperty(UgsyncCommonConstants.UGSYNC_USERNAME_CASE_CONVERSION_PARAM, + UgsyncCommonConstants.DEFAULT_UGSYNC_USERNAME_CASE_CONVERSION_VALUE)); + configs.put(RangerCommonConstants.PLUGINS_GROUPNAME_CASE_CONVERSION_PARAM, PropertiesUtil.getProperty(UgsyncCommonConstants.UGSYNC_GROUPNAME_CASE_CONVERSION_PARAM, + UgsyncCommonConstants.DEFAULT_UGSYNC_GROUPNAME_CASE_CONVERSION_VALUE)); + configs.put(RangerCommonConstants.PLUGINS_MAPPING_USERNAME_HANDLER, PropertiesUtil.getProperty(UgsyncCommonConstants.SYNC_MAPPING_USERNAME_HANDLER, + UgsyncCommonConstants.DEFAULT_SYNC_MAPPING_USERNAME_HANDLER)); + configs.put(RangerCommonConstants.PLUGINS_MAPPING_GROUPNAME_HANDLER, PropertiesUtil.getProperty(UgsyncCommonConstants.SYNC_MAPPING_GROUPNAME_HANDLER, + UgsyncCommonConstants.DEFAULT_SYNC_MAPPING_GROUPNAME_HANDLER)); + configs.put(RangerCommonConstants.PLUGINS_MAPPING_SEPARATOR, getRegexSeparator()); + configs.putAll(getAllRegexPatternsConfig(RangerCommonConstants.PLUGINS_MAPPING_USERNAME)); + configs.putAll(getAllRegexPatternsConfig(RangerCommonConstants.PLUGINS_MAPPING_GROUPNAME)); + return configs; + } + + public String getRegexSeparator() { + String ret = UgsyncCommonConstants.DEFAULT_MAPPING_SEPARATOR; + String val = PropertiesUtil.getProperty(UgsyncCommonConstants.SYNC_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)); + return ret; + } + + public Map<String, String> getAllRegexPatternsConfig(String baseProperty) { + Map<String, String> regexPatterns = new HashMap<>(); + String baseRegex = PropertiesUtil.getProperty(baseProperty); + if (baseRegex == null) { + return regexPatterns; + } + regexPatterns.put(baseProperty, baseRegex); + int i = 1; + String nextRegex = PropertiesUtil.getProperty(baseProperty + "." + i); + while (nextRegex != null) { + regexPatterns.put(baseProperty + "." + i, nextRegex); + i++; + nextRegex = PropertiesUtil.getProperty(baseProperty + "." + i); + } + return regexPatterns; + } + void createTransactionLog(RangerPolicy policy, int operationImportContext, int operationContext) { StackTraceElement[] trace = Thread.currentThread().getStackTrace(); @@ -4078,6 +4112,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()); @@ -4091,6 +4126,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)); @@ -4104,6 +4140,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); @@ -4112,6 +4149,12 @@ private ServicePolicies getServicePolicies(String serviceName, Long lastKnownVer ret.setTagPolicies(tagPolicies); } + if (LOG.isDebugEnabled()) { + if (ret != null) { + LOG.debug("<== ServiceDBStore.getServicePolicies(" + serviceName + ", " + lastKnownVersion + "): ret=" + ret.getServiceConfig()); + } + } + LOG.debug("<== ServiceDBStore.getServicePolicies({}, {}): count={}, delta-count={}", serviceName, lastKnownVersion, (ret == null || ret.getPolicies() == null) ? 0 : ret.getPolicies().size(), (ret == null || ret.getPolicyDeltas() == null) ? 0 : ret.getPolicyDeltas().size()); return ret; @@ -4806,9 +4849,9 @@ private void writeCSVForPolicyItems(Map<String, String> svcNameToSvcType, Ranger String resKey = resource.getKey(); RangerPolicyResource policyResource = resource.getValue(); List<String> resvalueList = policyResource.getValues(); - String isExcludes = policyResource.getIsExcludes().toString(); - String isRecursive = policyResource.getIsRecursive().toString(); - String resValue = resvalueList.toString(); + String isExcludes = policyResource.getIsExcludes().toString(); + String isRecursive = policyResource.getIsRecursive().toString(); + String resValue = resvalueList.toString(); sb.append(resourceKeyVal).append(" ").append(resKey).append("=").append(resValue); sbIsExcludes.append(resourceKeyVal).append(" ").append(resKey).append("=[").append(isExcludes).append("]"); @@ -5086,10 +5129,10 @@ private void writeBookForPolicyItems(Map<String, String> svcNameToSvcType, Range String resourceKeyVal = ""; String isRecursiveValue = ""; String resKey; - StringBuilder sb = new StringBuilder(); - StringBuilder sbIsRecursive = new StringBuilder(); - StringBuilder sbIsExcludes = new StringBuilder(); - Map<String, RangerPolicyResource> resources = policy.getResources(); + StringBuilder sb = new StringBuilder(); + StringBuilder sbIsRecursive = new StringBuilder(); + StringBuilder sbIsExcludes = new StringBuilder(); + Map<String, RangerPolicyResource> resources = policy.getResources(); RangerPolicy.RangerPolicyItemDataMaskInfo dataMaskInfo; RangerPolicy.RangerPolicyItemRowFilterInfo filterInfo; @@ -5103,9 +5146,9 @@ private void writeBookForPolicyItems(Map<String, String> svcNameToSvcType, Range RangerPolicyResource policyResource = resource.getValue(); List<String> resvalueList = policyResource.getValues(); - isExcludes = policyResource.getIsExcludes().toString(); - isRecursive = policyResource.getIsRecursive().toString(); - resValue = resvalueList.toString(); + isExcludes = policyResource.getIsExcludes().toString(); + isRecursive = policyResource.getIsRecursive().toString(); + resValue = resvalueList.toString(); sb.append(resourceKeyVal).append("; ").append(resKey).append("=").append(resValue); sbIsExcludes.append(resourceKeyVal).append("; ").append(resKey).append("=[").append(isExcludes).append("]"); @@ -5379,7 +5422,7 @@ private RangerPolicyList searchRangerPolicies(SearchFilter searchFilter) { Set<Long> processedSvcIdsForRole = new HashSet<>(); Set<Long> processedPolicies = new HashSet<>(); List<XXPolicy> xPolList = null; - String serviceName = searchFilter.getParam(ServiceREST.PARAM_SERVICE_NAME); + String serviceName = searchFilter.getParam(ServiceREST.PARAM_SERVICE_NAME); if (StringUtils.isNotBlank(serviceName)) { Long serviceId = getRangerServiceByName(serviceName.trim()); @@ -5429,8 +5472,8 @@ private RangerPolicyList searchRangerPolicies(SearchFilter searchFilter) { groupNames.add(RangerConstants.GROUP_PUBLIC); - Set<Long> processedSvcIdsForGroup = new HashSet<>(); - Set<String> processedGroupsName = new HashSet<>(); + Set<Long> processedSvcIdsForGroup = new HashSet<>(); + Set<String> processedGroupsName = new HashSet<>(); for (String groupName : groupNames) { searchFilter.setParam("group", groupName); @@ -5554,8 +5597,8 @@ private RangerPolicyList searchRangerPolicies(SearchFilter searchFilter) { getContainingRoles(xxRole.getId(), allContainedRoles); } - Set<String> roleNames = getRoleNames(allContainedRoles); - Set<String> processedRoleName = new HashSet<>(); + Set<String> roleNames = getRoleNames(allContainedRoles); + Set<String> processedRoleName = new HashSet<>(); for (String roleName : roleNames) { searchFilter.setParam("role", roleName); @@ -6028,8 +6071,8 @@ private String getMetricOfTypeContextEnrichers(final SearchCriteria searchCriter if (repoTypeList != null) { for (RangerServiceDef repoType : repoTypeList) { - String name = repoType.getName(); - List<RangerContextEnricherDef> contextEnrichers = repoType.getContextEnrichers(); + String name = repoType.getName(); + List<RangerContextEnricherDef> contextEnrichers = repoType.getContextEnrichers(); if (contextEnrichers != null && !contextEnrichers.isEmpty()) { serviceWithContextEnrichers.setServiceName(name); @@ -6196,9 +6239,9 @@ private VXMetricServiceCount getAuditsCount(int accessResult, Date startDate, Da Iterable<RangerServiceDef> repoTypeGet = paginatedSvcDefs.getList(); for (RangerServiceDef repoType : repoTypeGet) { - long id = repoType.getId(); - String serviceRepoName = repoType.getName(); - SearchCriteria searchCriteriaWithType = new SearchCriteria(); + long id = repoType.getId(); + String serviceRepoName = repoType.getName(); + SearchCriteria searchCriteriaWithType = new SearchCriteria(); searchCriteriaWithType.getParamList().put("repoType", id); searchCriteriaWithType.getParamList().put("accessResult", accessResult); @@ -6573,9 +6616,9 @@ private boolean isServiceActive(String serviceName) { return ret; } - public enum JSON_FILE_NAME_TYPE { POLICY, ROLE } + public enum JSON_FILE_NAME_TYPE {POLICY, ROLE} - public enum VERSION_TYPE { POLICY_VERSION, TAG_VERSION, ROLE_VERSION, GDS_VERSION } + public enum VERSION_TYPE {POLICY_VERSION, TAG_VERSION, ROLE_VERSION, GDS_VERSION} public enum METRIC_TYPE { USER_GROUP { @@ -6656,7 +6699,7 @@ public static METRIC_TYPE getMetricTypeByName(final String metricTypeName) { abstract String getMetric(ServiceDBStore ref, SearchCriteria searchCriteria); } - public enum REMOVE_REF_TYPE { USER, GROUP, ROLE } + public enum REMOVE_REF_TYPE {USER, GROUP, ROLE} private static class RangerPolicyDeltaComparator implements Comparator<RangerPolicyDelta>, java.io.Serializable { @Override 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 e415924fa..6216228ea 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 @@ -176,9 +176,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/RangerServicePoliciesCache.java b/security-admin/src/main/java/org/apache/ranger/common/RangerServicePoliciesCache.java index daa2e6456..a7e91efac 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 @@ -285,8 +285,8 @@ public void saveToCache(ServicePolicies policies) { } private class ServicePoliciesWrapper { - final Long serviceId; - final ReentrantLock lock = new ReentrantLock(); + final Long serviceId; + final ReentrantLock lock = new ReentrantLock(); ServicePolicies servicePolicies; Date updateTime; long longestDbLoadTimeInMs = -1; @@ -362,8 +362,14 @@ ServicePolicies getLatestOrCached(String serviceName, ServiceStore serviceStore, if (isDeltaCacheReinitialized) { this.deltaCache = new ServicePolicyDeltasCache(lastKnownVersion, servicePoliciesForDeltas); } + if (LOG.isDebugEnabled()) { + LOG.debug("servicePoliciesForDeltas = " + servicePoliciesForDeltas.getServiceConfig()); + } ret = servicePoliciesForDeltas; + if (LOG.isDebugEnabled()) { + LOG.debug("ret = " + ret.getServiceConfig()); + } } else { LOG.warn("Deltas were requested for service:[{}], but could not get them!! lastKnownVersion:[{}]; Returning cached ServicePolicies:[{}]", serviceName, lastKnownVersion, 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 1208cf3db..886933638 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 @@ -2672,6 +2672,12 @@ public ServicePolicies getSecureServicePoliciesIfUpdated(@PathParam("serviceName throw restErrorUtil.createRESTException(httpCode, logMsg, logError); } + if (LOG.isDebugEnabled()) { + if (ret != null) { + LOG.debug("<== ServiceREST.getSecureServicePoliciesIfUpdated(): configs =" + ret.getServiceConfig()); + } + } + LOG.debug("<== ServiceREST.getSecureServicePoliciesIfUpdated({}, {}, {}, {}, {}, {}) : count={}", serviceName, lastKnownVersion, lastActivationTime, pluginId, clusterName, supportsPolicyDeltas, ((ret == null || ret.getPolicies() == null) ? 0 : ret.getPolicies().size())); return ret; diff --git a/ugsync-util/pom.xml b/ugsync-util/pom.xml index 6dc01bca1..4847b3c09 100644 --- a/ugsync-util/pom.xml +++ b/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> + <artifactId>log4j-api</artifactId> + <version>${log4j2.version}</version> + </dependency> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>log4j-over-slf4j</artifactId> + <version>${slf4j.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 +93,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 87% 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 e090175fb..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,16 +17,18 @@ * under the License. */ -package org.apache.ranger.usergroupsync; +package org.apache.ranger.ugsyncutil.transform; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.List; + public abstract class AbstractMapper implements Mapper { protected static final Logger logger = LoggerFactory.getLogger(AbstractMapper.class); @Override - public void init(String baseProperty) { + public void init(String baseProperty, List<String> regexPatterns, String regexSeparator) { // TODO Auto-generated method stub } 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 a1daba8c2..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 75% 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 b7f256660..392fea144 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,9 +17,7 @@ * under the License. */ -package org.apache.ranger.usergroupsync; - -import org.apache.ranger.unixusersync.config.UserGroupSyncConfig; +package org.apache.ranger.ugsyncutil.transform; import java.util.LinkedHashMap; import java.util.List; @@ -27,24 +25,19 @@ import java.util.regex.Pattern; public class RegEx extends AbstractMapper { - private final UserGroupSyncConfig config = UserGroupSyncConfig.getInstance(); - private LinkedHashMap<String, String> replacementPattern; + private LinkedHashMap<String, String> replacementPattern; public LinkedHashMap<String, String> getReplacementPattern() { return replacementPattern; } @Override - public void init(String baseProperty) { - logger.info("Initializing for {}", baseProperty); - + public void init(String baseProperty, List<String> regexPatterns, String regexSeparator) { + AbstractMapper.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()); + AbstractMapper.logger.error("Failed to initialize " + baseProperty, t.fillInStackTrace()); } } @@ -63,13 +56,13 @@ public String transform(String attrValue) { } } } catch (Throwable t) { - logger.error("Failed to transform {}", attrValue, t.fillInStackTrace()); + AbstractMapper.logger.error("Failed to transform " + attrValue, t.fillInStackTrace()); } return result; } - protected void populateReplacementPatterns(String baseProperty, List<String> regexPatterns, String regexSeparator) { + public void populateReplacementPatterns(String baseProperty, List<String> regexPatterns, String regexSeparator) { replacementPattern = new LinkedHashMap<>(); String regex = String.format("s%s([^%s]*)%s([^%s]*)%s(g)?", regexSeparator, regexSeparator, regexSeparator, regexSeparator, regexSeparator); @@ -79,7 +72,7 @@ protected void populateReplacementPatterns(String baseProperty, List<String> reg Matcher m = p.matcher(regexPattern); if (!m.matches()) { - logger.warn("Invalid RegEx {} and hence skipping this regex property", regexPattern); + AbstractMapper.logger.warn("Invalid RegEx " + regexPattern + " and hence skipping this regex property"); } m = m.reset(); 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 ca1b82df3..9d47acf8b 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 @@ -25,6 +25,30 @@ public class UgsyncCommonConstants { 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 = "/"; + private UgsyncCommonConstants() { // to block instantiation } diff --git a/ugsync/src/test/java/org/apache/ranger/usergroupsync/TestRegEx.java b/ugsync-util/src/test/java/org/apache/ranger/ugsynutil/transform/TestRegEx.java similarity index 75% rename from ugsync/src/test/java/org/apache/ranger/usergroupsync/TestRegEx.java rename to ugsync-util/src/test/java/org/apache/ranger/ugsynutil/transform/TestRegEx.java index 7e9856c3a..0855c93be 100644 --- a/ugsync/src/test/java/org/apache/ranger/usergroupsync/TestRegEx.java +++ b/ugsync-util/src/test/java/org/apache/ranger/ugsynutil/transform/TestRegEx.java @@ -17,8 +17,10 @@ * under the License. */ -package org.apache.ranger.usergroupsync; +package org.apache.ranger.ugsynutil.transform; +import org.apache.ranger.ugsyncutil.transform.RegEx; +import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -26,8 +28,6 @@ import java.util.Collections; import java.util.List; -import static org.junit.Assert.assertEquals; - public class TestRegEx { protected String userNameBaseProperty = "ranger.usersync.mapping.username.regex"; protected String groupNameBaseProperty = "ranger.usersync.mapping.groupname.regex"; @@ -49,7 +49,7 @@ public void setUp() { public void testUserNameTransform() { userRegexPatterns.add("s/\\s/_/"); userNameRegEx.populateReplacementPatterns(userNameBaseProperty, userRegexPatterns, mappingSeparator); - assertEquals("test_user", userNameRegEx.transform("test user")); + Assert.assertEquals("test_user", userNameRegEx.transform("test user")); } @Test @@ -57,13 +57,13 @@ public void testGroupNameTransform() { groupRegexPatterns.add("s/\\s/_/g"); groupRegexPatterns.add("s/_/\\$/g"); groupNameRegEx.populateReplacementPatterns(groupNameBaseProperty, groupRegexPatterns, mappingSeparator); - assertEquals("ldap$grp", groupNameRegEx.transform("ldap grp")); + Assert.assertEquals("ldap$grp", groupNameRegEx.transform("ldap grp")); } @Test public void testEmptyTransform() { - assertEquals("test user", userNameRegEx.transform("test user")); - assertEquals("ldap grp", groupNameRegEx.transform("ldap grp")); + Assert.assertEquals("test user", userNameRegEx.transform("test user")); + Assert.assertEquals("ldap grp", groupNameRegEx.transform("ldap grp")); } @Test @@ -72,8 +72,8 @@ public void testTransform() { groupRegexPatterns.add("s/\\s/_/g"); userNameRegEx.populateReplacementPatterns(userNameBaseProperty, userRegexPatterns, mappingSeparator); groupNameRegEx.populateReplacementPatterns(groupNameBaseProperty, groupRegexPatterns, mappingSeparator); - assertEquals("test_user", userNameRegEx.transform("test user")); - assertEquals("ldap_grp", groupNameRegEx.transform("ldap grp")); + Assert.assertEquals("test_user", userNameRegEx.transform("test user")); + Assert.assertEquals("ldap_grp", groupNameRegEx.transform("ldap grp")); } @Test @@ -85,8 +85,8 @@ public void testTransform1() { groupRegexPatterns.add("s/\\s"); groupRegexPatterns.add("s/\\$//g"); groupNameRegEx.populateReplacementPatterns(groupNameBaseProperty, groupRegexPatterns, mappingSeparator); - assertEquals("test user", userNameRegEx.transform("test\\user")); - assertEquals("ldapgrp", groupNameRegEx.transform("ldap grp")); + Assert.assertEquals("test user", userNameRegEx.transform("test\\user")); + Assert.assertEquals("ldapgrp", groupNameRegEx.transform("ldap grp")); } @Test @@ -96,7 +96,7 @@ public void testTransformWithSeparators() { userRegexPatterns = new ArrayList<>(); userRegexPatterns.add(String.format("s%sdark%sDE/dark%sg", separator, separator, separator)); userNameRegEx.populateReplacementPatterns(userNameBaseProperty, userRegexPatterns, separator); - assertEquals("DE/dark_knight_admin", userNameRegEx.transform("dark_knight_admin")); + Assert.assertEquals("DE/dark_knight_admin", userNameRegEx.transform("dark_knight_admin")); } } @@ -106,10 +106,10 @@ public void testUsernamePrefix() { String separator = "#"; userRegexPatterns = Collections.singletonList("s#^(.*)#PR/$1#g"); userNameRegEx.populateReplacementPatterns(userNameBaseProperty, userRegexPatterns, separator); - assertEquals("PR/mew_two", userNameRegEx.transform("mew_two")); - assertEquals("PR/dragoon", userNameRegEx.transform("dragoon")); - assertEquals("PR/pikachu", userNameRegEx.transform("pikachu")); - assertEquals("PR/dialga", userNameRegEx.transform("dialga")); + Assert.assertEquals("PR/mew_two", userNameRegEx.transform("mew_two")); + Assert.assertEquals("PR/dragoon", userNameRegEx.transform("dragoon")); + Assert.assertEquals("PR/pikachu", userNameRegEx.transform("pikachu")); + Assert.assertEquals("PR/dialga", userNameRegEx.transform("dialga")); } @Test @@ -118,7 +118,7 @@ public void testUsernameSuffix() { String separator = "#"; userRegexPatterns = Collections.singletonList("s#^(.*)#$1_ty#g"); userNameRegEx.populateReplacementPatterns(userNameBaseProperty, userRegexPatterns, separator); - assertEquals("mew_ty", userNameRegEx.transform("mew")); - assertEquals("onix_ty", userNameRegEx.transform("onix")); + Assert.assertEquals("mew_ty", userNameRegEx.transform("mew")); + Assert.assertEquals("onix_ty", userNameRegEx.transform("onix")); } } 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 73e712157..c05189e3f 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 @@ -24,6 +24,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; @@ -36,212 +37,173 @@ import java.nio.file.Paths; import java.security.KeyStore; import java.util.ArrayList; +import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Properties; import java.util.Set; import java.util.StringTokenizer; public class UserGroupSyncConfig { - private static final Logger LOG = LoggerFactory.getLogger(UserGroupSyncConfig.class); - - private static final String CORE_SITE_CONFIG_FILE = "core-site.xml"; - - public static final String CONFIG_FILE = "ranger-ugsync-site.xml"; - public static final String DEFAULT_CONFIG_FILE = "ranger-ugsync-default.xml"; - public static final String UGSYNC_ENABLED_PROP = "ranger.usersync.enabled"; - - private static final String UGSYNC_SOURCE_CLASS_PARAM = "ranger.usersync.source.impl.class"; - private static final String UGSYNC_SINK_CLASS_PARAM = "ranger.usersync.sink.impl.class"; - private static final String UGSYNC_SOURCE_CLASS = "org.apache.ranger.unixusersync.process.UnixUserGroupBuilder"; - private static final String UGSYNC_SINK_CLASS = "org.apache.ranger.unixusersync.process.PolicyMgrUserGroupBuilder"; - private static final String LGSYNC_SOURCE_CLASS = "org.apache.ranger.ldapusersync.process.LdapUserGroupBuilder"; - + public static final String CONFIG_FILE = "ranger-ugsync-site.xml"; + public static final String DEFAULT_CONFIG_FILE = "ranger-ugsync-default.xml"; + public static final String UGSYNC_ENABLED_PROP = "ranger.usersync.enabled"; + /* Unix Configs */ + public static final String UGSYNC_MIN_USERID_PROP = "ranger.usersync.unix.minUserId"; + public static final String UGSYNC_MIN_GROUPID_PROP = "ranger.usersync.unix.minGroupId"; + public static final String UGSYNC_UNIX_PASSWORD_FILE = "ranger.usersync.unix.password.file"; + public static final String UGSYNC_UNIX_GROUP_FILE = "ranger.usersync.unix.group.file"; + /* Unix Defaults */ + public static final String DEFAULT_UGSYNC_UNIX_GROUP_FILE = "/etc/group"; + public static final String DEFAULT_UGSYNC_UNIX_PASSWORD_FILE = "/etc/passwd"; + public static final String DEFAULT_UGSYNC_MIN_GROUPID = "0"; + /* File Sync Configs */ + public static final String UGSYNC_SOURCE_FILE_PROC = "ranger.usersync.filesource.file"; + public static final String UGSYNC_SOURCE_FILE_DELIMITER = "ranger.usersync.filesource.text.delimiter"; + public static final String UGSYNC_SOURCE_FILE_DELIMITERER = "ranger.usersync.filesource.text.delimiterer"; + /* Metrics */ + public static final String UGSYNC_METRICS_ENABLED_PROP = "ranger.usersync.metrics.enabled"; + /* Policy Manager Configs */ + public static final String UGSYNC_PM_URL_PROP = "ranger.usersync.policymanager.baseURL"; + public static final String UGSYNC_MAX_RECORDS_PER_API_CALL_PROP = "ranger.usersync.policymanager.maxrecordsperapicall"; + public static final String UGSYNC_MOCK_RUN_PROP = "ranger.usersync.policymanager.mockrun"; + public static final String UGSYNC_TEST_RUN_PROP = "ranger.usersync.policymanager.testrun"; + /* Other Configs */ + public static final String UGSYNC_SERVER_HA_ENABLED_PARAM = "ranger-ugsync.server.ha.enabled"; + public static final String UGSYNC_NAME_VALIDATION_ENABLED = "ranger.usersync.name.validation.enabled"; + public static final String UGSYNC_SYNC_SOURCE_VALIDATION_ENABLED = "ranger.usersync.syncsource.validation.enabled"; + private static final Logger LOG = LoggerFactory.getLogger(UserGroupSyncConfig.class); + private static final String CORE_SITE_CONFIG_FILE = "core-site.xml"; + private static final String UGSYNC_SOURCE_CLASS_PARAM = "ranger.usersync.source.impl.class"; + private static final String UGSYNC_SINK_CLASS_PARAM = "ranger.usersync.sink.impl.class"; + private static final String UGSYNC_SOURCE_CLASS = "org.apache.ranger.unixusersync.process.UnixUserGroupBuilder"; + private static final String UGSYNC_SINK_CLASS = "org.apache.ranger.unixusersync.process.PolicyMgrUserGroupBuilder"; + private static final String LGSYNC_SOURCE_CLASS = "org.apache.ranger.ldapusersync.process.LdapUserGroupBuilder"; /* LDAP Configs */ - private static final String LGSYNC_LDAP_URL = "ranger.usersync.ldap.url"; - private static final String LGSYNC_LDAP_AUTHENTICATION_MECHANISM = "ranger.usersync.ldap.authentication.mechanism"; - private static final String LGSYNC_REFERRAL = "ranger.usersync.ldap.referral"; - private static final String LGSYNC_LDAP_BIND_DN = "ranger.usersync.ldap.binddn"; - private static final String LGSYNC_LDAP_BIND_ALIAS = "ranger.usersync.ldap.bindalias"; - private static final String LGSYNC_LDAP_BIND_PASSWORD = "ranger.usersync.ldap.ldapbindpassword"; - private static final String LGSYNC_SEARCH_BASE = "ranger.usersync.ldap.searchBase"; - private static final String LGSYNC_USER_SEARCH_BASE = "ranger.usersync.ldap.user.searchbase"; - private static final String LGSYNC_USER_SEARCH_SCOPE = "ranger.usersync.ldap.user.searchscope"; - private static final String LGSYNC_USER_OBJECT_CLASS = "ranger.usersync.ldap.user.objectclass"; - private static final String LGSYNC_USER_SEARCH_FILTER = "ranger.usersync.ldap.user.searchfilter"; - private static final String LGSYNC_USER_NAME_ATTRIBUTE = "ranger.usersync.ldap.user.nameattribute"; - private static final String LGSYNC_USER_GROUP_NAME_ATTRIBUTE = "ranger.usersync.ldap.user.groupnameattribute"; - private static final String LGSYNC_OTHER_USER_ATTRIBUTES = "ranger.usersync.ldap.user.otherattributes"; - private static final String LGSYNC_USER_CLOUDID_ATTRIBUTE = "ranger.usersync.ldap.user.cloudid.attribute"; - private static final String LGSYNC_USER_CLOUDID_ATTRIBUTE_DATATYPE = "ranger.usersync.ldap.user.cloudid.attribute.datatype"; - private static final String UGSYNC_USERNAME_CASE_CONVERSION_PARAM = "ranger.usersync.ldap.username.caseconversion"; + private static final String LGSYNC_LDAP_URL = "ranger.usersync.ldap.url"; + private static final String LGSYNC_LDAP_AUTHENTICATION_MECHANISM = "ranger.usersync.ldap.authentication.mechanism"; + private static final String LGSYNC_REFERRAL = "ranger.usersync.ldap.referral"; + private static final String LGSYNC_LDAP_BIND_DN = "ranger.usersync.ldap.binddn"; + private static final String LGSYNC_LDAP_BIND_ALIAS = "ranger.usersync.ldap.bindalias"; + private static final String LGSYNC_LDAP_BIND_PASSWORD = "ranger.usersync.ldap.ldapbindpassword"; + private static final String LGSYNC_SEARCH_BASE = "ranger.usersync.ldap.searchBase"; + private static final String LGSYNC_USER_SEARCH_BASE = "ranger.usersync.ldap.user.searchbase"; + private static final String LGSYNC_USER_SEARCH_SCOPE = "ranger.usersync.ldap.user.searchscope"; + private static final String LGSYNC_USER_OBJECT_CLASS = "ranger.usersync.ldap.user.objectclass"; + private static final String LGSYNC_USER_SEARCH_FILTER = "ranger.usersync.ldap.user.searchfilter"; + private static final String LGSYNC_USER_NAME_ATTRIBUTE = "ranger.usersync.ldap.user.nameattribute"; + private static final String LGSYNC_USER_GROUP_NAME_ATTRIBUTE = "ranger.usersync.ldap.user.groupnameattribute"; + private static final String LGSYNC_OTHER_USER_ATTRIBUTES = "ranger.usersync.ldap.user.otherattributes"; + private static final String LGSYNC_USER_CLOUDID_ATTRIBUTE = "ranger.usersync.ldap.user.cloudid.attribute"; + private static final String LGSYNC_USER_CLOUDID_ATTRIBUTE_DATATYPE = "ranger.usersync.ldap.user.cloudid.attribute.datatype"; + + /* LDAP Defaults */ /** * ranger.usersync.user.searchenabled is used only when group search first is enabled to get username from - * 1. the group member attribute of the group or * 2. the additional user search based on the user attribute configuration */ - private static final String LGSYNC_USER_SEARCH_ENABLED = "ranger.usersync.user.searchenabled"; - - private static final String LGSYNC_GROUP_SEARCH_BASE = "ranger.usersync.group.searchbase"; - private static final String LGSYNC_GROUP_SEARCH_SCOPE = "ranger.usersync.group.searchscope"; - private static final String LGSYNC_GROUP_OBJECT_CLASS = "ranger.usersync.group.objectclass"; - private static final String LGSYNC_GROUP_SEARCH_FILTER = "ranger.usersync.group.searchfilter"; - private static final String LGSYNC_GROUP_NAME_ATTRIBUTE = "ranger.usersync.group.nameattribute"; - private static final String LGSYNC_GROUP_MEMBER_ATTRIBUTE_NAME = "ranger.usersync.group.memberattributename"; - private static final String LGSYNC_GROUP_SEARCH_ENABLED = "ranger.usersync.group.searchenabled"; - private static final String LGSYNC_GROUP_SEARCH_FIRST_ENABLED = "ranger.usersync.group.search.first.enabled"; - private static final String LGSYNC_GROUPNAMES = "ranger.usersync.ldap.groupnames"; - private static final String LGSYNC_OTHER_GROUP_ATTRIBUTES = "ranger.usersync.ldap.group.otherattributes"; - private static final String LGSYNC_GROUP_CLOUDID_ATTRIBUTE = "ranger.usersync.ldap.group.cloudid.attribute"; - private static final String LGSYNC_GROUP_CLOUDID_ATTRIBUTE_DATATYPE = "ranger.usersync.ldap.group.cloudid.attribute.datatype"; - private static final String UGSYNC_GROUPNAME_CASE_CONVERSION_PARAM = "ranger.usersync.ldap.groupname.caseconversion"; - private static final String LGSYNC_GROUP_HIERARCHY_LEVELS = "ranger.usersync.ldap.grouphierarchylevels"; - - private static final String LGSYNC_LDAP_BIND_KEYSTORE = "ranger.usersync.credstore.filename"; - private static final String LGSYNC_LDAP_DELTASYNC_ENABLED = "ranger.usersync.ldap.deltasync"; - private static final String LGSYNC_LDAP_STARTTLS_ENABLED = "ranger.usersync.ldap.starttls"; - private static final String UGSYNC_SLEEP_LDAP_FORCE_TIME_IN_MILLIS_BETWEEN_CYCLE_PARAM_ENABLED = "ranger.usersync.ldap.force.sleeptimeinmillisbetweensynccycle.enabled"; - - /* LDAP Defaults */ - 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"; - - private static final String DEFAULT_AUTHENTICATION_MECHANISM = "simple"; - private static final String DEFAULT_USER_OBJECT_CLASS = "person"; - private static final String DEFAULT_USER_NAME_ATTRIBUTE = "cn"; - private static final String DEFAULT_USER_GROUP_NAME_ATTRIBUTE = "memberof,ismemberof"; - private static final String DEFAULT_USER_CLOUDID_ATTRIBUTE = "objectid"; - private static final String DEFAULT_USER_CLOUDID_ATTRIBUTE_DATATYPE = "byte[]"; - private static final String DEFAULT_OTHER_USER_ATTRIBUTES = "userurincipaluame,"; - private static final String DEFAULT_UGSYNC_USERNAME_CASE_CONVERSION_VALUE = UGSYNC_NONE_CASE_CONVERSION_VALUE; - - private static final String DEFAULT_LGSYNC_GROUP_OBJECT_CLASS = "groupofnames"; - private static final String DEFAULT_LGSYNC_GROUP_NAME_ATTRIBUTE = "cn"; - private static final String DEFAULT_LGSYNC_GROUP_MEMBER_ATTRIBUTE_NAME = "member"; - private static final String DEFAULT_GROUP_CLOUDID_ATTRIBUTE = "objectid"; - private static final String DEFAULT_GROUP_CLOUDID_ATTRIBUTE_DATATYPE = "byte[]"; - private static final String DEFAULT_OTHER_GROUP_ATTRIBUTES = "displayname,"; - private static final String DEFAULT_UGSYNC_GROUPNAME_CASE_CONVERSION_VALUE = UGSYNC_NONE_CASE_CONVERSION_VALUE; - private static final String DEFAULT_LGSYNC_REFERRAL = "ignore"; - private static final int DEFAULT_LGSYNC_GROUP_HIERARCHY_LEVELS = 0; - private static final int DEFAULT_LGSYNC_PAGED_RESULTS_SIZE = 500; - private static final boolean DEFAULT_LGSYNC_LDAP_DELTASYNC_ENABLED = false; - private static final boolean DEFAULT_LGSYNC_LDAP_STARTTLS_ENABLED = false; - private static final boolean DEFAULT_LGSYNC_PAGED_RESULTS_ENABLED = true; - private static final boolean DEFAULT_LGSYNC_GROUP_SEARCH_ENABLED = true; - private static final boolean DEFAULT_LGSYNC_USER_SEARCH_ENABLED = true; - private static final boolean DEFAULT_LGSYNC_GROUP_SEARCH_FIRST_ENABLED = true; - - /* Unix Configs */ - public static final String UGSYNC_MIN_USERID_PROP = "ranger.usersync.unix.minUserId"; - public static final String UGSYNC_MIN_GROUPID_PROP = "ranger.usersync.unix.minGroupId"; - public static final String UGSYNC_UNIX_PASSWORD_FILE = "ranger.usersync.unix.password.file"; - public static final String UGSYNC_UNIX_GROUP_FILE = "ranger.usersync.unix.group.file"; - - private static final String UGSYNC_GROUP_ENUMERATE_ENABLED = "ranger.usersync.group.enumerate"; - private static final String UGSYNC_GROUP_ENUMERATE_GROUPS = "ranger.usersync.group.enumerategroup"; - private static final String UGSYNC_UNIX_BACKEND = "ranger.usersync.unix.backend"; - - /* Unix Defaults */ - public static final String DEFAULT_UGSYNC_UNIX_GROUP_FILE = "/etc/group"; - public static final String DEFAULT_UGSYNC_UNIX_PASSWORD_FILE = "/etc/passwd"; - public static final String DEFAULT_UGSYNC_MIN_GROUPID = "0"; - - private static final String DEFAULT_UGSYNC_UNIX_BACKEND = "passwd"; - private static final String UGSYNC_UPDATE_MILLIS_MIN = "ranger.usersync.unix.updatemillismin"; - - /* File Sync Configs */ - public static final String UGSYNC_SOURCE_FILE_PROC = "ranger.usersync.filesource.file"; - public static final String UGSYNC_SOURCE_FILE_DELIMITER = "ranger.usersync.filesource.text.delimiter"; - public static final String UGSYNC_SOURCE_FILE_DELIMITERER = "ranger.usersync.filesource.text.delimiterer"; - - private static final String DEFAULT_USER_GROUP_TEXTFILE_DELIMITER = ","; - - /* RegEx */ - 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 SYNC_MAPPING_GROUPNAME_HANDLER = "ranger.usersync.mapping.groupname.handler"; - private static final String SYNC_MAPPING_SEPARATOR = "ranger.usersync.mapping.regex.separator"; - - private static final String DEFAULT_SYNC_MAPPING_USERNAME_HANDLER = "org.apache.ranger.usergroupsync.RegEx"; - private static final String DEFAULT_SYNC_MAPPING_GROUPNAME_HANDLER = "org.apache.ranger.usergroupsync.RegEx"; - - private static final String DEFAULT_MAPPING_SEPARATOR = "/"; - + private static final String LGSYNC_USER_SEARCH_ENABLED = "ranger.usersync.user.searchenabled"; + private static final String LGSYNC_GROUP_SEARCH_BASE = "ranger.usersync.group.searchbase"; + private static final String LGSYNC_GROUP_SEARCH_SCOPE = "ranger.usersync.group.searchscope"; + private static final String LGSYNC_GROUP_OBJECT_CLASS = "ranger.usersync.group.objectclass"; + private static final String LGSYNC_GROUP_SEARCH_FILTER = "ranger.usersync.group.searchfilter"; + private static final String LGSYNC_GROUP_NAME_ATTRIBUTE = "ranger.usersync.group.nameattribute"; + private static final String LGSYNC_GROUP_MEMBER_ATTRIBUTE_NAME = "ranger.usersync.group.memberattributename"; + private static final String LGSYNC_GROUP_SEARCH_ENABLED = "ranger.usersync.group.searchenabled"; + private static final String LGSYNC_GROUP_SEARCH_FIRST_ENABLED = "ranger.usersync.group.search.first.enabled"; + private static final String LGSYNC_GROUPNAMES = "ranger.usersync.ldap.groupnames"; + private static final String LGSYNC_OTHER_GROUP_ATTRIBUTES = "ranger.usersync.ldap.group.otherattributes"; + private static final String LGSYNC_GROUP_CLOUDID_ATTRIBUTE = "ranger.usersync.ldap.group.cloudid.attribute"; + private static final String LGSYNC_GROUP_CLOUDID_ATTRIBUTE_DATATYPE = "ranger.usersync.ldap.group.cloudid.attribute.datatype"; + private static final String LGSYNC_GROUP_HIERARCHY_LEVELS = "ranger.usersync.ldap.grouphierarchylevels"; + private static final String LGSYNC_LDAP_BIND_KEYSTORE = "ranger.usersync.credstore.filename"; + private static final String LGSYNC_LDAP_DELTASYNC_ENABLED = "ranger.usersync.ldap.deltasync"; + private static final String LGSYNC_LDAP_STARTTLS_ENABLED = "ranger.usersync.ldap.starttls"; + private static final String UGSYNC_SLEEP_LDAP_FORCE_TIME_IN_MILLIS_BETWEEN_CYCLE_PARAM_ENABLED = "ranger.usersync.ldap.force.sleeptimeinmillisbetweensynccycle.enabled"; + private static final String DEFAULT_AUTHENTICATION_MECHANISM = "simple"; + private static final String DEFAULT_USER_OBJECT_CLASS = "person"; + private static final String DEFAULT_USER_NAME_ATTRIBUTE = "cn"; + private static final String DEFAULT_USER_GROUP_NAME_ATTRIBUTE = "memberof,ismemberof"; + private static final String DEFAULT_USER_CLOUDID_ATTRIBUTE = "objectid"; + private static final String DEFAULT_USER_CLOUDID_ATTRIBUTE_DATATYPE = "byte[]"; + private static final String DEFAULT_OTHER_USER_ATTRIBUTES = "userurincipaluame,"; + private static final String DEFAULT_LGSYNC_GROUP_OBJECT_CLASS = "groupofnames"; + private static final String DEFAULT_LGSYNC_GROUP_NAME_ATTRIBUTE = "cn"; + private static final String DEFAULT_LGSYNC_GROUP_MEMBER_ATTRIBUTE_NAME = "member"; + private static final String DEFAULT_GROUP_CLOUDID_ATTRIBUTE = "objectid"; + private static final String DEFAULT_GROUP_CLOUDID_ATTRIBUTE_DATATYPE = "byte[]"; + private static final String DEFAULT_OTHER_GROUP_ATTRIBUTES = "displayname,"; + private static final String DEFAULT_LGSYNC_REFERRAL = "ignore"; + private static final int DEFAULT_LGSYNC_GROUP_HIERARCHY_LEVELS = 0; + private static final int DEFAULT_LGSYNC_PAGED_RESULTS_SIZE = 500; + private static final boolean DEFAULT_LGSYNC_LDAP_DELTASYNC_ENABLED = false; + private static final boolean DEFAULT_LGSYNC_LDAP_STARTTLS_ENABLED = false; + private static final boolean DEFAULT_LGSYNC_PAGED_RESULTS_ENABLED = true; + private static final boolean DEFAULT_LGSYNC_GROUP_SEARCH_ENABLED = true; + private static final boolean DEFAULT_LGSYNC_USER_SEARCH_ENABLED = true; + private static final boolean DEFAULT_LGSYNC_GROUP_SEARCH_FIRST_ENABLED = true; + private static final String UGSYNC_GROUP_ENUMERATE_ENABLED = "ranger.usersync.group.enumerate"; + private static final String UGSYNC_GROUP_ENUMERATE_GROUPS = "ranger.usersync.group.enumerategroup"; + private static final String UGSYNC_UNIX_BACKEND = "ranger.usersync.unix.backend"; + private static final String DEFAULT_UGSYNC_UNIX_BACKEND = "passwd"; + private static final String UGSYNC_UPDATE_MILLIS_MIN = "ranger.usersync.unix.updatemillismin"; + private static final String DEFAULT_USER_GROUP_TEXTFILE_DELIMITER = ","; /* Role Assignments */ - 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"; - private static final String USERNAME_GROUPNAME_ASSIGNMENT_LIST_DELIMITER = "ranger.usersync.username.groupname.assignment.list.delimiter"; - private static final String GROUP_BASED_ROLE_ASSIGNMENT_RULES = "ranger.usersync.group.based.role.assignment.rules"; - private static final String WHITELIST_USER_ROLE_ASSIGNMENT_RULES = "ranger.usersync.whitelist.users.role.assignment.rules"; - private static final String DEFAULT_WHITELIST_USER_ROLE_ASSIGNMENT_RULES = "&ROLE_SYS_ADMIN:u:admin,rangerusersync,rangertagsync&ROLE_KEY_ADMIN:u:keyadmin"; - - /* Metrics */ - public static final String UGSYNC_METRICS_ENABLED_PROP = "ranger.usersync.metrics.enabled"; - - private static final String UGSYNC_METRICS_FILENAME = "ranger.usersync.metrics.filename"; - private static final String DEFAULT_UGSYNC_METRICS_FILENAME = "ranger_usersync_metric.json"; - private static final String UGSYNC_METRICS_FILEPATH = "ranger.usersync.metrics.filepath"; - private static final String UGSYNC_METRICS_FREQUENCY_TIME_IN_MILLIS_PARAM = "ranger.usersync.metrics.frequencytimeinmillis"; - - private static final String DEFAULT_UGSYNC_METRICS_FILEPATH = "/tmp/"; - private static final long DEFAULT_UGSYNC_METRICS_FREQUENCY_TIME_IN_MILLIS = 10_000L; - - /* Policy Manager Configs */ - public static final String UGSYNC_PM_URL_PROP = "ranger.usersync.policymanager.baseURL"; - public static final String UGSYNC_MAX_RECORDS_PER_API_CALL_PROP = "ranger.usersync.policymanager.maxrecordsperapicall"; - public static final String UGSYNC_MOCK_RUN_PROP = "ranger.usersync.policymanager.mockrun"; - public static final String UGSYNC_TEST_RUN_PROP = "ranger.usersync.policymanager.testrun"; - - private static final String SYNC_POLICY_MGR_KEYSTORE = "ranger.usersync.policymgr.keystore"; - private static final String SYNC_POLICY_MGR_ALIAS = "ranger.usersync.policymgr.alias"; - private static final String SYNC_POLICY_MGR_PASSWORD = "ranger.usersync.policymgr.password"; - private static final String SYNC_POLICY_MGR_USERNAME = "ranger.usersync.policymgr.username"; - private static final String SYNC_POLICY_MGR_MAX_RETRY_ATTEMPTS = "ranger.usersync.policymgr.max.retry.attempts"; - private static final String SYNC_POLICY_MGR_RETRY_INTERVAL_MS = "ranger.usersync.policymgr.retry.interval.ms"; - private static final String DEFAULT_POLICYMGR_USERNAME = "rangerusersync"; - - /* Other Configs */ - public static final String UGSYNC_SERVER_HA_ENABLED_PARAM = "ranger-ugsync.server.ha.enabled"; - public static final String UGSYNC_NAME_VALIDATION_ENABLED = "ranger.usersync.name.validation.enabled"; - public static final String UGSYNC_SYNC_SOURCE_VALIDATION_ENABLED = "ranger.usersync.syncsource.validation.enabled"; - private static final String UGSYNC_SLEEP_TIME_IN_MILLIS_BETWEEN_CYCLE_PARAM = "ranger.usersync.sleeptimeinmillisbetweensynccycle"; - - private static final long UGSYNC_SLEEP_TIME_IN_MILLIS_BETWEEN_CYCLE_MIN_VALUE = 60_000L; - private static final long UGSYNC_SLEEP_TIME_IN_MILLIS_BETWEEN_CYCLE_UNIX_DEFAULT_VALUE = 60_000L; - private static final long UGSYNC_SLEEP_TIME_IN_MILLIS_BETWEEN_CYCLE_LDAP_DEFAULT_VALUE = 3_600_000L; - private static final long DEFAULT_UGSYNC_UPDATE_MILLIS_MIN = 60_000; - private static final long UGSYNC_INIT_SLEEP_TIME_IN_MILLIS_BETWEEN_CYCLE_MIN_VALUE_FOR_HA = 5_000L; - private static final boolean DEFAULT_UGSYNC_NAME_VALIDATION_ENABLED = false; - private static final boolean DEFAULT_UGSYNC_SYNC_SOURCE_VALIDATION_ENABLED = true; - - private static final String SYNC_SOURCE = "ranger.usersync.sync.source"; - private static final String LGSYNC_PAGED_RESULTS_ENABLED = "ranger.usersync.pagedresultsenabled"; - private static final String LGSYNC_PAGED_RESULTS_SIZE = "ranger.usersync.pagedresultssize"; - private static final String UGSYNC_DELETES_ENABLED = "ranger.usersync.deletes.enabled"; - private static final String UGSYNC_DELETES_FREQUENCY = "ranger.usersync.deletes.frequency"; - private static final String USERSYNC_RANGER_COOKIE_ENABLED_PROP = "ranger.usersync.cookie.enabled"; - private static final String RANGER_ADMIN_COOKIE_NAME_PROPS = "ranger.usersync.dest.ranger.session.cookie.name"; - - private static final boolean DEFAULT_UGSYNC_DELETES_ENABLED = false; - private static final long DEFAULT_UGSYNC_DELETES_FREQUENCY = 10L; // After every 10 sync cycles + 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"; + private static final String USERNAME_GROUPNAME_ASSIGNMENT_LIST_DELIMITER = "ranger.usersync.username.groupname.assignment.list.delimiter"; + private static final String GROUP_BASED_ROLE_ASSIGNMENT_RULES = "ranger.usersync.group.based.role.assignment.rules"; + private static final String WHITELIST_USER_ROLE_ASSIGNMENT_RULES = "ranger.usersync.whitelist.users.role.assignment.rules"; + private static final String DEFAULT_WHITELIST_USER_ROLE_ASSIGNMENT_RULES = "&ROLE_SYS_ADMIN:u:admin,rangerusersync,rangertagsync&ROLE_KEY_ADMIN:u:keyadmin"; + private static final String UGSYNC_METRICS_FILENAME = "ranger.usersync.metrics.filename"; + private static final String DEFAULT_UGSYNC_METRICS_FILENAME = "ranger_usersync_metric.json"; + private static final String UGSYNC_METRICS_FILEPATH = "ranger.usersync.metrics.filepath"; + private static final String UGSYNC_METRICS_FREQUENCY_TIME_IN_MILLIS_PARAM = "ranger.usersync.metrics.frequencytimeinmillis"; + private static final String DEFAULT_UGSYNC_METRICS_FILEPATH = "/tmp/"; + private static final long DEFAULT_UGSYNC_METRICS_FREQUENCY_TIME_IN_MILLIS = 10_000L; + private static final String SYNC_POLICY_MGR_KEYSTORE = "ranger.usersync.policymgr.keystore"; + private static final String SYNC_POLICY_MGR_ALIAS = "ranger.usersync.policymgr.alias"; + private static final String SYNC_POLICY_MGR_PASSWORD = "ranger.usersync.policymgr.password"; + private static final String SYNC_POLICY_MGR_USERNAME = "ranger.usersync.policymgr.username"; + private static final String SYNC_POLICY_MGR_MAX_RETRY_ATTEMPTS = "ranger.usersync.policymgr.max.retry.attempts"; + private static final String SYNC_POLICY_MGR_RETRY_INTERVAL_MS = "ranger.usersync.policymgr.retry.interval.ms"; + private static final String DEFAULT_POLICYMGR_USERNAME = "rangerusersync"; + private static final String UGSYNC_SLEEP_TIME_IN_MILLIS_BETWEEN_CYCLE_PARAM = "ranger.usersync.sleeptimeinmillisbetweensynccycle"; + + private static final long UGSYNC_SLEEP_TIME_IN_MILLIS_BETWEEN_CYCLE_MIN_VALUE = 60_000L; + private static final long UGSYNC_SLEEP_TIME_IN_MILLIS_BETWEEN_CYCLE_UNIX_DEFAULT_VALUE = 60_000L; + private static final long UGSYNC_SLEEP_TIME_IN_MILLIS_BETWEEN_CYCLE_LDAP_DEFAULT_VALUE = 3_600_000L; + private static final long DEFAULT_UGSYNC_UPDATE_MILLIS_MIN = 60_000; + private static final long UGSYNC_INIT_SLEEP_TIME_IN_MILLIS_BETWEEN_CYCLE_MIN_VALUE_FOR_HA = 5_000L; + private static final boolean DEFAULT_UGSYNC_NAME_VALIDATION_ENABLED = false; + private static final boolean DEFAULT_UGSYNC_SYNC_SOURCE_VALIDATION_ENABLED = true; + + private static final String SYNC_SOURCE = "ranger.usersync.sync.source"; + private static final String LGSYNC_PAGED_RESULTS_ENABLED = "ranger.usersync.pagedresultsenabled"; + private static final String LGSYNC_PAGED_RESULTS_SIZE = "ranger.usersync.pagedresultssize"; + private static final String UGSYNC_DELETES_ENABLED = "ranger.usersync.deletes.enabled"; + private static final String UGSYNC_DELETES_FREQUENCY = "ranger.usersync.deletes.frequency"; + private static final String USERSYNC_RANGER_COOKIE_ENABLED_PROP = "ranger.usersync.cookie.enabled"; + private static final String RANGER_ADMIN_COOKIE_NAME_PROPS = "ranger.usersync.dest.ranger.session.cookie.name"; + + private static final boolean DEFAULT_UGSYNC_DELETES_ENABLED = false; + private static final long DEFAULT_UGSYNC_DELETES_FREQUENCY = 10L; // After every 10 sync cycles /* SSL Configs */ - private static final String SSL_KEYSTORE_FILE_TYPE_PARAM = "ranger.keystore.file.type"; - private static final String SSL_TRUSTSTORE_FILE_TYPE_PARAM = "ranger.truststore.file.type"; - private static final String SSL_KEYSTORE_PATH_PARAM = "ranger.usersync.keystore.file"; - private static final String SSL_KEYSTORE_PATH_PASSWORD_PARAM = "ranger.usersync.keystore.password"; - private static final String SSL_TRUSTSTORE_PATH_PARAM = "ranger.usersync.truststore.file"; - private static final String SSL_TRUSTSTORE_PATH_PASSWORD_PARAM = "ranger.usersync.truststore.password"; - private static final String SSL_KEYSTORE_PATH_PASSWORD_ALIAS = "usersync.ssl.key.password"; - private static final String SSL_TRUSTSTORE_PATH_PASSWORD_ALIAS = "usersync.ssl.truststore.password"; + private static final String SSL_KEYSTORE_FILE_TYPE_PARAM = "ranger.keystore.file.type"; + private static final String SSL_TRUSTSTORE_FILE_TYPE_PARAM = "ranger.truststore.file.type"; + private static final String SSL_KEYSTORE_PATH_PARAM = "ranger.usersync.keystore.file"; + private static final String SSL_KEYSTORE_PATH_PASSWORD_PARAM = "ranger.usersync.keystore.password"; + private static final String SSL_TRUSTSTORE_PATH_PARAM = "ranger.usersync.truststore.file"; + private static final String SSL_TRUSTSTORE_PATH_PASSWORD_PARAM = "ranger.usersync.truststore.password"; + private static final String SSL_KEYSTORE_PATH_PASSWORD_ALIAS = "usersync.ssl.key.password"; + private static final String SSL_TRUSTSTORE_PATH_PASSWORD_ALIAS = "usersync.ssl.truststore.password"; private static volatile UserGroupSyncConfig me; - private final Properties prop = new Properties(); - private Configuration userGroupConfig; + private final Properties prop = new Properties(); + private Configuration userGroupConfig; private UserGroupSyncConfig() { init(); @@ -747,13 +709,13 @@ public String getOtherUserAttributeDataType(String attrName) { } public String getUserNameCaseConversion() { - String ret = prop.getProperty(UGSYNC_USERNAME_CASE_CONVERSION_PARAM, DEFAULT_UGSYNC_USERNAME_CASE_CONVERSION_VALUE); + String ret = prop.getProperty(UgsyncCommonConstants.UGSYNC_USERNAME_CASE_CONVERSION_PARAM, UgsyncCommonConstants.DEFAULT_UGSYNC_USERNAME_CASE_CONVERSION_VALUE); return ret.trim().toLowerCase(); } public String getGroupNameCaseConversion() { - String ret = prop.getProperty(UGSYNC_GROUPNAME_CASE_CONVERSION_PARAM, DEFAULT_UGSYNC_GROUPNAME_CASE_CONVERSION_VALUE); + String ret = prop.getProperty(UgsyncCommonConstants.UGSYNC_GROUPNAME_CASE_CONVERSION_PARAM, UgsyncCommonConstants.DEFAULT_UGSYNC_GROUPNAME_CASE_CONVERSION_VALUE); return ret.trim().toLowerCase(); } @@ -782,7 +744,7 @@ public void setPagedResultsEnabled(boolean pagedResultsEnabled) { public int getPagedResultsSize() { int pagedResultsSize; - String val = prop.getProperty(LGSYNC_PAGED_RESULTS_SIZE); + String val = prop.getProperty(LGSYNC_PAGED_RESULTS_SIZE); if (val == null || val.trim().isEmpty()) { pagedResultsSize = DEFAULT_LGSYNC_PAGED_RESULTS_SIZE; @@ -797,6 +759,17 @@ public int getPagedResultsSize() { return pagedResultsSize; } + 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; + } + public boolean isGroupSearchEnabled() { boolean groupSearchEnabled; String val = prop.getProperty(LGSYNC_GROUP_SEARCH_ENABLED); @@ -972,7 +945,7 @@ public Set<String> getOtherGroupAttributes() { otherAttributes = DEFAULT_OTHER_GROUP_ATTRIBUTES; } - StringTokenizer st = new StringTokenizer(otherAttributes, ","); + StringTokenizer st = new StringTokenizer(otherAttributes, ","); Set<String> otherGroupAttributes = new HashSet<>(); while (st.hasMoreTokens()) { @@ -1138,20 +1111,20 @@ public List<String> getAllRegexPatterns(String baseProperty) { } 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; @@ -1247,19 +1220,6 @@ public boolean isStartTlsEnabled() { return starttlsEnabled; } - 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.parseBoolean(val); - } - - return deltaSyncEnabled; - } - /* Used only for unit testing */ public void setProperty(String name, String value) { prop.setProperty(name, value); @@ -1408,8 +1368,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) { @@ -1426,7 +1386,7 @@ public String getRegexSeparator() { public boolean isSyncSourceValidationEnabled() { boolean isSyncSourceValidationEnabled = DEFAULT_UGSYNC_SYNC_SOURCE_VALIDATION_ENABLED; - String val = prop.getProperty(UGSYNC_SYNC_SOURCE_VALIDATION_ENABLED); + String val = prop.getProperty(UGSYNC_SYNC_SOURCE_VALIDATION_ENABLED); if (StringUtils.isNotEmpty(val)) { isSyncSourceValidationEnabled = Boolean.parseBoolean(val); @@ -1435,6 +1395,37 @@ public boolean isSyncSourceValidationEnabled() { return isSyncSourceValidationEnabled; } + public Map<String, String> getNameTransformationRules() { + Map<String, String> nameTransformationRules = new HashMap<>(); + nameTransformationRules.put(UgsyncCommonConstants.UGSYNC_USERNAME_CASE_CONVERSION_PARAM, getUserNameCaseConversion()); + nameTransformationRules.put(UgsyncCommonConstants.UGSYNC_GROUPNAME_CASE_CONVERSION_PARAM, getGroupNameCaseConversion()); + nameTransformationRules.put(UgsyncCommonConstants.SYNC_MAPPING_USERNAME_HANDLER, getUserSyncMappingUserNameHandler()); + nameTransformationRules.put(UgsyncCommonConstants.SYNC_MAPPING_GROUPNAME_HANDLER, getUserSyncMappingGroupNameHandler()); + nameTransformationRules.put(UgsyncCommonConstants.SYNC_MAPPING_SEPARATOR, getRegexSeparator()); + nameTransformationRules.putAll(getAllRegexPatternsConfig(UgsyncCommonConstants.SYNC_MAPPING_USERNAME)); + nameTransformationRules.putAll(getAllRegexPatternsConfig(UgsyncCommonConstants.SYNC_MAPPING_GROUPNAME)); + return nameTransformationRules; + } + + public Map<String, String> getAllRegexPatternsConfig(String baseProperty) { + Map<String, String> regexPatterns = new HashMap<>(); + if (prop != null) { + String baseRegex = prop.getProperty(baseProperty); + if (baseRegex == null) { + return regexPatterns; + } + regexPatterns.put(baseProperty, baseRegex); + int i = 1; + String nextRegex = prop.getProperty(baseProperty + "." + i); + while (nextRegex != null) { + regexPatterns.put(baseProperty + "." + i, nextRegex); + i++; + nextRegex = prop.getProperty(baseProperty + "." + i); + } + } + return regexPatterns; + } + private void init() { XMLUtils.loadConfig(DEFAULT_CONFIG_FILE, prop); XMLUtils.loadConfig(CORE_SITE_CONFIG_FILE, prop); 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 8c15de95d..b7d858538 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 @@ -152,20 +152,20 @@ 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 3f88edda7..efba2c68c 100644 --- a/ugsync/src/main/java/org/apache/ranger/usergroupsync/AbstractUserGroupSource.java +++ b/ugsync/src/main/java/org/apache/ranger/usergroupsync/AbstractUserGroupSource.java @@ -18,13 +18,14 @@ */ 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 Mapper userNameRegExInst; protected Mapper groupNameRegExInst; @@ -39,7 +40,8 @@ public AbstractUserGroupSource() { userNameRegExInst = regExClass.newInstance(); if (userNameRegExInst != null) { - userNameRegExInst.init(UserGroupSyncConfig.SYNC_MAPPING_USERNAME); + String baseProperty = UgsyncCommonConstants.SYNC_MAPPING_USERNAME; + userNameRegExInst.init(baseProperty, config.getAllRegexPatterns(baseProperty), config.getRegexSeparator()); } else { LOG.error("RegEx handler instance for username is null!"); } @@ -59,7 +61,8 @@ public AbstractUserGroupSource() { groupNameRegExInst = regExClass.newInstance(); if (groupNameRegExInst != null) { - groupNameRegExInst.init(UserGroupSyncConfig.SYNC_MAPPING_GROUPNAME); + String baseProperty = UgsyncCommonConstants.SYNC_MAPPING_GROUPNAME; + groupNameRegExInst.init(baseProperty, config.getAllRegexPatterns(baseProperty), config.getRegexSeparator()); } else { LOG.error("RegEx handler instance for groupname is null!"); } 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 08466d688..cdd48c1de 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 @@ -18,6 +18,7 @@ */ package org.apache.ranger.unixusersync.process; +import org.apache.ranger.ugsyncutil.util.UgsyncCommonConstants; import org.apache.ranger.unixusersync.config.UserGroupSyncConfig; import org.apache.ranger.usergroupsync.PolicyMgrUserGroupBuilderTest; import org.junit.Test; @@ -134,10 +135,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 894117482..144e279f9 100644 --- a/ugsync/src/test/java/org/apache/ranger/usergroupsync/TestLdapUserGroup.java +++ b/ugsync/src/test/java/org/apache/ranger/usergroupsync/TestLdapUserGroup.java @@ -30,6 +30,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; @@ -385,8 +386,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();