You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by co...@apache.org on 2001/01/29 08:09:15 UTC

cvs commit: jakarta-tomcat/src/share/org/apache/tomcat/util/test DefaultMatcher.java GTest.java

costin      01/01/28 23:09:14

  Modified:    src/facade22/org/apache/tomcat/facade JspInterceptor.java
               src/share/org/apache/tomcat/modules/aaa
                        AccessInterceptor.java
               src/share/org/apache/tomcat/modules/generators
                        ErrorHandler.java StaticInterceptor.java
               src/share/org/apache/tomcat/util ByteChunk.java
                        CharChunk.java MessageBytes.java
               src/share/org/apache/tomcat/util/test DefaultMatcher.java
                        GTest.java
  Log:
  - fix bug in ErrorHandler ( the "original URI" was wrongly displayed in 404)
  
  - check WEB-INF and META-INF in AccessInterceptor ( where all access control
  should be done, instead of relying on every module on doing it )
  
  - Few changes in StaticInterceptor to behave closer to apache. Also,
  redirects are sent only if the request passes the access control ( it's not
   a big deal, but it's safer this way )
  
  - Added some code to do WEB-INF insensitive match without object allocation.
  
  - few fixes in the test driver
  
  Revision  Changes    Path
  1.10      +1 -1      jakarta-tomcat/src/facade22/org/apache/tomcat/facade/JspInterceptor.java
  
  Index: JspInterceptor.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat/src/facade22/org/apache/tomcat/facade/JspInterceptor.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- JspInterceptor.java	2001/01/28 19:45:52	1.9
  +++ JspInterceptor.java	2001/01/29 07:08:37	1.10
  @@ -495,7 +495,7 @@
   	    }
   
   	    //	    if( debug > 3) 
  -	    log.log( "Compiling: " + jspFile + " to " +
  +	    ctx.log( "Compiling: " + jspFile + " to " +
   		     mangler.getServletClassName());
   	    
   	    //XXX old servlet -  destroy(); 
  
  
  
  1.4       +17 -4     jakarta-tomcat/src/share/org/apache/tomcat/modules/aaa/AccessInterceptor.java
  
  Index: AccessInterceptor.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/modules/aaa/AccessInterceptor.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- AccessInterceptor.java	2001/01/09 21:26:07	1.3
  +++ AccessInterceptor.java	2001/01/29 07:08:45	1.4
  @@ -238,20 +238,33 @@
   	Context ctx=req.getContext();
   	SecurityConstraints ctxSec=(SecurityConstraints)ctx.getContainer().
   	    getNote( secMapNote );
  -	if( ctxSec==null || ctxSec.patterns==0 ) return 0; // fast exit
   
  +	// do the check for the "special patterns"
   	MessageBytes reqURIMB=req.requestURI();
  +	String ctxPath= ctx.getPath();
  +	int ctxPathLen=ctxPath.length();
  +	
  +	// quick test
  +	if( reqURIMB.startsWithIgnoreCase( "/META-INF", ctxPathLen) ) {
  +	    return 403;
  +	}
  +	if( reqURIMB.startsWithIgnoreCase( "/WEB-INF", ctxPathLen) ) {
  +	    return 403;
  +	}
  +
  +	// if we don't have any other constraints, return
  +	if( ctxSec==null || ctxSec.patterns==0 ) return 0; // fast exit
  +
   	if (reqURIMB.indexOf('%') >= 0 || reqURIMB.indexOf( '+' ) >= 0) {
   	    log("Shouldn't happen - the request is decoded earlier");
   	    reqURIMB.unescapeURL();
   	}
   	String reqURI = req.requestURI().toString();
  -	String ctxPath= ctx.getPath();
  -	String path=reqURI.substring( ctxPath.length());
  +	String path=reqURI.substring( ctxPathLen);
   	String method=req.method().toString();
   	
   	if( debug > 1 ) log( "checking " + path );
  -	
  +
   	for( int i=0; i< ctxSec.patterns ; i++ ) {
   	    Container ct=ctxSec.securityPatterns[i];
   	    if( match( ct, path, method ) ) {
  
  
  
  1.4       +10 -8     jakarta-tomcat/src/share/org/apache/tomcat/modules/generators/ErrorHandler.java
  
  Index: ErrorHandler.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/modules/generators/ErrorHandler.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- ErrorHandler.java	2001/01/07 00:17:06	1.3
  +++ ErrorHandler.java	2001/01/29 07:08:50	1.4
  @@ -128,6 +128,7 @@
   	// Default status handlers
   	ctx.addServlet( new RedirectHandler(this));
   	ctx.addErrorPage( "302", "tomcat.redirectHandler");
  +	ctx.addErrorPage( "301", "tomcat.redirectHandler");
   	ctx.addServlet( new NotFoundHandler(this, showDebugInfo));
   	ctx.addErrorPage( "404", "tomcat.notFoundHandler");
       }
  @@ -173,7 +174,7 @@
   	if( errorPath != null ) {
   	    errorServlet=getHandlerForPath( cm, ctx, errorPath );
   
  -	    // Make sure Jsps will work
  +	    // Make sure Jsps will work - needed if the error page is a jsp
   	    req.setAttribute( "javax.servlet.include.request_uri",
   				  ctx.getPath()  + "/" + errorPath );
   	    req.setAttribute( "javax.servlet.include.servlet_path", errorPath );
  @@ -378,14 +379,10 @@
   	throws Exception
       {
   	res.setContentType("text/html");	// ISO-8859-1 default
  -
  -	String requestURI = (String)req.
  -	    getAttribute("javax.servlet.include.request_uri");
  -
  -	if (requestURI == null) {
  -	    requestURI = req.requestURI().toString();
  -	}
   
  +	// "javax.servlet.include.request_uri" is set to this handler
  +	String requestURI = req.requestURI().toString();
  +	
   	if( sbNote==0 ) {
   	    sbNote=req.getContextManager().getNoteId(ContextManager.REQUEST_NOTE,
   						     "NotFoundHandler.buff");
  @@ -668,6 +665,11 @@
   	String location	= (String)
   	    req.getAttribute("javax.servlet.error.message");
   	Context ctx=req.getContext();
  +
  +	if( res.getStatus() != 301 &&
  +	    res.getStatus() != 302 ) {
  +	    res.setStatus( 301 );
  +	}
   	
   	location = makeAbsolute(req, location);
   
  
  
  
  1.4       +21 -16    jakarta-tomcat/src/share/org/apache/tomcat/modules/generators/StaticInterceptor.java
  
  Index: StaticInterceptor.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/modules/generators/StaticInterceptor.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- StaticInterceptor.java	2001/01/28 21:46:00	1.3
  +++ StaticInterceptor.java	2001/01/29 07:08:52	1.4
  @@ -159,6 +159,16 @@
   	if( debug > 0 )
   	    log( "DefaultServlet: welcome file: "  + welcomeFile);
   
  +	// consistent with Apache
  +	if( welcomeFile==null && ! requestURI.endsWith("/") ) {
  +	    String redirectURI= requestURI + "/";
  +	    req.setAttribute("javax.servlet.error.message",
  +			     redirectURI);
  +	    if( debug > 0) log( "Redirect " + redirectURI );
  +	    req.setHandler( ctx.getServletByName( "tomcat.redirectHandler"));
  +	    return 0;
  +	}
  +	
   	// Doesn't matter if we are or not in include
   	if( welcomeFile == null  ) {
   	    // normal dir, no welcome.
  @@ -167,15 +177,6 @@
   	    return 0;
   	}
   
  -	// consistent with Apache
  -	if( ! requestURI.endsWith("/") ) {
  -	    String redirectURI= requestURI + "/";
  -	    req.setAttribute("javax.servlet.error.message",
  -			     redirectURI);
  -	    if( debug > 0) log( "Redirect " + redirectURI );
  -	    return 301;
  -	}
  -	
   	// Send redirect to the welcome file.
   	// This is consistent with other web servers and avoids
   	// gray areas in the spec - if the welcome file is a jsp,
  @@ -188,7 +189,11 @@
   	req.setAttribute("javax.servlet.error.message",
   			 redirectURI);
   	if( debug > 0) log( "Redirect " + redirectURI );
  -	return 301;
  +	// allow processing to go on - another mapper may change the
  +	// outcome, we are just the default ( preventive for bad ordering,
  +	// in correct config Static is the last one anyway ).
  +	req.setHandler( ctx.getServletByName( "tomcat.redirectHandler"));
  +	return 0;
       }
   
       private static String concatPath( String s1, String s2 ) {
  @@ -317,14 +322,14 @@
   	    log("Ends with \\/. " + absPath);
   	    return null;
   	}
  -    if (absPath.length() > base.length())
  +	if (absPath.length() > base.length())
   	{
   		String relPath=absPath.substring( base.length() + 1);
   		if( debug>0) log( "RelPath = " + relPath );
   
   		String relPathU=relPath.toUpperCase();
   		if ( relPathU.startsWith("WEB-INF") ||
  -				relPathU.startsWith("META-INF")) {
  +		     relPathU.startsWith("META-INF")) {
   			return null;
   		}
   	}
  @@ -386,13 +391,13 @@
   		String relPath=absPath.substring( base.length() + 1);
   		String relPathU=relPath.toUpperCase();
   		if ( relPathU.startsWith("WEB-INF") ||
  -				relPathU.startsWith("META-INF")) {
  -			context.getContextManager().handleStatus( req, res, 404);
  -			return;
  +		     relPathU.startsWith("META-INF")) {
  +		    context.getContextManager().handleStatus( req, res, 404);
  +		    return;
   		}
   	}
   
  -		if( sbNote==0 ) {
  +	if( sbNote==0 ) {
   	    sbNote=req.getContextManager().getNoteId(ContextManager.REQUEST_NOTE,
   						     "RedirectHandler.buff");
   	}
  
  
  
  1.5       +21 -0     jakarta-tomcat/src/share/org/apache/tomcat/util/ByteChunk.java
  
  Index: ByteChunk.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/util/ByteChunk.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- ByteChunk.java	2001/01/04 13:14:41	1.4
  +++ ByteChunk.java	2001/01/29 07:08:56	1.5
  @@ -319,6 +319,27 @@
   	return true;
       }
   
  +    /**
  +     * Returns true if the message bytes starts with the specified string.
  +     * @param s the string
  +     */
  +    public boolean startsWithIgnoreCase(String s, int pos) {
  +	byte[] b = bytes;
  +	int len = s.length();
  +	if (b == null || len+pos > bytesLen) {
  +	    return false;
  +	}
  +	int off = bytesOff+pos;
  +	for (int i = 0; i < len; i++) {
  +	    if (Ascii.toLower( b[off++] ) != Ascii.toLower( s.charAt(i))) {
  +		return false;
  +	    }
  +	}
  +	return true;
  +    }
  +    
  +
  +
       // based on ap_unescape_url ( util.c, Apache2.0 )
       public int unescapeURL()
       {
  
  
  
  1.5       +19 -0     jakarta-tomcat/src/share/org/apache/tomcat/util/CharChunk.java
  
  Index: CharChunk.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/util/CharChunk.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- CharChunk.java	2001/01/04 13:14:41	1.4
  +++ CharChunk.java	2001/01/29 07:08:57	1.5
  @@ -244,6 +244,25 @@
   	return true;
       }
       
  +    /**
  +     * Returns true if the message bytes starts with the specified string.
  +     * @param s the string
  +     */
  +    public boolean startsWithIgnoreCase(String s, int pos) {
  +	char[] c = chars;
  +	int len = s.length();
  +	if (c == null || len+pos > charsLen) {
  +	    return false;
  +	}
  +	int off = charsOff+pos;
  +	for (int i = 0; i < len; i++) {
  +	    if (Ascii.toLower( c[off++] ) != Ascii.toLower( s.charAt(i))) {
  +		return false;
  +	    }
  +	}
  +	return true;
  +    }
  +    
   
       // -------------------- Hash code  --------------------
   
  
  
  
  1.16      +40 -0     jakarta-tomcat/src/share/org/apache/tomcat/util/MessageBytes.java
  
  Index: MessageBytes.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/util/MessageBytes.java,v
  retrieving revision 1.15
  retrieving revision 1.16
  diff -u -r1.15 -r1.16
  --- MessageBytes.java	2000/12/30 07:54:16	1.15
  +++ MessageBytes.java	2001/01/29 07:08:58	1.16
  @@ -408,6 +408,32 @@
   	}
       }
   
  +    /**
  +     * Returns true if the message bytes starts with the specified string.
  +     * @param s the string
  +     */
  +    public boolean startsWithIgnoreCase(String s, int pos) {
  +	switch (type) {
  +	case T_STR:
  +	    if( strValue==null ) return false;
  +	    if( strValue.length() < pos + s.length() ) return false;
  +	    
  +	    for( int i=0; i<s.length(); i++ ) {
  +		if( Ascii.toLower( s.charAt( i ) ) !=
  +		    Ascii.toLower( strValue.charAt( pos + i ))) {
  +		    return false;
  +		}
  +	    }
  +	    return true;
  +	case T_CHARS:
  +	    return charC.startsWithIgnoreCase( s, pos );
  +	case T_BYTES:
  +	    return byteC.startsWithIgnoreCase( s, pos );
  +	default:
  +	    return false;
  +	}
  +    }
  +
       
   
       // -------------------- Hash code  --------------------
  @@ -463,6 +489,20 @@
   
       public int indexOf(char c) {
   	return indexOf( c, 0);
  +    }
  +
  +    // Inefficient initial implementation. Will be replaced on the next
  +    // round of tune-up
  +    public int indexOf(String s, int starting) {
  +	toString();
  +	return strValue.indexOf( s, starting );
  +    }
  +    
  +    public int indexOfIgnoreCase(String s, int starting) {
  +	toString();
  +	String upper=strValue.toUpperCase();
  +	String sU=s.toUpperCase();
  +	return upper.indexOf( sU, starting );
       }
       
       /**
  
  
  
  1.7       +4 -4      jakarta-tomcat/src/share/org/apache/tomcat/util/test/DefaultMatcher.java
  
  Index: DefaultMatcher.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/util/test/DefaultMatcher.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- DefaultMatcher.java	2001/01/28 19:53:11	1.6
  +++ DefaultMatcher.java	2001/01/29 07:09:08	1.7
  @@ -275,10 +275,10 @@
   	    Enumeration e=expectHeaders.keys();
   	    while( e.hasMoreElements()) {
   		String key=(String)e.nextElement();
  -		Header h=(Header)expectHeaders.get(key);
  -		String value=h.getValue();
  -		h=(Header)headers.get(key);
  -		String respValue=h.getValue();
  +		Header expH=(Header)expectHeaders.get(key);
  +		String value=expH.getValue();
  +		Header resH=(Header)headers.get(key);
  +		String respValue=(resH==null)? "": resH.getValue();
   		if( respValue==null || respValue.indexOf( value ) <0 ) {
   		    log("ERROR expecting header " + key + ":" +
   			value + " \nGOT: " + respValue+ " HEADERS(" +
  
  
  
  1.7       +21 -6     jakarta-tomcat/src/share/org/apache/tomcat/util/test/GTest.java
  
  Index: GTest.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/util/test/GTest.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- GTest.java	2001/01/28 21:46:01	1.6
  +++ GTest.java	2001/01/29 07:09:10	1.7
  @@ -91,9 +91,10 @@
       
       String description="No description";
   
  -    PrintWriter out=defaultOutput;
  -    String outType=defaultOutType;
  -    int debug=defaultDebug;
  +    PrintWriter out=null;
  +    String outType=null;
  +    int debug=-1;
  +    
       boolean result=false;
       
       public GTest() {
  @@ -146,6 +147,14 @@
   	return testProperties;
       }
   
  +    public static void resetGTest() {
  +	GTest.getTestResults().setSize(0);
  +	GTest.getTestFailures().setSize(0);
  +	GTest.getTestSuccess().setSize(0);
  +	GTest.getTestProperties().clear();
  +	HttpClient.getHttpClients().clear();
  +    }
  +    
       // -------------------- GTest behavior --------------------
       public void setWriter( PrintWriter pw ) {
   	out=pw;
  @@ -192,6 +201,7 @@
       }
   
       public String getComment() {
  +	if(comment==null) return "";
   	return comment.getText();
       }
       
  @@ -288,8 +298,12 @@
       // -------------------- Execute the request --------------------
   
       public void execute() {
  -	
   	try {
  +	    //	 System.out.println("XXX " + outType + " " + defaultOutType);
  +	    if( out==null) out=defaultOutput;
  +	    if( outType==null) outType=defaultOutType;
  +	    if( debug==-1) debug=defaultDebug;
  +
   	    httpClient.execute();
   	    Response resp=httpClient.getResponse();
   
  @@ -335,7 +349,7 @@
   	    out.println("FAIL " + msg );
   	    out.println("Message: " + matcher.getMessage());
   	}
  -
  +	out.flush();
       }
   
       private void htmlReport() {
  @@ -392,6 +406,7 @@
   	    ex.printStackTrace(out);
   	    out.println("</pre><br>");
   	}
  +	out.flush();
       }
   
       private void xmlReport() {
  @@ -413,7 +428,7 @@
   	    ex.printStackTrace(out);
   	    out.println("</pre><br>");
   	}
  -
  +	out.flush();
       }