You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by rj...@apache.org on 2009/09/09 11:10:11 UTC

svn commit: r812847 - in /tomcat/sandbox/tomcat-oacc/trunk: docs/ src/share/org/apache/catalina/cluster/session/

Author: rjung
Date: Wed Sep  9 09:10:11 2009
New Revision: 812847

URL: http://svn.apache.org/viewvc?rev=812847&view=rev
Log:
Backport r610930 from tc6.0.x:

Include user principal if possible when serializing de-serializing sessions.
Fix bug 43840.

Modified:
    tomcat/sandbox/tomcat-oacc/trunk/docs/changelog.xml
    tomcat/sandbox/tomcat-oacc/trunk/src/share/org/apache/catalina/cluster/session/LocalStrings.properties
    tomcat/sandbox/tomcat-oacc/trunk/src/share/org/apache/catalina/cluster/session/LocalStrings_es.properties
    tomcat/sandbox/tomcat-oacc/trunk/src/share/org/apache/catalina/cluster/session/SerializablePrincipal.java

Modified: tomcat/sandbox/tomcat-oacc/trunk/docs/changelog.xml
URL: http://svn.apache.org/viewvc/tomcat/sandbox/tomcat-oacc/trunk/docs/changelog.xml?rev=812847&r1=812846&r2=812847&view=diff
==============================================================================
--- tomcat/sandbox/tomcat-oacc/trunk/docs/changelog.xml (original)
+++ tomcat/sandbox/tomcat-oacc/trunk/docs/changelog.xml Wed Sep  9 09:10:11 2009
@@ -33,6 +33,11 @@
   <subsection name="Cluster">
       <changelog>
       <fix>
+        <bug>43840</bug>: Include user principal if possible when serializing /
+        de-serializing sessions.
+        Port from Tomcat 6.0. (rjung)
+      </fix>
+      <fix>
         <bug>40551</bug>: Enable the JvmRouteBinderValve to work with
         PersistentManagers as well as clustering. Patch by Chris Chandler.
         Port from Tomcat 5.5. (rjung)

Modified: tomcat/sandbox/tomcat-oacc/trunk/src/share/org/apache/catalina/cluster/session/LocalStrings.properties
URL: http://svn.apache.org/viewvc/tomcat/sandbox/tomcat-oacc/trunk/src/share/org/apache/catalina/cluster/session/LocalStrings.properties?rev=812847&r1=812846&r2=812847&view=diff
==============================================================================
--- tomcat/sandbox/tomcat-oacc/trunk/src/share/org/apache/catalina/cluster/session/LocalStrings.properties (original)
+++ tomcat/sandbox/tomcat-oacc/trunk/src/share/org/apache/catalina/cluster/session/LocalStrings.properties Wed Sep  9 09:10:11 2009
@@ -91,3 +91,4 @@
 standardSession.removeAttribute.ise=removeAttribute: Session already invalidated
 standardSession.sessionEvent=Session event listener threw exception
 standardSession.setAttribute.namenull=setAttribute: name parameter cannot be null
+serializablePrincipal.readPrincipal.cnfe=readPrincipal: Failed to recreate user Principal

Modified: tomcat/sandbox/tomcat-oacc/trunk/src/share/org/apache/catalina/cluster/session/LocalStrings_es.properties
URL: http://svn.apache.org/viewvc/tomcat/sandbox/tomcat-oacc/trunk/src/share/org/apache/catalina/cluster/session/LocalStrings_es.properties?rev=812847&r1=812846&r2=812847&view=diff
==============================================================================
--- tomcat/sandbox/tomcat-oacc/trunk/src/share/org/apache/catalina/cluster/session/LocalStrings_es.properties (original)
+++ tomcat/sandbox/tomcat-oacc/trunk/src/share/org/apache/catalina/cluster/session/LocalStrings_es.properties Wed Sep  9 09:10:11 2009
@@ -90,3 +90,4 @@
 standardSession.removeAttribute.ise = removeAttribute\: Sesi\u00F3n ya invalidada
 standardSession.sessionEvent = El oyente de evento de sesi\u00F3n lanz\u00F3 excepci\u00F3n
 standardSession.setAttribute.namenull = setAttribute\: par\u00E1metro de nombre no puede ser nulo
+serializablePrincipal.readPrincipal.cnfe = readPrincipal\: No pude volver a crea el usuario Principal

