support for CAPTCHAs
[mir.git] / source / mir / session / HTTPAdapters.java
index 5dcc510..cbeead5 100755 (executable)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2001, 2002 The Mir-coders group
+ * Copyright (C) 2001-2006 The Mir-coders group
  *
  * This file is part of Mir.
  *
@@ -19,8 +19,6 @@
  *
  * In addition, as a special exception, The Mir-coders gives permission to link
  * the code of this program with  any library licensed under the Apache Software License,
- * The Sun (tm) Java Advanced Imaging library (JAI), The Sun JIMI library
- * (or with modified versions of the above that use the same license as the above),
  * and distribute linked combinations including the two.  You must obey the
  * GNU General Public License in all respects for all of the code used other than
  * the above mentioned libraries.  If you modify this file, you may extend this
  */
 package mir.session;
 
-import java.util.Arrays;
-import java.util.List;
-import java.util.Vector;
+import mir.util.HTTPParsedRequest;
+import org.apache.commons.fileupload.FileItem;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpSession;
-
-import mir.util.HTTPParsedRequest;
-
-import org.apache.commons.fileupload.FileItem;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.Iterator;
+import java.util.List;
 
 public class HTTPAdapters {
   public static class HTTPRequestAdapter implements Request {
     private HttpServletRequest request;
+    private String cachedHostName = null;
 
     public HTTPRequestAdapter(HttpServletRequest aRequest) {
       request = aRequest;
@@ -52,20 +54,50 @@ public class HTTPAdapters {
       if (aHeaderName.equals("ip"))
         return request.getRemoteAddr();
 
+      if (aHeaderName.equals("hostname")) {
+        if (aHeaderName.equals("hostname")) {
+          if (cachedHostName==null) {
+            try {
+              cachedHostName = InetAddress.getByName(request.getRemoteAddr()).getHostName();
+            }
+            catch (UnknownHostException e) {
+              cachedHostName = request.getRemoteAddr();
+            }
+          }
+
+          return cachedHostName;
+        }
+
+      }
+
       return request.getHeader(aHeaderName);
-    };
+    }
 
     public String getParameter(String aName) {
       return request.getParameter(aName);
-    };
+    }
+
+    public List getPrefixedParameterNames(String aPrefix) {
+      List result = new ArrayList();
+
+      Enumeration enumeration = request.getParameterNames();
+      while (enumeration.hasMoreElements()) {
+        String name = (String) enumeration.nextElement();
+        if (name.startsWith(aPrefix)) {
+          result.add(name);
+        }
+      }
+
+      return result;
+    }
 
     public List getUploadedFiles() {
-      return new Vector();
-    };
+      return Collections.EMPTY_LIST;
+    }
 
     public List getParameters(String aName) {
       return Arrays.asList(request.getParameterValues(aName));
-    };
+    }
 
     public HttpServletRequest getRequest() {
       return request;
@@ -74,28 +106,63 @@ public class HTTPAdapters {
 
   public static class HTTPParsedRequestAdapter implements Request {
     private HTTPParsedRequest request;
+    private String cachedHostName = null;
 
     public HTTPParsedRequestAdapter(HTTPParsedRequest aRequest) {
       request = aRequest;
     }
 
     public String getHeader(String aHeaderName) {
-      if (aHeaderName.equals("ip"))
-        return request.getRequest().getRemoteAddr();
+      if (aHeaderName.equals("ip")) {
+        // transparent proxies propagate the originating ip in the x-forwarded-for
+        // header. So if it's there, we should use it.
+        Enumeration headers = request.getRequest().getHeaders("x-forwarded-for");
+        if (headers.hasMoreElements()) {
+          return (String) headers.nextElement();
+        }
+                               return request.getRequest().getRemoteAddr();
+      }
+
+      if (aHeaderName.equals("hostname")) {
+        if (cachedHostName==null) {
+          try {
+            cachedHostName = InetAddress.getByName(getHeader("ip")).getHostName();
+          }
+          catch (UnknownHostException e) {
+            cachedHostName = request.getRequest().getRemoteAddr();
+          }
+        }
+
+        return cachedHostName;
+      }
 
       return request.getHeader(aHeaderName);
-    };
+    }
 
     public String getParameter(String aName) {
       return request.getParameter(aName);
-    };
+    }
 
     public List getParameters(String aName) {
       return request.getParameterList(aName);
-    };
+    }
+
+    public List getPrefixedParameterNames(String aPrefix) {
+      List result = new ArrayList();
+
+      Iterator i = request.getParameterNames().iterator();
+
+      while (i.hasNext()) {
+        String name = (String) i.next();
+        if (name.startsWith(aPrefix)) {
+          result.add(name);
+        }
+      }
+      return result;
+    }
 
     public List getUploadedFiles() {
-      List result = new Vector();
+      List result = new ArrayList();
       List files = request.getFiles();
 
       for (int i=0; i<files.size(); i++) {
@@ -103,7 +170,7 @@ public class HTTPAdapters {
       }
 
       return result;
-    };
+    }
 
     public HttpServletRequest getRequest() {
       return request.getRequest();
@@ -116,6 +183,11 @@ public class HTTPAdapters {
     public HTTPSessionAdapter(HttpSession aSession) {
       session = aSession;
     }
+
+    public String getId() {
+      return session.getId();
+    }
+
     public Object getAttribute(String aName) {
       return session.getAttribute(aName);
     }