costin 01/02/27 11:10:19 Modified: src/share/org/apache/tomcat/core Request.java src/share/org/apache/tomcat/modules/aaa JDBCRealm.java SimpleRealm.java Added: src/share/org/apache/tomcat/util/aaa SimplePrincipal.java Removed: src/share/org/apache/tomcat/util SimplePrincipal.java Log: Another code move for simpler dependencies. This time with a more significant change - the aaa modules must set the Principal ( instead of relying on core to create one ). The Principal is carying more information than the String user, and in general we should use Principal whenever possible. ( for example by checking the class name of the principal you can find who did the authentication ) Revision Changes Path 1.95 +0 -4 jakarta-tomcat/src/share/org/apache/tomcat/core/Request.java Index: Request.java =================================================================== RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/Request.java,v retrieving revision 1.94 retrieving revision 1.95 diff -u -r1.94 -r1.95 --- Request.java 2001/02/27 16:54:02 1.94 +++ Request.java 2001/02/27 19:10:14 1.95 @@ -65,7 +65,6 @@ import org.apache.tomcat.util.http.ContentType; import org.apache.tomcat.util.http.Cookies; -import org.apache.tomcat.util.SimplePrincipal; import org.apache.tomcat.util.buf.MessageBytes; @@ -443,9 +442,6 @@ */ public Principal getUserPrincipal() { if( getRemoteUser() == null ) return null; - if( principal == null ) { - principal=new SimplePrincipal( getRemoteUser() ); - } return principal; } 1.5 +15 -7 jakarta-tomcat/src/share/org/apache/tomcat/modules/aaa/JDBCRealm.java Index: JDBCRealm.java =================================================================== RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/modules/aaa/JDBCRealm.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- JDBCRealm.java 2001/02/20 03:16:51 1.4 +++ JDBCRealm.java 2001/02/27 19:10:16 1.5 @@ -1,7 +1,7 @@ /* - * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/modules/aaa/JDBCRealm.java,v 1.4 2001/02/20 03:16:51 costin Exp $ - * $Revision: 1.4 $ - * $Date: 2001/02/20 03:16:51 $ + * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/modules/aaa/JDBCRealm.java,v 1.5 2001/02/27 19:10:16 costin Exp $ + * $Revision: 1.5 $ + * $Date: 2001/02/27 19:10:16 $ * * The Apache Software License, Version 1.1 * @@ -64,11 +64,9 @@ import org.apache.tomcat.core.*; import org.apache.tomcat.util.res.StringManager; import org.apache.tomcat.util.buf.HexUtils; +import org.apache.tomcat.util.aaa.*; import java.security.*; -//import java.security.Principal; -//import java.io.File; -//import java.util.Enumeration; -//import java.util.Hashtable; +import java.security.Principal; import java.util.Vector; import java.io.*; import java.net.*; @@ -447,6 +445,7 @@ req.setAuthType(ctx.getAuthMethod()); if (user != null) { req.setRemoteUser(user); + req.setUserPrincipal( new JdbcPrincipal( user )); String userRoles[] = getUserRoles(user); req.setUserRoles(userRoles); return OK; @@ -524,4 +523,13 @@ shutdown(); } + // Nothing - except cary on the class name information + public static class JdbcPrincipal extends SimplePrincipal { + private String name; + + JdbcPrincipal(String name) { + super(name); + } + } } + 1.2 +74 -58 jakarta-tomcat/src/share/org/apache/tomcat/modules/aaa/SimpleRealm.java Index: SimpleRealm.java =================================================================== RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/modules/aaa/SimpleRealm.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- SimpleRealm.java 2001/01/01 02:01:29 1.1 +++ SimpleRealm.java 2001/02/27 19:10:17 1.2 @@ -64,9 +64,11 @@ import org.apache.tomcat.util.*; import org.apache.tomcat.util.log.*; import org.apache.tomcat.util.xml.*; +import org.apache.tomcat.util.aaa.*; import java.io.*; import java.net.*; import java.util.*; +import java.security.Principal; import org.xml.sax.*; /** @@ -143,13 +145,18 @@ if( user==null) return DECLINED; // we don't know about this if( debug > 0 ) log( "Verify user=" + user + " pass=" + password ); - if( memoryRealm.checkPassword( user, password ) ) { + SimpleRealmPrincipal srp=memoryRealm.getPrincipal( user ); + if( srp == null ) return DECLINED; + + if( srp.checkPassword( password ) ) { if( debug > 0 ) log( "Auth ok, user=" + user ); Context ctx = req.getContext(); req.setAuthType(ctx.getAuthMethod()); req.setRemoteUser( user ); + req.setUserPrincipal( srp ); + if( user!=null ) { - String userRoles[] = memoryRealm.getUserRoles( user ); + String userRoles[] = srp.getUserRoles( user ); req.setUserRoles( userRoles ); } return OK; // the user is ok, - no need for more work @@ -163,12 +170,14 @@ class MemoryRealm { // String user -> password - Hashtable passwords=new Hashtable(); + // Hashtable passwords=new Hashtable(); // String role -> Vector users - Hashtable roles=new Hashtable(); + // Hashtable roles=new Hashtable(); // user -> roles - Hashtable userRoles= new Hashtable(); - String filename; + // Hashtable userRoles= new Hashtable(); + + Hashtable principals=new Hashtable(); + String filename; String home; MemoryRealm(String fn,String home) { @@ -176,64 +185,22 @@ filename=fn; } - public Hashtable getRoles() { - return roles; - } + public SimpleRealmPrincipal getPrincipal( String user ) { + return (SimpleRealmPrincipal)principals.get(user); + } + public void addPrincipal( String name, Principal p ) { + principals.put( name, p ); + } + public void addUser(String name, String pass, String groups ) { if( getDebug() > 0 ) log( "Add user " + name + " " + pass + " " + groups ); - passwords.put( name, pass ); - groups += ","; - while (true) { - int comma = groups.indexOf(","); - if (comma < 0) - break; - addRole( groups.substring(0, comma).trim(), name); - groups = groups.substring(comma + 1); - } + SimpleRealmPrincipal sp=new SimpleRealmPrincipal( name, pass ); + sp.addRoles( groups ); + principals.put( name, sp ); } - public void addRole( String role, String user ) { - Vector users=(Vector)roles.get(role); - if(users==null) { - users=new Vector(); - roles.put(role, users ); - } - users.addElement( user ); - - Vector thisUserRoles=(Vector)userRoles.get( user ); - if( thisUserRoles == null ) { - thisUserRoles = new Vector(); - userRoles.put( user, thisUserRoles ); - } - thisUserRoles.addElement( role ); - } - - public boolean checkPassword( String user, String pass ) { - if( user==null ) return false; - if( getDebug() > 0 ) log( "check " + user+ " " + - pass + " " + passwords.get( user )); - return pass.equals( (String)passwords.get( user ) ); - } - - public String[] getUserRoles( String user ) { - Vector v=(Vector)userRoles.get( user ); - if( v==null) return null; - String roles[]=new String[v.size()]; - for( int i=0; i<roles.length; i++ ) { - roles[i]=(String)v.elementAt( i ); - } - return roles; - } - - public boolean userInRole( String user, String role ) { - Vector users=(Vector)roles.get(role); - if( getDebug() > 0 ) log( "check role " + user+ " " + - role + " " ); - if(users==null) return false; - return users.indexOf( user ) >=0 ; - } void readMemoryRealm() throws Exception { File f; if (filename != null) @@ -258,6 +225,7 @@ String user=attributes.getValue("name"); String pass=attributes.getValue("password"); String group=attributes.getValue("roles"); + mr.addUser( user, pass, group ); } } @@ -266,5 +234,53 @@ xh.readXml( f, this ); } } + + public static class SimpleRealmPrincipal extends SimplePrincipal { + private String pass; + private Vector roles=new Vector(); + + SimpleRealmPrincipal(String name, String pass) { + super( name ); + this.pass=pass; + } + + // local methods + + private void addRole(String role ) { + roles.addElement( role ); + } + + boolean checkPassword( String s ) { + if( s == pass ) return true; // interned or nulls? + if( s==null ) return false; // if pass == null already true + return s.equals( pass ); + } + + // backward compat - bad XML format !!! + void addRoles( String groups ) { + groups += ","; + while (true) { + int comma = groups.indexOf(","); + if (comma < 0) + break; + addRole( groups.substring(0, comma).trim() ); + groups = groups.substring(comma + 1); + } + } + + String[] getUserRoles( String user ) { + String rolesA[]=new String[roles.size()]; + for( int i=0; i<roles.size(); i++ ) { + rolesA[i]=(String)roles.elementAt( i ); + } + return rolesA; + } + + // public boolean userInRole( String role ) { + // return roles.indexOf( role ) >=0 ; + // } + + } + } 1.1 jakarta-tomcat/src/share/org/apache/tomcat/util/aaa/SimplePrincipal.java Index: SimplePrincipal.java =================================================================== /* * ==================================================================== * * The Apache Software License, Version 1.1 * * Copyright (c) 1999 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, if * any, must include the following acknowlegement: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowlegement may appear in the software itself, * if and wherever such third-party acknowlegements normally appear. * * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software * Foundation" must not be used to endorse or promote products derived * from this software without prior written permission. For written * permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache" * nor may "Apache" appear in their names without prior written * permission of the Apache Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. * * [Additional notices, if required by prior licensing conditions] * */ package org.apache.tomcat.util.aaa; import java.security.Principal; public class SimplePrincipal implements Principal { private String name; public SimplePrincipal(String name) { this.name = name; } /** * Returns true if the specified Object represents the * same principal (i.e. a Principal with the same name) * * @param another Another Principal instance * @return true if another is a Principal with the same name */ public boolean equals(Object another) { return another instanceof Principal && ((Principal) another).getName().equals(getName()); } /** * Returns the principal's name. * * @return The principal's name */ public String getName() { return name; } /** * Returns the principal's name. * * @return The principal's name */ public String toString() { return getName(); } } --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, email: [EMAIL PROTECTED]