Thursday, May 8, 2014

OIM 11g R2 PS2 - Notify User ID to User

In this post, I will cover a scenario where in we want to notify the userid and password to the newly created user in separate email because of security reasons.


OIM out-of-the-box sends out a single mail containing userid and password.

Generated Password Notification Template is triggered by default to inform the user about his login id and password






                                                                                                                                            
                                                                                                                                                 
Modify this template to send only the password









                                                                                                                                          
                                                                                                                                                   
Create a new Template to include only the Login ID

                                                                                                                                                     
                                                                                                                                    
                                                                                                                                                              



Export
/metadata/iam-features-passwordmgmt/event-definition/EventHandlers.xml
using weblogicExportMetaData.sh

Add the below entry

<postprocess-handler class="com.dubey.deepak.oim.user.NotifyUserIdToUser" entity-type="User" operation="CREATE" name="NotifyUserIdToUser" order="2180" stage="postprocess" sync="TRUE"/>

Import back using weblogicImportMetaData.sh 


Create a new Notification Event Resolver

Export


/metadata/iam-features-passwordmgmt/notification/ResetPasswordEvent.xml 
using weblogicExportMetaData.sh

Add the below entry

<EventType name="NotifyUserIdToUser">
<StaticData>
<Attribute DataType="X2-Entity" EntityName="User" Name="Granted User"/>
</StaticData>
<Resolver class="oracle.iam.identity.notification.EndDateNotificationEventResolver">
<Param DataType="X2-Entity" EntityName="User" Name="usr_key"/>
</Resolver>
</EventType>


Import back using weblogicImportMetaData.sh

