001/* 002 * The contents of this file are subject to the terms of the Common Development and 003 * Distribution License (the License). You may not use this file except in compliance with the 004 * License. 005 * 006 * You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the 007 * specific language governing permission and limitations under the License. 008 * 009 * When distributing Covered Software, include this CDDL Header Notice in each file and include 010 * the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL 011 * Header, with the fields enclosed by brackets [] replaced by your own identifying 012 * information: "Portions Copyright [year] [name of copyright owner]". 013 * 014 * Copyright 2008 Sun Microsystems, Inc. 015 */ 016package org.forgerock.opendj.server.config.meta; 017 018 019 020import org.forgerock.opendj.config.AdministratorAction; 021import org.forgerock.opendj.config.BooleanPropertyDefinition; 022import org.forgerock.opendj.config.ClassPropertyDefinition; 023import org.forgerock.opendj.config.client.ConcurrentModificationException; 024import org.forgerock.opendj.config.client.ManagedObject; 025import org.forgerock.opendj.config.client.MissingMandatoryPropertiesException; 026import org.forgerock.opendj.config.client.OperationRejectedException; 027import org.forgerock.opendj.config.DefaultBehaviorProvider; 028import org.forgerock.opendj.config.DefinedDefaultBehaviorProvider; 029import org.forgerock.opendj.config.IntegerPropertyDefinition; 030import org.forgerock.opendj.config.ManagedObjectAlreadyExistsException; 031import org.forgerock.opendj.config.ManagedObjectDefinition; 032import org.forgerock.opendj.config.PropertyOption; 033import org.forgerock.opendj.config.PropertyProvider; 034import org.forgerock.opendj.config.server.ConfigurationChangeListener; 035import org.forgerock.opendj.config.server.ServerManagedObject; 036import org.forgerock.opendj.config.Tag; 037import org.forgerock.opendj.config.UndefinedDefaultBehaviorProvider; 038import org.forgerock.opendj.ldap.DN; 039import org.forgerock.opendj.ldap.LdapException; 040import org.forgerock.opendj.server.config.client.SimilarityBasedPasswordValidatorCfgClient; 041import org.forgerock.opendj.server.config.server.PasswordValidatorCfg; 042import org.forgerock.opendj.server.config.server.SimilarityBasedPasswordValidatorCfg; 043 044 045 046/** 047 * An interface for querying the Similarity Based Password Validator 048 * managed object definition meta information. 049 * <p> 050 * The Similarity Based Password Validator determines whether a 051 * proposed password is acceptable by measuring how similar it is to 052 * the user's current password. 053 */ 054public final class SimilarityBasedPasswordValidatorCfgDefn extends ManagedObjectDefinition<SimilarityBasedPasswordValidatorCfgClient, SimilarityBasedPasswordValidatorCfg> { 055 056 /** The singleton configuration definition instance. */ 057 private static final SimilarityBasedPasswordValidatorCfgDefn INSTANCE = new SimilarityBasedPasswordValidatorCfgDefn(); 058 059 060 061 /** The "java-class" property definition. */ 062 private static final ClassPropertyDefinition PD_JAVA_CLASS; 063 064 065 066 /** The "min-password-difference" property definition. */ 067 private static final IntegerPropertyDefinition PD_MIN_PASSWORD_DIFFERENCE; 068 069 070 071 /** Build the "java-class" property definition. */ 072 static { 073 ClassPropertyDefinition.Builder builder = ClassPropertyDefinition.createBuilder(INSTANCE, "java-class"); 074 builder.setOption(PropertyOption.MANDATORY); 075 builder.setOption(PropertyOption.ADVANCED); 076 builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.COMPONENT_RESTART, INSTANCE, "java-class")); 077 DefaultBehaviorProvider<String> provider = new DefinedDefaultBehaviorProvider<String>("org.opends.server.extensions.SimilarityBasedPasswordValidator"); 078 builder.setDefaultBehaviorProvider(provider); 079 builder.addInstanceOf("org.opends.server.api.PasswordValidator"); 080 PD_JAVA_CLASS = builder.getInstance(); 081 INSTANCE.registerPropertyDefinition(PD_JAVA_CLASS); 082 } 083 084 085 086 /** Build the "min-password-difference" property definition. */ 087 static { 088 IntegerPropertyDefinition.Builder builder = IntegerPropertyDefinition.createBuilder(INSTANCE, "min-password-difference"); 089 builder.setOption(PropertyOption.MANDATORY); 090 builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.NONE, INSTANCE, "min-password-difference")); 091 builder.setDefaultBehaviorProvider(new UndefinedDefaultBehaviorProvider<Integer>()); 092 builder.setUpperLimit(2147483647); 093 builder.setLowerLimit(0); 094 PD_MIN_PASSWORD_DIFFERENCE = builder.getInstance(); 095 INSTANCE.registerPropertyDefinition(PD_MIN_PASSWORD_DIFFERENCE); 096 } 097 098 099 100 // Register the tags associated with this managed object definition. 101 static { 102 INSTANCE.registerTag(Tag.valueOf("user-management")); 103 } 104 105 106 107 /** 108 * Get the Similarity Based Password Validator configuration 109 * definition singleton. 110 * 111 * @return Returns the Similarity Based Password Validator 112 * configuration definition singleton. 113 */ 114 public static SimilarityBasedPasswordValidatorCfgDefn getInstance() { 115 return INSTANCE; 116 } 117 118 119 120 /** 121 * Private constructor. 122 */ 123 private SimilarityBasedPasswordValidatorCfgDefn() { 124 super("similarity-based-password-validator", PasswordValidatorCfgDefn.getInstance()); 125 } 126 127 128 129 /** {@inheritDoc} */ 130 public SimilarityBasedPasswordValidatorCfgClient createClientConfiguration( 131 ManagedObject<? extends SimilarityBasedPasswordValidatorCfgClient> impl) { 132 return new SimilarityBasedPasswordValidatorCfgClientImpl(impl); 133 } 134 135 136 137 /** {@inheritDoc} */ 138 public SimilarityBasedPasswordValidatorCfg createServerConfiguration( 139 ServerManagedObject<? extends SimilarityBasedPasswordValidatorCfg> impl) { 140 return new SimilarityBasedPasswordValidatorCfgServerImpl(impl); 141 } 142 143 144 145 /** {@inheritDoc} */ 146 public Class<SimilarityBasedPasswordValidatorCfg> getServerConfigurationClass() { 147 return SimilarityBasedPasswordValidatorCfg.class; 148 } 149 150 151 152 /** 153 * Get the "enabled" property definition. 154 * <p> 155 * Indicates whether the password validator is enabled for use. 156 * 157 * @return Returns the "enabled" property definition. 158 */ 159 public BooleanPropertyDefinition getEnabledPropertyDefinition() { 160 return PasswordValidatorCfgDefn.getInstance().getEnabledPropertyDefinition(); 161 } 162 163 164 165 /** 166 * Get the "java-class" property definition. 167 * <p> 168 * Specifies the fully-qualified name of the Java class that 169 * provides the password validator implementation. 170 * 171 * @return Returns the "java-class" property definition. 172 */ 173 public ClassPropertyDefinition getJavaClassPropertyDefinition() { 174 return PD_JAVA_CLASS; 175 } 176 177 178 179 /** 180 * Get the "min-password-difference" property definition. 181 * <p> 182 * Specifies the minimum difference of new and old password. 183 * <p> 184 * A value of zero indicates that no difference between passwords is 185 * acceptable. 186 * 187 * @return Returns the "min-password-difference" property definition. 188 */ 189 public IntegerPropertyDefinition getMinPasswordDifferencePropertyDefinition() { 190 return PD_MIN_PASSWORD_DIFFERENCE; 191 } 192 193 194 195 /** 196 * Managed object client implementation. 197 */ 198 private static class SimilarityBasedPasswordValidatorCfgClientImpl implements 199 SimilarityBasedPasswordValidatorCfgClient { 200 201 /** Private implementation. */ 202 private ManagedObject<? extends SimilarityBasedPasswordValidatorCfgClient> impl; 203 204 205 206 /** Private constructor. */ 207 private SimilarityBasedPasswordValidatorCfgClientImpl( 208 ManagedObject<? extends SimilarityBasedPasswordValidatorCfgClient> impl) { 209 this.impl = impl; 210 } 211 212 213 214 /** {@inheritDoc} */ 215 public Boolean isEnabled() { 216 return impl.getPropertyValue(INSTANCE.getEnabledPropertyDefinition()); 217 } 218 219 220 221 /** {@inheritDoc} */ 222 public void setEnabled(boolean value) { 223 impl.setPropertyValue(INSTANCE.getEnabledPropertyDefinition(), value); 224 } 225 226 227 228 /** {@inheritDoc} */ 229 public String getJavaClass() { 230 return impl.getPropertyValue(INSTANCE.getJavaClassPropertyDefinition()); 231 } 232 233 234 235 /** {@inheritDoc} */ 236 public void setJavaClass(String value) { 237 impl.setPropertyValue(INSTANCE.getJavaClassPropertyDefinition(), value); 238 } 239 240 241 242 /** {@inheritDoc} */ 243 public Integer getMinPasswordDifference() { 244 return impl.getPropertyValue(INSTANCE.getMinPasswordDifferencePropertyDefinition()); 245 } 246 247 248 249 /** {@inheritDoc} */ 250 public void setMinPasswordDifference(int value) { 251 impl.setPropertyValue(INSTANCE.getMinPasswordDifferencePropertyDefinition(), value); 252 } 253 254 255 256 /** {@inheritDoc} */ 257 public ManagedObjectDefinition<? extends SimilarityBasedPasswordValidatorCfgClient, ? extends SimilarityBasedPasswordValidatorCfg> definition() { 258 return INSTANCE; 259 } 260 261 262 263 /** {@inheritDoc} */ 264 public PropertyProvider properties() { 265 return impl; 266 } 267 268 269 270 /** {@inheritDoc} */ 271 public void commit() throws ManagedObjectAlreadyExistsException, 272 MissingMandatoryPropertiesException, ConcurrentModificationException, 273 OperationRejectedException, LdapException { 274 impl.commit(); 275 } 276 277 278 279 /** {@inheritDoc} */ 280 public String toString() { 281 return impl.toString(); 282 } 283 } 284 285 286 287 /** 288 * Managed object server implementation. 289 */ 290 private static class SimilarityBasedPasswordValidatorCfgServerImpl implements 291 SimilarityBasedPasswordValidatorCfg { 292 293 /** Private implementation. */ 294 private ServerManagedObject<? extends SimilarityBasedPasswordValidatorCfg> impl; 295 296 /** The value of the "enabled" property. */ 297 private final boolean pEnabled; 298 299 /** The value of the "java-class" property. */ 300 private final String pJavaClass; 301 302 /** The value of the "min-password-difference" property. */ 303 private final int pMinPasswordDifference; 304 305 306 307 /** Private constructor. */ 308 private SimilarityBasedPasswordValidatorCfgServerImpl(ServerManagedObject<? extends SimilarityBasedPasswordValidatorCfg> impl) { 309 this.impl = impl; 310 this.pEnabled = impl.getPropertyValue(INSTANCE.getEnabledPropertyDefinition()); 311 this.pJavaClass = impl.getPropertyValue(INSTANCE.getJavaClassPropertyDefinition()); 312 this.pMinPasswordDifference = impl.getPropertyValue(INSTANCE.getMinPasswordDifferencePropertyDefinition()); 313 } 314 315 316 317 /** {@inheritDoc} */ 318 public void addSimilarityBasedChangeListener( 319 ConfigurationChangeListener<SimilarityBasedPasswordValidatorCfg> listener) { 320 impl.registerChangeListener(listener); 321 } 322 323 324 325 /** {@inheritDoc} */ 326 public void removeSimilarityBasedChangeListener( 327 ConfigurationChangeListener<SimilarityBasedPasswordValidatorCfg> listener) { 328 impl.deregisterChangeListener(listener); 329 } 330 /** {@inheritDoc} */ 331 public void addChangeListener( 332 ConfigurationChangeListener<PasswordValidatorCfg> listener) { 333 impl.registerChangeListener(listener); 334 } 335 336 337 338 /** {@inheritDoc} */ 339 public void removeChangeListener( 340 ConfigurationChangeListener<PasswordValidatorCfg> listener) { 341 impl.deregisterChangeListener(listener); 342 } 343 344 345 346 /** {@inheritDoc} */ 347 public boolean isEnabled() { 348 return pEnabled; 349 } 350 351 352 353 /** {@inheritDoc} */ 354 public String getJavaClass() { 355 return pJavaClass; 356 } 357 358 359 360 /** {@inheritDoc} */ 361 public int getMinPasswordDifference() { 362 return pMinPasswordDifference; 363 } 364 365 366 367 /** {@inheritDoc} */ 368 public Class<? extends SimilarityBasedPasswordValidatorCfg> configurationClass() { 369 return SimilarityBasedPasswordValidatorCfg.class; 370 } 371 372 373 374 /** {@inheritDoc} */ 375 public DN dn() { 376 return impl.getDN(); 377 } 378 379 380 381 /** {@inheritDoc} */ 382 public String toString() { 383 return impl.toString(); 384 } 385 } 386}