Author: toad
Date: 2006-12-07 21:08:20 +0000 (Thu, 07 Dec 2006)
New Revision: 11289

Modified:
   trunk/freenet/src/freenet/clients/http/filter/FilterCallback.java
   trunk/freenet/src/freenet/clients/http/filter/GenericReadFilterCallback.java
   trunk/freenet/src/freenet/clients/http/filter/HTMLFilter.java
   trunk/freenet/src/freenet/clients/http/filter/NullFilterCallback.java
Log:
Move the decision on whether a <form> is allowed to the filter callback, which 
is where it should be.
Force the enctype and accept-encoding.
Drop support for accept until we get around to filtering it properly.

Modified: trunk/freenet/src/freenet/clients/http/filter/FilterCallback.java
===================================================================
--- trunk/freenet/src/freenet/clients/http/filter/FilterCallback.java   
2006-12-07 20:49:39 UTC (rev 11288)
+++ trunk/freenet/src/freenet/clients/http/filter/FilterCallback.java   
2006-12-07 21:08:20 UTC (rev 11289)
@@ -15,16 +15,6 @@
        public String processURI(String uri, String overrideType) throws 
CommentException;

        /**
-        * Should we allow GET forms?
-        */
-       public boolean allowGetForms();
-       
-       /**
-        * Should we allow POST forms?
-        */
-       public boolean allowPostForms();
-
-       /**
         * Process a base URI in the page. Not only is this filtered, it 
affects all
         * relative uri's on the page.
         */
@@ -36,5 +26,13 @@
         *    (for example: "title")
         */
        public void onText(String s, String type);
+
+       /**
+        * Process a form on the page.
+        * @param method The form sending method. Normally GET or POST.
+        * @param action The URI to send the form to.
+        * @return The new action URI, or null if the form is not allowed.
+        */
+       public String processForm(String method, String action);

 }

Modified: 
trunk/freenet/src/freenet/clients/http/filter/GenericReadFilterCallback.java
===================================================================
--- 
trunk/freenet/src/freenet/clients/http/filter/GenericReadFilterCallback.java    
    2006-12-07 20:49:39 UTC (rev 11288)
+++ 
trunk/freenet/src/freenet/clients/http/filter/GenericReadFilterCallback.java    
    2006-12-07 21:08:20 UTC (rev 11289)
@@ -215,5 +215,26 @@
                if(cb != null)
                        cb.onText(s, type, baseURI);
        }
+
+       /**
+        * Process a form.
+        * Current strategy:
+        * - Both POST and GET forms are allowed to /
+        * Anything that is hazardous should be protected through formPassword.
+        */
+       public String processForm(String method, String action) {
+               if(action == null) return null;
+               method = method.toUpperCase();
+               if(!(method.equals("POST") || method.equals("GET"))) 
+                       return null; // no irregular form sending methods
+               // Everything is allowed to / - updating the node, shutting it 
down, everything.
+               // Why? Becuase it's all protected by formPassword anyway.
+               // FIXME whitelist? Most things are okay if the user is 
prompted for a confirmation...
+               // FIXME what about /queue/ /darknet/ etc?
+               if(action.equals("/")) 
+                       return action;
+               // Otherwise disallow.
+               return null;
+       }

 }

Modified: trunk/freenet/src/freenet/clients/http/filter/HTMLFilter.java
===================================================================
--- trunk/freenet/src/freenet/clients/http/filter/HTMLFilter.java       
2006-12-07 20:49:39 UTC (rev 11288)
+++ trunk/freenet/src/freenet/clients/http/filter/HTMLFilter.java       
2006-12-07 21:08:20 UTC (rev 11289)
@@ -951,12 +951,9 @@
                        new FormTagVerifier(
                                "form",
                                new String[] {
-                                       "method",
-                                       "name",
-                                       "enctype",
-                                       "accept",
-                                       "accept-charset" },
-                               new String[] { "action" },
+                                       "name" }, // FIXME add a whitelist 
filter for accept
+                                       // All other attributes are handled by 
FormTagVerifier.
+                               new String[] { },
                                new String[] { "onsubmit", "onreset" }));
                allowedTagsVerifiers.put(
                        "input",
@@ -1571,9 +1568,15 @@
                        ParsedTag p,
                        HTMLParseContext pc) throws DataFilterException {
                        Hashtable hn = super.sanitizeHash(h, p, pc);
-                       // Action has been previously sanitized, we force it :p
-                       hn.put("action","/");
-                       
+                       String method = (String) h.get("method");
+                       String action = (String) h.get("action");
+                       String finalAction = pc.cb.processForm(method, action);
+                       if(finalAction == null) return null;
+                       hn.put("method", method);
+                       hn.put("action", finalAction);
+                       // Force enctype and accept-charset to acceptable 
values.
+                       hn.put("enctype", "multipart/form-data");
+                       hn.put("accept-charset", "UTF-8");
                        return hn;
                }
        }

Modified: trunk/freenet/src/freenet/clients/http/filter/NullFilterCallback.java
===================================================================
--- trunk/freenet/src/freenet/clients/http/filter/NullFilterCallback.java       
2006-12-07 20:49:39 UTC (rev 11288)
+++ trunk/freenet/src/freenet/clients/http/filter/NullFilterCallback.java       
2006-12-07 21:08:20 UTC (rev 11289)
@@ -5,14 +5,6 @@

 public class NullFilterCallback implements FilterCallback {

-       public boolean allowGetForms() {
-               return false;
-       }
-
-       public boolean allowPostForms() {
-               return false;
-       }
-
        public String processURI(String uri, String overrideType) {
                return null;
        }
@@ -25,4 +17,8 @@
                // Do nothing
        }

+       public String processForm(String method, String action) {
+               return null;
+       }
+
 }


Reply via email to