This is an automated email from the ASF dual-hosted git repository.
spolavarapu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ranger.git
The following commit(s) were added to refs/heads/master by this push:
new 63704db RANGER-3630: Added code to support wildcards, group short
names, and list of memberof attribute DNs for computing user search filter
63704db is described below
commit 63704db998840b8f5d50575945691de2e46f3260
Author: Sailaja Polavarapu <[email protected]>
AuthorDate: Tue Mar 8 17:58:54 2022 -0800
RANGER-3630: Added code to support wildcards, group short names, and list
of memberof attribute DNs for computing user search filter
---
.../ldapusersync/process/LdapUserGroupBuilder.java | 379 ++++++++++++++++-----
.../unixusersync/config/UserGroupSyncConfig.java | 22 ++
.../ranger/usergroupsync/TestLdapUserGroup.java | 111 +++++-
3 files changed, 421 insertions(+), 91 deletions(-)
diff --git
a/ugsync/src/main/java/org/apache/ranger/ldapusersync/process/LdapUserGroupBuilder.java
b/ugsync/src/main/java/org/apache/ranger/ldapusersync/process/LdapUserGroupBuilder.java
index dae78e9..550775f 100644
---
a/ugsync/src/main/java/org/apache/ranger/ldapusersync/process/LdapUserGroupBuilder.java
+++
b/ugsync/src/main/java/org/apache/ranger/ldapusersync/process/LdapUserGroupBuilder.java
@@ -75,7 +75,9 @@ public class LdapUserGroupBuilder implements UserGroupSource {
private static final String DATA_TYPE_BYTEARRAY = "byte[]";
private static final String DATE_FORMAT = "yyyyMMddHHmmss";
private static final int PAGE_SIZE = 500;
- private static long deltaSyncUserTime = 0; // Used for AD uSNChanged
+ private static final String MEMBER_OF_ATTR = "memberof=";
+ private static final String GROUP_NAME_ATTRIBUTE = "cn=";
+ private static long deltaSyncUserTime = 0; // Used for AD uSNChanged
private static long deltaSyncGroupTime = 0; // Used for AD uSNChanged
private String deltaSyncUserTimeStamp; // Used for OpenLdap
modifyTimestamp
private String deltaSyncGroupTimeStamp; // Used for OpenLdap
modifyTimestamp
@@ -93,6 +95,7 @@ public class LdapUserGroupBuilder implements UserGroupSource {
private int userSearchScope;
private String userObjectClass;
private String userSearchFilter;
+ private Set<String> groupNameSet;
private String extendedUserSearchFilter;
private SearchControls userSearchControls;
private Set<String> userGroupNameAttributeSet;
@@ -116,8 +119,8 @@ public class LdapUserGroupBuilder implements
UserGroupSource {
private String groupCloudIdAttribute;
private Set<String> otherGroupAttributes;
private int groupHierarchyLevels;
- private int deleteCycles;
- private String currentSyncSource;
+ private int deleteCycles;
+ private String currentSyncSource;
private LdapContext ldapContext;
StartTlsResponse tls;
@@ -139,7 +142,7 @@ public class LdapUserGroupBuilder implements
UserGroupSource {
public void init() throws Throwable{
deltaSyncUserTime = 0;
deltaSyncGroupTime = 0;
- deleteCycles = 1;
+ deleteCycles = 1;
DateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT);
deltaSyncUserTimeStamp = dateFormat.format(new Date(0));
deltaSyncGroupTimeStamp = dateFormat.format(new Date(0));
@@ -190,7 +193,6 @@ public class LdapUserGroupBuilder implements
UserGroupSource {
env.put("java.naming.ldap.attributes.binary",
otherGroupAttribute);
}
}
-
ldapContext = new InitialLdapContext(env, null);
if (!ldapUrl.startsWith("ldaps")) {
if (config.isStartTlsEnabled()) {
@@ -214,22 +216,21 @@ public class LdapUserGroupBuilder implements
UserGroupSource {
LOG.info("LdapUserGroupBuilder initialization started");
currentSyncSource = config.getCurrentSyncSource();
- groupSearchFirstEnabled = true;
- userSearchEnabled = config.isUserSearchEnabled();
- groupSearchEnabled = config.isGroupSearchEnabled();
- ldapUrl = config.getLdapUrl();
- ldapBindDn = config.getLdapBindDn();
- ldapBindPassword = config.getLdapBindPassword();
- //ldapBindPassword = "admin-password";
- ldapAuthenticationMechanism = config.getLdapAuthenticationMechanism();
- ldapReferral = config.getContextReferral();
+ groupSearchFirstEnabled = true;
+ userSearchEnabled = config.isUserSearchEnabled();
+ groupSearchEnabled = config.isGroupSearchEnabled();
+ ldapUrl = config.getLdapUrl();
+ ldapBindDn = config.getLdapBindDn();
+ ldapBindPassword = config.getLdapBindPassword();
+ //ldapBindPassword = "admin-password";
+ ldapAuthenticationMechanism =
config.getLdapAuthenticationMechanism();
+ ldapReferral = config.getContextReferral();
searchBase = config.getSearchBase();
userSearchBase = config.getUserSearchBase().split(";");
userSearchScope = config.getUserSearchScope();
userObjectClass = config.getUserObjectClass();
userSearchFilter = config.getUserSearchFilter();
-
userNameAttribute = config.getUserNameAttribute();
userCloudIdAttribute = config.getUserCloudIdAttribute();
@@ -251,67 +252,92 @@ public class LdapUserGroupBuilder implements
UserGroupSource {
userSearchControls.setReturningAttributes(userSearchAttributes.toArray(
new String[userSearchAttributes.size()]));
- pagedResultsEnabled = config.isPagedResultsEnabled();
- pagedResultsSize = config.getPagedResultsSize();
+ pagedResultsEnabled = config.isPagedResultsEnabled();
+ pagedResultsSize = config.getPagedResultsSize();
- groupSearchBase = config.getGroupSearchBase().split(";");
- groupSearchScope = config.getGroupSearchScope();
- groupObjectClass = config.getGroupObjectClass();
- groupSearchFilter = config.getGroupSearchFilter();
- groupMemberAttributeName = config.getUserGroupMemberAttributeName();
- groupNameAttribute = config.getGroupNameAttribute();
- groupCloudIdAttribute = config.getGroupCloudIdAttribute();
+ groupSearchBase = config.getGroupSearchBase().split(";");
+ groupSearchScope = config.getGroupSearchScope();
+ groupObjectClass = config.getGroupObjectClass();
+ groupSearchFilter = config.getGroupSearchFilter();
+ groupMemberAttributeName =
config.getUserGroupMemberAttributeName();
+ groupNameAttribute = config.getGroupNameAttribute();
+ groupCloudIdAttribute = config.getGroupCloudIdAttribute();
groupHierarchyLevels = config.getGroupHierarchyLevels();
- extendedGroupSearchFilter = "(&" + extendedGroupSearchFilter + "(|(" +
groupMemberAttributeName + "={0})(" + groupMemberAttributeName + "={1})))";
-
- groupSearchControls = new SearchControls();
- groupSearchControls.setSearchScope(groupSearchScope);
-
- Set<String> groupSearchAttributes = new HashSet<String>();
- groupSearchAttributes.add(groupNameAttribute);
- groupSearchAttributes.add(groupCloudIdAttribute);
- groupSearchAttributes.add(groupMemberAttributeName);
- groupSearchAttributes.add("uSNChanged");
- groupSearchAttributes.add("modifytimestamp");
- otherGroupAttributes = config.getOtherGroupAttributes();
- for (String otherGroupAttribute : otherGroupAttributes) {
- groupSearchAttributes.add(otherGroupAttribute);
- }
- groupSearchControls.setReturningAttributes(groupSearchAttributes.toArray(
- new String[groupSearchAttributes.size()]));
-
- LOG.info("LdapUserGroupBuilder initialization completed
with -- "
- + "ldapUrl: " + ldapUrl
- + ", ldapBindDn: " + ldapBindDn
- + ", ldapBindPassword: ***** "
- + ", ldapAuthenticationMechanism: " +
ldapAuthenticationMechanism
- + ", searchBase: " + searchBase
- + ", userSearchBase: " + Arrays.toString(userSearchBase)
- + ", userSearchScope: " + userSearchScope
- + ", userObjectClass: " +
userObjectClass
- + ", userSearchFilter: " +
userSearchFilter
- + ", extendedUserSearchFilter: " +
extendedUserSearchFilter
- + ", userNameAttribute: " +
userNameAttribute
- + ", userSearchAttributes: " +
userSearchAttributes
- + ", userGroupNameAttributeSet: " +
userGroupNameAttributeSet
- + ", otherUserAttributes: " + otherUserAttributes
- + ", pagedResultsEnabled: " + pagedResultsEnabled
- + ", pagedResultsSize: " + pagedResultsSize
- + ", groupSearchEnabled: " + groupSearchEnabled
- + ", groupSearchBase: " + Arrays.toString(groupSearchBase)
- + ", groupSearchScope: " + groupSearchScope
- + ", groupObjectClass: " + groupObjectClass
- + ", groupSearchFilter: " + groupSearchFilter
- + ", extendedGroupSearchFilter: " + extendedGroupSearchFilter
- + ", extendedAllGroupsSearchFilter: " +
extendedAllGroupsSearchFilter
- + ", groupMemberAttributeName: " + groupMemberAttributeName
- + ", groupNameAttribute: " + groupNameAttribute
- + ", groupSearchAttributes: " + groupSearchAttributes
- + ", groupSearchFirstEnabled: " + groupSearchFirstEnabled
- + ", userSearchEnabled: " + userSearchEnabled
- + ", ldapReferral: " + ldapReferral
- );
+ extendedGroupSearchFilter = "(&" + extendedGroupSearchFilter +
"(|(" + groupMemberAttributeName + "={0})(" + groupMemberAttributeName +
"={1})))";
+
+ groupSearchControls = new SearchControls();
+ groupSearchControls.setSearchScope(groupSearchScope);
+
+ Set<String> groupSearchAttributes = new HashSet<String>();
+ groupSearchAttributes.add(groupNameAttribute);
+ groupSearchAttributes.add(groupCloudIdAttribute);
+ groupSearchAttributes.add(groupMemberAttributeName);
+ groupSearchAttributes.add("uSNChanged");
+ groupSearchAttributes.add("modifytimestamp");
+ otherGroupAttributes = config.getOtherGroupAttributes();
+ for (String otherGroupAttribute : otherGroupAttributes) {
+ groupSearchAttributes.add(otherGroupAttribute);
+ }
+
groupSearchControls.setReturningAttributes(groupSearchAttributes.toArray(
+ new String[groupSearchAttributes.size()]));
+
+ if (StringUtils.isEmpty(userSearchFilter)) {
+ groupNameSet = config.getGroupNameSet();
+ String computedSearchFilter = "";
+ for (String groupName : groupNameSet) {
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("groupName = " + groupName);
+ }
+ if (!groupName.startsWith(MEMBER_OF_ATTR) &&
!groupName.startsWith(GROUP_NAME_ATTRIBUTE)){
+ LOG.info("Ignoring unsupported format
for " + groupName );
+ continue;
+ }
+ String searchFilter = groupName;
+ if (groupName.startsWith(MEMBER_OF_ATTR)) {
+ searchFilter =
groupName.substring(MEMBER_OF_ATTR.length());
+ }
+ searchFilter = getFirstRDN(searchFilter);
+ computedSearchFilter +=
getDNForMemberOf(searchFilter);
+ }
+ if (StringUtils.isNotEmpty(computedSearchFilter)) {
+ computedSearchFilter = "(|" +
computedSearchFilter + ")";
+ }
+ LOG.info("Final computedSearchFilter = " +
computedSearchFilter);
+ userSearchFilter = computedSearchFilter;
+ }
+
+ LOG.info("LdapUserGroupBuilder initialization completed with --
"
+ + "ldapUrl: " + ldapUrl
+ + ", ldapBindDn: " + ldapBindDn
+ + ", ldapBindPassword: ***** "
+ + ", ldapAuthenticationMechanism: " +
ldapAuthenticationMechanism
+ + ", searchBase: " + searchBase
+ + ", userSearchBase: " +
Arrays.toString(userSearchBase)
+ + ", userSearchScope: " + userSearchScope
+ + ", userObjectClass: " + userObjectClass
+ + ", userSearchFilter: " + userSearchFilter
+ + ", extendedUserSearchFilter: " +
extendedUserSearchFilter
+ + ", userNameAttribute: " + userNameAttribute
+ + ", userSearchAttributes: " +
userSearchAttributes
+ + ", userGroupNameAttributeSet: " +
userGroupNameAttributeSet
+ + ", otherUserAttributes: " +
otherUserAttributes
+ + ", pagedResultsEnabled: " +
pagedResultsEnabled
+ + ", pagedResultsSize: " + pagedResultsSize
+ + ", groupSearchEnabled: " + groupSearchEnabled
+ + ", groupSearchBase: " +
Arrays.toString(groupSearchBase)
+ + ", groupSearchScope: " + groupSearchScope
+ + ", groupObjectClass: " + groupObjectClass
+ + ", groupSearchFilter: " + groupSearchFilter
+ + ", extendedGroupSearchFilter: " +
extendedGroupSearchFilter
+ + ", extendedAllGroupsSearchFilter: " +
extendedAllGroupsSearchFilter
+ + ", groupMemberAttributeName: " +
groupMemberAttributeName
+ + ", groupNameAttribute: " + groupNameAttribute
+ + ", groupSearchAttributes: " +
groupSearchAttributes
+ + ", groupSearchFirstEnabled: " +
groupSearchFirstEnabled
+ + ", userSearchEnabled: " + userSearchEnabled
+ + ", ldapReferral: " + ldapReferral
+ );
}
private void closeLdapContext() throws Throwable {
@@ -332,7 +358,7 @@ public class LdapUserGroupBuilder implements
UserGroupSource {
@Override
public void updateSink(UserGroupSink sink) throws Throwable {
LOG.info("LdapUserGroupBuilder updateSink started");
- boolean computeDeletes = false;
+ boolean computeDeletes = false;
groupUserTable = HashBasedTable.create();
sourceGroups = new HashMap<>();
sourceUsers = new HashMap<>();
@@ -710,10 +736,10 @@ public class LdapUserGroupBuilder implements
UserGroupSource {
String groupFullName =
(groupEntry.getNameInNamespace());
String gName = (String)
groupNameAttr.get();
Map<String, String>
groupAttrMap = new HashMap<>();
-
groupAttrMap.put(UgsyncCommonConstants.ORIGINAL_NAME, gName);
-
groupAttrMap.put(UgsyncCommonConstants.FULL_NAME, groupFullName);
-
groupAttrMap.put(UgsyncCommonConstants.SYNC_SOURCE, currentSyncSource);
-
groupAttrMap.put(UgsyncCommonConstants.LDAP_URL, config.getLdapUrl());
+
groupAttrMap.put(UgsyncCommonConstants.ORIGINAL_NAME, gName);
+ groupAttrMap.put(UgsyncCommonConstants.FULL_NAME,
groupFullName);
+
groupAttrMap.put(UgsyncCommonConstants.SYNC_SOURCE, currentSyncSource);
+ groupAttrMap.put(UgsyncCommonConstants.LDAP_URL,
config.getLdapUrl());
Attribute
groupCloudIdAttr = attributes.get(groupCloudIdAttribute);
if (groupCloudIdAttr !=
null) {
addToAttrMap(groupAttrMap, "cloud_id", groupCloudIdAttr,
config.getGroupCloudIdAttributeDataType());
@@ -762,13 +788,14 @@ public class LdapUserGroupBuilder implements
UserGroupSource {
continue;
}
userCount++;
+
if
(!userSearchEnabled) {
Map<String, String> userAttrMap = new HashMap<>();
String
userName = getShortName(originalUserFullName);
-
userAttrMap.put(UgsyncCommonConstants.ORIGINAL_NAME, userName);
-
userAttrMap.put(UgsyncCommonConstants.FULL_NAME, originalUserFullName);
-
userAttrMap.put(UgsyncCommonConstants.SYNC_SOURCE, currentSyncSource);
-
userAttrMap.put(UgsyncCommonConstants.LDAP_URL, config.getLdapUrl());
+
userAttrMap.put(UgsyncCommonConstants.ORIGINAL_NAME, userName);
+
userAttrMap.put(UgsyncCommonConstants.FULL_NAME, originalUserFullName);
+
userAttrMap.put(UgsyncCommonConstants.SYNC_SOURCE, currentSyncSource);
+
userAttrMap.put(UgsyncCommonConstants.LDAP_URL, config.getLdapUrl());
sourceUsers.put(originalUserFullName, userAttrMap);
if
(LOG.isDebugEnabled()) {
LOG.debug("As usersearch is disabled, adding user " + userName + " from group
member attribute for group " + gName);
@@ -941,10 +968,10 @@ public class LdapUserGroupBuilder implements
UserGroupSource {
Map<String, String>
groupAttrMap = new HashMap<>();
-
groupAttrMap.put(UgsyncCommonConstants.ORIGINAL_NAME, gName);
-
groupAttrMap.put(UgsyncCommonConstants.FULL_NAME, groupFullName);
-
groupAttrMap.put(UgsyncCommonConstants.SYNC_SOURCE, currentSyncSource);
-
groupAttrMap.put(UgsyncCommonConstants.LDAP_URL, config.getLdapUrl());
+
groupAttrMap.put(UgsyncCommonConstants.ORIGINAL_NAME, gName);
+ groupAttrMap.put(UgsyncCommonConstants.FULL_NAME,
groupFullName);
+
groupAttrMap.put(UgsyncCommonConstants.SYNC_SOURCE, currentSyncSource);
+ groupAttrMap.put(UgsyncCommonConstants.LDAP_URL,
config.getLdapUrl());
for (String
otherGroupAttribute : otherGroupAttributes) {
Attribute
otherGroupAttr = groupEntry.getAttributes().get(otherGroupAttribute);
if
(otherGroupAttr != null) {
@@ -963,10 +990,10 @@ public class LdapUserGroupBuilder implements
UserGroupSource {
if
(!userSearchEnabled && !sourceGroups.containsKey(originalUserFullName)) {
Map<String, String> userAttrMap = new HashMap<>();
String
userName = getShortName(originalUserFullName);
-
userAttrMap.put(UgsyncCommonConstants.ORIGINAL_NAME, userName);
-
userAttrMap.put(UgsyncCommonConstants.FULL_NAME, originalUserFullName);
-
userAttrMap.put(UgsyncCommonConstants.SYNC_SOURCE, currentSyncSource);
-
userAttrMap.put(UgsyncCommonConstants.LDAP_URL, config.getLdapUrl());
+
userAttrMap.put(UgsyncCommonConstants.ORIGINAL_NAME, userName);
+
userAttrMap.put(UgsyncCommonConstants.FULL_NAME, originalUserFullName);
+
userAttrMap.put(UgsyncCommonConstants.SYNC_SOURCE, currentSyncSource);
+
userAttrMap.put(UgsyncCommonConstants.LDAP_URL, config.getLdapUrl());
sourceUsers.put(originalUserFullName, userAttrMap);
}
groupUserTable.put(groupFullName, originalUserFullName, originalUserFullName);
@@ -1089,4 +1116,176 @@ public class LdapUserGroupBuilder implements
UserGroupSource {
LOG.info("longName: " + longName + ", userName: " + shortName);
return shortName;
}
+
+ private String getFirstRDN(String name) {
+ if (StringUtils.isEmpty(name)) {
+ return null;
+ }
+ String shortName = "";
+ try {
+ LdapName subjectDN = new LdapName(name);
+ List<Rdn> rdns = subjectDN.getRdns();
+ for (int i = rdns.size() - 1; i >= 0; i--) {
+ if (StringUtils.isNotEmpty(shortName)) {
+ break;
+ }
+ Rdn rdn = rdns.get(i);
+ Attributes attributes = rdn.toAttributes();
+ try {
+ Attribute cn = attributes.get("cn");
+ if (cn != null) {
+ Object value = cn.get();
+ if (value != null) {
+ shortName =
GROUP_NAME_ATTRIBUTE + value.toString();
+ }
+ }
+ } catch (NoSuchElementException ignore) {
+ LOG.warn("NoSuchElementException while
retrieving first RDN for " + name);
+ } catch (NamingException ignore) {
+ LOG.warn("NamingException while
retrieving first RDN for " + name);
+ }
+ }
+ } catch (InvalidNameException ex) {
+ LOG.warn("InvalidNameException while retrieving first
RDN for " + name);
+ }
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Input group name: " + name + ", first RDN: "
+ shortName);
+ }
+ return shortName;
+ }
+
+ private String getDNForMemberOf(String searchFilter) throws Throwable {
+ NamingEnumeration<SearchResult> userSearchResultEnum = null;
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("getDNForMemberOf(" + searchFilter + ")");
+ }
+ String computedSearchFilter = "";
+ try {
+ createLdapContext();
+ int total;
+ // Activate paged results
+ if (pagedResultsEnabled) {
+ ldapContext.setRequestControls(new Control[]{
+ new
PagedResultsControl(pagedResultsSize, Control.NONCRITICAL) });
+ }
+ SearchControls searchControls = new SearchControls();
+ searchControls.setSearchScope(groupSearchScope);
+
+ Set<String> searchAttributes = new HashSet<String>();
+ searchAttributes.add(groupNameAttribute);
+
searchControls.setReturningAttributes(searchAttributes.toArray(
+ new String[searchAttributes.size()]));
+
+
+ // When multiple OUs are configured, go through each OU
as the user search base to search for users.
+ for (int ou=0; ou<groupSearchBase.length; ou++) {
+ byte[] cookie = null;
+ int counter = 0;
+ try {
+ int paged = 0;
+ do {
+ userSearchResultEnum =
ldapContext
+
.search(groupSearchBase[ou], "(&(objectclass=" + groupObjectClass + ")(" +
searchFilter + "))",
+
searchControls);
+
+ while
(userSearchResultEnum.hasMore()) {
+ // searchResults
contains all the user entries
+ final SearchResult
userEntry = userSearchResultEnum.next();
+
+ if (userEntry == null)
{
+
LOG.info("userEntry null, skipping sync for the entry");
+ continue;
+ }
+
+ Attributes attributes =
userEntry.getAttributes();
+ if (attributes == null)
{
+
LOG.info("attributes missing for entry " + userEntry.getNameInNamespace() +
+
", skipping sync");
+ continue;
+ }
+
+ Attribute groupNameAttr
= attributes.get(groupNameAttribute);
+ if (groupNameAttr ==
null) {
+
LOG.info(groupNameAttribute + " missing for entry " +
userEntry.getNameInNamespace() +
+
", skipping sync");
+ continue;
+ }
+
+ String groupFullName =
(userEntry.getNameInNamespace());
+ LOG.info("groupFullName
= " + groupFullName);
+ computedSearchFilter +=
"(" + MEMBER_OF_ATTR + groupFullName + ")";
+ counter++;
+
+ if (counter <= 2000) {
+
LOG.info("Updating group count: " + counter
+
+ ", groupName: " + groupFullName);
+ if ( counter ==
2000 ) {
+
LOG.info("===> 2000 group records have been synchronized so far. From now on,
only a summary progress log will be written for every 100 users. To continue to
see detailed log for every user, please enable Trace level logging. <===");
+ }
+ } else {
+ if
(LOG.isTraceEnabled()) {
+
LOG.trace("Updating group count: " + counter
+
+ ", groupName: " + groupFullName);
+ } else {
+ if (
counter % 100 == 0) {
+
LOG.info("Synced " + counter + " groups till now");
+ }
+ }
+ }
+
+ }
+
+ // Examine the paged results
control response
+ Control[] controls =
ldapContext.getResponseControls();
+ if (controls != null) {
+ for (int i = 0; i <
controls.length; i++) {
+ if (controls[i]
instanceof PagedResultsResponseControl) {
+
PagedResultsResponseControl prrc =
+
(PagedResultsResponseControl)controls[i];
+ total =
prrc.getResultSize();
+ if
(total != 0) {
+
if (LOG.isDebugEnabled()) {
+
LOG.debug("END-OF-PAGE total : " + total);
+
}
+ } else {
+
if (LOG.isDebugEnabled()) {
+
LOG.debug("END-OF-PAGE total : unknown");
+
}
+ }
+ cookie
= prrc.getCookie();
+ }
+ }
+ } else {
+ if
(LOG.isDebugEnabled()) {
+ LOG.debug("No
controls were sent from the server");
+ }
+ }
+ // Re-activate paged results
+ if (pagedResultsEnabled) {
+ if
(LOG.isDebugEnabled()) {
+
LOG.debug(String.format("Fetched paged results round: %s", ++paged));
+ }
+
ldapContext.setRequestControls(new Control[]{
+ new
PagedResultsControl(pagedResultsSize, cookie, Control.CRITICAL) });
+ }
+ } while (cookie != null);
+
LOG.info("LdapUserGroupBuilder.getDNForMemberOf() completed with group count: "
+ + counter);
+ } catch (Exception t) {
+
LOG.error("LdapUserGroupBuilder.getDNForMemberOf() failed with exception: ", t);
+
LOG.info("LdapUserGroupBuilder.getDNForMemberOf() group count: "
+ + counter);
+ }
+ }
+ } finally {
+ if (userSearchResultEnum != null) {
+ userSearchResultEnum.close();
+ }
+ closeLdapContext();
+ }
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("computedSearchFilter = " +
computedSearchFilter);
+ }
+ return computedSearchFilter;
+ }
}
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 5f30165..531e35a 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
@@ -141,6 +141,7 @@ public class UserGroupSyncConfig {
private static final String LGSYNC_USER_OBJECT_CLASS =
"ranger.usersync.ldap.user.objectclass";
private static final String DEFAULT_USER_OBJECT_CLASS = "person";
+ private static final String LGSYNC_GROUPNAMES =
"ranger.usersync.ldap.groupnames";
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";
@@ -679,6 +680,22 @@ public class UserGroupSyncConfig {
return val;
}
+ public String getGroupNames() {
+ return prop.getProperty(LGSYNC_GROUPNAMES);
+ }
+
+ public Set<String> getGroupNameSet() {
+ String groupNames = getGroupNames();
+ Set<String> groupNamegSet = new HashSet<String>();
+ if (StringUtils.isNotEmpty(groupNames)) {
+ StringTokenizer st = new StringTokenizer(groupNames,
";");
+ while (st.hasMoreTokens()) {
+
groupNamegSet.add(st.nextToken().trim().toLowerCase());
+ }
+ }
+ return groupNamegSet;
+ }
+
public Set<String> getUserGroupNameAttributeSet() {
String uga = getUserGroupNameAttribute();
StringTokenizer st = new StringTokenizer(uga, ",");
@@ -1201,6 +1218,11 @@ public class UserGroupSyncConfig {
prop.setProperty(LGSYNC_GROUP_HIERARCHY_LEVELS,
String.valueOf(groupHierarchyLevel));
}
+ /* Used only for unit testing */
+ public void setGroupnames(String groupnames) {
+ prop.setProperty(LGSYNC_GROUPNAMES, groupnames);
+ }
+
public String getUserSyncMetricsFileName() throws IOException {
String val = prop.getProperty(UGSYNC_METRICS_FILEPATH);
if (StringUtils.isBlank(val)) {
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 78bc56c..2011b5b 100644
---
a/ugsync/src/test/java/org/apache/ranger/usergroupsync/TestLdapUserGroup.java
+++
b/ugsync/src/test/java/org/apache/ranger/usergroupsync/TestLdapUserGroup.java
@@ -95,6 +95,114 @@ public class TestLdapUserGroup extends AbstractLdapTestUnit{
}
@Test
+ public void testUserSearchFilterWithWildcards() throws Throwable {
+ config.setUserNameAttribute("sAMAccountName");
+
config.setUserSearchBase("DC=ranger,DC=qe,DC=hortonworks,DC=com");
+ config.setUserSearchFilter("");
+
config.setGroupSearchBase("OU=Groups,DC=ranger,DC=qe,DC=hortonworks,DC=com");
+ config.setUserGroupMemberAttributeName("member");
+ config.setUserObjectClass("organizationalPerson");
+ config.setGroupObjectClass("groupOfNames");
+ config.setGroupSearchEnabled(true);
+ config.setPagedResultsEnabled(true);
+ config.setGroupnames("memberof=cn=Group2*");
+ ldapBuilder.init();
+ sink.init();
+ ldapBuilder.updateSink(sink);
+ assertEquals(10, sink.getTotalUsers());
+ }
+
+ @Test
+ public void testUserSearchFilterWithShortname() throws Throwable {
+ config.setUserNameAttribute("sAMAccountName");
+
config.setUserSearchBase("DC=ranger,DC=qe,DC=hortonworks,DC=com");
+ config.setUserSearchFilter("");
+
config.setGroupSearchBase("OU=Groups,DC=ranger,DC=qe,DC=hortonworks,DC=com");
+ config.setUserGroupMemberAttributeName("member");
+ config.setUserObjectClass("organizationalPerson");
+ config.setGroupObjectClass("groupOfNames");
+ config.setGroupSearchEnabled(true);
+ config.setPagedResultsEnabled(true);
+ config.setGroupnames("memberof=CN=Group20");
+ ldapBuilder.init();
+ sink.init();
+ ldapBuilder.updateSink(sink);
+ assertEquals(10, sink.getTotalUsers());
+ }
+
+ @Test
+ public void testUserSearchFilterWithMultipleShortname() throws
Throwable {
+ config.setUserNameAttribute("sAMAccountName");
+
config.setUserSearchBase("DC=ranger,DC=qe,DC=hortonworks,DC=com");
+ config.setUserSearchFilter("");
+
config.setGroupSearchBase("OU=Groups,DC=ranger,DC=qe,DC=hortonworks,DC=com");
+ config.setUserGroupMemberAttributeName("member");
+ config.setUserObjectClass("organizationalPerson");
+ config.setGroupObjectClass("groupOfNames");
+ config.setGroupSearchEnabled(true);
+ config.setPagedResultsEnabled(true);
+ config.setGroupnames("memberof=CN=Group20;CN=Group19");
+ ldapBuilder.init();
+ sink.init();
+ ldapBuilder.updateSink(sink);
+ assertEquals(21, sink.getTotalUsers());
+ }
+
+ @Test
+ public void testUserSearchFilterWithMultipleWildcards() throws
Throwable {
+ config.setUserNameAttribute("sAMAccountName");
+
config.setUserSearchBase("DC=ranger,DC=qe,DC=hortonworks,DC=com");
+ config.setUserSearchFilter("");
+
config.setGroupSearchBase("OU=Groups,DC=ranger,DC=qe,DC=hortonworks,DC=com");
+ config.setUserGroupMemberAttributeName("member");
+ config.setUserObjectClass("organizationalPerson");
+ config.setGroupObjectClass("groupOfNames");
+ config.setGroupSearchEnabled(true);
+ config.setPagedResultsEnabled(true);
+ config.setGroupnames("memberof=CN=Group2*;memberof=CN=Group1*");
+ ldapBuilder.init();
+ sink.init();
+ ldapBuilder.updateSink(sink);
+ assertEquals(111, sink.getTotalUsers());
+ }
+
+ @Test
+ public void testUserSearchFilterWithMultipleDNs() throws Throwable {
+ config.setUserNameAttribute("sAMAccountName");
+
config.setUserSearchBase("DC=ranger,DC=qe,DC=hortonworks,DC=com");
+ config.setUserSearchFilter("");
+
config.setGroupSearchBase("OU=Groups,DC=ranger,DC=qe,DC=hortonworks,DC=com");
+ config.setUserGroupMemberAttributeName("member");
+ config.setUserObjectClass("organizationalPerson");
+ config.setGroupObjectClass("groupOfNames");
+ config.setGroupSearchEnabled(true);
+ config.setPagedResultsEnabled(true);
+
config.setGroupnames("memberof=CN=Group14,OU=Groups,DC=ranger,DC=qe,DC=hortonworks,DC=com;memberof=CN=Group20,OU=Groups,DC=ranger,DC=qe,DC=hortonworks,DC=com");
+ ldapBuilder.init();
+ sink.init();
+ ldapBuilder.updateSink(sink);
+ assertEquals(21, sink.getTotalUsers());
+ }
+
+ @Test
+ public void testUserSearchFilterWithInvalidDNs() throws Throwable {
+ config.setUserNameAttribute("sAMAccountName");
+
config.setUserSearchBase("DC=ranger,DC=qe,DC=hortonworks,DC=com");
+ config.setUserSearchFilter("");
+
config.setGroupSearchBase("OU=Groups,DC=ranger,DC=qe,DC=hortonworks,DC=com");
+ config.setUserGroupMemberAttributeName("member");
+ config.setUserObjectClass("organizationalPerson");
+ config.setGroupObjectClass("groupOfNames");
+ config.setGroupSearchEnabled(true);
+ config.setPagedResultsEnabled(true);
+
config.setGroupnames("uid=Group14,OU=Groups,DC=ranger;memberuid=Group20,OU=Groups,DC=ranger,DC=qe");
+ ldapBuilder.init();
+ sink.init();
+ ldapBuilder.updateSink(sink);
+ assertEquals(111, sink.getTotalUsers());
+ }
+
+ @Test
public void testUpdateSinkTotalUsers() throws Throwable {
config.setUserNameAttribute("sAMAccountName");
config.setUserSearchBase("cn=users,DC=ranger,DC=qe,DC=hortonworks,DC=com");
@@ -126,6 +234,7 @@ public class TestLdapUserGroup extends AbstractLdapTestUnit{
config.setGroupSearchEnabled(false);
config.setPagedResultsEnabled(false);
config.setGroupSearchFirstEnabled(false);
+ config.setGroupnames("");
//config.setGroupHierarchyLevel(0);
ldapBuilder.init();
sink.init();
@@ -137,7 +246,6 @@ public class TestLdapUserGroup extends AbstractLdapTestUnit{
public void testUpdateSinkUserFilter() throws Throwable {
config.setUserNameAttribute("sAMAccountName");
config.setUserSearchBase("cn=users,DC=ranger,DC=qe,DC=hortonworks,DC=com");
-
//config.setUserSearchFilter("(|(memberof=cn=usersGroup9,ou=Group,dc=openstacklocal)(memberof=cn=usersGroup4,ou=Group,dc=openstacklocal))");
config.setUserSearchFilter("(|(memberof=CN=Group10,OU=Groups,DC=ranger,DC=qe,DC=hortonworks,DC=com)(memberof=CN=Group11,OU=Groups,DC=ranger,DC=qe,DC=hortonworks,DC=com))");
config.setGroupSearchBase("OU=Groups,DC=ranger,DC=qe,DC=hortonworks,DC=com");
config.setUserGroupMemberAttributeName("member");
@@ -256,6 +364,7 @@ public class TestLdapUserGroup extends AbstractLdapTestUnit{
config.setGroupSearchEnabled(false);
config.setPagedResultsEnabled(true);
config.setGroupSearchFirstEnabled(false);
+ config.setGroupnames("");
ldapBuilder.init();
sink.init();
ldapBuilder.updateSink(sink);