Author: toad
Date: 2007-03-19 23:11:30 +0000 (Mon, 19 Mar 2007)
New Revision: 12227

Added:
   trunk/freenet/src/freenet/io/EverythingMatcher.java
Modified:
   trunk/freenet/src/freenet/io/AddressMatcher.java
   trunk/freenet/src/freenet/io/AllowedHosts.java
   trunk/freenet/src/freenet/io/Inet4AddressMatcher.java
   trunk/freenet/src/freenet/io/Inet6AddressMatcher.java
Log:
Add getAllowedHosts() - may break things!

Modified: trunk/freenet/src/freenet/io/AddressMatcher.java
===================================================================
--- trunk/freenet/src/freenet/io/AddressMatcher.java    2007-03-19 22:37:59 UTC 
(rev 12226)
+++ trunk/freenet/src/freenet/io/AddressMatcher.java    2007-03-19 23:11:30 UTC 
(rev 12227)
@@ -28,4 +28,7 @@

        public boolean matches(InetAddress address);

+       /** Get the human-readable version of the Matcher */
+       public String getHumanRepresentation();
+
 }

Modified: trunk/freenet/src/freenet/io/AllowedHosts.java
===================================================================
--- trunk/freenet/src/freenet/io/AllowedHosts.java      2007-03-19 22:37:59 UTC 
(rev 12226)
+++ trunk/freenet/src/freenet/io/AllowedHosts.java      2007-03-19 23:11:30 UTC 
(rev 12227)
@@ -17,10 +17,8 @@

 import java.net.InetAddress;
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
-import java.util.Map;
 import java.util.StringTokenizer;

 import freenet.io.AddressIdentifier.AddressType;
