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.controls;
028    import org.opends.messages.Message;
029    
030    
031    
032    import org.opends.server.protocols.asn1.ASN1OctetString;
033    import org.opends.server.protocols.ldap.LDAPResultCode;
034    import org.opends.server.types.Control;
035    import org.opends.server.types.DebugLogLevel;
036    import org.opends.server.types.LDAPException;
037    
038    import static org.opends.server.loggers.debug.DebugLogger.*;
039    import org.opends.server.loggers.debug.DebugTracer;
040    import static org.opends.messages.ProtocolMessages.*;
041    import static org.opends.server.util.ServerConstants.*;
042    import static org.opends.server.util.StaticUtils.*;
043    
044    
045    
046    /**
047     * This class implements the Netscape password expiring control, which serves as
048     * a warning to clients that the user's password is about to expire. The only
049     * element contained in the control value is a string representation of the
050     * number of seconds until expiration.
051     */
052    public class PasswordExpiringControl
053           extends Control
054    {
055      /**
056       * The tracer object for the debug logger.
057       */
058      private static final DebugTracer TRACER = getTracer();
059    
060    
061    
062    
063      // The length of time in seconds until the password actually expires.
064      private int secondsUntilExpiration;
065    
066    
067    
068      /**
069       * Creates a new instance of the password expiring control with the provided
070       * information.
071       *
072       * @param  secondsUntilExpiration  The length of time in seconds until the
073       *                                 password actually expires.
074       */
075      public PasswordExpiringControl(int secondsUntilExpiration)
076      {
077        super(OID_NS_PASSWORD_EXPIRING, false,
078              new ASN1OctetString(String.valueOf(secondsUntilExpiration)));
079    
080    
081        this.secondsUntilExpiration = secondsUntilExpiration;
082      }
083    
084    
085    
086      /**
087       * Creates a new instance of the password expiring control with the provided
088       * information.
089       *
090       * @param  oid                     The OID to use for this control.
091       * @param  isCritical              Indicates whether support for this control
092       *                                 should be considered a critical part of the
093       *                                 client processing.
094       * @param  secondsUntilExpiration  The length of time in seconds until the
095       *                                 password actually expires.
096       */
097      public PasswordExpiringControl(String oid, boolean isCritical,
098                                     int secondsUntilExpiration)
099      {
100        super(oid, isCritical,
101              new ASN1OctetString(String.valueOf(secondsUntilExpiration)));
102    
103    
104        this.secondsUntilExpiration = secondsUntilExpiration;
105      }
106    
107    
108    
109      /**
110       * Creates a new instance of the password expiring control with the provided
111       * information.
112       *
113       * @param  oid                     The OID to use for this control.
114       * @param  isCritical              Indicates whether support for this control
115       *                                 should be considered a critical part of the
116       *                                 client processing.
117       * @param  secondsUntilExpiration  The length of time in seconds until the
118       *                                 password actually expires.
119       * @param  encodedValue            The pre-encoded value for this control.
120       */
121      private PasswordExpiringControl(String oid, boolean isCritical,
122                                      int secondsUntilExpiration,
123                                      ASN1OctetString encodedValue)
124      {
125        super(oid, isCritical, encodedValue);
126    
127    
128        this.secondsUntilExpiration = secondsUntilExpiration;
129      }
130    
131    
132    
133      /**
134       * Creates a new password expiring control from the contents of the provided
135       * control.
136       *
137       * @param  control  The generic control containing the information to use to
138       *                  create this password expiring control.
139       *
140       * @return  The password expiring control decoded from the provided control.
141       *
142       * @throws  LDAPException  If this control cannot be decoded as a valid
143       *                         password expiring control.
144       */
145      public static PasswordExpiringControl decodeControl(Control control)
146             throws LDAPException
147      {
148        if (! control.hasValue())
149        {
150          Message message = ERR_PWEXPIRING_NO_CONTROL_VALUE.get();
151          throw new LDAPException(LDAPResultCode.PROTOCOL_ERROR, message);
152        }
153    
154    
155        int secondsUntilExpiration;
156        try
157        {
158          secondsUntilExpiration =
159               Integer.parseInt(control.getValue().stringValue());
160        }
161        catch (Exception e)
162        {
163          if (debugEnabled())
164          {
165            TRACER.debugCaught(DebugLogLevel.ERROR, e);
166          }
167    
168          Message message = ERR_PWEXPIRING_CANNOT_DECODE_SECONDS_UNTIL_EXPIRATION.
169              get(getExceptionMessage(e));
170          throw new LDAPException(LDAPResultCode.PROTOCOL_ERROR, message);
171        }
172    
173    
174        return new PasswordExpiringControl(control.getOID(), control.isCritical(),
175                                           secondsUntilExpiration,
176                                           control.getValue());
177      }
178    
179    
180    
181      /**
182       * Retrieves the length of time in seconds until the password actually
183       * expires.
184       *
185       * @return  The length of time in seconds until the password actually expires.
186       */
187      public int getSecondsUntilExpiration()
188      {
189        return secondsUntilExpiration;
190      }
191    
192    
193    
194      /**
195       * Retrieves a string representation of this password expiring control.
196       *
197       * @return  A string representation of this password expiring control.
198       */
199      public String toString()
200      {
201        StringBuilder buffer = new StringBuilder();
202        toString(buffer);
203        return buffer.toString();
204      }
205    
206    
207    
208      /**
209       * Appends a string representation of this password expiring control to the
210       * provided buffer.
211       *
212       * @param  buffer  The buffer to which the information should be appended.
213       */
214      public void toString(StringBuilder buffer)
215      {
216        buffer.append("PasswordExpiringControl(secondsUntilExpiration=");
217        buffer.append(secondsUntilExpiration);
218        buffer.append(")");
219      }
220    }
221