001 /* 002 * CDDL HEADER START 003 * 004 * The contents of this file are subject to the terms of the 005 * Common Development and Distribution License, Version 1.0 only 006 * (the "License"). You may not use this file except in compliance 007 * with the License. 008 * 009 * You can obtain a copy of the license at 010 * trunk/opends/resource/legal-notices/OpenDS.LICENSE 011 * or https://OpenDS.dev.java.net/OpenDS.LICENSE. 012 * See the License for the specific language governing permissions 013 * and limitations under the License. 014 * 015 * When distributing Covered Code, include this CDDL HEADER in each 016 * file and include the License file at 017 * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable, 018 * add the following below this CDDL HEADER, with the fields enclosed 019 * by brackets "[]" replaced with your own identifying information: 020 * Portions Copyright [yyyy] [name of copyright owner] 021 * 022 * CDDL HEADER END 023 * 024 * 025 * Copyright 2006-2008 Sun Microsystems, Inc. 026 */ 027 package org.opends.server.types; 028 029 030 031 import java.util.ArrayList; 032 import java.util.Date; 033 import java.util.HashMap; 034 import java.util.List; 035 import java.util.Map; 036 037 import org.opends.messages.Message; 038 import org.opends.server.core.PasswordPolicy; 039 import org.opends.server.core.PasswordPolicyState; 040 041 import static org.opends.server.types. 042 AccountStatusNotificationProperty.*; 043 import static org.opends.server.util.StaticUtils.*; 044 045 046 047 /** 048 * This class defines a data type for storing information associated 049 * with an account status notification. 050 */ 051 @org.opends.server.types.PublicAPI( 052 stability=org.opends.server.types.StabilityLevel.VOLATILE, 053 mayInstantiate=false, 054 mayExtend=false, 055 mayInvoke=true) 056 public final class AccountStatusNotification 057 { 058 // The notification type for this account status notification. 059 private AccountStatusNotificationType notificationType; 060 061 // The entry for the user to whom this notification applies. 062 private Entry userEntry; 063 064 // A set of additional properties that may be useful for this 065 // notification. 066 private Map<AccountStatusNotificationProperty,List<String>> 067 notificationProperties; 068 069 // A message that provides additional information for this account 070 // status notification. 071 private Message message; 072 073 074 075 /** 076 * Creates a new account status notification object with the 077 * provided information. 078 * 079 * @param notificationType The type for this account status 080 * notification. 081 * @param userEntry The entry for the user to whom 082 * this notification applies. 083 * @param message The human-readable message for 084 * this notification. 085 * @param notificationProperties A set of properties that may 086 * include additional information 087 * about this notification. 088 */ 089 public AccountStatusNotification( 090 AccountStatusNotificationType notificationType, 091 Entry userEntry, Message message, 092 Map<AccountStatusNotificationProperty,List<String>> 093 notificationProperties) 094 { 095 this.notificationType = notificationType; 096 this.userEntry = userEntry; 097 this.message = message; 098 099 if (notificationProperties == null) 100 { 101 this.notificationProperties = 102 new HashMap<AccountStatusNotificationProperty, 103 List<String>>(0); 104 } 105 else 106 { 107 this.notificationProperties = notificationProperties; 108 } 109 } 110 111 112 113 /** 114 * Retrieves the notification type for this account status 115 * notification. 116 * 117 * @return The notification type for this account status 118 * notification. 119 */ 120 public AccountStatusNotificationType getNotificationType() 121 { 122 return notificationType; 123 } 124 125 126 127 /** 128 * Retrieves the DN of the user entry to which this notification 129 * applies. 130 * 131 * @return The DN of the user entry to which this notification 132 * applies. 133 */ 134 public DN getUserDN() 135 { 136 return userEntry.getDN(); 137 } 138 139 140 141 /** 142 * Retrieves user entry for whom this notification applies. 143 * 144 * @return The user entry for whom this notification applies. 145 */ 146 public Entry getUserEntry() 147 { 148 return userEntry; 149 } 150 151 152 153 /** 154 * Retrieves a message that provides additional information for this 155 * account status notification. 156 * 157 * @return A message that provides additional information for this 158 * account status notification. 159 */ 160 public Message getMessage() 161 { 162 return message; 163 } 164 165 166 167 /** 168 * Retrieves a set of properties that may provide additional 169 * information for this account status notification. 170 * 171 * @return A set of properties that may provide additional 172 * information for this account status notification. 173 */ 174 public Map<AccountStatusNotificationProperty,List<String>> 175 getNotificationProperties() 176 { 177 return notificationProperties; 178 } 179 180 181 182 /** 183 * Retrieves the set of values for the specified account status 184 * notification property. 185 * 186 * @param property The account status notification property for 187 * which to retrieve the associated values. 188 * 189 * @return The set of values for the specified account status 190 * notification property, or {@code null} if the specified 191 * property is not defined for this account status 192 * notification. 193 */ 194 public List<String> getNotificationProperty( 195 AccountStatusNotificationProperty property) 196 { 197 return notificationProperties.get(property); 198 } 199 200 201 202 /** 203 * Creates a set of account status notification properties from the 204 * provided information. 205 * 206 * @param pwPolicyState The password policy state for the user 207 * associated with the notification. 208 * @param tempLocked Indicates whether the user's account 209 * has been temporarily locked. 210 * @param timeToExpiration The length of time in seconds until the 211 * user's password expires, or -1 if it's 212 * not about to expire. 213 * @param oldPasswords The set of old passwords for the user, 214 * or {@code null} if this is not 215 * applicable. 216 * @param newPasswords The set of new passwords for the user, 217 * or {@code null} if this is not 218 * applicable. 219 * 220 * @return The created set of account status notification 221 * properties. 222 */ 223 @org.opends.server.types.PublicAPI( 224 stability=org.opends.server.types.StabilityLevel.PRIVATE, 225 mayInstantiate=false, 226 mayExtend=false, 227 mayInvoke=false) 228 public static Map<AccountStatusNotificationProperty,List<String>> 229 createProperties( 230 PasswordPolicyState pwPolicyState, 231 boolean tempLocked, int timeToExpiration, 232 List<AttributeValue> oldPasswords, 233 List<AttributeValue> newPasswords) 234 { 235 HashMap<AccountStatusNotificationProperty,List<String>> props = 236 new HashMap<AccountStatusNotificationProperty, 237 List<String>>(4); 238 239 PasswordPolicy policy = pwPolicyState.getPolicy(); 240 241 ArrayList<String> propList = new ArrayList<String>(1); 242 propList.add(policy.getConfigEntryDN().toString()); 243 props.put(PASSWORD_POLICY_DN, propList); 244 245 if (tempLocked) 246 { 247 int secondsUntilUnlock = policy.getLockoutDuration(); 248 if (secondsUntilUnlock > 0) 249 { 250 propList = new ArrayList<String>(1); 251 propList.add(String.valueOf(secondsUntilUnlock)); 252 props.put(SECONDS_UNTIL_UNLOCK, propList); 253 254 propList = new ArrayList<String>(1); 255 propList.add( 256 secondsToTimeString(secondsUntilUnlock).toString()); 257 props.put(TIME_UNTIL_UNLOCK, propList); 258 259 long unlockTime = System.currentTimeMillis() + 260 (1000*secondsUntilUnlock); 261 propList = new ArrayList<String>(1); 262 propList.add(new Date(unlockTime).toString()); 263 props.put(ACCOUNT_UNLOCK_TIME, propList); 264 } 265 } 266 267 if (timeToExpiration >= 0) 268 { 269 propList = new ArrayList<String>(1); 270 propList.add(String.valueOf(timeToExpiration)); 271 props.put(SECONDS_UNTIL_EXPIRATION, propList); 272 273 propList = new ArrayList<String>(1); 274 propList.add( 275 secondsToTimeString(timeToExpiration).toString()); 276 props.put(TIME_UNTIL_EXPIRATION, propList); 277 278 long expTime = System.currentTimeMillis() + 279 (1000*timeToExpiration); 280 propList = new ArrayList<String>(1); 281 propList.add(new Date(expTime).toString()); 282 props.put(PASSWORD_EXPIRATION_TIME, propList); 283 } 284 285 if ((oldPasswords != null) && (! oldPasswords.isEmpty())) 286 { 287 propList = new ArrayList<String>(oldPasswords.size()); 288 for (AttributeValue v : oldPasswords) 289 { 290 propList.add(v.getStringValue()); 291 } 292 293 props.put(OLD_PASSWORD, propList); 294 } 295 296 if ((newPasswords != null) && (! newPasswords.isEmpty())) 297 { 298 propList = new ArrayList<String>(newPasswords.size()); 299 for (AttributeValue v : newPasswords) 300 { 301 propList.add(v.getStringValue()); 302 } 303 304 props.put(NEW_PASSWORD, propList); 305 } 306 307 return props; 308 } 309 310 311 312 /** 313 * Retrieves a string representation of this account status 314 * notification. 315 * 316 * @return A string representation of this account status 317 * notification. 318 */ 319 public String toString() 320 { 321 return "AccountStatusNotification(type=" + 322 notificationType.getName() + ",dn=" + userEntry.getDN() + 323 ",message=" + message + ")"; 324 } 325 } 326