/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only * (the "License"). You may not use this file except in compliance * with the License. * * You can obtain a copy of the license at * trunk/opends/resource/legal-notices/OpenDS.LICENSE * or https://OpenDS.dev.java.net/OpenDS.LICENSE. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable, * add the following below this CDDL HEADER, with the fields enclosed * by brackets "[]" replaced with your own identifying information: * Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END * * * Copyright 2006-2008 Sun Microsystems, Inc. * Portions copyright 2011 ForgeRock AS. */ package org.opends.server.types; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import org.opends.messages.Message; import org.opends.server.core.PasswordPolicy; import org.opends.server.core.PasswordPolicyState; import static org.opends.server.types. AccountStatusNotificationProperty.*; import static org.opends.server.util.StaticUtils.*; /** * This class defines a data type for storing information associated * with an account status notification. */ @org.opends.server.types.PublicAPI( stability=org.opends.server.types.StabilityLevel.VOLATILE, mayInstantiate=false, mayExtend=false, mayInvoke=true) public final class AccountStatusNotification { // The notification type for this account status notification. private AccountStatusNotificationType notificationType; // The entry for the user to whom this notification applies. private Entry userEntry; // A set of additional properties that may be useful for this // notification. private Map<AccountStatusNotificationProperty,List<String>> notificationProperties; // A message that provides additional information for this account // status notification. private Message message; /** * Creates a new account status notification object with the * provided information. * * @param notificationType The type for this account status * notification. * @param userEntry The entry for the user to whom * this notification applies. * @param message The human-readable message for * this notification. * @param notificationProperties A set of properties that may * include additional information * about this notification. */ public AccountStatusNotification( AccountStatusNotificationType notificationType, Entry userEntry, Message message, Map<AccountStatusNotificationProperty,List<String>> notificationProperties) { this.notificationType = notificationType; this.userEntry = userEntry; this.message = message; if (notificationProperties == null) { this.notificationProperties = new HashMap<AccountStatusNotificationProperty, List<String>>(0); } else { this.notificationProperties = notificationProperties; } } /** * Retrieves the notification type for this account status * notification. * * @return The notification type for this account status * notification. */ public AccountStatusNotificationType getNotificationType() { return notificationType; } /** * Retrieves the DN of the user entry to which this notification * applies. * * @return The DN of the user entry to which this notification * applies. */ public DN getUserDN() { return userEntry.getDN(); } /** * Retrieves user entry for whom this notification applies. * * @return The user entry for whom this notification applies. */ public Entry getUserEntry() { return userEntry; } /** * Retrieves a message that provides additional information for this * account status notification. * * @return A message that provides additional information for this * account status notification. */ public Message getMessage() { return message; } /** * Retrieves a set of properties that may provide additional * information for this account status notification. * * @return A set of properties that may provide additional * information for this account status notification. */ public Map<AccountStatusNotificationProperty,List<String>> getNotificationProperties() { return notificationProperties; } /** * Retrieves the set of values for the specified account status * notification property. * * @param property The account status notification property for * which to retrieve the associated values. * * @return The set of values for the specified account status * notification property, or {@code null} if the specified * property is not defined for this account status * notification. */ public List<String> getNotificationProperty( AccountStatusNotificationProperty property) { return notificationProperties.get(property); } /** * Creates a set of account status notification properties from the * provided information. * * @param pwPolicyState The password policy state for the user * associated with the notification. * @param tempLocked Indicates whether the user's account * has been temporarily locked. * @param timeToExpiration The length of time in seconds until the * user's password expires, or -1 if it's * not about to expire. * @param oldPasswords The set of old passwords for the user, * or {@code null} if this is not * applicable. * @param newPasswords The set of new passwords for the user, * or {@code null} if this is not * applicable. * * @return The created set of account status notification * properties. */ @org.opends.server.types.PublicAPI( stability=org.opends.server.types.StabilityLevel.PRIVATE, mayInstantiate=false, mayExtend=false, mayInvoke=false) public static Map<AccountStatusNotificationProperty,List<String>> createProperties( PasswordPolicyState pwPolicyState, boolean tempLocked, int timeToExpiration, List<AttributeValue> oldPasswords, List<AttributeValue> newPasswords) { HashMap<AccountStatusNotificationProperty,List<String>> props = new HashMap<AccountStatusNotificationProperty, List<String>>(4); PasswordPolicy policy = pwPolicyState.getAuthenticationPolicy(); ArrayList<String> propList = new ArrayList<String>(1); propList.add(policy.getDN().toString()); props.put(PASSWORD_POLICY_DN, propList); if (tempLocked) { long secondsUntilUnlock = policy.getLockoutDuration(); if (secondsUntilUnlock > 0L) { propList = new ArrayList<String>(1); propList.add(String.valueOf(secondsUntilUnlock)); props.put(SECONDS_UNTIL_UNLOCK, propList); propList = new ArrayList<String>(1); propList.add( secondsToTimeString(secondsUntilUnlock).toString()); props.put(TIME_UNTIL_UNLOCK, propList); long unlockTime = System.currentTimeMillis() + (1000*secondsUntilUnlock); propList = new ArrayList<String>(1); propList.add(new Date(unlockTime).toString()); props.put(ACCOUNT_UNLOCK_TIME, propList); } } if (timeToExpiration >= 0) { propList = new ArrayList<String>(1); propList.add(String.valueOf(timeToExpiration)); props.put(SECONDS_UNTIL_EXPIRATION, propList); propList = new ArrayList<String>(1); propList.add( secondsToTimeString(timeToExpiration).toString()); props.put(TIME_UNTIL_EXPIRATION, propList); long expTime = System.currentTimeMillis() + (1000*timeToExpiration); propList = new ArrayList<String>(1); propList.add(new Date(expTime).toString()); props.put(PASSWORD_EXPIRATION_TIME, propList); } if ((oldPasswords != null) && (! oldPasswords.isEmpty())) { propList = new ArrayList<String>(oldPasswords.size()); for (AttributeValue v : oldPasswords) { propList.add(v.getValue().toString()); } props.put(OLD_PASSWORD, propList); } if ((newPasswords != null) && (! newPasswords.isEmpty())) { propList = new ArrayList<String>(newPasswords.size()); for (AttributeValue v : newPasswords) { propList.add(v.getValue().toString()); } props.put(NEW_PASSWORD, propList); } return props; } /** * Retrieves a string representation of this account status * notification. * * @return A string representation of this account status * notification. */ public String toString() { return "AccountStatusNotification(type=" + notificationType.getName() + ",dn=" + userEntry.getDN() + ",message=" + message + ")"; } }