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

Matthew Swift
26.20.2011 238b72df72b6644e45cc4c1a05ef7afc74210574
Minor refactoring work for OPENDJ-262: Implement pass through authentication (PTA)

Delay parsing the password change time when constructing password policy state until it is actually needed. This will avoid unnecessary parsing for entries that do not represent user accounts.
1 files modified
108 ■■■■■ changed files
opends/src/server/org/opends/server/core/PasswordPolicyState.java 108 ●●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/core/PasswordPolicyState.java
@@ -166,51 +166,13 @@
   * @param currentTime
   *          The time to use as the current time for all time-related
   *          determinations.
   * @throws DirectoryException
   *           If a problem occurs while attempting to determine the password
   *           policy for the user or perform any other state initialization.
   */
  PasswordPolicyState(PasswordPolicy policy, Entry userEntry, long currentTime)
      throws DirectoryException
  {
    this.userEntry   = userEntry;
    this.currentTime = currentTime;
    this.userDNString     = userEntry.getDN().toString();
    this.passwordPolicy   = policy;
    // Get the password changed time for the user.
    AttributeType type
         = DirectoryServer.getAttributeType(OP_ATTR_PWPOLICY_CHANGED_TIME_LC);
    if (type == null)
    {
      type = DirectoryServer.getDefaultAttributeType(
           OP_ATTR_PWPOLICY_CHANGED_TIME);
    }
    passwordChangedTime = getGeneralizedTime(type);
    if (passwordChangedTime <= 0)
    {
      // Get the time that the user's account was created.
      AttributeType createTimeType
           = DirectoryServer.getAttributeType(OP_ATTR_CREATE_TIMESTAMP_LC);
      if (createTimeType == null)
      {
        createTimeType
            = DirectoryServer.getDefaultAttributeType(OP_ATTR_CREATE_TIMESTAMP);
      }
      passwordChangedTime = getGeneralizedTime(createTimeType);
      if (passwordChangedTime <= 0)
      {
        passwordChangedTime = 0;
        if (debugEnabled())
        {
          TRACER.debugWarning("Could not determine password changed time for " +
              "user %s.", userDNString);
        }
      }
    }
  }
@@ -491,6 +453,62 @@
   */
  public long getPasswordChangedTime()
  {
    if (passwordChangedTime < 0)
    {
      // Get the password changed time for the user.
      AttributeType type = DirectoryServer.getAttributeType(
          OP_ATTR_PWPOLICY_CHANGED_TIME_LC, true);
      try
      {
        passwordChangedTime = getGeneralizedTime(type);
      }
      catch (DirectoryException e)
      {
        /*
         * The password change time could not be parsed (but has been logged in
         * the debug log). The best effort we can do from here is to a) use the
         * current time, b) use the start of the epoch (1/1/1970), or c) use the
         * create time stamp. Lets treat this problem as if the change time
         * attribute did not exist and resort to the create time stamp.
         */
      }
      if (passwordChangedTime < 0)
      {
        // Get the time that the user's account was created.
        AttributeType createTimeType = DirectoryServer.getAttributeType(
            OP_ATTR_CREATE_TIMESTAMP_LC, true);
        try
        {
          passwordChangedTime = getGeneralizedTime(createTimeType);
        }
        catch (DirectoryException e)
        {
          /*
           * The create time stamp could not be parsed (but has been logged in
           * the debug log). The best effort we can do from here is to a) use
           * the current time, or b) use the start of the epoch (1/1/1970). Lets
           * treat this problem as if the change time attribute did not exist
           * and use the start of the epoch. Doing so stands a greater chance of
           * forcing a password change.
           */
        }
        if (passwordChangedTime < 0)
        {
          passwordChangedTime = 0;
          if (debugEnabled())
          {
            TRACER.debugWarning(
                "Could not determine password changed time for " + "user %s.",
                userDNString);
          }
        }
      }
    }
    return passwordChangedTime;
  }
@@ -568,7 +586,7 @@
    // passwordChangedTime is computed in the constructor from values in the
    // entry.
    if (this.passwordChangedTime != passwordChangedTime)
    if (getPasswordChangedTime() != passwordChangedTime)
    {
      this.passwordChangedTime = passwordChangedTime;
@@ -609,7 +627,7 @@
    try
    {
      passwordChangedTime = getGeneralizedTime(createTimeType);
      if (passwordChangedTime <= 0)
      if (passwordChangedTime < 0)
      {
        passwordChangedTime = 0;
      }
@@ -1697,7 +1715,7 @@
    if(lockTime < 0) lockTime = 0;
    long lastLoginTime = getLastLoginTime();
    if (lastLoginTime > lockTime || passwordChangedTime > lockTime)
    if (lastLoginTime > lockTime || getPasswordChangedTime() > lockTime)
    {
      isIdleLocked = ConditionResult.FALSE;
      if (debugEnabled())
@@ -1913,7 +1931,7 @@
      return false;
    }
    long maxResetTime = passwordChangedTime +
    long maxResetTime = getPasswordChangedTime() +
        (1000L * passwordPolicy.getMaxPasswordResetAge());
    boolean locked = (maxResetTime < currentTime);
@@ -1951,7 +1969,7 @@
      long maxAge = passwordPolicy.getMaxPasswordAge();
      if (maxAge > 0L)
      {
        long expTime = passwordChangedTime + (1000L*maxAge);
        long expTime = getPasswordChangedTime() + (1000L*maxAge);
        if (expTime < passwordExpirationTime)
        {
          passwordExpirationTime = expTime;
@@ -1962,7 +1980,7 @@
      long maxResetAge = passwordPolicy.getMaxPasswordResetAge();
      if (mustChangePassword() && (maxResetAge > 0L))
      {
        long expTime = passwordChangedTime + (1000L*maxResetAge);
        long expTime = getPasswordChangedTime() + (1000L*maxResetAge);
        if (expTime < passwordExpirationTime)
        {
          passwordExpirationTime = expTime;
@@ -2164,7 +2182,7 @@
      return false;
    }
    else if ((passwordChangedTime + (minAge*1000L)) < currentTime)
    else if ((getPasswordChangedTime() + (minAge*1000L)) < currentTime)
    {
      // It's been long enough since the user changed their password.
      if (debugEnabled())