Package org.jboss.web.tomcat.service.sso

Source Code of org.jboss.web.tomcat.service.sso.JBossSingleSignOnEntry

/*
* Copyright 1999-2001,2004 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*      http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jboss.web.tomcat.service.sso;

import java.security.Principal;

import javax.servlet.http.HttpServletRequest;

import org.apache.catalina.Session;
import org.apache.catalina.authenticator.Constants;
import org.apache.catalina.authenticator.SingleSignOn;
import org.apache.catalina.authenticator.SingleSignOnEntry;

/**
* A class that represents entries in the cache of authenticated users.
*
* @author Brian E. Stansberry, based on work by Craig R. McClanahan
* @version $Revision: 97697 $ $Date: 2009-12-10 10:49:13 -0500 (Thu, 10 Dec 2009) $
* @see SingleSignOn
*/
class JBossSingleSignOnEntry extends SingleSignOnEntry
{

    public JBossSingleSignOnEntry(Principal principal, String authType,
            String username, String password)
    {
      super(principal, authType, username, password);
    }
 
   // ------------------------------------------------------- Package Methods

   /**
    * Adds a <code>Session</code> to the list of those associated with
    * this SSO.
    *
    * @param sso     The <code>SingleSignOn</code> valve that is managing
    *                the SSO session.
    * @param session The <code>Session</code> being associated with the SSO.
    * @return <code>true</code> if the given Session was a new addition (i.e.
    *         was not previously associated with this entry);
    *         <code>false</code> otherwise.
    */
   synchronized boolean addSession2(SingleSignOn sso, Session session)
   {
      for (int i = 0; i < sessions.length; i++)
      {
         if (session == sessions[i])
            return false;
      }
      Session results[] = new Session[sessions.length + 1];
      System.arraycopy(sessions, 0, results, 0, sessions.length);
      results[sessions.length] = session;
      sessions = results;
      session.addSessionListener(sso);
      return true;
   }

   /**
    * Removes the given <code>Session</code> from the list of those
    * associated with this SSO.
    *
    * @param session the <code>Session</code> to remove.
    * @return <code>true</code> if the given Session needed to be removed
    *         (i.e. was in fact previously associated with this entry);
    *         <code>false</code> otherwise.
    */
   synchronized boolean removeSession2(Session session)
   {
      if (sessions.length == 0)
         return false;

      boolean removed = false;
      Session[] nsessions = new Session[sessions.length - 1];
      for (int i = 0, j = 0; i < sessions.length; i++)
      {
         if (session == sessions[i])
         {
            removed = true;
            continue;
         }
         else if (!removed && i == nsessions.length)
         {
            // We have tested all our sessions, and have not had to
            // remove any; break loop now so we don't cause an
            // ArrayIndexOutOfBounds on nsessions
            break;
         }
         nsessions[j++] = sessions[i];
      }
     
      // Only if we removed a session, do we replace our session list
      if (removed)
         sessions = nsessions;
      return removed;
   }

   /**
    * Returns the <code>Session</code>s associated with this SSO.
    */
   public synchronized Session[] findSessions()
   {
      return (this.sessions);
   }

   /**
    * Gets the name of the authentication type originally used to authenticate
    * the user associated with the SSO.
    *
    * @return "BASIC", "CLIENT-CERT", "DIGEST", "FORM" or "NONE"
    */
   public String getAuthType()
   {
      return (this.authType);
   }

   /**
    * Gets whether the authentication type associated with the original
    * authentication supports reauthentication.
    *
    * @return <code>true</code> if <code>getAuthType</code> returns
    *         "BASIC" or "FORM", <code>false</code> otherwise.
    */
   public boolean getCanReauthenticate()
   {
      return (this.canReauthenticate);
   }

   /**
    * Gets the password credential (if any) associated with the SSO.
    *
    * @return the password credential associated with the SSO, or
    *         <code>null</code> if the original authentication type
    *         does not involve a password.
    */
   public String getPassword()
   {
      return (this.password);
   }

   /**
    * Gets the <code>Principal</code> that has been authenticated by
    * the SSO.
    * <p/>
    * <b>NOTE: </b> May return <code>null</code> if this object was
    * retrieved via a lookup from another node in a cluster. Interface
    * <code>Principal</code> does not extend <code>Serializable</code>,
    * so a <code>SingleSignOnEntry</code>'s principal member cannot be
    * serialized as part of SSO management in a cluster.  A
    * <code>Principal</code> cannot be bound to a
    * <code>SingleSignOnEntry</code> until the SSO has been authenticated
    * by the local node.
    *
    * @return The <code>Principal</code> that has been authenticated by
    *         the local SSO, or <code>null</code> if no authentication
    *         has been performed yet in this cluster node.
    */
   public Principal getPrincipal()
   {
      return (this.principal);
   }

   /**
    * Sets the <code>Principal</code> that has been authenticated by
    * the SSO.
    */
   void setPrincipal(Principal principal)
   {
      this.principal = principal;
   }

   /**
    * Returns the number of sessions associated with this SSO, either
    * locally or remotely.
    */
   int getSessionCount()
   {
      return (sessions.length);
   }

   /**
    * Gets the username provided by the user as part of the authentication
    * process.
    */
   public String getUsername()
   {
      return (this.username);
   }


   public void updateCredentials(Principal principal, String authType,
          String username, String password)
   {
     updateCredentials2(principal, authType, username, password);
   }
  
  
   /**
    * Updates the SingleSignOnEntry to reflect the latest security
    * information associated with the caller.
    *
    * @param principal the <code>Principal</code> returned by the latest
    *                  call to <code>Realm.authenticate</code>.
    * @param authType  the type of authenticator used (BASIC, CLIENT-CERT,
    *                  DIGEST or FORM)
    * @param username  the username (if any) used for the authentication
    * @param password  the password (if any) used for the authentication
    */
   public synchronized boolean updateCredentials2(Principal principal, String authType,
      String username, String password)
   {

      boolean changed =
         (safeEquals(this.principal, principal)
         || safeEquals(this.authType, authType)
         || safeEquals(this.username, username)
         || safeEquals(this.password, password));

      this.principal = principal;
      this.authType = authType;
      this.username = username;
      this.password = password;
      this.canReauthenticate =
         (HttpServletRequest.BASIC_AUTH.equals(authType)
         || HttpServletRequest.FORM_AUTH.equals(authType));
      return changed;
   }

   // -------------------------------------------------------  Private Methods

   private boolean safeEquals(Object a, Object b)
   {
      return ((a == b)
         || (a != null && a.equals(b))
         || (b != null && b.equals(a)));
   }
}
TOP

Related Classes of org.jboss.web.tomcat.service.sso.JBossSingleSignOnEntry

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.