mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

ludovicp
31.16.2010 85811b64468e9b7a876bd352a0299b904a53a3fb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
/*
 * 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.
 */
package org.opends.server.core;
import org.opends.messages.Message;
 
import java.util.ArrayList;
import java.util.List;
 
import org.opends.server.admin.server.ConfigurationChangeListener;
import org.opends.server.admin.std.server.PasswordPolicyCfg;
import org.opends.server.config.ConfigException;
import org.opends.server.types.ConfigChangeResult;
import org.opends.server.types.InitializationException;
import org.opends.server.types.ResultCode;
 
import static org.opends.server.loggers.debug.DebugLogger.*;
import org.opends.server.loggers.debug.DebugTracer;
import org.opends.server.types.DebugLogLevel;
import static org.opends.messages.CoreMessages.*;
 
 
/**
 This class is the interface between the password policy configurable component
 and a password policy state object. When a password policy entry is added to
 the configuration, an instance of this class is created and registered to
 manage subsequent modification to that configuration entry, including
 valiadating any proposed modification and applying an accepted modification.
 */
public class PasswordPolicyConfig
        implements ConfigurationChangeListener<PasswordPolicyCfg>
{
  /**
   * The tracer object for the debug logger.
   */
  private static final DebugTracer TRACER = getTracer();
 
 
  /**
   * The password policy object corresponding to the configuration entry. The
   * policy referenced by this field is assumed to be valid, hence any
   * changes resulting from a modification of the configuration entry must be
   * applied to a newly allocated instance and validated before updating this
   * reference to point to the new policy instance.
   */
  private PasswordPolicy currentPolicy;
 
 
  /**
   * Creates a new password policy configurable component to manage the provided
   * password policy object.
   *
   * @param policy The password policy object this object will manage.
   */
  public PasswordPolicyConfig(PasswordPolicy policy)
  {
    this.currentPolicy = policy;
  }
 
 
  /**
   * {@inheritDoc}
   */
  public boolean isConfigurationChangeAcceptable(
      PasswordPolicyCfg configuration, List<Message> unacceptableReasons)
  {
    assert configuration.dn().equals(this.currentPolicy.getConfigEntryDN() )
            : "Internal Error: mismatch between DN of configuration entry and"
              + "DN of current password policy." ;
 
    try
    {
      new PasswordPolicy(configuration);
    }
    catch (ConfigException ce)
    {
      if (debugEnabled())
      {
        TRACER.debugCaught(DebugLogLevel.ERROR, ce);
      }
 
      unacceptableReasons.add(ce.getMessageObject());
      return false;
    }
    catch (InitializationException ie)
    {
      if (debugEnabled())
      {
        TRACER.debugCaught(DebugLogLevel.ERROR, ie);
      }
 
      unacceptableReasons.add(ie.getMessageObject());
      return false;
    }
 
    // If we made it here, then the configuration is acceptable.
    return true;
  }
 
 
 
  /**
   * {@inheritDoc}
   */
  public ConfigChangeResult applyConfigurationChange(
      PasswordPolicyCfg configuration)
  {
    assert configuration.dn().equals(this.currentPolicy.getConfigEntryDN() )
            : "Internal Error: mismatch between DN of configuration entry and"
              + "DN of current password policy." ;
 
    PasswordPolicy p;
 
    try
    {
      p = new PasswordPolicy(configuration);
    }
    catch (ConfigException ce)
    {
      if (debugEnabled())
      {
        TRACER.debugCaught(DebugLogLevel.ERROR, ce);
      }
      ArrayList<Message> messages = new ArrayList<Message>();
      messages.add(ce.getMessageObject());
      return new ConfigChangeResult(
              DirectoryServer.getServerErrorResultCode(),
              /*adminActionRequired*/ true, messages);
    }
    catch (InitializationException ie)
    {
      if (debugEnabled())
      {
        TRACER.debugCaught(DebugLogLevel.ERROR, ie);
      }
      ArrayList<Message> messages = new ArrayList<Message>();
      messages.add(ie.getMessageObject());
      return new ConfigChangeResult(
              DirectoryServer.getServerErrorResultCode(),
              /*adminActionRequired*/ true, messages);
    }
 
    // If we've made it here, then everything is acceptable.  Apply the new
    // configuration.
    ArrayList<Message> messages = new ArrayList<Message>();
    messages.add(INFO_PWPOLICY_UPDATED_POLICY.get(
            String.valueOf(p.getConfigEntryDN())));
    this.currentPolicy = p;
 
    return new ConfigChangeResult(ResultCode.SUCCESS,
                                  /*adminActionRequired*/ false, messages);
  }
 
  /**
   * Retrieves the PasswordPolicy object representing the configuration entry
   * managed by this object.
   *
   * @return The PasswordPolicy object.
   */
  public PasswordPolicy getPolicy()
  {
    return currentPolicy;
  }
}