| 
What this is
 Other links
 The source code
/*
 * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/modules/aaa/RealmBase.java,v 1.4 2004/02/25 06:52:40 billbarker Exp $
 * $Revision: 1.4 $
 * $Date: 2004/02/25 06:52:40 $
 *
 *   
 *  Copyright 1999-2004 The Apache Sofware 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.apache.tomcat.modules.aaa;
import java.security.MessageDigest;
import java.security.Principal;
import org.apache.tomcat.core.BaseInterceptor;
import org.apache.tomcat.core.Context;
import org.apache.tomcat.core.ContextManager;
import org.apache.tomcat.core.Request;
import org.apache.tomcat.core.Response;
import org.apache.tomcat.core.TomcatException;
import org.apache.tomcat.util.res.StringManager;
/*
*  Abstract Base class for Realms.
*  This class is intented to be a helper for defining Realms, it contains basic
*  utils for Digesting passwords, and create associated notes.
*  There are 3 abstract methods in this class, every Realm that inherits from
*  RealmBase needs to define them to make a basic working Realm..they are:
*
*    protected abstract String getCredentials(String username);
*    protected abstract String[] getUserRoles(String username);
*    protected abstract Principal getPrincipal(String username);
*
*  Defining this methods and if needed contextInit and contextShutdown from
*  BaseInterceptor are the only methods a Realm Writer needs
*  to take into account to construct a functional Realm for Tomcat 3.3
*
*  A Complex Realm that need more control over the auth process can already
*  inherit directly from BaseInterceptor.
*
*/
public abstract class RealmBase extends BaseInterceptor {
    int reqRolesNote=-1;
    int userNote=-1;
    int passwordNote=-1;
    /** The string manager for this package. */
    protected static StringManager sm = StringManager.getManager("org.apache.tomcat.resources");
    /**
     * Digest algorithm used in passwords.  Should be a value accepted by MessageDigest for algorithm
     * or "No" ( no encode ).  "No" is the default.
     */
    protected String digest = "No";
    /**
     * Gets the digest algorithm used for credentials in the database.
     * Should be a value that MessageDigest accepts for algorithm or "No".
     * "No" is the Default.
     * @return the digest algorithm being used, or "No" if no encoding
     */
    public String getDigest() {
        return digest;
    }
    /**
     * Sets the digest algorithm used for credentials in the database.
     * Should be a value that MessageDigest accepts for algorithm or "No".
     * "No" is the Default.
     * @param algorithm the Encode type
     */
    public void setDigest(String algorithm) {
        digest = algorithm;
    }
    /**
     * Digest password using the algorithm especificied and
     * convert the result to a corresponding hex string.
     * If exception, the plain credentials string is returned
     * @param credentials Password or other credentials to use in authenticating this username
     * @param algorithm Algorithm used to do the digest
     */
    public static final String digest(String credentials,String algorithm ) {
        try {
            // Obtain a new message digest with MD5 encryption
            MessageDigest md = (MessageDigest)MessageDigest.getInstance(algorithm).clone();
            // encode the credentials
            md.update(credentials.getBytes());
            // obtain the byte array from the digest
            byte[] dig = md.digest();
            // convert the byte array to hex string
            //            Base64 enc=new Base64();
            //            return new String(enc.encode(HexUtils.convert(dig).getBytes()));
            return org.apache.tomcat.util.buf.HexUtils.convert(dig);
        } catch (Exception ex) {
            ex.printStackTrace();
            return credentials;
        }
    }
    /**
     * RealmBase can be used as a standalone tool for offline password digest
     * @param args
     */
    public static void main(String[] args) {
        if (args.length >= 2) {
            if (args[0].equalsIgnoreCase("-a")) {
                for (int i = 2; i < args.length; i++) {
                    System.out.print(args[i] + ":");
                    System.out.println(digest(args[i], args[1]));
                }
            }
        }
    }
    protected abstract String getCredentials(String username);
    protected abstract String[] getUserRoles(String username);
    protected abstract Principal getPrincipal(String username);
    String digest(String credentials) {
        if( digest.equals("") || digest.equalsIgnoreCase("No")){
            return credentials;
        } else {
            return digest(credentials,digest);
        }
    }
    public void engineInit( ContextManager cm )
	throws TomcatException
    {
	reqRolesNote = cm.getNoteId( ContextManager.REQUEST_NOTE,
				     "required.roles");
	userNote=cm.getNoteId( ContextManager.REQUEST_NOTE,
			       "credentials.user");
	passwordNote=cm.getNoteId( ContextManager.REQUEST_NOTE,
				   "credentials.password");
    }
    public int authenticate(Request req, Response response) {
        String user = (String)req.getNote(userNote);
        String password = (String)req.getNote(passwordNote);
        if (user == null) return DECLINED;
        if (checkPassword(user, password)) {
            if (debug > 0) log("Auth ok, user=" + user);
            Context ctx = req.getContext();
            if (ctx != null)
                req.setAuthType(ctx.getAuthMethod());
            if (user != null) {
                req.setRemoteUser(user);
                req.setUserPrincipal( getPrincipal( user ));
                String userRoles[] = getUserRoles(user);
                req.setUserRoles(userRoles);
                return OK;
            }
        }
        return DECLINED;
    }
    private boolean checkPassword(String username,String credentials) {
        // Create the authentication search prepared statement if necessary
        // Perform the authentication search
        if (digest(credentials).equals(getCredentials(username))) {
            if (debug >= 2)
                log(sm.getString("jdbcRealm.authenticateSuccess", username));
            return true;
        }
        if (debug >= 2)
            log(sm.getString("jdbcRealm.authenticateFailure", username));
        return false;
    }
}
 | 
| ... this post is sponsored by my books ... | |
         
           #1 New Release!  | 
      
         
           FP Best Seller  | 
  
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse 
URI on this website is
paid back to open source projects.