amyroh      2003/02/10 18:27:15

  Modified:    webapps/admin build.xml
               webapps/admin/WEB-INF/classes/org/apache/webapp/admin
                        ApplicationResources_en.properties
                        ApplicationResources_es.properties
               webapps/admin/WEB-INF/classes/org/apache/webapp/admin/valve
                        RemoteAddrValveForm.java RemoteHostValveForm.java
                        ValveUtil.java
  Log:
  Add validation for RemoteAddrValve and  RemoteHostValve to prevent
  installing a filter that prevents the admin's own access.
  
  Revision  Changes    Path
  1.5       +8 -1      jakarta-tomcat-4.0/webapps/admin/build.xml
  
  Index: build.xml
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-4.0/webapps/admin/build.xml,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- build.xml 16 Aug 2002 22:24:06 -0000      1.4
  +++ build.xml 11 Feb 2003 02:27:15 -0000      1.5
  @@ -20,6 +20,7 @@
     <path id="admin.classpath">
       <pathelement location="${commons-modeler.jar}"/>
       <pathelement location="${jmx.jar}"/>
  +    <pathelement location="${regexp.jar}"/>
       <pathelement location="${servlet.jar}"/>
       <pathelement location="${struts.jar}"/>
       <pathelement location="${commons-beanutils.jar}"/>
  @@ -55,6 +56,9 @@
       <available property="modeler.present"
        classname="org.apache.commons.modeler.Registry"
        classpath="${commons-modeler.jar}"/>
  +    <available property="regexp.present"
  +     classname="org.apache.regexp.RE"
  +     classpath="${regexp.jar}" />
       <available property="servlet.present"
        classname="javax.servlet.Servlet"
        classpath="${servlet.jar}" />
  @@ -69,6 +73,7 @@
       <!-- JAR files availability flags -->
       <available property="jmx.jar.present"   file="${jmx.jar}" />
       <available property="modeler.jar.present" file="${commons-modeler.jar}" />
  +    <available property="regexp.jar.present" file="${regexp.jar}" />
       <available property="servlet.jar.present" file="${servlet.jar}" />
       <available property="struts.jar.present"  file="${struts.jar}" />
       <available property="beanutils.jar.present" file="${commons-beanutils.jar}" />
  @@ -82,6 +87,7 @@
             <equals arg1="${struts.present}" arg2="true" />
             <equals arg1="${jmx.present}" arg2="true" />
             <equals arg1="${modeler.present}" arg2="true" />
  +          <equals arg1="${regexp.present}" arg2="true" />
             <available file="${struts.lib}/struts-bean.tld" />
             <available file="${struts.lib}/struts-html.tld" />
             <available file="${struts.lib}/struts-logic.tld" />
  @@ -126,11 +132,13 @@
       <echo message="jaxp.present=${jaxp.present}" />
       <echo message="jmx.present=${jmx.present}" />
       <echo message="modeler.present=${modeler.present}" />
  +    <echo message="regexp.present=${regexp.present}" />
       <echo message="servlet.present=${servlet.present}" />
   
       <echo message="--- Required JARs ---" />
       <echo message="jmx.jar.present=${jmx.jar.present}" />
       <echo message="modeler.jar.present=${modeler.jar.present}" />
  +    <echo message="regexp.jar.present=${regexp.jar.present}" />
       <echo message="servlet.jar.present=${servlet.jar.present}" />
       <echo message="struts.jar.present=${struts.jar.present}" />
       <echo message="beanutils.jar.present=${beanutils.jar.present}" />
  @@ -154,7 +162,6 @@
       <copy todir="${webapps.build}/${webapp.name}/WEB-INF" 
file="${struts.lib}/struts-html.tld"/>
       <copy todir="${webapps.build}/${webapp.name}/WEB-INF" 
file="${struts.lib}/struts-logic.tld"/>
     </target>
  -
   
     <!-- =================== BUILD: Create Directories ====================== -->
     <target name="build-prepare">
  
  
  
  1.73      +6 -0      
