Return-Path: Delivered-To: apmail-jakarta-tomcat-dev-archive@jakarta.apache.org Received: (qmail 39427 invoked by uid 500); 6 Jul 2001 20:59:38 -0000 Mailing-List: contact tomcat-dev-help@jakarta.apache.org; run by ezmlm Precedence: bulk list-help: list-unsubscribe: list-post: Reply-To: tomcat-dev@jakarta.apache.org Delivered-To: mailing list tomcat-dev@jakarta.apache.org Received: (qmail 39415 invoked by uid 500); 6 Jul 2001 20:59:36 -0000 Delivered-To: apmail-jakarta-tomcat-cvs@apache.org Date: 6 Jul 2001 20:59:35 -0000 Message-ID: <20010706205935.39410.qmail@apache.org> From: nacho@apache.org To: jakarta-tomcat-cvs@apache.org Subject: cvs commit: jakarta-tomcat/src/share/org/apache/tomcat/request JDBCRealm.java nacho 01/07/06 13:59:35 Modified: src/share/org/apache/tomcat/request Tag: tomcat_32 JDBCRealm.java Log: Bug# 2149 , 727 ( possibly others ) JDBCRealm did not close all the prepared staments opened, when trying to reconnect when found a broken DBConnection, I'ts a problem specillay surfaced when using MySQL.. Reported By : mark.shotton at micromass.co.uk andre.gommlich at netkom.de edwin at finalist.com kaneda at dedaletechnology.com Revision Changes Path No revision No revision 1.9.2.10 +47 -56 jakarta-tomcat/src/share/org/apache/tomcat/request/Attic/JDBCRealm.java Index: JDBCRealm.java =================================================================== RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/request/Attic/JDBCRealm.java,v retrieving revision 1.9.2.9 retrieving revision 1.9.2.10 diff -u -r1.9.2.9 -r1.9.2.10 --- JDBCRealm.java 2001/04/17 10:43:43 1.9.2.9 +++ JDBCRealm.java 2001/07/06 20:59:34 1.9.2.10 @@ -318,30 +318,14 @@ log(sm.getString("jdbcRealm.authenticateSQLException", username)); log("SQLException: " + ex); + close(); - // Clean up the JDBC objects so that they get recreated next time - if (preparedAuthenticate != null) { - try { - preparedAuthenticate.close(); - } catch (Throwable t) { - ; - } - preparedAuthenticate = null; - } - if (dbConnection != null) { - try { - dbConnection.close(); - } catch (Throwable t) { - ; - } - dbConnection = null; - } - // Return "not authenticated" for this request return false; } } + public synchronized String[] getUserRoles(String username) { try { if( !checkConnection()) { @@ -380,30 +364,15 @@ log(sm.getString("jdbcRealm.getUserRolesSQLException", username)); log("SQLException: " + ex); - if (preparedRoles != null) { - try { - preparedRoles.close(); - } catch (Throwable t) { - ; - } - preparedRoles = null; - } - if (dbConnection != null) { - try { - dbConnection.close(); - } catch (Throwable t) { - ; - } - dbConnection = null; - } + close(); } - return null; + return null; } public void contextInit(Context ctx) throws org.apache.tomcat.core.TomcatException { - // Validate and update our current component state + // Validate and update our current component state if (!started && checkConnection() ) { started = true; log(sm.getString("jdbcRealm.started")); @@ -415,14 +384,7 @@ // Validate and update our current component state if (started) { started=false; - if( dbConnection != null ) { - try { - dbConnection.close(); - } - catch( SQLException ex ) { - log("dbConnection.close Exception!!!"); - } - } + close(); } } @@ -448,8 +410,8 @@ // This realm will use only username and password callbacks String user=(String)cred.get("username"); String password=(String)cred.get("password"); - - if( user !=null && password !=null ){ + + if( user !=null && password !=null ){ if ( authenticate( user, password ) ) { if( debug > 0 ) log( "Auth ok, user=" + user ); req.setRemoteUser( user ); @@ -458,8 +420,8 @@ if (ctx != null) req.setAuthType(ctx.getAuthMethod()); } - } - return 0; + } + return 0; } public int authorize( Request req, Response response, String roles[] ) @@ -473,16 +435,16 @@ String userRoles[]=null; - String user=req.getRemoteUser(); - if( user==null ) + String user=req.getRemoteUser(); + if( user==null ) return 401; //HttpServletResponse.SC_UNAUTHORIZED - - if( debug > 0 ) + + if( debug > 0 ) log( "Controled access for " + user + " " + req + " " + req.getContainer() ); - - userRoles = getUserRoles( user ); - req.setUserRoles( userRoles ); + + userRoles = getUserRoles( user ); + req.setUserRoles( userRoles ); if( debug > 0 ) { if ((userRoles != null) && (userRoles.length > 0)) @@ -500,7 +462,7 @@ else log( "UnAuthorized - no roles specified"); } - return 401; //HttpServletResponse.SC_UNAUTHORIZED + return 401; //HttpServletResponse.SC_UNAUTHORIZED // XXX check transport } @@ -527,10 +489,39 @@ }catch (SQLException ex){ log(sm.getString("jdbcRealm.checkConnectionSQLException")); log ("SQLException: "+ex); + close(); return false; } catch( ClassNotFoundException ex ) { throw new RuntimeException("JDBCRealm.checkConnection: " + ex); + } + } + + private void close() { + // Clean up the JDBC objects so that they get recreated next time + if (preparedRoles != null) { + try { + preparedRoles.close(); + } catch (Throwable t) { + ; + } + preparedRoles = null; + } + if (preparedAuthenticate != null) { + try { + preparedAuthenticate.close(); + } catch (Throwable t) { + ; + } + preparedAuthenticate = null; + } + if (dbConnection != null) { + try { + dbConnection.close(); + } catch (Throwable t) { + ; + } + dbConnection = null; } }