This is an automated email from the ASF dual-hosted git repository.
spolavarapu pushed a commit to branch ranger-2.2
in repository https://gitbox.apache.org/repos/asf/ranger.git
The following commit(s) were added to refs/heads/ranger-2.2 by this push:
new f84adce RANGER-3254 & RANGER-3232: Incorporated review comments and
also added couple of unit tests
f84adce is described below
commit f84adce7c6988419ac1d9d59b6f347ea09636dc2
Author: Sailaja Polavarapu <[email protected]>
AuthorDate: Tue May 4 12:17:00 2021 -0700
RANGER-3254 & RANGER-3232: Incorporated review comments and also added
couple of unit tests
---
.../apache/ranger/ugsyncutil/model/XGroupInfo.java | 7 +-
.../apache/ranger/ugsyncutil/model/XUserInfo.java | 7 +-
.../unixusersync/config/UserGroupSyncConfig.java | 2 +-
.../process/PolicyMgrUserGroupBuilder.java | 119 ++++++++++++---------
.../process/TestFileSourceUserGroupBuilder.java | 31 ++++++
.../PolicyMgrUserGroupBuilderTest.java | 24 ++++-
.../resources/usergroups-special-characters.csv | 5 +
7 files changed, 135 insertions(+), 60 deletions(-)
diff --git
a/ugsync-util/src/main/java/org/apache/ranger/ugsyncutil/model/XGroupInfo.java
b/ugsync-util/src/main/java/org/apache/ranger/ugsyncutil/model/XGroupInfo.java
index 5f5c9aa..a80e5dc 100644
---
a/ugsync-util/src/main/java/org/apache/ranger/ugsyncutil/model/XGroupInfo.java
+++
b/ugsync-util/src/main/java/org/apache/ranger/ugsyncutil/model/XGroupInfo.java
@@ -19,6 +19,7 @@
package org.apache.ranger.ugsyncutil.model;
+import java.util.HashMap;
import java.util.Map;
public class XGroupInfo {
@@ -30,7 +31,7 @@ public class XGroupInfo {
private String isVisible;
private String groupSource;
private String otherAttributes;
- private Map<String, String> otherAttrsMap;
+ private Map<String, String> otherAttrsMap = new HashMap<>();
public String getId() {
return id;
}
@@ -77,7 +78,9 @@ public class XGroupInfo {
}
public void setOtherAttrsMap(Map<String, String> otherAttrsMap) {
- this.otherAttrsMap = otherAttrsMap;
+ if (otherAttrsMap != null) {
+ this.otherAttrsMap = otherAttrsMap;
+ }
}
public String getOtherAttributes() {
diff --git
a/ugsync-util/src/main/java/org/apache/ranger/ugsyncutil/model/XUserInfo.java
b/ugsync-util/src/main/java/org/apache/ranger/ugsyncutil/model/XUserInfo.java
index 058b984..bc1a665 100644
---
a/ugsync-util/src/main/java/org/apache/ranger/ugsyncutil/model/XUserInfo.java
+++
b/ugsync-util/src/main/java/org/apache/ranger/ugsyncutil/model/XUserInfo.java
@@ -20,6 +20,7 @@
package org.apache.ranger.ugsyncutil.model;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -28,7 +29,7 @@ public class XUserInfo {
private String name;
private String description;
private String otherAttributes;
- private Map<String, String> otherAttrsMap;
+ private Map<String, String> otherAttrsMap = new HashMap<>();
private String userSource;
private String status;
private String isVisible;
@@ -109,7 +110,9 @@ public class XUserInfo {
}
public void setOtherAttrsMap(Map<String, String> otherAttrsMap) {
- this.otherAttrsMap = otherAttrsMap;
+ if (otherAttrsMap != null) {
+ this.otherAttrsMap = otherAttrsMap;
+ }
}
public String getOtherAttributes() {
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 2271bd9..ce9d27f 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
@@ -273,7 +273,7 @@ public class UserGroupSyncConfig {
private static final boolean DEFAULT_UGSYNC_DELETES_ENABLED = false;
private static final String UGSYNC_DELETES_FREQUENCY =
"ranger.usersync.deletes.frequency";
private static final long DEFAULT_UGSYNC_DELETES_FREQUENCY = 10L; //
After every 10 sync cycles
- private static final String UGSYNC_NAME_VALIDATION_ENABLED =
"ranger.usersync.name.validation.enabled";
+ public static final String UGSYNC_NAME_VALIDATION_ENABLED =
"ranger.usersync.name.validation.enabled";
private static final boolean DEFAULT_UGSYNC_NAME_VALIDATION_ENABLED =
false;
private Properties prop = new Properties();
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 4d8a32a..6420939 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
@@ -602,35 +602,38 @@ public class PolicyMgrUserGroupBuilder extends
AbstractUserGroupSource implement
String groupName = groupNameMap.get(groupDN);
if (StringUtils.isEmpty(groupName)) {
groupName =
groupNameTransform(newGroupAttrs.get(UgsyncCommonConstants.ORIGINAL_NAME).trim());
- if (!isValidString(groupName)) {
- LOG.warn("Ignoring invalid group " +
groupName + " Full name = " + groupDN);
- continue;
- }
- groupNameMap.put(groupDN, groupName);
}
- if (!groupCache.containsKey(groupName)) {
- XGroupInfo newGroup = addXGroupInfo(groupName,
newGroupAttrs, newGroupAttrsStr);
- deltaGroups.put(groupName, newGroup);
- noOfNewGroups++;
+ if (!isValidString(groupName)) {
+ LOG.warn("Ignoring invalid group " + groupName
+ " Full name = " + groupDN);
} else {
- XGroupInfo oldGroup = groupCache.get(groupName);
- Map<String, String> oldGroupAttrs =
oldGroup.getOtherAttrsMap();
- String oldGroupDN =
oldGroupAttrs.get(UgsyncCommonConstants.FULL_NAME);
- //LOG.info("DN from source = " + groupDN + "
saved DN = " + oldGroupDN);
- //LOG.info("OldGroupAttr = " + oldGroupAttrs +
" newGroupAttrs = " + newGroupAttrs);
- if (StringUtils.equalsIgnoreCase(groupDN,
oldGroupDN)
- &&
StringUtils.equalsIgnoreCase(oldGroupAttrs.get(UgsyncCommonConstants.SYNC_SOURCE),
newGroupAttrs.get(UgsyncCommonConstants.SYNC_SOURCE))
- &&
StringUtils.equalsIgnoreCase(oldGroupAttrs.get(UgsyncCommonConstants.LDAP_URL),
newGroupAttrs.get(UgsyncCommonConstants.LDAP_URL))) {
- String oldGroupAttrsStr =
gson.toJson(oldGroupAttrs);
-
if(!StringUtils.equalsIgnoreCase(oldGroupAttrsStr, newGroupAttrsStr)) {
-
oldGroup.setOtherAttributes(newGroupAttrsStr);
-
oldGroup.setOtherAttrsMap(newGroupAttrs);
- deltaGroups.put(groupName,
oldGroup);
- noOfModifiedGroups++;
- }
+ if (!groupCache.containsKey(groupName)) {
+ XGroupInfo newGroup =
addXGroupInfo(groupName, newGroupAttrs, newGroupAttrsStr);
+ deltaGroups.put(groupName, newGroup);
+ noOfNewGroups++;
+ groupNameMap.put(groupDN, groupName);
} else {
- if (LOG.isDebugEnabled()) {
- LOG.debug("Skipping to update "
+ groupName + " as same group name with different DN already exists");
+ XGroupInfo oldGroup =
groupCache.get(groupName);
+ String oldGroupAttrsStr =
oldGroup.getOtherAttributes();
+ if
(!StringUtils.equalsIgnoreCase(oldGroupAttrsStr, newGroupAttrsStr)) {
+ Map<String, String>
oldGroupAttrs = oldGroup.getOtherAttrsMap();
+ String oldGroupDN =
oldGroupAttrs.get(UgsyncCommonConstants.FULL_NAME);
+ if
(StringUtils.equalsIgnoreCase(groupDN, oldGroupDN)
+ &&
(StringUtils.isEmpty(oldGroupAttrs.get(UgsyncCommonConstants.SYNC_SOURCE))
+ ||
StringUtils.equalsIgnoreCase(oldGroupAttrs.get(UgsyncCommonConstants.SYNC_SOURCE),
+
newGroupAttrs.get(UgsyncCommonConstants.SYNC_SOURCE)))) {
+
oldGroup.setOtherAttributes(newGroupAttrsStr);
+
oldGroup.setOtherAttrsMap(newGroupAttrs);
+
deltaGroups.put(groupName, oldGroup);
+ noOfModifiedGroups++;
+
groupNameMap.put(groupDN, groupName);
+ } else {
+ if
(LOG.isDebugEnabled()) {
+
LOG.debug("Skipping to update " + groupName + " as same group name with
different DN or sync source already exists");
+ LOG.debug("old
group DN = " + oldGroupDN + " and new group DN = " + groupDN);
+ }
+ }
+ } else {
+ groupNameMap.put(groupDN,
groupName);
}
}
}
@@ -654,35 +657,39 @@ public class PolicyMgrUserGroupBuilder extends
AbstractUserGroupSource implement
String userName = userNameMap.get(userDN);
if (StringUtils.isEmpty(userName)) {
userName =
userNameTransform(newUserAttrs.get(UgsyncCommonConstants.ORIGINAL_NAME).trim());
- if (!isValidString(userName)) {
- LOG.warn("Ignoring invalid user " +
userName + " Full name = " + userDN);
- continue;
- }
- userNameMap.put(userDN, userName);
}
-
- if (!userCache.containsKey(userName)) {
-
- XUserInfo newUser = addXUserInfo(userName,
newUserAttrs, newUserAttrsStr);
- deltaUsers.put(userName, newUser);
- noOfNewUsers++;
+ if (!isValidString(userName)) {
+ LOG.warn("Ignoring invalid user " + userName +
" Full name = " + userDN);
} else {
- XUserInfo oldUser = userCache.get(userName);
- Map<String, String> oldUserAttrs =
oldUser.getOtherAttrsMap();
- String oldUserDN =
oldUserAttrs.get(UgsyncCommonConstants.FULL_NAME);
- if (StringUtils.equalsIgnoreCase(userDN,
oldUserDN)
- &&
StringUtils.equalsIgnoreCase(oldUserAttrs.get(UgsyncCommonConstants.SYNC_SOURCE),
newUserAttrs.get(UgsyncCommonConstants.SYNC_SOURCE))
- &&
StringUtils.equalsIgnoreCase(oldUserAttrs.get(UgsyncCommonConstants.LDAP_URL),
newUserAttrs.get(UgsyncCommonConstants.LDAP_URL))) {
- String oldUserAttrsStr =
gson.toJson(oldUserAttrs);
- if(
!StringUtils.equalsIgnoreCase(oldUserAttrsStr, newUserAttrsStr)) {
-
oldUser.setOtherAttributes(newUserAttrsStr);
-
oldUser.setOtherAttrsMap(newUserAttrs);
- deltaUsers.put(userName,
oldUser);
- noOfModifiedUsers++;
- }
+ if (!userCache.containsKey(userName)) {
+
+ XUserInfo newUser =
addXUserInfo(userName, newUserAttrs, newUserAttrsStr);
+ deltaUsers.put(userName, newUser);
+ noOfNewUsers++;
+ userNameMap.put(userDN, userName);
} else {
- if (LOG.isDebugEnabled()) {
- LOG.debug("Skipping to update "
+ userName + " as same username with different DN already exists");
+ XUserInfo oldUser =
userCache.get(userName);
+ String oldUserAttrsStr =
oldUser.getOtherAttributes();
+ if
(!StringUtils.equalsIgnoreCase(oldUserAttrsStr, newUserAttrsStr)) {
+ Map<String, String>
oldUserAttrs = oldUser.getOtherAttrsMap();
+ String oldUserDN =
oldUserAttrs.get(UgsyncCommonConstants.FULL_NAME);
+ if
(StringUtils.equalsIgnoreCase(userDN, oldUserDN)
+ &&
(StringUtils.isEmpty(oldUserAttrs.get(UgsyncCommonConstants.SYNC_SOURCE))
+ ||
StringUtils.equalsIgnoreCase(oldUserAttrs.get(UgsyncCommonConstants.SYNC_SOURCE),
+
newUserAttrs.get(UgsyncCommonConstants.SYNC_SOURCE)))) {
+
oldUser.setOtherAttributes(newUserAttrsStr);
+
oldUser.setOtherAttrsMap(newUserAttrs);
+
deltaUsers.put(userName, oldUser);
+ noOfModifiedUsers++;
+ userNameMap.put(userDN,
userName);
+ } else {
+ if
(LOG.isDebugEnabled()) {
+
LOG.debug("Skipping to update " + userName + " as same username with different
DN or sync source already exists");
+ LOG.debug("old
user DN = " + oldUserDN + " and new user DN = " + userDN);
+ }
+ }
+ } else {
+ userNameMap.put(userDN,
userName);
}
}
}
@@ -1589,7 +1596,7 @@ public class PolicyMgrUserGroupBuilder extends
AbstractUserGroupSource implement
return groupName;
}
- private boolean isValidString(final String name) {
+ protected boolean isValidString(final String name) {
if (StringUtils.isBlank(name)) {
return false;
}
@@ -1827,4 +1834,10 @@ public class PolicyMgrUserGroupBuilder extends
AbstractUserGroupSource implement
return ret;
}
+
+ //Only for testing purpose
+ protected void setUserSyncNameValidationEnabled(boolean
isNameValidationEnabled) {
+
config.setProperty(UserGroupSyncConfig.UGSYNC_NAME_VALIDATION_ENABLED,
"isNameValidationEnabled");
+ this.isUserSyncNameValidationEnabled =
config.isUserSyncNameValidationEnabled();
+ }
}
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 42884af..2f26677 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
@@ -158,4 +158,35 @@ public class TestFileSourceUserGroupBuilder {
assertTrue(sink.getAllGroups().contains("group1"));
assertTrue(sink.getAllGroups().contains("group2"));
}
+
+ @Test
+ public void testUpdateSinkDisableInvalidNameCheck() throws Throwable {
+ config.setProperty(UserGroupSyncConfig.UGSYNC_SOURCE_FILE_PROC,
"src/test/resources/usergroups-special-characters.csv");
+
+ FileSourceUserGroupBuilder fileBuilder = new
FileSourceUserGroupBuilder();
+ fileBuilder.init();
+
+ PolicyMgrUserGroupBuilderTest sink = new
PolicyMgrUserGroupBuilderTest();
+ sink.init();
+ fileBuilder.updateSink(sink);
+
+ assertEquals(0, sink.getTotalInvalidGroups());
+ assertEquals(0, sink.getTotalInvalidUsers());
+ }
+
+ @Test
+ public void testUpdateSinkEnableInvalidNameCheck() throws Throwable {
+ config.setProperty(UserGroupSyncConfig.UGSYNC_SOURCE_FILE_PROC,
"src/test/resources/usergroups-special-characters.csv");
+
+ FileSourceUserGroupBuilder fileBuilder = new
FileSourceUserGroupBuilder();
+ fileBuilder.init();
+
+ PolicyMgrUserGroupBuilderTest sink = new
PolicyMgrUserGroupBuilderTest();
+ sink.init();
+ sink.setUserSyncNameValidationEnabled(true);
+ fileBuilder.updateSink(sink);
+
+ assertEquals(2, sink.getTotalInvalidGroups());
+ assertEquals(1, sink.getTotalInvalidUsers());
+ }
}
diff --git
a/ugsync/src/test/java/org/apache/ranger/usergroupsync/PolicyMgrUserGroupBuilderTest.java
b/ugsync/src/test/java/org/apache/ranger/usergroupsync/PolicyMgrUserGroupBuilderTest.java
index 4fb6b6c..930f688 100644
---
a/ugsync/src/test/java/org/apache/ranger/usergroupsync/PolicyMgrUserGroupBuilderTest.java
+++
b/ugsync/src/test/java/org/apache/ranger/usergroupsync/PolicyMgrUserGroupBuilderTest.java
@@ -30,6 +30,8 @@ public class PolicyMgrUserGroupBuilderTest extends
PolicyMgrUserGroupBuilder {
private Set<String> allGroups;
private Set<String> allUsers;
private Map<String, Set<String>> groupUsers;
+ private Set<String> invalidGroups;
+ private Set<String> invalidUsers;
public PolicyMgrUserGroupBuilderTest() {
super();
@@ -40,6 +42,8 @@ public class PolicyMgrUserGroupBuilderTest extends
PolicyMgrUserGroupBuilder {
allGroups = new HashSet<>();
allUsers = new HashSet<>();
groupUsers = new HashMap<>();
+ invalidGroups = new HashSet<>();
+ invalidUsers = new HashSet<>();
}
public int getTotalUsers() {
@@ -59,6 +63,14 @@ public class PolicyMgrUserGroupBuilderTest extends
PolicyMgrUserGroupBuilder {
return allUsers;
}
+ public int getTotalInvalidGroups() {
+ return invalidGroups.size();
+ }
+
+ public int getTotalInvalidUsers() {
+ return invalidUsers.size();
+ }
+
public int getGroupsWithNoUsers() {
int groupsWithNoUsers = 0;
for (String group : groupUsers.keySet()) {
@@ -77,11 +89,19 @@ public class PolicyMgrUserGroupBuilderTest extends
PolicyMgrUserGroupBuilder {
for (String userdn : sourceUsers.keySet()) {
//System.out.println("Username: " +
sourceUsers.get(userdn).get("original_name"));
-
allUsers.add(userNameTransform(sourceUsers.get(userdn).get("original_name")));
+ String username =
userNameTransform(sourceUsers.get(userdn).get("original_name"));
+ allUsers.add(username);
+ if (!isValidString(username)) {
+ invalidUsers.add(username);
+ }
}
for (String groupdn : sourceGroups.keySet()) {
//System.out.println("Groupname: " +
sourceGroups.get(groupdn).get("original_name"));
-
allGroups.add(groupNameTransform(sourceGroups.get(groupdn).get("original_name")));
+ String groupname =
groupNameTransform(sourceGroups.get(groupdn).get("original_name"));
+ allGroups.add(groupname);
+ if (!isValidString(groupname)) {
+ invalidGroups.add(groupname);
+ }
}
groupUsers = sourceGroupUsers;
//System.out.println("Username: " + user + " and associated
groups: " + groups);
diff --git a/ugsync/src/test/resources/usergroups-special-characters.csv
b/ugsync/src/test/resources/usergroups-special-characters.csv
new file mode 100644
index 0000000..8ba0285
--- /dev/null
+++ b/ugsync/src/test/resources/usergroups-special-characters.csv
@@ -0,0 +1,5 @@
+user$1,group1
+user2,group'2
+user3,group@1,group"2
+user-4,
+user5,group=
\ No newline at end of file