jakarta-tomcat-4.0/webapps/admin/WEB-INF/classes/org/apache/webapp/admin/ApplicationResources_en.properties
  
  Index: ApplicationResources_en.properties
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-4.0/webapps/admin/WEB-INF/classes/org/apache/webapp/admin/ApplicationResources_en.properties,v
  retrieving revision 1.72
  retrieving revision 1.73
  diff -u -r1.72 -r1.73
  --- ApplicationResources_en.properties        10 Dec 2002 20:41:47 -0000      1.72
  +++ ApplicationResources_en.properties        11 Feb 2003 02:27:15 -0000      1.73
  @@ -251,6 +251,12 @@
   valve.denyHosts=Deny these Hosts
   valve.allowIPs=Allow IP addresses
   valve.denyIPs=Deny IP addresses
  +error.allowHost=<li>Allow is invalid.  Need to include the admin's Hostname.</li>
  +error.denyHost=<li>Deny is invalid.  Need to exclude the admin's Hostname.</li>
  +error.allowIP=<li>Allow is invalid.  Need to include the admin's IP address.</li>
  +error.denyIP=<li>Deny is invalid.  Need to exclude the admin's IP address.</li>
  +error.allow.deny.required=<li>Allow or deny is required.</li>
  +error.syntax=<li>Syntax error in request filter pattern.</li>
   error.resource.required=<li>Resource Name is required.</li>
   error.resource.javaprefix=<li>Resource must have "java:" prefix.</li>
   error.pathName.required=<li>Path Name is required.</li>
  
  
  
  1.62      +6 -0      
jakarta-tomcat-4.0/webapps/admin/WEB-INF/classes/org/apache/webapp/admin/ApplicationResources_es.properties
  
  Index: ApplicationResources_es.properties
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-4.0/webapps/admin/WEB-INF/classes/org/apache/webapp/admin/ApplicationResources_es.properties,v
  retrieving revision 1.61
  retrieving revision 1.62
  diff -u -r1.61 -r1.62
  --- ApplicationResources_es.properties        10 Dec 2002 20:41:47 -0000      1.61
  +++ ApplicationResources_es.properties        11 Feb 2003 02:27:15 -0000      1.62
  @@ -250,6 +250,12 @@
   valve.denyHosts=Niegue estos Hosts
   valve.allowIPs=Permitir estas direcciones IP
   valve.denyIPs=Rechazar estas direcciones IP
  +error.allowHost=<li>Permita es inválido. Necesidad de incluir el hostname del 
admin.</li>
  +error.denyHost=<li>Niegue es inválido. Necesidad de excluir el hostname del 
admin.</li>
  +error.allowIP=<li>Permita es inválido. Necesidad de incluir el IP ADDRESS del 
admin.</li>
  +error.denyIP=<li>Niegue es inválido. Necesidad de excluir el IP ADDRESS del 
admin.</li>
  +error.allow.deny.required=<li>Permita o niegue se requiere.</li>
  +error.syntax=<li>Error del sintaxis en patrón del filtro de la petición.</li>
   error.resource.required=<li>Se requiere el nombre del recurso.</li>
   error.resource.javaprefix=<li>El recurso debe tener prefijo de "java:"</li>
   error.pathName.required=<li>Se requiere el nombre del path.</li>
  
  
  
  1.3       +82 -10    