Modified: tomcat/sandbox/tomcat-oacc/trunk/src/share/org/apache/catalina/cluster/session/SerializablePrincipal.java
URL: http://svn.apache.org/viewvc/tomcat/sandbox/tomcat-oacc/trunk/src/share/org/apache/catalina/cluster/session/SerializablePrincipal.java?rev=812847&r1=812846&r2=812847&view=diff
==============================================================================
--- tomcat/sandbox/tomcat-oacc/trunk/src/share/org/apache/catalina/cluster/session/SerializablePrincipal.java (original)
+++ tomcat/sandbox/tomcat-oacc/trunk/src/share/org/apache/catalina/cluster/session/SerializablePrincipal.java Wed Sep  9 09:10:11 2009
@@ -23,11 +23,13 @@
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
 import java.io.Serializable;
+import java.security.Principal;
 import java.util.Arrays;
 import java.util.List;
 
 import org.apache.catalina.Realm;
 import org.apache.catalina.realm.GenericPrincipal;
+import org.apache.catalina.util.StringManager;
 
 
 /**
@@ -40,6 +42,14 @@
  */
 public class SerializablePrincipal  implements Serializable {
 
+    protected static org.apache.juli.logging.Log log =
+        org.apache.juli.logging.LogFactory.getLog(SerializablePrincipal.class);
+    
+    /**
+     * The string manager for this package.
+     */
+    protected static StringManager sm =
+        StringManager.getManager(Constants.Package);
 
     // ----------------------------------------------------------- Constructors
 
@@ -75,6 +85,23 @@
      */
     public SerializablePrincipal(Realm realm, String name, String password,
                             List<String> roles) {
+        this(realm, name, password, roles, null);
+    }
+
+    
+    /**
+     * Construct a new Principal, associated with the specified Realm, for the
+     * specified username and password, with the specified role names
+     * (as Strings).
+     *
+     * @param realm The Realm that owns this principal
+     * @param name The username of the user represented by this Principal
+     * @param password Credentials used to authenticate this user
+     * @param roles List of roles (must be Strings) possessed by this user
+     * @param userPrincipal The user principal to be exposed to applications
+     */
+    public SerializablePrincipal(Realm realm, String name, String password,
+                            List<String> roles, Principal userPrincipal) {
 
         super();
         this.realm = realm;
@@ -86,7 +113,9 @@
             if (this.roles.length > 0)
                 Arrays.sort(this.roles);
         }
-
+        if (userPrincipal instanceof Serializable) {
+            this.userPrincipal = userPrincipal;
+        }
     }
 
 
@@ -140,6 +169,11 @@
     }
 
 
+    /**
+     * The user principal, if present.
+     */
+    protected Principal userPrincipal = null;
+    
     // --------------------------------------------------------- Public Methods
 
 
@@ -164,13 +198,15 @@
         return new SerializablePrincipal(principal.getRealm(),
                                          principal.getName(),
                                          principal.getPassword(),
-                                         principal.getRoles()!=null?Arrays.asList(principal.getRoles()):null);
+                                         principal.getRoles()!=null?Arrays.asList(principal.getRoles()):null,
+                                         principal.getUserPrincipal()!=principal?principal.getUserPrincipal():null);
     }
 
     public GenericPrincipal getPrincipal( Realm realm )
     {
         return new GenericPrincipal(realm, name, password,
-                getRoles()!=null?Arrays.asList(getRoles()):null);
+                getRoles()!=null?Arrays.asList(getRoles()):null,
+                userPrincipal);
     }
     
     public static GenericPrincipal readPrincipal(ObjectInput in, Realm realm)
@@ -182,7 +218,19 @@
         int size = in.readInt();
         String[] roles = new String[size];
         for ( int i=0; i<size; i++ ) roles[i] = in.readUTF();
-        return new GenericPrincipal(realm,name,pwd,Arrays.asList(roles));
+        Principal userPrincipal = null;
+        boolean hasUserPrincipal = in.readBoolean();
+        if (hasUserPrincipal) {
+            try {
+                userPrincipal = (Principal) in.readObject();
+            } catch (ClassNotFoundException e) {
+                log.error(sm.getString(
+                        "serializablePrincipal.readPrincipal.cnfe"), e);
+                throw e;
+            }
+        }
+        return new GenericPrincipal(realm,name,pwd,Arrays.asList(roles),
+                userPrincipal);
     }
     
     public static void writePrincipal(GenericPrincipal p, ObjectOutput out)
@@ -194,6 +242,10 @@
         if ( roles == null ) roles = new String[0];
         out.writeInt(roles.length);
         for ( int i=0; i<roles.length; i++ ) out.writeUTF(roles[i]);
+        boolean hasUserPrincipal = (p != p.getUserPrincipal() &&
+                p.getUserPrincipal() instanceof Serializable);
+        out.writeBoolean(hasUserPrincipal);
+        if (hasUserPrincipal) out.writeObject(p.getUserPrincipal());
     }
 
 



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org