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 ba2d550 RANGER-2552: Fixed code to update the user role/permissions properly when group memberships are updated ba2d550 is described below commit ba2d55068a0c4e19b29616c1265575da674a5170 Author: Sailaja Polavarapu <spolavar...@cloudera.com> AuthorDate: Tue Aug 27 10:32:38 2019 -0700 RANGER-2552: Fixed code to update the user role/permissions properly when group memberships are updated --- .../process/PolicyMgrUserGroupBuilder.java | 158 ++++++--------------- 1 file changed, 44 insertions(+), 114 deletions(-) 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 e5fc68b..52579a3 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 @@ -34,6 +34,7 @@ import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.StringTokenizer; import java.util.regex.Pattern; @@ -359,7 +360,6 @@ public class PolicyMgrUserGroupBuilder implements UserGroupSink { @Override public void addOrUpdateUser(String userName, List<String> groups) throws Throwable { - UserGroupInfo ugInfo = new UserGroupInfo(); XUserInfo user = userName2XUserInfoMap.get(userName); if (groups == null) { @@ -402,6 +402,7 @@ public class PolicyMgrUserGroupBuilder implements UserGroupSink { List<String> addGroups = new ArrayList<String>(); List<String> delGroups = new ArrayList<String>(); List<String> updateGroups = new ArrayList<String>(); + Set<String> cumulativeGroups = new HashSet<>(); XGroupInfo tempXGroupInfo=null; for(String group : groups) { if (! oldGroups.contains(group)) { @@ -442,122 +443,54 @@ public class PolicyMgrUserGroupBuilder implements UserGroupSink { } if (isMockRun) { - return; - } - if (!addGroups.isEmpty()) { - XUserInfo obj = addXUserInfo(userName); - if (obj != null) { - for (String group : addGroups) { - String value = groupMap.get(group); - if (value != null) { - List<String> userRoleList = new ArrayList<String>(); - userRoleList.add(value); - if (userMap.containsKey(obj.getName())) { - List<String> userRole = new ArrayList<String>(); - userRole.add(userMap.get(obj.getName())); - if (!obj.getUserRoleList().equals(userRole)) { - obj.setUserRoleList(userRole); - - } - } else if (!obj.getUserRoleList().equals(userRoleList)) { - obj.setUserRoleList(userRoleList); - } - } - } - } - ugInfo.setXuserInfo(obj); - ugInfo.setXgroupInfo(getXGroupInfoList(addGroups)); - try { - // If the rest call to ranger admin fails, - // propagate the failure to the caller for retry in next - // sync cycle. - if (addUserGroupInfo(ugInfo) == null) { - String msg = "Failed to add user group info"; - LOG.error(msg); - throw new Exception(msg); - } - } catch (Throwable t) { - LOG.error("PolicyMgrUserGroupBuilder.addUserGroupInfo failed for user-group entry: " - + ugInfo.toString() + " with exception: ", t); + if (LOG.isDebugEnabled()) { + LOG.debug("PolicyMgrUserGroupBuilder.addOrUpdateUser(): Mock Run enabled and hence not sending updates to Ranger admin!"); } - addXUserGroupInfo(user, addGroups); + return; } if (!delGroups.isEmpty()) { - if (LOG.isDebugEnabled()) { - LOG.debug("PolicyMgrUserGroupBuilder.addUserGroupInfo() user role list for " + userName + " after delete = " + user.getUserRoleList()); - } delXUserGroupInfo(user, delGroups); //Remove groups from user mapping - userName2XUserInfoMap.get(userName).deleteGroups(delGroups); - List<String> groupList = userName2XUserInfoMap.get(userName).getGroups(); + user.deleteGroups(delGroups); if (LOG.isDebugEnabled()) { - LOG.debug("PolicyMgrUserGroupBuilder.addUserGroupInfo() groups for " + userName + " after delete = " + groupList); - } - if (!groupList.isEmpty()) { - XUserInfo obj = addXUserInfo(userName); - if (obj != null) { - for (String group : updateGroups) { - String value = groupMap.get(group); - if (value != null) { - List<String> userRoleList = new ArrayList<String>(); - userRoleList.add(value); - if (userMap.containsKey(obj.getName())) { - List<String> userRole = new ArrayList<String>(); - userRole.add(userMap.get(obj.getName())); - if (!obj.getUserRoleList().equals(userRole)) { - obj.setUserRoleList(userRole); - } - } else if (!obj.getUserRoleList().equals( - userRoleList)) { - obj.setUserRoleList(userRoleList); - } - } - } - } - ugInfo.setXuserInfo(obj); - ugInfo.setXgroupInfo(getXGroupInfoList(groupList)); - try { - // If the rest call to ranger admin fails, - // propagate the failure to the caller for retry in next - // sync cycle. - if (addUserGroupInfo(ugInfo) == null) { - String msg = "Failed to add user group info"; - LOG.error(msg); - throw new Exception(msg); - } - } catch (Throwable t) { - LOG.error("PolicyMgrUserGroupBuilder.addUserGroupInfo failed with exception: " - + t.getMessage() - + ", for user-group entry: " - + ugInfo); - } + LOG.debug("PolicyMgrUserGroupBuilder.addUserGroupInfo(): groups for " + userName + " after delete = " + user.getGroups()); } } - if (!updateGroups.isEmpty()) { + if (!delGroups.isEmpty() || !addGroups.isEmpty() || !updateGroups.isEmpty()) { + cumulativeGroups = new HashSet<>(user.getGroups()); + cumulativeGroups.addAll(addGroups); + cumulativeGroups.addAll(updateGroups); + if (LOG.isDebugEnabled()) { + LOG.debug("PolicyMgrUserGroupBuilder.addUserGroupInfo(): cumulative groups for " + userName + " = " + cumulativeGroups); + } + + UserGroupInfo ugInfo = new UserGroupInfo(); XUserInfo obj = addXUserInfo(userName); - if (obj != null) { - for (String group : updateGroups) { - String value = groupMap.get(group); - if (value != null) { - List<String> userRoleList = new ArrayList<String>(); - userRoleList.add(value); - if (userMap.containsKey(obj.getName())) { - List<String> userRole = new ArrayList<String>(); - userRole.add(userMap.get(obj.getName())); - if (!obj.getUserRoleList().equals(userRole)) { - obj.setUserRoleList(userRole); - } - } else if (!obj.getUserRoleList().equals( - userRoleList)) { - obj.setUserRoleList(userRoleList); - } - } + Set<String> userRoleList = new HashSet<>(); + if (userMap.containsKey(userName)) { + // Add the user role that is defined in user role assignments + userRoleList.add(userMap.get(userName)); + } + + for (String group : cumulativeGroups) { + String value = groupMap.get(group); + if (value != null) { + userRoleList.add(value); } } + + if (!userRoleList.isEmpty()) { + obj.setUserRoleList(new ArrayList<>(userRoleList)); + } + + if (LOG.isDebugEnabled()) { + LOG.debug("PolicyMgrUserGroupBuilder.addUserGroupInfo() user role list for " + userName + " = " + obj.getUserRoleList()); + } + ugInfo.setXuserInfo(obj); - ugInfo.setXgroupInfo(getXGroupInfoList(updateGroups)); + ugInfo.setXgroupInfo(getXGroupInfoList(new ArrayList<>(cumulativeGroups))); try { // If the rest call to ranger admin fails, // propagate the failure to the caller for retry in next @@ -576,26 +509,23 @@ public class PolicyMgrUserGroupBuilder implements UserGroupSink { } if (isStartupFlag) { + UserGroupInfo ugInfo = new UserGroupInfo(); XUserInfo obj = addXUserInfo(userName); if (obj != null && updateGroups.isEmpty() && addGroups.isEmpty() && delGroups.isEmpty()) { + Set<String> userRoleList = new HashSet<>(); + if (userMap.containsKey(userName)) { + // Add the user role that is defined in user role assignments + userRoleList.add(userMap.get(userName)); + } + for (String group : groups) { String value = groupMap.get(group); if (value != null) { - List<String> userRoleList = new ArrayList<String>(); userRoleList.add(value); - if (userMap.containsKey(obj.getName())) { - List<String> userRole = new ArrayList<String>(); - userRole.add(userMap.get(obj.getName())); - if (!obj.getUserRoleList().equals(userRole)) { - obj.setUserRoleList(userRole); - } - } else if (!obj.getUserRoleList().equals( - userRoleList)) { - obj.setUserRoleList(userRoleList); - } } } + obj.setUserRoleList(new ArrayList<>(userRoleList)); ugInfo.setXuserInfo(obj); ugInfo.setXgroupInfo(getXGroupInfoList(groups)); try {