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}