package org.ovirt.engine.core.bll; import java.util.Collections; import java.util.List; import java.util.Map; import javax.inject.Inject; import javax.mail.internet.AddressException; import javax.mail.internet.InternetAddress; import org.apache.commons.lang.StringUtils; import org.ovirt.engine.core.bll.context.CommandContext; import org.ovirt.engine.core.bll.utils.PermissionSubject; import org.ovirt.engine.core.common.EventNotificationMethod; import org.ovirt.engine.core.common.VdcObjectType; import org.ovirt.engine.core.common.action.EventSubscriptionParametesBase; import org.ovirt.engine.core.common.businessentities.ActionGroup; import org.ovirt.engine.core.common.businessentities.EventSubscriber; import org.ovirt.engine.core.common.businessentities.Tags; import org.ovirt.engine.core.common.businessentities.aaa.DbUser; import org.ovirt.engine.core.common.errors.EngineMessage; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dao.EventDao; import org.ovirt.engine.core.dao.TagDao; public abstract class EventSubscriptionCommandBase<T extends EventSubscriptionParametesBase> extends CommandBase<T> { @Inject protected EventDao eventDao; @Inject private TagDao tagDao; public EventSubscriptionCommandBase(T parameters, CommandContext cmdContext) { super(parameters, cmdContext); } @Override public Map<String, String> getJobMessageProperties() { if (jobProperties == null) { jobProperties = super.getJobMessageProperties(); } jobProperties.put("address", getParameters().getEventSubscriber().getMethodAddress()); jobProperties.put("eventtype", getParameters().getEventSubscriber().getEventUpName()); return jobProperties; } /** * Validates the notification method. * * * @param eventNotificationMethod * The eventNotificationMethods. * @param eventSubscriber * The eventSubscriber. * @param user * The user. */ protected boolean validateNotificationMethod(EventNotificationMethod eventNotificationMethod, EventSubscriber eventSubscriber, DbUser user) { boolean retValue = true; EventNotificationMethod notificationMethod = eventNotificationMethod; switch (notificationMethod) { case SMTP: String mailAddress = StringUtils.isEmpty(eventSubscriber.getMethodAddress()) ? user.getEmail() : eventSubscriber.getMethodAddress(); if (!isEmailValid(mailAddress)) { addValidationMessage(EngineMessage.USER_DOES_NOT_HAVE_A_VALID_EMAIL); retValue = false; } break; default: addValidationMessage(EngineMessage.EN_UNKNOWN_NOTIFICATION_METHOD); retValue = false; break; } return retValue; } /** * Validates the notification method and tag. * * @param eventNotificationMethod * The eventNotificationMethod. * @param eventSubscriber * The eventSubscriber. * @param user * The user. */ protected boolean validateAdd(EventNotificationMethod eventNotificationMethod, EventSubscriber eventSubscriber, DbUser user) { String tagName = eventSubscriber.getTagName(); // validate notification method boolean retValue = validateNotificationMethod(eventNotificationMethod, eventSubscriber, user); // validate tag name if exists if (retValue && StringUtils.isNotEmpty(tagName)) { retValue = validateTag(tagName); } return retValue; } protected boolean validateRemove(EventNotificationMethod eventNotificationMethod, EventSubscriber eventSubscriber, DbUser user) { boolean retValue = false; // check if user is subscribed to the event List<EventSubscriber> list = eventDao.getAllForSubscriber(eventSubscriber.getSubscriberId()); if (list.isEmpty()) { addValidationMessage(EngineMessage.EN_NOT_SUBSCRIBED); } else { if (!validateSubscription(list, eventSubscriber)) { addValidationMessage(EngineMessage.EN_NOT_SUBSCRIBED); } else { String tagName = eventSubscriber.getTagName(); // validate notification method retValue = validateNotificationMethod(eventNotificationMethod, eventSubscriber, user); // validate tag name if exists if (retValue && StringUtils.isNotEmpty(tagName)) { retValue = validateTag(tagName); } } } return retValue; } /** * Validates the tag. * * @param tagName * Name of the tag. */ protected boolean validateTag(String tagName) { boolean retValue = true; Tags tag = tagDao.getByName(tagName); if (tag == null) { addValidationMessage(EngineMessage.EN_UNKNOWN_TAG_NAME); retValue = false; } return retValue; } /** * Determines whether [is valid email] [the specified input email]. * * @param email * The input email. * @return <c>true</c> if [is valid email] [the specified input email]; * otherwise, <c>false</c>. */ protected static boolean isEmailValid(String email) { boolean valid = false; try { if (email == null){ throw new AddressException(); } new InternetAddress(email, true); valid = true; } catch (AddressException ignored) { } return valid; } private static boolean validateSubscription(Iterable<EventSubscriber> subscriptions, EventSubscriber current) { boolean retValue = false; for (EventSubscriber eventSubscriber : subscriptions) { if (eventSubscriber.getSubscriberId().equals(current.getSubscriberId()) && StringUtils.equals(eventSubscriber.getEventUpName(), current.getEventUpName()) && eventSubscriber.getEventNotificationMethod() == current.getEventNotificationMethod()) { retValue = true; break; } } return retValue; } @Override public List<PermissionSubject> getPermissionCheckSubjects() { return Collections.singletonList(new PermissionSubject(Guid.SYSTEM, VdcObjectType.System, ActionGroup.EVENT_NOTIFICATION_MANAGEMENT)); } }