@@ -29,12 +27,8 @@
 /** Implementation of allowedHosts */
 public class AllowedHosts {

-       /** List of allowed hosts. */
-       protected final List/* <String> */allowedHosts = new ArrayList();
-
-       /** Maps allowed hosts to address matchers, if possible. */
-       protected final Map/* <String, AddressMatcher> */addressMatchers = new 
HashMap();
-
+       protected final List addressMatchers = new ArrayList();
+       
        public AllowedHosts(String allowedHosts) {
                setAllowedHosts(allowedHosts);
        }
@@ -48,8 +42,7 @@
         */
        public void setAllowedHosts(String allowedHosts) {
                StringTokenizer allowedHostsTokens = new 
StringTokenizer(allowedHosts, ",");
-               List newAllowedHosts = new ArrayList();
-               Map newAddressMatchers = new HashMap();
+               List newAddressMatchers = new ArrayList();
                while (allowedHostsTokens.hasMoreTokens()) {
                        String allowedHost = 
allowedHostsTokens.nextToken().trim();
                        String hostname = allowedHost;
@@ -58,39 +51,42 @@
                        }
                        AddressType addressType = 
AddressIdentifier.getAddressType(hostname);
                        if (addressType == AddressType.IPv4) {
-                               newAddressMatchers.put(allowedHost, new 
Inet4AddressMatcher(allowedHost));
-                               newAllowedHosts.add(allowedHost);
+                               newAddressMatchers.add(new 
Inet4AddressMatcher(allowedHost));
                        } else if (addressType == AddressType.IPv6) {
-                               newAddressMatchers.put(allowedHost, new 
Inet6AddressMatcher(allowedHost));
-                               newAllowedHosts.add(allowedHost);
+                               newAddressMatchers.add(new 
Inet6AddressMatcher(allowedHost));
                        } else if (allowedHost.equals("*")) {
-                               newAllowedHosts.add(allowedHost);
+                               newAddressMatchers.add(new 
EverythingMatcher(AddressIdentifier.AddressType.IPv4));
+                               newAddressMatchers.add(new 
EverythingMatcher(AddressIdentifier.AddressType.IPv6));
                        } else {
-                               Logger.normal(NetworkInterface.class, "Ignoring 
invalid allowedHost: " + allowedHost);
+                               Logger.error(NetworkInterface.class, "Ignoring 
invalid allowedHost: " + allowedHost);
                        }
                }
                synchronized (this) {
-                       this.allowedHosts.clear();
-                       this.allowedHosts.addAll(newAllowedHosts);
                        this.addressMatchers.clear();
-                       this.addressMatchers.putAll(newAddressMatchers);
+                       this.addressMatchers.addAll(newAddressMatchers);
                }
        }

        public synchronized boolean allowed(AddressType clientAddressType, 
InetAddress clientAddress) {
-               boolean addressMatched = false;
-               Iterator hosts = allowedHosts.iterator();
-               while (!addressMatched && hosts.hasNext()) {
-                       String host = (String) hosts.next();
-                       AddressMatcher matcher = (AddressMatcher) 
addressMatchers.get(host);
+               for(int i=0;i<addressMatchers.size();i++) {
+                       AddressMatcher matcher = (AddressMatcher) 
addressMatchers.get(i);

-                       if (matcher != null && clientAddressType == 
matcher.getAddressType()) {
-                               addressMatched = matcher.matches(clientAddress);
-                       } else {
-                               addressMatched = "*".equals(host);
+                       if (clientAddressType == matcher.getAddressType()) {
+                               if(matcher.matches(clientAddress)) return true;
                        }
                }
-               return addressMatched;
+               return false;
        }

+       public synchronized String getAllowedHosts() {
+               StringBuffer sb = new StringBuffer();
+               for(int i=0;i<addressMatchers.size();i++) {
+                       AddressMatcher matcher = (AddressMatcher) 
addressMatchers.get(i);
+                       if(matcher instanceof EverythingMatcher) return "*";
+                       if(i != 0) sb.append(',');
+                       sb.append(matcher.getHumanRepresentation());
+               }
+               return sb.toString();
+       }
+
 }

Added: trunk/freenet/src/freenet/io/EverythingMatcher.java
===================================================================
--- trunk/freenet/src/freenet/io/EverythingMatcher.java                         
(rev 0)
+++ trunk/freenet/src/freenet/io/EverythingMatcher.java 2007-03-19 23:11:30 UTC 
(rev 12227)
@@ -0,0 +1,27 @@
+package freenet.io;
+
+import java.net.InetAddress;
+
+import freenet.io.AddressIdentifier.AddressType;
+
+public class EverythingMatcher implements AddressMatcher {
+       
+       final AddressType type;
+
+       public EverythingMatcher(AddressType t) {
+               type = t;
+       }
+       
+       public AddressType getAddressType() {
+               return type;
+       }
+
+       public boolean matches(InetAddress address) {
+               return true;
+       }
+
+       public String getHumanRepresentation() {
+               return "*";
+       }
+
+}

Modified: trunk/freenet/src/freenet/io/Inet4AddressMatcher.java
===================================================================
--- trunk/freenet/src/freenet/io/Inet4AddressMatcher.java       2007-03-19 
22:37:59 UTC (rev 12226)
+++ trunk/freenet/src/freenet/io/Inet4AddressMatcher.java       2007-03-19 
23:11:30 UTC (rev 12227)
@@ -125,4 +125,22 @@
                return new Inet4AddressMatcher(cidrHostname).matches(address);
        }

+       public String getHumanRepresentation() {
+               if(networkMask == -1)
+                       return convertToString(address);
+               else
+                       return 
convertToString(address)+'/'+convertToString(networkMask);
+       }
+
+       private String convertToString(int addr) {
+               StringBuffer sb = new StringBuffer();
+               for(int i=0;i<4;i++) {
+                       int x = addr >>> 24;
+                       addr = addr << 8;
+                       if(i != 0) sb.append('.');
+                       sb.append(x);
+               }
+               return sb.toString();
+       }
+
 }

Modified: trunk/freenet/src/freenet/io/Inet6AddressMatcher.java
===================================================================
--- trunk/freenet/src/freenet/io/Inet6AddressMatcher.java       2007-03-19 
22:37:59 UTC (rev 12226)
+++ trunk/freenet/src/freenet/io/Inet6AddressMatcher.java       2007-03-19 
23:11:30 UTC (rev 12227)
@@ -32,6 +32,11 @@
                return AddressType.IPv6;
        }

+       private static final byte[] FULL_MASK = new byte[16];
+       static {
+               Arrays.fill(FULL_MASK, (byte) 0xff);
+       }
+       
        private byte[] address;
        private byte[] netmask;

@@ -51,8 +56,7 @@
                        }
                } else {
                        address = convertToBytes(pattern);
-                       netmask = new byte[16];
-                       Arrays.fill(netmask, (byte) 0xff);
+                       netmask = FULL_MASK;
                }
                if (address.length != 16) {
                        throw new IllegalArgumentException("address is not 
IPv6");
@@ -89,4 +93,21 @@
                return new Inet6AddressMatcher(pattern).matches(address);
        }

+       public String getHumanRepresentation() {
+               if(netmask == FULL_MASK)
+                       return convertToString(address);
+               else
+                       return 
convertToString(address)+'/'+convertToString(netmask);
+       }
+
+       private String convertToString(byte[] addr) {
+               StringBuffer sb = new StringBuffer(4*8+7);
+               for(int i=0;i<8;i++) {
+                       if(i != 0) sb.append(':');
+                       int token = ((addr[i*2] & 0xff) << 8) + (addr[i*2+1] & 
0xff);
+                       sb.append(Integer.toHexString(token));
+               }
+               return sb.toString();
+       }
+
 }


Reply via email to