costin      01/10/04 13:25:05

  Modified:    src/share/org/apache/tomcat/modules/mappers
                        DecodeInterceptor.java
  Log:
  Do not decode if it was alredy decoded - i.e. if tomcat+web server.
  For Http we need to decode, and also for eventual protocols that send the request
  encoded.
  
  Also, added an option ( defaulted to what we agreed ) to allow saving the 'original'
  uri. Turning it on will bring inconsistencyes between tomcat standalone and
  tomcat+web, and may be open to various security issues ( if the uri is used in any
  check or processing, many encoding tricks could be played - we've been there ).
  But it is the strict implementation of the 2.3 spec ( in the idea that 2.3 is
  backward compat. with 2.2 ).
  
  Revision  Changes    Path
  1.10      +14 -4     
jakarta-tomcat/src/share/org/apache/tomcat/modules/mappers/DecodeInterceptor.java
  
  Index: DecodeInterceptor.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/modules/mappers/DecodeInterceptor.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- DecodeInterceptor.java    2001/09/29 04:36:35     1.9
  +++ DecodeInterceptor.java    2001/10/04 20:25:05     1.10
  @@ -89,7 +89,7 @@
   
       private boolean normalize=true;
       private boolean safe=true;
  -    
  +    private boolean saveOriginal=false;
       public DecodeInterceptor() {
       }
   
  @@ -118,6 +118,13 @@
        normalize=b;
       }
   
  +    /** Save the original uri before decoding. Default is false,
  +     *  for consistency among servers.
  +     */
  +    public void setSaveOriginal( boolean b ) {
  +     saveOriginal=b;
  +    }
  +
       /** Decode interceptor can reject unsafe urls. These are
           URL's containing the following escapes:
           %25 = '%'
  @@ -398,7 +405,7 @@
       }
   
       private boolean isSafeURI(MessageBytes pathMB) {
  -        int start = pathMB.indexOf("%");
  +        int start = pathMB.indexOf('%');
           if( start >= 0 ) {
               int end = pathMB.indexOf(";jsessionid=");
               if( end < 0 || start < end ) {
  @@ -515,11 +522,14 @@
        // Decode request, save the original for the facade
   
        // Already decoded
  -     if( req.getNote( decodedNote ) != null )
  +     if( req.getNote( decodedNote ) != null ) {
  +         if( debug> 5 ) log("Already decoded " + req.getNote( decodedNote ));
            return 0;
  +     }
        if (pathMB.indexOf('%') >= 0 || pathMB.indexOf( '+' ) >= 0) {
            try {
  -             req.unparsedURI().duplicate( pathMB );
  +             if( saveOriginal )
  +                 req.unparsedURI().duplicate( pathMB );
                if(debug>1 )
                    log( "Before " + pathMB.toString());
                req.getURLDecoder().convert( pathMB );
  
  
  


Reply via email to