Skip to content

Commit afe56fe

Browse files
RANGER-5209 : User source is not getting updated on the Ranger Access Audit page
1 parent a179612 commit afe56fe

File tree

9 files changed

+162
-7
lines changed

9 files changed

+162
-7
lines changed

agents-common/src/main/java/org/apache/ranger/plugin/util/RangerCommonConstants.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ public class RangerCommonConstants {
6868
public static final String SCRIPT_FIELD__MATCH_TYPE = "_matchType";
6969
public static final String SCRIPT_FIELD__NAME = "_name";
7070
public static final String SCRIPT_FIELD__SYNC_SOURCE = "_syncSource";
71+
public static final String SCRIPT_FIELD__USER_SOURCE = "_userSource";
7172
public static final String SCRIPT_FIELD__IS_INTERNAL = "_isInternal";
7273
public static final String SCRIPT_FIELD__EMAIL_ADDRESS = "_emailAddress";
7374
public static final String SCRIPT_FIELD__OWNER_USER = "_ownerUser";

security-admin/src/main/java/org/apache/ranger/biz/XUserMgr.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,13 +79,15 @@
7979
import org.apache.ranger.plugin.model.UserInfo;
8080
import org.apache.ranger.plugin.store.EmbeddedServiceDefsUtil;
8181
import org.apache.ranger.plugin.util.PasswordUtils.PasswordGenerator;
82+
import org.apache.ranger.plugin.util.RangerCommonConstants;
8283
import org.apache.ranger.plugin.util.RangerUserStore;
8384
import org.apache.ranger.service.RangerPolicyService;
8485
import org.apache.ranger.service.XPortalUserService;
8586
import org.apache.ranger.service.XResourceService;
8687
import org.apache.ranger.service.XUgsyncAuditInfoService;
8788
import org.apache.ranger.ugsyncutil.model.GroupUserInfo;
8889
import org.apache.ranger.ugsyncutil.model.UsersGroupRoleAssignments;
90+
import org.apache.ranger.view.VXAccessAudit;
8991
import org.apache.ranger.view.VXAuditMap;
9092
import org.apache.ranger.view.VXAuditMapList;
9193
import org.apache.ranger.view.VXGroup;
@@ -2821,6 +2823,33 @@ public RangerUserStore getRangerUserStoreIfUpdated(Long lastKnownUserStoreVersio
28212823
return ret;
28222824
}
28232825

2826+
public void setAccessAuditsUserSource(List<VXAccessAudit> vxAccessAudits) {
2827+
Long lastKnownUserStoreVersion = 1L;
2828+
2829+
if (vxAccessAudits != null) {
2830+
RangerUserStore latestUserStore = getRangerUserStoreIfUpdated(lastKnownUserStoreVersion);
2831+
if (latestUserStore != null) {
2832+
Map<String, Map<String, String>> userAttrMapping = latestUserStore.getUserAttrMapping();
2833+
2834+
for (VXAccessAudit vxAccessAudit : vxAccessAudits) {
2835+
String requestUser = vxAccessAudit.getRequestUser();
2836+
Map<String, String> userAttributes = userAttrMapping.getOrDefault(vxAccessAudit.getRequestUser(), Collections.emptyMap());
2837+
2838+
if (MapUtils.isNotEmpty(userAttributes)) {
2839+
String userSourceStr = userAttributes.get(RangerCommonConstants.SCRIPT_FIELD__USER_SOURCE);
2840+
if (userSourceStr != null) {
2841+
try {
2842+
vxAccessAudit.setUserSource(Integer.parseInt(userSourceStr));
2843+
} catch (NumberFormatException e) {
2844+
logger.error("XUserMgr.setAccessAuditsUserSource() : could not parse [{}] as Integer!", userSourceStr, e); // ignore
2845+
}
2846+
}
2847+
}
2848+
}
2849+
}
2850+
}
2851+
}
2852+
28242853
public int createOrUpdateXUsers(VXUserList users) {
28252854
logger.debug("==> createOrUpdateXUsers(): Started");
28262855

security-admin/src/main/java/org/apache/ranger/db/XXUserDao.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import static org.apache.ranger.plugin.util.RangerCommonConstants.SCRIPT_FIELD__EMAIL_ADDRESS;
4444
import static org.apache.ranger.plugin.util.RangerCommonConstants.SCRIPT_FIELD__IS_INTERNAL;
4545
import static org.apache.ranger.plugin.util.RangerCommonConstants.SCRIPT_FIELD__SYNC_SOURCE;
46+
import static org.apache.ranger.plugin.util.RangerCommonConstants.SCRIPT_FIELD__USER_SOURCE;
4647

4748
@Service
4849
public class XXUserDao extends BaseDao<XXUser> {
@@ -213,6 +214,10 @@ private UserInfo toUserInfo(Object[] row) {
213214

214215
attrMap.put(SCRIPT_FIELD__IS_INTERNAL, Boolean.toString(isInternal));
215216

217+
if (userSource != null) {
218+
attrMap.put(SCRIPT_FIELD__USER_SOURCE, String.valueOf(userSource));
219+
}
220+
216221
return new UserInfo(name, description, attrMap);
217222
}
218223
}

security-admin/src/main/java/org/apache/ranger/rest/AssetREST.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.apache.ranger.admin.client.datatype.RESTResponse;
2424
import org.apache.ranger.biz.AssetMgr;
2525
import org.apache.ranger.biz.RangerBizUtil;
26+
import org.apache.ranger.biz.XUserMgr;
2627
import org.apache.ranger.common.RESTErrorUtil;
2728
import org.apache.ranger.common.RangerSearchUtil;
2829
import org.apache.ranger.common.SearchCriteria;
@@ -142,6 +143,9 @@ public class AssetREST {
142143
@Autowired
143144
RangerDaoManager daoManager;
144145

146+
@Autowired
147+
XUserMgr xUserMgr;
148+
145149
@GET
146150
@Path("/assets/{id}")
147151
@Produces("application/json")
@@ -596,6 +600,8 @@ public VXAccessAuditList getAccessLogs(@Context HttpServletRequest request, @Que
596600
vxAccessAuditList.getVXAccessAudits().forEach(vxAccessAudit -> vxAccessAudit.setZonedEventTime(new SimpleDateFormat(RestUtil.ZONED_EVENT_TIME_FORMAT).format(vxAccessAudit.getEventTime())));
597601
}
598602

603+
xUserMgr.setAccessAuditsUserSource(vxAccessAuditList.getVXAccessAudits());
604+
599605
return vxAccessAuditList;
600606
}
601607

security-admin/src/main/java/org/apache/ranger/view/VXAccessAudit.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,11 @@ public class VXAccessAudit extends VXDataObject implements java.io.Serializable
158158
//Zoned Event Time
159159
protected String zonedEventTime;
160160

161+
/**
162+
* userSource
163+
*/
164+
protected int userSource;
165+
161166
/**
162167
* Default constructor. This will set all the attributes to default value.
163168
*/
@@ -631,6 +636,7 @@ public String toString() {
631636
str += "agentHost={" + agentHost + "}";
632637
str += "eventId={" + eventId + "}";
633638
str += "zonedEventTime={" + zonedEventTime + "} ";
639+
str += "userSource={" + userSource + "} ";
634640
str += "}";
635641
return str;
636642
}
@@ -697,4 +703,12 @@ public String getZonedEventTime() {
697703
public void setZonedEventTime(String zonedEventTime) {
698704
this.zonedEventTime = zonedEventTime;
699705
}
706+
707+
public int getUserSource() {
708+
return userSource;
709+
}
710+
711+
public void setUserSource(int userSource) {
712+
this.userSource = userSource;
713+
}
700714
}

security-admin/src/main/webapp/react-webapp/src/utils/XAUtils.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1585,3 +1585,12 @@ export const currentTimeZone = (timeZoneDate) => {
15851585
.replace(/^.*GMT.*\(/, "")
15861586
.replace(/\)$/, "");
15871587
};
1588+
1589+
export const isEmptyValueCheck = (value) => {
1590+
return (
1591+
value == null ||
1592+
(typeof value === "string" && value.trim() === "") ||
1593+
(Array.isArray(value) && value.length === 0) ||
1594+
(typeof value === "object" && Object.keys(value).length === 0)
1595+
);
1596+
};

security-admin/src/main/webapp/react-webapp/src/views/AuditEvent/AccessLogs.jsx

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,8 @@ import {
5858
serverError,
5959
requestDataTitle,
6060
fetchSearchFilterParams,
61-
parseSearchFilter
61+
parseSearchFilter,
62+
isEmptyValueCheck
6263
} from "../../utils/XAUtils";
6364
import { CustomTooltip, Loader } from "../../components/CommonComponents";
6465
import {
@@ -530,13 +531,19 @@ function Access() {
530531
Header: "User Source",
531532
accessor: "userSource",
532533
Cell: (rawValue) => {
533-
if (!isEmpty(rawValue?.value)) {
534+
if (!isEmptyValueCheck(rawValue?.value)) {
534535
const userSourceVal = find(UserTypes, { value: rawValue.value });
535-
return (
536-
<h6 className="text-center">
537-
<Badge bg={userSourceVal.variant}>{userSourceVal.label}</Badge>
538-
</h6>
539-
);
536+
if (userSourceVal) {
537+
return (
538+
<h6 className="text-center">
539+
<Badge bg={userSourceVal.variant}>
540+
{userSourceVal.label}
541+
</Badge>
542+
</h6>
543+
);
544+
} else {
545+
return "--";
546+
}
540547
} else return "--";
541548
},
542549
width: 100,

security-admin/src/test/java/org/apache/ranger/biz/TestXUserMgr.java

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,8 @@
7575
import org.apache.ranger.plugin.model.RangerPolicy.RangerPolicyResource;
7676
import org.apache.ranger.plugin.model.RangerSecurityZone;
7777
import org.apache.ranger.plugin.model.UserInfo;
78+
import org.apache.ranger.plugin.util.RangerCommonConstants;
79+
import org.apache.ranger.plugin.util.RangerUserStore;
7880
import org.apache.ranger.security.context.RangerContextHolder;
7981
import org.apache.ranger.security.context.RangerSecurityContext;
8082
import org.apache.ranger.service.RangerPolicyService;
@@ -92,6 +94,7 @@
9294
import org.apache.ranger.service.XUserService;
9395
import org.apache.ranger.ugsyncutil.model.GroupUserInfo;
9496
import org.apache.ranger.ugsyncutil.model.UsersGroupRoleAssignments;
97+
import org.apache.ranger.view.VXAccessAudit;
9598
import org.apache.ranger.view.VXAuditMap;
9699
import org.apache.ranger.view.VXAuditMapList;
97100
import org.apache.ranger.view.VXGroup;
@@ -134,6 +137,7 @@
134137

135138
import java.util.ArrayList;
136139
import java.util.Collection;
140+
import java.util.Collections;
137141
import java.util.Date;
138142
import java.util.HashMap;
139143
import java.util.HashSet;
@@ -4316,6 +4320,81 @@ public void test132CreateExternalUser() {
43164320
Assert.assertEquals(createdXUser.getName(), vXUser.getName());
43174321
}
43184322

4323+
@Test
4324+
public void testSetAccessAuditsUserSource_WhenValidUserMappingExists() {
4325+
destroySession();
4326+
setup();
4327+
VXAccessAudit audit = new VXAccessAudit();
4328+
audit.setRequestUser("tom");
4329+
4330+
List<VXAccessAudit> auditList = Collections.singletonList(audit);
4331+
4332+
Map<String, String> userAttributes = new HashMap<>();
4333+
userAttributes.put(RangerCommonConstants.SCRIPT_FIELD__USER_SOURCE, "5");
4334+
4335+
Map<String, Map<String, String>> attrMap = new HashMap<>();
4336+
attrMap.put("tom", userAttributes);
4337+
RangerUserStore rangerUserStore = Mockito.mock(RangerUserStore.class);
4338+
rangerUserStore.setUserAttrMapping(attrMap);
4339+
XUserMgr spyXUserMgr = Mockito.spy(xUserMgr);
4340+
Mockito.doReturn(rangerUserStore).when(spyXUserMgr).getRangerUserStoreIfUpdated(1L);
4341+
Mockito.when(rangerUserStore.getUserAttrMapping()).thenReturn(attrMap);
4342+
4343+
spyXUserMgr.setAccessAuditsUserSource(auditList);
4344+
4345+
Assert.assertEquals(5, audit.getUserSource());
4346+
}
4347+
4348+
@Test
4349+
public void testSetAccessAuditsUserSource_WhenUserMappingDoesNotExist() {
4350+
destroySession();
4351+
setup();
4352+
VXAccessAudit audit = new VXAccessAudit();
4353+
audit.setRequestUser("unknownUser");
4354+
4355+
List<VXAccessAudit> auditList = Collections.singletonList(audit);
4356+
4357+
Map<String, String> userAttributes = new HashMap<>();
4358+
userAttributes.put(RangerCommonConstants.SCRIPT_FIELD__USER_SOURCE, "5");
4359+
4360+
Map<String, Map<String, String>> attrMap = new HashMap<>();
4361+
attrMap.put("tom", userAttributes);
4362+
RangerUserStore rangerUserStore = Mockito.mock(RangerUserStore.class);
4363+
rangerUserStore.setUserAttrMapping(attrMap);
4364+
XUserMgr spyXUserMgr = Mockito.spy(xUserMgr);
4365+
Mockito.doReturn(rangerUserStore).when(spyXUserMgr).getRangerUserStoreIfUpdated(1L);
4366+
Mockito.when(rangerUserStore.getUserAttrMapping()).thenReturn(attrMap);
4367+
4368+
spyXUserMgr.setAccessAuditsUserSource(auditList);
4369+
4370+
Assert.assertEquals(0, audit.getUserSource());
4371+
}
4372+
4373+
@Test
4374+
public void testSetAccessAuditsUserSource_WhenUserSourceKeyIsMissing() {
4375+
destroySession();
4376+
setup();
4377+
4378+
VXAccessAudit audit = new VXAccessAudit();
4379+
audit.setRequestUser("tom");
4380+
4381+
List<VXAccessAudit> auditList = Collections.singletonList(audit);
4382+
4383+
Map<String, String> userAttributes = new HashMap<>();
4384+
4385+
Map<String, Map<String, String>> attrMap = new HashMap<>();
4386+
attrMap.put("tom", userAttributes);
4387+
RangerUserStore rangerUserStore = Mockito.mock(RangerUserStore.class);
4388+
rangerUserStore.setUserAttrMapping(attrMap);
4389+
XUserMgr spyXUserMgr = Mockito.spy(xUserMgr);
4390+
Mockito.doReturn(rangerUserStore).when(spyXUserMgr).getRangerUserStoreIfUpdated(1L);
4391+
Mockito.when(rangerUserStore.getUserAttrMapping()).thenReturn(attrMap);
4392+
4393+
spyXUserMgr.setAccessAuditsUserSource(auditList);
4394+
4395+
Assert.assertEquals(0, audit.getUserSource());
4396+
}
4397+
43194398
@Test
43204399
public void test01CreateXUser_federated() {
43214400
destroySession();

security-admin/src/test/java/org/apache/ranger/rest/TestAssetREST.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import org.apache.ranger.admin.client.datatype.RESTResponse;
2121
import org.apache.ranger.biz.AssetMgr;
2222
import org.apache.ranger.biz.RangerBizUtil;
23+
import org.apache.ranger.biz.XUserMgr;
2324
import org.apache.ranger.common.RESTErrorUtil;
2425
import org.apache.ranger.common.RangerSearchUtil;
2526
import org.apache.ranger.common.SearchCriteria;
@@ -120,6 +121,8 @@ public class TestAssetREST {
120121
RangerBizUtil msBizUtil;
121122
@Mock
122123
RangerDaoManager daoManager;
124+
@Mock
125+
XUserMgr xUserMgr;
123126
@InjectMocks
124127
AssetREST assetREST = new AssetREST();
125128
@Mock RESTErrorUtil restErrorUtil;
@@ -562,6 +565,7 @@ public void testGetAccessLogs() {
562565
Mockito.when(daoManager.getXXServiceDef()).thenReturn(xxServiceDefDao);
563566
XXServiceDef xServiceDef = new XXServiceDef();
564567
xServiceDef.setId(Id);
568+
xUserMgr.setAccessAuditsUserSource(vXAccessAuditList.getVXAccessAudits());
565569
Mockito.when(xxServiceDefDao.findByName(EmbeddedServiceDefsUtil.EMBEDDED_SERVICEDEF_KMS_NAME)).thenReturn(xServiceDef);
566570
Mockito.when(assetMgr.getAccessLogs(searchCriteria)).thenReturn(vXAccessAuditList);
567571
VXAccessAuditList expectedVXAccessAuditList = assetREST.getAccessLogs(request, null);
@@ -597,6 +601,7 @@ public void testGetAccessLogsForKms() {
597601
Mockito.when(daoManager.getXXServiceDef()).thenReturn(xxServiceDefDao);
598602
XXServiceDef xServiceDef = new XXServiceDef();
599603
xServiceDef.setId(Id);
604+
xUserMgr.setAccessAuditsUserSource(vXAccessAuditList.getVXAccessAudits());
600605
Mockito.when(xxServiceDefDao.findByName(EmbeddedServiceDefsUtil.EMBEDDED_SERVICEDEF_KMS_NAME)).thenReturn(xServiceDef);
601606
Mockito.when(assetMgr.getAccessLogs(searchCriteria)).thenReturn(vXAccessAuditList);
602607
VXAccessAuditList expectedVXAccessAuditList = assetREST.getAccessLogs(request, null);

0 commit comments

Comments
 (0)