jakarta-tomcat-4.0/webapps/admin/WEB-INF/classes/org/apache/webapp/admin/valve/RemoteAddrValveForm.java
  
  Index: RemoteAddrValveForm.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-4.0/webapps/admin/WEB-INF/classes/org/apache/webapp/admin/valve/RemoteAddrValveForm.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- RemoteAddrValveForm.java  11 Apr 2002 07:42:04 -0000      1.2
  +++ RemoteAddrValveForm.java  11 Feb 2003 02:27:15 -0000      1.3
  @@ -61,13 +61,16 @@
   
   package org.apache.webapp.admin.valve;
   
  +import java.lang.IllegalArgumentException;
  +import java.net.InetAddress;
  +import java.util.List;
   import javax.servlet.http.HttpServletRequest;
  +import org.apache.regexp.RE;
   import org.apache.struts.action.ActionError;
   import org.apache.struts.action.ActionErrors;
   import org.apache.struts.action.ActionForm;
   import org.apache.struts.action.ActionMapping;
  -import java.net.InetAddress;
  -import java.util.List;
  +
   
   import org.apache.webapp.admin.ApplicationServlet;
   import org.apache.webapp.admin.LabelValueBean;
  @@ -83,6 +86,7 @@
       
       // ----------------------------------------------------- Instance Variables
       
  +    
       /**
        * The text for the allow IP addresses.
        * A comma-separated list of regular expression patterns
  @@ -94,6 +98,17 @@
        * The text for the deny IP addresses.
        */
       private String deny = "";
  +    
  +    /**
  +     * The set of <code>allow</code> regular expressions we will evaluate.
  +     */
  +    private RE allows[] = new RE[0];
  +
  +    /**
  +     * The set of <code>deny</code> regular expressions we will evaluate.
  +     */
  +    private RE denies[] = new RE[0];
  +
   
       // ------------------------------------------------------------- Properties
   
  @@ -135,6 +150,7 @@
   
       // --------------------------------------------------------- Public Methods
       
  +    
       /**
        * Reset all properties to their default values.
        *
  @@ -146,6 +162,8 @@
           super.reset(mapping, request);
           this.allow = null;
           this.deny = null;
  +        this.allows = null;
  +        this.denies = null;
           
       }
       
  @@ -188,10 +206,64 @@
           String submit = request.getParameter("submit");
           
           // front end validation when save is clicked.        
  -         if (submit != null) {
  -         // validate allow/deny patterns?
  -         }
  -                 
  +        if (submit != null) {
  +            // validate allow/deny patterns
  +            if ((allow == null) || (allow.length() < 1)) {
  +                if ((deny == null) || (deny.length() < 1)) {
  +                    errors.add("allow",
  +                    new ActionError("error.allow.deny.required"));
  +                }
  +            }                
  +        }
  +        
  +        try {
  +            allows = ValveUtil.precalculate(allow);            
  +        } catch (IllegalArgumentException e) {
  +            errors.add("allow", new ActionError("error.syntax"));
  +            return errors;
  +        }
  +         
  +        try {   
  +            denies = ValveUtil.precalculate(deny);
  +        } catch (IllegalArgumentException e) {
  +            errors.add("allow", new ActionError("error.syntax"));
  +            return errors;
  +        }
  +        
  +        String ip = request.getRemoteAddr();
  +        
  +        if (ip == null) {
  +            return errors;
  +        }
  +        
  +        for (int i = 0; i < denies.length; i++) {
  +            if (denies[i].match("127.0.0.1")) {
  +                errors.add("deny",
  +                new ActionError("error.denyIP"));
  +            }
  +            if (denies[i].match(ip)) {
  +                for (int j = 0; j < allows.length; j++) {
  +                    if (!allows[j].match(ip)) { 
  +                        errors.add("deny",
  +                        new ActionError("error.denyIP"));
  +                    }
  +                }
  +            }    
  +        }
  +        
  +        boolean allowMatch = true;
  +        if (allows.length > 0) {
  +            allowMatch = false;
  +        }
  +        for (int i = 0; i < allows.length; i++) {
  +            if (allows[i].match(ip)) {
  +                allowMatch = true;       
  +            }
  +        }       
  +        if (!allowMatch) {
  +            errors.add("allow", new ActionError("error.allowIP"));
  +        }
  +        
           return errors;
       }
   }
  
  
  
  1.3       +94 -8     
jakarta-tomcat-4.0/webapps/admin/WEB-INF/classes/org/apache/webapp/admin/valve/RemoteHostValveForm.java
  
  Index: RemoteHostValveForm.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-4.0/webapps/admin/WEB-INF/classes/org/apache/webapp/admin/valve/RemoteHostValveForm.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- RemoteHostValveForm.java  11 Apr 2002 14:16:16 -0000      1.2
  +++ RemoteHostValveForm.java  11 Feb 2003 02:27:15 -0000      1.3
  @@ -61,13 +61,16 @@
   
   package org.apache.webapp.admin.valve;
   
  +import java.lang.IllegalArgumentException;
  +import java.net.InetAddress;
  +import java.util.List;
   import javax.servlet.http.HttpServletRequest;
  +
  +import org.apache.regexp.RE;
   import org.apache.struts.action.ActionError;
   import org.apache.struts.action.ActionErrors;
   import org.apache.struts.action.ActionForm;
   import org.apache.struts.action.ActionMapping;
  -import java.net.InetAddress;
  -import java.util.List;
   
   import org.apache.webapp.admin.ApplicationServlet;
   import org.apache.webapp.admin.LabelValueBean;
  @@ -83,6 +86,7 @@
       
       // ----------------------------------------------------- Instance Variables
   
  +
       /**
        * The text for the allow hosts IP addresses.
        * A comma-separated list of regular expression patterns
  @@ -95,6 +99,17 @@
        */
       private String deny = "";
   
  +    /**
  +     * The set of <code>allow</code> regular expressions we will evaluate.
  +     */
  +    private RE allows[] = new RE[0];
  +
  +    /**
  +     * The set of <code>deny</code> regular expressions we will evaluate.
  +     */
  +    private RE denies[] = new RE[0];
  +    
  +    
       // ------------------------------------------------------------- Properties
   
       /**
  @@ -146,6 +161,8 @@
           super.reset(mapping, request);
           this.allow = null;
           this.deny = null;
  +        this.allows = null;
  +        this.denies = null;
           
       }
       
  @@ -188,10 +205,79 @@
           String submit = request.getParameter("submit");
           
           // front end validation when save is clicked.        
  -         if (submit != null) {
  +        if (submit != null) {
                // TBD
               // validate allow/deny IPs
  -         }        
  +            if ((allow == null) || (allow.length() < 1)) {
  +                if ((deny == null) || (deny.length() < 1)) {
  +                    errors.add("allow",
  +                    new ActionError("error.allow.deny.required"));
  +                }
  +            }              
  +        }
  +        
  +        try {
  +            allows = ValveUtil.precalculate(allow);            
  +        } catch (IllegalArgumentException e) {
  +            errors.add("allow", new ActionError("error.syntax"));
  +            return errors;
  +        }
  +         
  +        try {   
  +            denies = ValveUtil.precalculate(deny);
  +        } catch (IllegalArgumentException e) {
  +            errors.add("allow", new ActionError("error.syntax"));
  +            return errors;
  +        }
  +                 
  +        String host = request.getRemoteHost();
  +        // check for IP address also in case DNS is not configured 
  +        // to give a host name for the client machine
  +        String ip = request.getRemoteAddr();
  +    
  +        if (host == null) {
  +            return errors;
  +        }
  +        
  +        for (int i = 0; i < denies.length; i++) {
  +            if (denies[i].match("localhost") || 
  +                        denies[i].match("127.0.0.1")) {
  +                errors.add("deny",
  +                new ActionError("error.denyHost"));
  +            }
  +            if (denies[i].match(host)) {
  +                for (int j = 0; j < allows.length; j++) {
  +                    if (!allows[j].match(host)) { 
  +                        errors.add("deny",
  +                        new ActionError("error.denyHost"));
  +                    }
  +                }
  +            } else if (denies[i].match(ip)) {
  +                for (int j = 0; j < allows.length; j++) {
  +                    if (!allows[j].match(ip)) { 
  +                        errors.add("deny",
  +                        new ActionError("error.denyHost"));
  +                    }
  +                }
  +            }
  +        }
  +        
  +        boolean allowMatch = true;
  +        
  +        if ((allows != null) && (allows.length > 0)) {
  +            allowMatch = false;
  +        }
  +        
  +        for (int i = 0; i < allows.length; i++) {
  +            if (allows[i].match(host)) {
  +                allowMatch = true;       
  +            }
  +        }
  +        
  +        if (!allowMatch) {
  +            errors.add("allow", new ActionError("error.allowHost"));
  +        }        
  +        
           return errors;
       }
       
  
  
  
  1.9       +49 -4     
jakarta-tomcat-4.0/webapps/admin/WEB-INF/classes/org/apache/webapp/admin/valve/ValveUtil.java
  
  Index: ValveUtil.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-4.0/webapps/admin/WEB-INF/classes/org/apache/webapp/admin/valve/ValveUtil.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- ValveUtil.java    10 Feb 2003 04:25:26 -0000      1.8
  +++ ValveUtil.java    11 Feb 2003 02:27:15 -0000      1.9
  @@ -62,6 +62,7 @@
   package org.apache.webapp.admin.valve;
   
   import java.net.URLEncoder;
  +import java.util.ArrayList;
   import java.util.Iterator;
   import java.util.Locale;
   import java.io.IOException;
  @@ -77,6 +78,8 @@
   import javax.servlet.http.HttpServletRequest;
   import javax.servlet.http.HttpServletResponse;
   import javax.servlet.http.HttpSession;
  +import org.apache.regexp.RE;
  +import org.apache.regexp.RESyntaxException;
   import org.apache.struts.action.Action;
   import org.apache.struts.action.ActionError;
   import org.apache.struts.action.ActionErrors;
  @@ -238,4 +241,46 @@
           session.removeAttribute(mapping.getAttribute());
           return vObjectName;
       }
  +
  +    
  +    /**
  +     * Return an array of regular expression objects initialized from the
  +     * specified argument, which must be <code>null</code> or a comma-delimited
  +     * list of regular expression patterns.
  +     *
  +     * @param list The comma-separated list of patterns
  +     *
  +     * @exception IllegalArgumentException if one of the patterns has
  +     *  invalid syntax
  +     */
  +    public static RE[] precalculate(String list) 
  +                                    throws IllegalArgumentException {
  +
  +        if (list == null)
  +            return (new RE[0]);
  +        list = list.trim();
  +        if (list.length() < 1)
  +            return (new RE[0]);
  +        list += ",";
  +
  +        ArrayList reList = new ArrayList();
  +        while (list.length() > 0) {
  +            int comma = list.indexOf(',');
  +            if (comma < 0)
  +                break;
  +            String pattern = list.substring(0, comma).trim();
  +            try {
  +                reList.add(new RE(pattern));
  +            } catch (RESyntaxException e) {
  +                throw new IllegalArgumentException
  +                    ("Syntax error in request filter pattern");
  +            }
  +            list = list.substring(comma + 1);
  +        }
  +
  +        RE reArray[] = new RE[reList.size()];
  +        return ((RE[]) reList.toArray(reArray));
  +
  +    }    
  +
   }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to