/** * Utility method that allows interactive testing of individal ACL records, as well as the net * effect of the ACL record list. * * <p>Run "java -cp path/to/hsqldb.jar org.hsqldb.server.ServerAcl --help" for Syntax help. */ public static void main(String[] sa) throws AclFormatException, IOException { if (sa.length > 1) { throw new RuntimeException( "Try: java -cp path/to/hsqldb.jar " + ServerAcl.class.getName() + " --help"); } if (sa.length > 0 && sa[0].equals("--help")) { System.err.println( "SYNTAX: java -cp path/to/hsqldb.jar " + ServerAcl.class.getName() + " [filepath.txt]"); System.err.println("ACL file path defaults to 'acl.txt' in the " + "current directory."); System.exit(0); } ServerAcl serverAcl = new ServerAcl(new File((sa.length == 0) ? "acl.txt" : sa[0])); serverAcl.setPrintWriter(new PrintWriter(System.out)); System.out.println(serverAcl.toString()); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.println("Enter hostnames or IP addresses to be tested " + "(one per line)."); String s; while ((s = br.readLine()) != null) { s = s.trim(); if (s.length() < 1) { continue; } System.out.println(Boolean.toString(serverAcl.permitAccess(s))); } }
public String toString() { StringBuffer sb = new StringBuffer("Addrs "); sb.append( (value.length == 16) ? ("[" + ServerAcl.colonNotation(value) + ']') : ServerAcl.dottedNotation(value)); sb.append("/" + bitBlockSize + ' ' + (allow ? "ALLOW" : "DENY")); return sb.toString(); }
/** * @return true if access for the candidate address should be permitted, false if access should be * denied. * @throws RuntimeException if no rule covers the candidate address. This would be the case if * this class is applied to some network protocol other than ipv4 or ipv6, without adding a * default rule for it. */ public boolean permitAccess(byte[] addr) { ensureAclsUptodate(); for (int i = 0; i < aclEntries.size(); i++) { if (((AclEntry) aclEntries.get(i)).matches(addr)) { AclEntry hit = (AclEntry) aclEntries.get(i); println( "Addr '" + ServerAcl.dottedNotation(addr) + "' matched rule #" + (i + 1) + ": " + hit); return hit.allow; } } throw new RuntimeException("No rule matches address '" + ServerAcl.dottedNotation(addr) + "'"); }
public void validateMask() throws AclFormatException { if (BitMap.hasAnyBitSet(BitMap.and(value, BitMap.not(mask)))) { throw new AclFormatException( "The base address '" + ServerAcl.dottedNotation(value) + "' is too specific for block-size-spec /" + bitBlockSize); } }