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();
+ }
+
}