/*
* Copyright (c) 2005-2014, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.wso2.carbon.identity.mgt.listener;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.wso2.carbon.identity.core.AbstractIdentityUserOperationEventListener;
import org.wso2.carbon.identity.core.util.IdentityCoreConstants;
import org.wso2.carbon.identity.mgt.internal.IdentityMgtServiceComponent;
import org.wso2.carbon.identity.notification.mgt.NotificationManagementException;
import org.wso2.carbon.identity.notification.mgt.NotificationSender;
import org.wso2.carbon.identity.notification.mgt.bean.PublisherEvent;
import org.wso2.carbon.user.core.UserStoreException;
import org.wso2.carbon.user.core.UserStoreManager;
import java.util.Map;
/**
* This listener is registered as a user operation listener. Whenever a user operation takes place
* this listener fires message sending module, So that registered modules with registered events
* will send messages to endpoints.
*/
public class UserOperationsNotificationListener extends AbstractIdentityUserOperationEventListener {
private static final Log log = LogFactory.getLog(UserOperationsNotificationListener.class);
private final String eventName = "userOperation";
private final String usernameLabel = "username";
private final String operationLabel = "operation";
private final String EVENT_TYPE_PROFILE_UPDATE = "profileUpdate";
private final String EVENT_TYPE_ROLE_UPDATE = "roleUpdate";
@Override
public int getExecutionOrderId() {
int orderId = getOrderId();
if (orderId != IdentityCoreConstants.EVENT_LISTENER_ORDER_ID) {
return orderId;
}
return 80;
}
/**
* Overridden to trigger Notification sending module to send messages to registered modules
* on doPostDeleteOperation
*
* @param username Username of the deleted user
* @param userStoreManager Instance of user store manager called
* @return Always returns true, even if message sending fails there is no major effect on
* further operations.
* @throws org.wso2.carbon.user.core.UserStoreException
*/
@Override
public boolean doPostDeleteUser(String username, UserStoreManager userStoreManager)
throws UserStoreException {
if (!isEnable()) {
return true;
}
if (log.isDebugEnabled()) {
log.debug("Sending user delete notification for user " + username);
}
sendNotification(EVENT_TYPE_PROFILE_UPDATE, username);
// Returns true since no major effect on upcoming listeners
return true;
}
/**
* Overridden to trigger Notification Sending module to send messages to registered modules
* on doPostDeleteUserClaimValues
*
* @param username Username of the deleted user
* @param userStoreManager Instance of user store manager called
* @return Always returns true, even if message sending fails there is no major effect on
* further operations.
* @throws org.wso2.carbon.user.core.UserStoreException
*/
@Override
public boolean doPostDeleteUserClaimValues(String username, UserStoreManager userStoreManager)
throws UserStoreException {
if (!isEnable()) {
return true;
}
if (log.isDebugEnabled()) {
log.debug("Sending user claim value update notification for user " + username);
}
sendNotification(EVENT_TYPE_PROFILE_UPDATE, username);
// Returns true since no major effect on upcoming listeners
return true;
}
/**
* Overridden to trigger Notification Sending module to send messages to registered modules
* on
* doPostDeleteUserClaimValues
*
* @param username Username of the deleted user
* @param userStoreManager Instance of user store manager called
* @return Always returns true, even if message sending fails there is no major effect on
* further operations.
* @throws org.wso2.carbon.user.core.UserStoreException
*/
@Override
public boolean doPostDeleteUserClaimValue(String username, UserStoreManager userStoreManager)
throws UserStoreException {
if (!isEnable()) {
return true;
}
if (log.isDebugEnabled()) {
log.debug("Sending user delete update notification for user " + username);
}
sendNotification(EVENT_TYPE_PROFILE_UPDATE, username);
// Returns true since no major effect on upcoming listeners
return true;
}
/**
* Overridden to trigger Notification Sending module to send messages to registered modules
* on PostUpdateRoleListOfUser
*
* @param username Username of role updated user
* @param deletedRoles List of roles deleted
* @param newRoles list of roles added
* @param userStoreManager Instance of user store manager called
* @return always returns true since no major effect on further operations.
* @throws org.wso2.carbon.user.core.UserStoreException
*/
public boolean doPostUpdateRoleListOfUser(String username,
String[] deletedRoles, String[] newRoles,
UserStoreManager userStoreManager)
throws UserStoreException {
if (!isEnable()) {
return true;
}
if (log.isDebugEnabled()) {
log.debug("Sending user role list update notification for user " + username);
}
sendNotification(EVENT_TYPE_ROLE_UPDATE, username);
// Returns true since no major effect on upcoming listeners
return true;
}
/**
* Overridden to trigger Notification Sending module to send messages to registered modules
* on doPostSetUserClaimValues
*
* @param username username of user whose claim values are updated
* @param claims set of claims
* @param profileName profile name
* @param userStoreManager instance of user store manager called
* @return always returns true since no major effect on further operations
* @throws org.wso2.carbon.user.core.UserStoreException
*/
@Override
public boolean doPostSetUserClaimValues(String username,
Map<String, String> claims, String profileName,
UserStoreManager userStoreManager)
throws UserStoreException {
if (!isEnable()) {
return true;
}
if (log.isDebugEnabled()) {
log.debug("Sending user claim values update notification for user " + username);
}
sendNotification(EVENT_TYPE_PROFILE_UPDATE, username);
// Returns true since no major effect on upcoming listeners
return true;
}
/**
* This function builds the required configuration object for Notification sender and pass it
* to the notification sender with the relevant event.
*
* @param operation Type or operation took place in user operation listener
* @param username username of the subjected user for attribute change
*/
private void sendNotification(String operation, String username) {
NotificationSender notificationSender = IdentityMgtServiceComponent.getNotificationSender();
if (notificationSender != null) {
try {
PublisherEvent event = new PublisherEvent(eventName);
event.addEventProperty(operationLabel, operation);
event.addEventProperty(usernameLabel, username);
if (log.isDebugEnabled()) {
log.debug("Invoking notification sender");
}
notificationSender.invoke(event);
} catch (NotificationManagementException e) {
log.error("Error while sending notifications on user operations", e);
}
} else {
log.error("No registered notification sender found. Notification sending aborted");
}
}
}