NotifyUserIdToUser java class


  1 package com.dubey.deepak.oim.user;
  2 
  3 import static oracle.iam.identity.usermgmt.api.UserManagerConstants.AttributeName.MANAGER_KEY;
  4 import static oracle.iam.identity.usermgmt.api.UserManagerConstants.AttributeName.USER_LOGIN;
  5 
  6 import java.io.Serializable;
  7 import java.util.ArrayList;
  8 import java.util.HashMap;
  9 import java.util.HashSet;
 10 import java.util.List;
 11 import java.util.Set;
 12 
 13 import oracle.iam.identity.exception.NoSuchUserException;
 14 import oracle.iam.identity.exception.UserLookupException;
 15 import oracle.iam.identity.usermgmt.api.UserManager;
 16 import oracle.iam.identity.usermgmt.vo.User;
 17 import oracle.iam.notification.api.NotificationService;
 18 import oracle.iam.notification.vo.NotificationEvent;
 19 import oracle.iam.platform.Platform;
 20 import oracle.iam.platform.authz.exception.AccessDeniedException;
 21 import oracle.iam.platform.kernel.spi.PostProcessHandler;
 22 import oracle.iam.platform.kernel.vo.AbstractGenericOrchestration;
 23 import oracle.iam.platform.kernel.vo.BulkEventResult;
 24 import oracle.iam.platform.kernel.vo.BulkOrchestration;
 25 import oracle.iam.platform.kernel.vo.EventResult;
 26 import oracle.iam.platform.kernel.vo.Orchestration;
 27 
 28 public class NotifyUserIdToUser implements PostProcessHandler {
 29 
 30 	public EventResult execute(long processId, long eventId,
 31 			Orchestration orchestration) {
 32 		return new EventResult();
 33 	}
 34 
 35 	private NotificationEvent createNotificationEvent(String poTemplateName,
 36 			String userKey) {
 37 		NotificationEvent event = null;
 38 		try {
 39 			event = new NotificationEvent();
 40 			String[] receiverUserIds = getRecipientUserIds(userKey);
 41 			event.setUserIds(receiverUserIds);
 42 			event.setTemplateName(poTemplateName);
 43 			event.setSender(null);
 44 			HashMap<String, Object> templateParams = new HashMap<String, Object>();
 45 			templateParams.put("usr_key", userKey);
 46 			event.setParams(templateParams);
 47 		} catch (Exception e) {
 48 			e.printStackTrace();
 49 			System.out.println("e-------->" + e.getMessage());
 50 		}
 51 		return event;
 52 	}
 53 
 54 	@Override
 55 	public void initialize(HashMap<String, String> arg0) {
 56 
 57 	}
 58 
 59 	@Override
 60 	public boolean cancel(long arg0, long arg1,
 61 			AbstractGenericOrchestration arg2) {
 62 		return false;
 63 	}
 64 
 65 	@Override
 66 	public void compensate(long arg0, long arg1,
 67 			AbstractGenericOrchestration arg2) {
 68 
 69 	}
 70 
 71 	@Override
 72 	public BulkEventResult execute(long l, long l1, BulkOrchestration bulkOrch) {
 73 		try {
 74 			System.out
 75 					.println("Entering  BulkEventResult of NotifyUserIdToUser");
 76 			System.out.println("l ->" + l);
 77 			System.out.println("l1 ->" + l1);
 78 			String oprType = bulkOrch.getOperation();
 79 			System.out.println("oprType ->" + oprType);
 80 			HashMap<String, Serializable>[] bulkParams = bulkOrch
 81 					.getBulkParameters();
 82 			for (HashMap<String, Serializable> bulkParam : bulkParams) {
 83 				System.out.println("bulkParam ->" + bulkParam);
 84 				Set<String> bulkKeySet = bulkParam.keySet();
 85 				System.out.println("bulkKeySet ->" + bulkKeySet);
 86 				String usrLogin = null;
 87 				String usrKey = null;
 88 				for (String key : bulkKeySet) {
 89 					System.out.println("key ->" + key);
 90 					Serializable serializable = bulkParam.get(key);
 91 					System.out.println("serializable ->" + serializable);
 92 					if (key.equalsIgnoreCase("User Login")) {
 93 						usrLogin = serializable.toString();
 94 						System.out.println("usrLogin ->" + usrLogin);
 95 						UserManager usrMgr = Platform
 96 								.getService(UserManager.class);
 97 
 98 						User user = usrMgr.getDetails(usrLogin, null, true);
 99 						usrKey = user.getEntityId(); // getAttribute("usr_key").toString();
100 						String uid = user.getId();
101 						System.out.println("uid--->" + uid);
102 						System.out.println("usrKey ->" + usrKey);
103 						String templateName = "Notify UserId to User";
104 						NotificationService notService = Platform
105 								.getService(NotificationService.class);
106 						NotificationEvent eventToSend = this
107 								.createNotificationEvent(templateName, usrKey);
108 						notService.notify(eventToSend);
109 
110 					}
111 
112 				}
113 			}
114 		} catch (Exception e) {
115 			System.out.println("exception e in BulkExecuteEvent ->"
116 					+ e.getMessage());
117 			e.printStackTrace();
118 		}
119 		System.out.println("Exiting  BulkEventResult of NotifyUserIdToUser");
120 		return new BulkEventResult();
121 	}
122 
123 	private String[] getRecipientUserIds(String userKey)
124 			throws NoSuchUserException, UserLookupException,
125 			AccessDeniedException {
126 		UserManager usrMgr = Platform.getService(UserManager.class);
127 		User user = null;
128 		String userId = null;
129 		Set<String> userRetAttrs = new HashSet<String>();
130 		userRetAttrs.add(MANAGER_KEY.getId());
131 		userRetAttrs.add(USER_LOGIN.getId());
132 		User manager = null;
133 		String managerId = null;
134 		String managerKey = null;
135 		Set<String> managerRetAttrs = new HashSet<String>();
136 		managerRetAttrs.add(USER_LOGIN.getId());
137 		user = usrMgr.getDetails(userKey, userRetAttrs, false);
138 		userId = user.getAttribute(USER_LOGIN.getId()).toString();
139 		List<String> userIds = new ArrayList<String>();
140 		userIds.add(userId);
141 		if (user.getAttribute(MANAGER_KEY.getId()) != null) {
142 			managerKey = user.getAttribute(MANAGER_KEY.getId()).toString();
143 			manager = usrMgr.getDetails(managerKey, managerRetAttrs, false);
144 			managerId = manager.getAttribute(USER_LOGIN.getId()).toString();
145 			userIds.add(managerId);
146 		}
147 		String[] recipientIDs = userIds.toArray(new String[0]);
148 		return recipientIDs;
149 	}
150 
151 }
152 


Finally the plugin.xml file to for packaging and registration


<?xml version="1.0" encoding="UTF-8"?>
<oimplugins>
  <plugins pluginpoint="oracle.iam.platform.kernel.spi.EventHandler">
    <plugin pluginclass=
        "com.dubey.deepak.oim.user.NotifyUserIdToUser"
         version="1.0"
         name="NotifyUserIdToUser">
    </plugin>
  </plugins>
</oimplugins>


Run the “ant -f pluginregistration.xml register” and register/upload the plugin to OIM.