Repository: ranger Updated Branches: refs/heads/master d0e5f24b2 -> a4ad1a0b6
RANGER-2021 : Ranger Usersync should use cookie based authentication for subsequent requests Change-Id: I9fd45eb7cbdf961a1df24f55e63245bb699577c7 Signed-off-by: Mehul Parikh <[email protected]> Project: http://git-wip-us.apache.org/repos/asf/ranger/repo Commit: http://git-wip-us.apache.org/repos/asf/ranger/commit/a4ad1a0b Tree: http://git-wip-us.apache.org/repos/asf/ranger/tree/a4ad1a0b Diff: http://git-wip-us.apache.org/repos/asf/ranger/diff/a4ad1a0b Branch: refs/heads/master Commit: a4ad1a0b6599cee1831062d73f8515bcd7e0f721 Parents: d0e5f24 Author: Nikhil P <[email protected]> Authored: Wed Apr 18 20:18:33 2018 +0530 Committer: Mehul Parikh <[email protected]> Committed: Thu Apr 19 15:39:40 2018 +0530 ---------------------------------------------------------------------- .../config/UserGroupSyncConfig.java | 11 +- .../process/PolicyMgrUserGroupBuilder.java | 660 +++++++++++++++---- .../conf.dist/ranger-ugsync-default.xml | 4 + 3 files changed, 536 insertions(+), 139 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ranger/blob/a4ad1a0b/ugsync/src/main/java/org/apache/ranger/unixusersync/config/UserGroupSyncConfig.java ---------------------------------------------------------------------- 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 e9e356a..13d77e7 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 @@ -233,7 +233,10 @@ public class UserGroupSyncConfig { 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 Properties prop = new Properties(); + + private static final String USERSYNC_RANGER_COOKIE_ENABLED_PROP = "ranger.usersync.cookie.enabled"; + + private Properties prop = new Properties(); private static volatile UserGroupSyncConfig me = null; @@ -928,6 +931,12 @@ public class UserGroupSyncConfig { return null; } + public boolean isUserSyncRangerCookieEnabled() { + String val = prop.getProperty(USERSYNC_RANGER_COOKIE_ENABLED_PROP); + return val == null || Boolean.valueOf(val.trim()); + } + + public String getRoleDelimiter() { if (prop != null && prop.containsKey(ROLE_ASSIGNMENT_LIST_DELIMITER)) { String roleDelimiter = prop http://git-wip-us.apache.org/repos/asf/ranger/blob/a4ad1a0b/ugsync/src/main/java/org/apache/ranger/unixusersync/process/PolicyMgrUserGroupBuilder.java ---------------------------------------------------------------------- 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 b30b051..dd26e1b 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 @@ -28,7 +28,13 @@ import java.net.UnknownHostException; import java.security.KeyStore; import java.security.PrivilegedAction; import java.security.SecureRandom; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.StringTokenizer; import java.util.regex.Pattern; import javax.net.ssl.HostnameVerifier; @@ -39,11 +45,26 @@ import javax.net.ssl.SSLSession; import javax.net.ssl.TrustManager; import javax.net.ssl.TrustManagerFactory; import javax.security.auth.Subject; +import javax.servlet.http.HttpServletResponse; +import javax.ws.rs.core.Cookie; import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.NewCookie; import org.apache.hadoop.security.SecureClientLogin; import org.apache.log4j.Level; import org.apache.log4j.Logger; +import org.apache.ranger.unixusersync.config.UserGroupSyncConfig; +import org.apache.ranger.unixusersync.model.GetXGroupListResponse; +import org.apache.ranger.unixusersync.model.GetXUserGroupListResponse; +import org.apache.ranger.unixusersync.model.GetXUserListResponse; +import org.apache.ranger.unixusersync.model.MUserInfo; +import org.apache.ranger.unixusersync.model.UgsyncAuditInfo; +import org.apache.ranger.unixusersync.model.UserGroupInfo; +import org.apache.ranger.unixusersync.model.XGroupInfo; +import org.apache.ranger.unixusersync.model.XUserGroupInfo; +import org.apache.ranger.unixusersync.model.XUserInfo; +import org.apache.ranger.usergroupsync.UserGroupSink; +import org.apache.ranger.usersync.util.UserSyncUtil; import com.google.gson.Gson; import com.google.gson.GsonBuilder; @@ -55,11 +76,6 @@ import com.sun.jersey.api.client.config.DefaultClientConfig; import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter; import com.sun.jersey.client.urlconnection.HTTPSProperties; -import org.apache.ranger.unixusersync.config.UserGroupSyncConfig; -import org.apache.ranger.unixusersync.model.*; -import org.apache.ranger.usergroupsync.UserGroupSink; -import org.apache.ranger.usersync.util.UserSyncUtil; - public class PolicyMgrUserGroupBuilder implements UserGroupSink { private static final Logger LOG = Logger.getLogger(PolicyMgrUserGroupBuilder.class); @@ -86,11 +102,16 @@ public class PolicyMgrUserGroupBuilder implements UserGroupSink { private static final String GROUP_SOURCE_EXTERNAL ="1"; + private static final String RANGER_ADMIN_COOKIE_NAME = "RANGERADMINSESSIONID"; private static String LOCAL_HOSTNAME = "unknown"; private String recordsToPullPerCall = "1000"; private boolean isMockRun = false; private String policyMgrBaseUrl; + private Cookie sessionId=null; + private boolean isValidRangerCookie=false; + List<NewCookie> cookieList=new ArrayList<>(); + private UserGroupSyncConfig config = UserGroupSyncConfig.getInstance(); private UserGroupInfo usergroupInfo = new UserGroupInfo(); @@ -124,6 +145,7 @@ public class PolicyMgrUserGroupBuilder implements UserGroupSink { private HashSet<String> modifiedUserList = new HashSet<String>(); private HashSet<String> newGroupList = new HashSet<String>(); private HashSet<String> modifiedGroupList = new HashSet<String>(); + private boolean isRangerCookieEnabled; boolean isStartupFlag = false; static { @@ -150,11 +172,11 @@ public class PolicyMgrUserGroupBuilder implements UserGroupSink { noOfNewGroups = 0; noOfModifiedGroups = 0; isStartupFlag = true; - + isRangerCookieEnabled = config.isUserSyncRangerCookieEnabled(); if (isMockRun) { LOG.setLevel(Level.DEBUG); } - + sessionId=null; keyStoreFile = config.getSSLKeyStorePath(); keyStoreFilepwd = config.getSSLKeyStorePathPassword(); trustStoreFile = config.getSSLTrustStorePath(); @@ -327,7 +349,6 @@ public class PolicyMgrUserGroupBuilder implements UserGroupSink { if (groups == null) { groups = new ArrayList<String>(); } - if (user == null) { // Does not exists //noOfNewUsers++; newUserList.add(userName); @@ -545,109 +566,118 @@ public class PolicyMgrUserGroupBuilder implements UserGroupSink { private void buildGroupList() { if (LOG.isDebugEnabled()) { - LOG.debug("==> PolicyMgrUserGroupBuilder.buildGroupList"); + LOG.debug("==> PolicyMgrUserGroupBuilder.buildGroupList()"); } Client c = getClient(); - int totalCount = 100; int retrievedCount = 0; - while (retrievedCount < totalCount) { - WebResource r = c.resource(getURL(PM_GROUP_LIST_URI)) - .queryParam("pageSize", recordsToPullPerCall) - .queryParam("startIndex", String.valueOf(retrievedCount)); - - String response = r.accept(MediaType.APPLICATION_JSON_TYPE).get(String.class); - - LOG.debug("RESPONSE: [" + response + "]"); + String response = null; + Gson gson = new GsonBuilder().create(); + if (isRangerCookieEnabled) { + response = cookieBasedGetEntity(PM_GROUP_LIST_URI, retrievedCount); + } else { + WebResource r = c.resource(getURL(PM_GROUP_LIST_URI)).queryParam("pageSize", recordsToPullPerCall) + .queryParam("startIndex", String.valueOf(retrievedCount)); - Gson gson = new GsonBuilder().create(); + response = r.accept(MediaType.APPLICATION_JSON_TYPE).get(String.class); + } + LOG.debug("RESPONSE: [" + response + "]"); - GetXGroupListResponse groupList = gson.fromJson(response, GetXGroupListResponse.class); + GetXGroupListResponse groupList = gson.fromJson(response, GetXGroupListResponse.class); - totalCount = groupList.getTotalCount(); + totalCount = groupList.getTotalCount(); if (groupList.getXgroupInfoList() != null) { xgroupList.addAll(groupList.getXgroupInfoList()); retrievedCount = xgroupList.size(); for (XGroupInfo g : groupList.getXgroupInfoList()) { - LOG.debug("GROUP: Id:" + g.getId() + ", Name: "+ g.getName() + ", Description: "+ g.getDescription()); + LOG.debug("GROUP: Id:" + g.getId() + ", Name: " + g.getName() + ", Description: " + + g.getDescription()); } } } + if (LOG.isDebugEnabled()) { + LOG.debug("<== PolicyMgrUserGroupBuilder.buildGroupList()"); + } } private void buildUserList() { if (LOG.isDebugEnabled()) { - LOG.debug("==> PolicyMgrUserGroupBuilder.buildUserList"); + LOG.debug("==> PolicyMgrUserGroupBuilder.buildUserList()"); } Client c = getClient(); + int totalCount = 100; + int retrievedCount = 0; + while (retrievedCount < totalCount) { + String response = null; + Gson gson = new GsonBuilder().create(); + if (isRangerCookieEnabled) { + response = cookieBasedGetEntity(PM_USER_LIST_URI, retrievedCount); + } else { + WebResource r = c.resource(getURL(PM_USER_LIST_URI)).queryParam("pageSize", recordsToPullPerCall) + .queryParam("startIndex", String.valueOf(retrievedCount)); + response = r.accept(MediaType.APPLICATION_JSON_TYPE).get(String.class); + } + LOG.debug("RESPONSE: [" + response + "]"); + GetXUserListResponse userList = gson.fromJson(response, GetXUserListResponse.class); - int totalCount = 100; - int retrievedCount = 0; - - while (retrievedCount < totalCount) { - - WebResource r = c.resource(getURL(PM_USER_LIST_URI)) - .queryParam("pageSize", recordsToPullPerCall) - .queryParam("startIndex", String.valueOf(retrievedCount)); - - String response = r.accept(MediaType.APPLICATION_JSON_TYPE).get(String.class); - - Gson gson = new GsonBuilder().create(); - - LOG.debug("RESPONSE: [" + response + "]"); - - GetXUserListResponse userList = gson.fromJson(response, GetXUserListResponse.class); - - totalCount = userList.getTotalCount(); + totalCount = userList.getTotalCount(); - if (userList.getXuserInfoList() != null) { - xuserList.addAll(userList.getXuserInfoList()); - retrievedCount = xuserList.size(); + if (userList.getXuserInfoList() != null) { + xuserList.addAll(userList.getXuserInfoList()); + retrievedCount = xuserList.size(); - for(XUserInfo u : userList.getXuserInfoList()) { - LOG.debug("USER: Id:" + u.getId() + ", Name: " + u.getName() + ", Description: " + u.getDescription()); - } - } - } + for (XUserInfo u : userList.getXuserInfoList()) { + LOG.debug("USER: Id:" + u.getId() + ", Name: " + u.getName() + ", Description: " + + u.getDescription()); + } + } + } + if (LOG.isDebugEnabled()) { + LOG.debug("<== PolicyMgrUserGroupBuilder.buildUserList()"); + } } private void buildUserGroupLinkList() { - if(LOG.isDebugEnabled()) { - LOG.debug("==> PolicyMgrUserGroupBuilder.buildUserGroupLinkList"); - } + if (LOG.isDebugEnabled()) { + LOG.debug("==> PolicyMgrUserGroupBuilder.buildUserGroupLinkList()"); + } Client c = getClient(); + int totalCount = 100; + int retrievedCount = 0; - int totalCount = 100; - int retrievedCount = 0; - - while (retrievedCount < totalCount) { - - WebResource r = c.resource(getURL(PM_USER_GROUP_MAP_LIST_URI)) - .queryParam("pageSize", recordsToPullPerCall) - .queryParam("startIndex", String.valueOf(retrievedCount)); - - String response = r.accept(MediaType.APPLICATION_JSON_TYPE).get(String.class); - - LOG.debug("RESPONSE: [" + response + "]"); + while (retrievedCount < totalCount) { + String response = null; + Gson gson = new GsonBuilder().create(); + if (isRangerCookieEnabled) { + response = cookieBasedGetEntity(PM_USER_GROUP_MAP_LIST_URI, retrievedCount); + } else { + WebResource r = c.resource(getURL(PM_USER_GROUP_MAP_LIST_URI)) + .queryParam("pageSize", recordsToPullPerCall) + .queryParam("startIndex", String.valueOf(retrievedCount)); - Gson gson = new GsonBuilder().create(); + response = r.accept(MediaType.APPLICATION_JSON_TYPE).get(String.class); + } + LOG.debug("RESPONSE: [" + response + "]"); - GetXUserGroupListResponse usergroupList = gson.fromJson(response, GetXUserGroupListResponse.class); + GetXUserGroupListResponse usergroupList = gson.fromJson(response, GetXUserGroupListResponse.class); - totalCount = usergroupList.getTotalCount(); + totalCount = usergroupList.getTotalCount(); - if (usergroupList.getXusergroupInfoList() != null) { - xusergroupList.addAll(usergroupList.getXusergroupInfoList()); - retrievedCount = xusergroupList.size(); + if (usergroupList.getXusergroupInfoList() != null) { + xusergroupList.addAll(usergroupList.getXusergroupInfoList()); + retrievedCount = xusergroupList.size(); - for(XUserGroupInfo ug : usergroupList.getXusergroupInfoList()) { - LOG.debug("USER_GROUP: UserId:" + ug.getUserId() + ", Name: " + ug.getGroupName()); - } - } - } + for (XUserGroupInfo ug : usergroupList.getXusergroupInfoList()) { + LOG.debug("USER_GROUP: UserId:" + ug.getUserId() + ", Name: " + ug.getGroupName()); + } + } + } + if (LOG.isDebugEnabled()) { + LOG.debug("<== PolicyMgrUserGroupBuilder.buildUserGroupLinkList()"); + } } private UserGroupInfo addUserGroupInfo(String userName, List<String> groups){ @@ -711,20 +741,31 @@ public class PolicyMgrUserGroupBuilder implements UserGroupSink { } private UserGroupInfo getUsergroupInfo(UserGroupInfo ret) { - Client c = getClient(); - - WebResource r = c.resource(getURL(PM_ADD_USER_GROUP_INFO_URI)); - + if(LOG.isDebugEnabled()){ + LOG.debug("==> PolicyMgrUserGroupBuilder.getUsergroupInfo(UserGroupInfo ret)"); + } + String response = null; Gson gson = new GsonBuilder().create(); - String jsonString = gson.toJson(usergroupInfo); - - LOG.debug("USER GROUP MAPPING" + jsonString); - - String response = r.accept(MediaType.APPLICATION_JSON_TYPE).type(MediaType.APPLICATION_JSON_TYPE).post(String.class, jsonString); - - LOG.debug("RESPONSE: [" + response + "]"); - + if (LOG.isDebugEnabled()) { + LOG.debug("USER GROUP MAPPING" + jsonString); + } + if(isRangerCookieEnabled){ + response = cookieBasedUploadEntity(jsonString,PM_ADD_USER_GROUP_INFO_URI); + } + else{ + Client c = getClient(); + WebResource r = c.resource(getURL(PM_ADD_USER_GROUP_INFO_URI)); + try{ + response = r.accept(MediaType.APPLICATION_JSON_TYPE).type(MediaType.APPLICATION_JSON_TYPE).post(String.class, jsonString); + } + catch(Throwable t){ + LOG.error("Failed to communicate Ranger Admin : ", t); + } + } + if ( LOG.isDebugEnabled() ) { + LOG.debug("RESPONSE: [" + response + "]"); + } ret = gson.fromJson(response, UserGroupInfo.class); if ( ret != null) { @@ -738,32 +779,38 @@ public class PolicyMgrUserGroupBuilder implements UserGroupSink { } } + if(LOG.isDebugEnabled()){ + LOG.debug("<== PolicyMgrUserGroupBuilder.getUsergroupInfo (UserGroupInfo ret)"); + } return ret; } private void getUserGroupInfo(UserGroupInfo ret, UserGroupInfo usergroupInfo) { - Client c = getClient(); - - WebResource r = c.resource(getURL(PM_ADD_USER_GROUP_INFO_URI)); - + if(LOG.isDebugEnabled()){ + LOG.debug("==> PolicyMgrUserGroupBuilder.getUsergroupInfo(UserGroupInfo ret, UserGroupInfo usergroupInfo)"); + } + String response = null; Gson gson = new GsonBuilder().create(); - String jsonString = gson.toJson(usergroupInfo); - if ( LOG.isDebugEnabled() ) { - LOG.debug("USER GROUP MAPPING" + jsonString); + if (LOG.isDebugEnabled()) { + LOG.debug("USER GROUP MAPPING" + jsonString); } - - String response = null; - try{ - response=r.accept(MediaType.APPLICATION_JSON_TYPE).type(MediaType.APPLICATION_JSON_TYPE).post(String.class, jsonString); - }catch(Throwable t){ - LOG.error("Failed to communicate Ranger Admin : ", t); + if(isRangerCookieEnabled){ + response = cookieBasedUploadEntity(jsonString,PM_ADD_USER_GROUP_INFO_URI); } - if ( LOG.isDebugEnabled() ) { + else{ + Client c = getClient(); + WebResource r = c.resource(getURL(PM_ADD_USER_GROUP_INFO_URI)); + try{ + response=r.accept(MediaType.APPLICATION_JSON_TYPE).type(MediaType.APPLICATION_JSON_TYPE).post(String.class, jsonString); + }catch(Throwable t){ + LOG.error("Failed to communicate Ranger Admin : ", t); + } + } + if (LOG.isDebugEnabled()) { LOG.debug("RESPONSE: [" + response + "]"); } ret = gson.fromJson(response, UserGroupInfo.class); - if ( ret != null) { XUserInfo xUserInfo = ret.getXuserInfo(); @@ -774,8 +821,109 @@ public class PolicyMgrUserGroupBuilder implements UserGroupSink { addUserGroupInfoToList(xUserInfo, xGroupInfo); } } + if(LOG.isDebugEnabled()){ + LOG.debug("<== PolicyMgrUserGroupBuilder.getUsergroupInfo(UserGroupInfo ret, UserGroupInfo usergroupInfo)"); + } } + + private String tryUploadEntityWithCookie(String jsonString, String apiURL) { + if (LOG.isDebugEnabled()) { + LOG.debug("==> PolicyMgrUserGroupBuilder.tryUploadEntityWithCookie()"); + } + String response = null; + ClientResponse clientResp = null; + WebResource webResource = createWebResourceForCookieAuth(apiURL); + WebResource.Builder br = webResource.getRequestBuilder().cookie(sessionId); + try{ + clientResp=br.accept(MediaType.APPLICATION_JSON_TYPE).type(MediaType.APPLICATION_JSON_TYPE).post(ClientResponse.class, jsonString); + } + catch(Throwable t){ + LOG.error("Failed to communicate Ranger Admin : ", t); + } + if (clientResp != null) { + if (!(clientResp.toString().contains(apiURL))) { + clientResp.setStatus(HttpServletResponse.SC_NOT_FOUND); + sessionId = null; + isValidRangerCookie = false; + } else if (clientResp.getStatus() == HttpServletResponse.SC_UNAUTHORIZED) { + sessionId = null; + isValidRangerCookie = false; + } else if (clientResp.getStatus() == HttpServletResponse.SC_NO_CONTENT || clientResp.getStatus() == HttpServletResponse.SC_OK) { + cookieList = clientResp.getCookies(); + for (NewCookie cookie : cookieList) { + if (cookie.getName().equalsIgnoreCase(RANGER_ADMIN_COOKIE_NAME)) { + sessionId = cookie.toCookie(); + isValidRangerCookie = true; + break; + } + } + } + + if (clientResp.getStatus() != HttpServletResponse.SC_OK && clientResp.getStatus() != HttpServletResponse.SC_NO_CONTENT + && clientResp.getStatus() != HttpServletResponse.SC_BAD_REQUEST) { + sessionId = null; + isValidRangerCookie = false; + } + clientResp.bufferEntity(); + response = clientResp.getEntity(String.class); + } + if (LOG.isDebugEnabled()) { + LOG.debug("<== PolicyMgrUserGroupBuilder.tryUploadEntityWithCookie()"); + } + return response; + } + + + private String tryUploadEntityWithCred(String jsonString,String apiURL){ + if(LOG.isDebugEnabled()){ + LOG.debug("==> PolicyMgrUserGroupBuilder.tryUploadEntityInfoWithCred()"); + } + String response = null; + ClientResponse clientResp = null; + Client c = getClient(); + WebResource r = c.resource(getURL(apiURL)); + if ( LOG.isDebugEnabled() ) { + LOG.debug("USER GROUP MAPPING" + jsonString); + } + try{ + clientResp=r.accept(MediaType.APPLICATION_JSON_TYPE).type(MediaType.APPLICATION_JSON_TYPE).post(ClientResponse.class, jsonString); + } + catch(Throwable t){ + LOG.error("Failed to communicate Ranger Admin : ", t); + } + if (clientResp != null) { + if (!(clientResp.toString().contains(apiURL))) { + clientResp.setStatus(HttpServletResponse.SC_NOT_FOUND); + } else if (clientResp.getStatus() == HttpServletResponse.SC_UNAUTHORIZED) { + LOG.warn("Credentials response from ranger is 401."); + } else if (clientResp.getStatus() == HttpServletResponse.SC_OK || clientResp.getStatus() == HttpServletResponse.SC_NO_CONTENT) { + cookieList = clientResp.getCookies(); + for (NewCookie cookie : cookieList) { + if (cookie.getName().equalsIgnoreCase(RANGER_ADMIN_COOKIE_NAME)) { + sessionId = cookie.toCookie(); + isValidRangerCookie = true; + LOG.info("valid cookie saved "); + break; + } + } + } + if (clientResp.getStatus() != HttpServletResponse.SC_OK && clientResp.getStatus() != HttpServletResponse.SC_NO_CONTENT + && clientResp.getStatus() != HttpServletResponse.SC_BAD_REQUEST) { + sessionId = null; + isValidRangerCookie = false; + } + clientResp.bufferEntity(); + response = clientResp.getEntity(String.class); + } + + if (LOG.isDebugEnabled()) { + LOG.debug("<== PolicyMgrUserGroupBuilder.tryUploadEntityInfoWithCred()"); + } + return response; + } + + private UserGroupInfo addUserGroupInfo(UserGroupInfo usergroupInfo){ if(LOG.isDebugEnabled()) { LOG.debug("==> PolicyMgrUserGroupBuilder.addUserGroupInfo"); @@ -808,6 +956,9 @@ public class PolicyMgrUserGroupBuilder implements UserGroupSink { LOG.error("Failed to add User Group Info : ", t); } } + if (LOG.isDebugEnabled()) { + LOG.debug("<== PolicyMgrUserGroupBuilder.addUserGroupInfo"); + } return ret; } @@ -920,21 +1071,84 @@ public class PolicyMgrUserGroupBuilder implements UserGroupSink { private void delXUserGroupInfo(XUserInfo aUserInfo, XGroupInfo aGroupInfo) { + if (LOG.isDebugEnabled()) { + LOG.debug("==> PolicyMgrUserGroupBuilder.delXUserGroupInfo()"); + } + String groupName = aGroupInfo.getName(); String userName = aUserInfo.getName(); try { - - Client c = getClient(); - + ClientResponse response = null; String uri = PM_DEL_USER_GROUP_LINK_URI.replaceAll(Pattern.quote("${groupName}"), UserSyncUtil.encodeURIParam(groupName)).replaceAll(Pattern.quote("${userName}"), UserSyncUtil.encodeURIParam(userName)); + if (isRangerCookieEnabled) { + if (sessionId != null && isValidRangerCookie) { + WebResource webResource = createWebResourceForCookieAuth(uri); + WebResource.Builder br = webResource.getRequestBuilder().cookie(sessionId); + response = br.delete(ClientResponse.class); + if (response != null) { + if (!(response.toString().contains(uri))) { + response.setStatus(HttpServletResponse.SC_NOT_FOUND); + sessionId = null; + isValidRangerCookie = false; + } else if (response.getStatus() == HttpServletResponse.SC_UNAUTHORIZED) { + LOG.warn("response from ranger is 401 unauthorized"); + sessionId = null; + isValidRangerCookie = false; + } else if (response.getStatus() == HttpServletResponse.SC_NO_CONTENT + || response.getStatus() == HttpServletResponse.SC_OK) { + cookieList = response.getCookies(); + for (NewCookie cookie : cookieList) { + if (cookie.getName().equalsIgnoreCase(RANGER_ADMIN_COOKIE_NAME)) { + sessionId = cookie.toCookie(); + isValidRangerCookie = true; + break; + } + } + } + if (response.getStatus() != HttpServletResponse.SC_OK && response.getStatus() != HttpServletResponse.SC_NO_CONTENT + && response.getStatus() != HttpServletResponse.SC_BAD_REQUEST) { + sessionId = null; + isValidRangerCookie = false; + } + } + } else { + Client c = getClient(); + WebResource r = c.resource(getURL(uri)); + response = r.delete(ClientResponse.class); + if (response != null) { + if (!(response.toString().contains(uri))) { + response.setStatus(HttpServletResponse.SC_NOT_FOUND); + } else if (response.getStatus() == HttpServletResponse.SC_UNAUTHORIZED) { + LOG.warn("Credentials response from ranger is 401."); + } else if (response.getStatus() == HttpServletResponse.SC_OK + || response.getStatus() == HttpServletResponse.SC_NO_CONTENT) { + cookieList = response.getCookies(); + for (NewCookie cookie : cookieList) { + if (cookie.getName().equalsIgnoreCase(RANGER_ADMIN_COOKIE_NAME)) { + sessionId = cookie.toCookie(); + isValidRangerCookie = true; + LOG.info("valid cookie saved "); + break; + } + } + } + if (response.getStatus() != HttpServletResponse.SC_OK && response.getStatus() != HttpServletResponse.SC_NO_CONTENT + && response.getStatus() != HttpServletResponse.SC_BAD_REQUEST) { + sessionId = null; + isValidRangerCookie = false; + } + } + } + } else { + Client c = getClient(); WebResource r = c.resource(getURL(uri)); - ClientResponse response = r.delete(ClientResponse.class); - + response = r.delete(ClientResponse.class); + } if ( LOG.isDebugEnabled() ) { LOG.debug("RESPONSE: [" + response.toString() + "]"); } @@ -947,6 +1161,9 @@ public class PolicyMgrUserGroupBuilder implements UserGroupSink { LOG.warn( "ERROR: Unable to delete GROUP: " + groupName + " from USER:" + userName , e); } + if (LOG.isDebugEnabled()) { + LOG.debug("<== PolicyMgrUserGroupBuilder.delXUserGroupInfo()"); + } } @@ -990,31 +1207,166 @@ public class PolicyMgrUserGroupBuilder implements UserGroupSink { private MUserInfo getMUser(MUserInfo userInfo, MUserInfo ret) { - Client c = getClient(); + if(LOG.isDebugEnabled()){ + LOG.debug("==> PolicyMgrUserGroupBuilder.getMUser()"); + } + String response = null; + Gson gson = new GsonBuilder().create(); + String jsonString = gson.toJson(userInfo); + if (isRangerCookieEnabled) { + response = cookieBasedUploadEntity(jsonString, PM_ADD_LOGIN_USER_URI); + } else { + Client c = getClient(); + WebResource r = c.resource(getURL(PM_ADD_LOGIN_USER_URI)); + response = r.accept(MediaType.APPLICATION_JSON_TYPE).type(MediaType.APPLICATION_JSON_TYPE) + .post(String.class, jsonString); + } + if (LOG.isDebugEnabled()) { + LOG.debug("RESPONSE[" + response + "]"); + } + ret = gson.fromJson(response, MUserInfo.class); + if (LOG.isDebugEnabled()) { + LOG.debug("MUser Creation successful " + ret); + LOG.debug("<== PolicyMgrUserGroupBuilder.getMUser()"); + } + return ret; + } - WebResource r = c.resource(getURL(PM_ADD_LOGIN_USER_URI)); + private String cookieBasedUploadEntity(String jsonString, String apiURL ) { + if (LOG.isDebugEnabled()) { + LOG.debug("==> PolicyMgrUserGroupBuilder.cookieBasedUploadEntity()"); + } + String response = null; + if (sessionId != null && isValidRangerCookie) { + response = tryUploadEntityWithCookie(jsonString,apiURL); + } + else{ + response = tryUploadEntityWithCred(jsonString,apiURL); + } + if (LOG.isDebugEnabled()) { + LOG.debug("<== PolicyMgrUserGroupBuilder.cookieBasedUploadEntity()"); + } + return response; + } - Gson gson = new GsonBuilder().create(); + private String cookieBasedGetEntity(String apiURL ,int retrievedCount) { + if (LOG.isDebugEnabled()) { + LOG.debug("==> PolicyMgrUserGroupBuilder.cookieBasedGetEntity()"); + } + String response = null; + if (sessionId != null && isValidRangerCookie) { + response = tryGetEntityWithCookie(apiURL,retrievedCount); + } + else{ + response = tryGetEntityWithCred(apiURL,retrievedCount); + } + if (LOG.isDebugEnabled()) { + LOG.debug("<== PolicyMgrUserGroupBuilder.cookieBasedGetEntity()"); + } + return response; + } - String jsonString = gson.toJson(userInfo); + private String tryGetEntityWithCred(String apiURL, int retrievedCount) { + if(LOG.isDebugEnabled()){ + LOG.debug("==> PolicyMgrUserGroupBuilder.tryGetEntityWithCred()"); + } + String response = null; + ClientResponse clientResp = null; + Client c = getClient(); + WebResource r = c.resource(getURL(apiURL)) + .queryParam("pageSize", recordsToPullPerCall) + .queryParam("startIndex", String.valueOf(retrievedCount)); - String response = r.accept(MediaType.APPLICATION_JSON_TYPE).type(MediaType.APPLICATION_JSON_TYPE).post(String.class, jsonString); + try{ + clientResp=r.accept(MediaType.APPLICATION_JSON_TYPE).get(ClientResponse.class); + } + catch(Throwable t){ + LOG.error("Failed to communicate Ranger Admin : ", t); + } + if (clientResp != null) { + if (!(clientResp.toString().contains(apiURL))) { + clientResp.setStatus(HttpServletResponse.SC_NOT_FOUND); + } else if (clientResp.getStatus() == HttpServletResponse.SC_UNAUTHORIZED) { + LOG.warn("Credentials response from ranger is 401."); + } else if (clientResp.getStatus() == HttpServletResponse.SC_OK || clientResp.getStatus() == HttpServletResponse.SC_NO_CONTENT) { + cookieList = clientResp.getCookies(); + for (NewCookie cookie : cookieList) { + if (cookie.getName().equalsIgnoreCase(RANGER_ADMIN_COOKIE_NAME)) { + sessionId = cookie.toCookie(); + isValidRangerCookie = true; + LOG.info("valid cookie saved "); + break; + } + } + } + if (clientResp.getStatus() != HttpServletResponse.SC_OK && clientResp.getStatus() != HttpServletResponse.SC_NO_CONTENT + && clientResp.getStatus() != HttpServletResponse.SC_BAD_REQUEST) { + sessionId = null; + isValidRangerCookie = false; + } + clientResp.bufferEntity(); + response = clientResp.getEntity(String.class); + } - LOG.debug("RESPONSE[" + response + "]"); + if (LOG.isDebugEnabled()) { + LOG.debug("<== PolicyMgrUserGroupBuilder.tryGetEntityWithCred()"); + } + return response; + } - ret = gson.fromJson(response, MUserInfo.class); - LOG.debug("MUser Creation successful " + ret); + private String tryGetEntityWithCookie(String apiURL, int retrievedCount) { + if (LOG.isDebugEnabled()) { + LOG.debug("==> PolicyMgrUserGroupBuilder.tryGetEntityWithCookie()"); + } + String response = null; + ClientResponse clientResp = null; + WebResource webResource = createWebResourceForCookieAuth(apiURL).queryParam("pageSize", recordsToPullPerCall).queryParam("startIndex", String.valueOf(retrievedCount)); + WebResource.Builder br = webResource.getRequestBuilder().cookie(sessionId); + try{ + clientResp=br.accept(MediaType.APPLICATION_JSON_TYPE).get(ClientResponse.class); + } + catch(Throwable t){ + LOG.error("Failed to communicate Ranger Admin : ", t); + } + if (clientResp != null) { + if (!(clientResp.toString().contains(apiURL))) { + clientResp.setStatus(HttpServletResponse.SC_NOT_FOUND); + sessionId = null; + isValidRangerCookie = false; + } else if (clientResp.getStatus() == HttpServletResponse.SC_UNAUTHORIZED) { + sessionId = null; + isValidRangerCookie = false; + } else if (clientResp.getStatus() == HttpServletResponse.SC_NO_CONTENT || clientResp.getStatus() == HttpServletResponse.SC_OK) { + cookieList = clientResp.getCookies(); + for (NewCookie cookie : cookieList) { + if (cookie.getName().equalsIgnoreCase(RANGER_ADMIN_COOKIE_NAME)) { + sessionId = cookie.toCookie(); + isValidRangerCookie = true; + break; + } + } + } - return ret; + if (clientResp.getStatus() != HttpServletResponse.SC_OK && clientResp.getStatus() != HttpServletResponse.SC_NO_CONTENT + && clientResp.getStatus() != HttpServletResponse.SC_BAD_REQUEST) { + sessionId = null; + isValidRangerCookie = false; + } + clientResp.bufferEntity(); + response = clientResp.getEntity(String.class); + } + if (LOG.isDebugEnabled()) { + LOG.debug("<== PolicyMgrUserGroupBuilder.tryGetEntityWithCookie()"); + } + return response; } + private synchronized Client getClient() { Client ret = null; - if (policyMgrBaseUrl.startsWith("https://")) { - ClientConfig config = new DefaultClientConfig(); if (sslContext == null) { @@ -1112,6 +1464,13 @@ public class PolicyMgrUserGroupBuilder implements UserGroupSink { return ret; } + private WebResource createWebResourceForCookieAuth(String url) { + Client cookieClient = getClient(); + cookieClient.removeAllFilters(); + WebResource ret = cookieClient.resource(getURL(url)); + return ret; + } + private InputStream getFileInputStream(String path) throws FileNotFoundException { InputStream ret = null; @@ -1199,20 +1558,29 @@ public class PolicyMgrUserGroupBuilder implements UserGroupSink { private XGroupInfo getAddedGroupInfo(XGroupInfo group){ XGroupInfo ret = null; - - Client c = getClient(); - - WebResource r = c.resource(getURL(PM_ADD_GROUP_URI)); - + String response = null; Gson gson = new GsonBuilder().create(); - String jsonString = gson.toJson(group); + if(isRangerCookieEnabled){ + response = cookieBasedUploadEntity(jsonString,PM_ADD_GROUP_URI); + } + else{ + Client c = getClient(); + WebResource r = c.resource(getURL(PM_ADD_GROUP_URI)); + if (LOG.isDebugEnabled()) { + LOG.debug("Group" + jsonString); + } + try{ + response = r.accept(MediaType.APPLICATION_JSON_TYPE).type(MediaType.APPLICATION_JSON_TYPE).post(String.class, jsonString); + } + catch(Throwable t){ + LOG.error("Failed to communicate Ranger Admin : ", t); + } + } - LOG.debug("Group" + jsonString); - - String response = r.accept(MediaType.APPLICATION_JSON_TYPE).type(MediaType.APPLICATION_JSON_TYPE).post(String.class, jsonString); - - LOG.debug("RESPONSE: [" + response + "]"); + if ( LOG.isDebugEnabled() ) { + LOG.debug("RESPONSE: [" + response + "]"); + } ret = gson.fromJson(response, XGroupInfo.class); @@ -1308,22 +1676,38 @@ public class PolicyMgrUserGroupBuilder implements UserGroupSink { private UgsyncAuditInfo getUserGroupAuditInfo(UgsyncAuditInfo userInfo) { - Client c = getClient(); + if(LOG.isDebugEnabled()){ + LOG.debug("==> PolicyMgrUserGroupBuilder.getUserGroupAuditInfo()"); + } - WebResource r = c.resource(getURL(PM_AUDIT_INFO_URI)); + String response = null; Gson gson = new GsonBuilder().create(); - String jsonString = gson.toJson(userInfo); - - String response = r.accept(MediaType.APPLICATION_JSON_TYPE).type(MediaType.APPLICATION_JSON_TYPE).post(String.class, jsonString); - - LOG.debug("RESPONSE[" + response + "]"); - + if(isRangerCookieEnabled){ + response = cookieBasedUploadEntity(jsonString, PM_AUDIT_INFO_URI); + } + else{ + Client c = getClient(); + WebResource r = c.resource(getURL(PM_AUDIT_INFO_URI)); + try{ + response = r.accept(MediaType.APPLICATION_JSON_TYPE).type(MediaType.APPLICATION_JSON_TYPE).post(String.class, jsonString); + } + catch(Throwable t){ + LOG.error("Failed to communicate Ranger Admin : ", t); + } + } + if (LOG.isDebugEnabled()) { + LOG.debug("RESPONSE[" + response + "]"); + } UgsyncAuditInfo ret = gson.fromJson(response, UgsyncAuditInfo.class); LOG.debug("AuditInfo Creation successful "); + if(LOG.isDebugEnabled()){ + LOG.debug("<== PolicyMgrUserGroupBuilder.getUserGroupAuditInfo()"); + } + return ret; } http://git-wip-us.apache.org/repos/asf/ranger/blob/a4ad1a0b/unixauthservice/conf.dist/ranger-ugsync-default.xml ---------------------------------------------------------------------- diff --git a/unixauthservice/conf.dist/ranger-ugsync-default.xml b/unixauthservice/conf.dist/ranger-ugsync-default.xml index cf4ab80..719bd90 100644 --- a/unixauthservice/conf.dist/ranger-ugsync-default.xml +++ b/unixauthservice/conf.dist/ranger-ugsync-default.xml @@ -61,4 +61,8 @@ <name>ranger.usersync.logdir</name> <value>./log</value> </property> + <property> + <name>ranger.usersync.cookie.enabled</name> + <value>true</value> + </property> </configuration>
