PolicyViolation WorkFlow , This WF is used to modify the violation object , This will remove the violation object and will remove if anything is added through LCM .
<?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE Workflow PUBLIC "sailpoint.dtd" "sailpoint.dtd"> <Workflow explicitTransitions="true" handler="sailpoint.api.StandardWorkflowHandler" name="VIS Detective SOD Policy Violation Workflow" type="PolicyViolation"> <Variable input="true" name="approvalObject"> <Description>PolicyViolation to process. Note that we use approvalObject for consistency with other workflows, but the violation has already been persisted. Calling the commit or rollback actions will have no effect.</Description> </Variable> <Variable input="true" name="approver"> <Description>The user to receive the work item, normally the owner of the policy.</Description> <Script> <Source> import sailpoint.object.Identity; Identity newOwner= approvalObject.getOwner(); return newOwner.getName(); </Source> </Script> </Variable> <Variable input="true" name="violator"> <Description>The identity that has the violation.</Description> </Variable> <Variable name="approved"> <Description>Internal variable automatically set logically true an Approval process completes with no rejects. </Description> </Variable> <Variable name="action"> <Description>Variable that may be set in the approval page to determine the action to take on this violation. We handle violation approvals differently than most work items. There is no &quot;reject&quot; there is a selection of an action (mitigate, remediate, delete, ignroe) followed by buttons that always post approval.</Description> </Variable> <Variable name="expiration"> <Description>Variable that must be set to a Date (or the String representation of a Date) in order to use the &quot;mitigate&quot; action. This will be tested in the call:mitigate handler and logged if it is invalid. You may wish to have the worklfow do it&#39;s own validation.</Description> </Variable> <Variable name="comments"> <Description>Variable that may be set to comments to be included with a mitigation or remediation.</Description> </Variable> <Variable name="remediatables"> <Description>Variable that may be set to a list of things that can be selected for remediation. Currently this will only be set for Role SOD violations.</Description> </Variable> <Variable name="remediations"> <Description>Variable holding the remediatables selected in the work item.</Description> </Variable> <RuleLibraries> <Reference class="sailpoint.object.Rule" name="Rule Library"/> </RuleLibraries> <Step icon="Default" name="Logs" posX="98" posY="126"> <Arg value="ref:remediatables"/> <Script> <Source> import java.util.Map; import java.util.Date; import java.util.List; import java.util.HashMap; import java.util.ArrayList; import sailpoint.tools.Util; import sailpoint.object.Filter; import sailpoint.api.ObjectUtil; import java.text.ParseException; import java.text.SimpleDateFormat; import sailpoint.object.Identity; import sailpoint.object.QueryOptions; import sailpoint.api.SailPointContext; import sailpoint.object.EmailOptions; import sailpoint.object.EmailTemplate; import sailpoint.object.PolicyViolation; import sailpoint.object.ManagedAttribute; import org.apache.commons.logging.Log; import sailpoint.tools.GeneralException; import sailpoint.object.IdentityEntitlement; import org.apache.commons.logging.LogFactory; import sailpoint.object.IdentitySelector.MatchTerm; Log logger = LogFactory.getLog("vis.workflow.visDetectiveSODPolicyViolationWorkflow"); public boolean checkIfThroughLCM(String applicationName, String identityName, String entitlementName) { boolean wasThroughLCM = false; StringBuilder result = new StringBuilder(); String sDate1 = "06/05/2021"; Date date = new SimpleDateFormat("MM/dd/yyyy").parse(sDate1); result.append("date [").append(date).append("]\n"); Filter dateCheckFilter = Filter.gt("created", date); logger.debug(" new Date dt : "+ sDate1 + " new date : " + result); QueryOptions qo = new QueryOptions(); qo.addFilter(Filter.and(Filter.eq("source","Aggregation"),Filter.eq("application.name",applicationName), Filter.eq("identity.name",identityName),Filter.eq("value",entitlementName),dateCheckFilter)); List identityEntitlements = context.getObjects(IdentityEntitlement.class, qo); logger.debug("identityEntitlements :: " + identityEntitlements); if(identityEntitlements.size() > 0) { return true; }else { return false; } } public Map getEntitlementDetails(String entitlementValue, String applicationName) { QueryOptions qo = new QueryOptions(); qo.addFilter(Filter.and(Filter.eq("value", entitlementValue) , Filter.eq("application.name", applicationName))); Map entDetailsMap = new HashMap(); List managedAttributes = context.getObjects(ManagedAttribute.class, qo); if(managedAttributes != null && managedAttributes.size() > 0) { ManagedAttribute managedAttribute = managedAttributes.get(0); entDetailsMap.put("LogiplexName", managedAttribute.getAttribute("logiplexAppName")); entDetailsMap.put("EntitlementDescription", managedAttribute.getDescriptions().get("en_US") ); } return entDetailsMap; } //Main code starts here logger.debug("Startes Main code here"); String piiMarkerGroup = "<<Left Group>>"; String notificationTemplateForPolicyViolation = "VIS Policy Violation Notification Template"; Identity violationOnwer = approvalObject.getOwner(); EmailTemplate violationTemplate = context.getObjectByName(EmailTemplate.class,notificationTemplateForPolicyViolation ); Map emailVariables = new HashMap(); String ownerEmails= Util.listToCsv(ObjectUtil.getEffectiveEmails(context,violationOnwer)); List entitlementsTobeAddedToViolation = new ArrayList(); List PIIEntitlementsToBeAddedToViolation = new ArrayList(); if (approvalObject != null && approvalObject.getArgument("ViolatingEntitlements") != null) { Identity identityWithViolation = approvalObject.getIdentity(); String firstName = identityWithViolation.getFirstname(); String lastName = identityWithViolation.getLastname(); String lanId = identityWithViolation.getAttribute("lanId"); String identityName = identityWithViolation.getAttribute("displayName"); emailVariables.put("firstName", firstName); emailVariables.put("lastName", lastName); emailVariables.put("lanId", lanId); emailVariables.put("identityName", identityName); for (int i = 0; i < approvalObject.getArgument("ViolatingEntitlements").size(); i++) { sailpoint.object.IdentitySelector.MatchTerm entitlementViolatingAtTop = approvalObject.getArgument("ViolatingEntitlements").get(i); if (entitlementViolatingAtTop != null) { String applicationNameForViolatingEntitlement = ""; String entitlementValueForViolatingEntitlement = ""; String accountNameForViolatingEntitlement=""; if(entitlementViolatingAtTop.getApplication() != null ){ applicationNameForViolatingEntitlement = entitlementViolatingAtTop.getApplication().getName(); accountNameForViolatingEntitlement= getAccountNmae(identityWithViolation, entitlementViolatingAtTop.getApplication()); } if(entitlementViolatingAtTop.getValue() != null) { entitlementValueForViolatingEntitlement = entitlementViolatingAtTop.getValue(); } if(entitlementValueForViolatingEntitlement.equalsIgnoreCase(piiMarkerGroup)) { PIIEntitlementsToBeAddedToViolation.add(entitlementViolatingAtTop); }else { boolean checkThruLCMmethodResult = checkIfThroughLCM(applicationNameForViolatingEntitlement, identityWithViolation.getName(), entitlementValueForViolatingEntitlement) ; logger.debug("CheckThruLCMmethodResult:: " + checkThruLCMmethodResult ); if( checkThruLCMmethodResult == true ) { entitlementsTobeAddedToViolation.add(entitlementViolatingAtTop); Map entDetails = getEntitlementDetails(entitlementValueForViolatingEntitlement, applicationNameForViolatingEntitlement); auditDetectiveSOD( "Violation Detected","Aggregation",lanId,entDetails.get("LogiplexName"),entitlementValueForViolatingEntitlement,accountNameForViolatingEntitlement,approvalObject,"Aggregation",lanId ); emailVariables.put("entitltmentName",entitlementValueForViolatingEntitlement); emailVariables.put("entitltmentDesc",entDetails.get("EntitlementDescription")); if(violationTemplate!= null){ logger.debug("Violation temp loop"); Identity policyViolationApproverObject = approvalObject.getOwner(); if(null!=policyViolationApproverObject && ( Util.listToCsv(ObjectUtil.getEffectiveEmails(context,policyViolationApproverObject)) != null)){ approverEmails = Util.listToCsv(ObjectUtil.getEffectiveEmails(context,policyViolationApproverObject)); EmailOptions ops = new EmailOptions(approverEmails, emailVariables); try { context.sendEmailNotification(violationTemplate, ops); }catch(Exception e){ log.error("Could not send email to GS team as : " + e); } logger.debug("Email Sent "); } } } } } } } if(entitlementsTobeAddedToViolation != null && entitlementsTobeAddedToViolation.size() >0){ entitlementsTobeAddedToViolation.addAll(PIIEntitlementsToBeAddedToViolation) ; approvalObject.setArgument("ViolatingEntitlements",entitlementsTobeAddedToViolation ); context.saveObject(approvalObject); context.commitTransaction(); logger.debug("OBJECT persisted"); }else{ context.removeObject(approvalObject); context.commitTransaction(); logger.debug("OBJECT DELETED"); } logger.debug("End of workflow Step"); </Source> </Script> <Transition to="End"/> </Step> <Step icon="Stop" name="End" posX="160" posY="126"/> <Step icon="Start" name="Start" posX="28" posY="10"> <Transition to="Logs"/> </Step> </Workflow>