From a4c0d3d6d878da55435cb9d9cc8cff6199644199 Mon Sep 17 00:00:00 2001 From: Peter Palfrader Date: Sun, 19 Oct 2003 15:08:35 +0000 Subject: Support random path creation --- .../noreply/fancydress/directory/Directory.java | 230 ++++++++++++++++++--- .../fancydress/directory/IncomingMMTPSection.java | 14 +- src/org/noreply/fancydress/directory/Server.java | 64 +++++- .../fancydress/directory/ServerDescriptor.java | 72 +++---- 4 files changed, 308 insertions(+), 72 deletions(-) (limited to 'src/org/noreply/fancydress/directory') diff --git a/src/org/noreply/fancydress/directory/Directory.java b/src/org/noreply/fancydress/directory/Directory.java index f2eda8c..ff0cfdf 100644 --- a/src/org/noreply/fancydress/directory/Directory.java +++ b/src/org/noreply/fancydress/directory/Directory.java @@ -24,6 +24,12 @@ import java.util.*; * @see Server */ public class Directory { + /** + * directory version we understand. + */ + + private static final String DIRECTORY_VERSION = "0.2"; + /** * Hash holding all Servers. * @@ -37,35 +43,27 @@ public class Directory { private Hashtable byName; /** - * Possibly add a new server descriptor to the directory. + * Useable servers. * - * This method adds a server desccriptor to the directory if it - * - conforms to the syntax specified. - * - the server is not yet known or it's identity key matches the key of the already known ServerDescriptor. + * A server is useable if it understands PacketVersions that we understand + * and has a serverdescriptor that is useable right now. + */ + private Server[] useableServers; + + /** + * Recommended servers. + */ + private Server[] recommendedServers; + + /* + * matrix of friends. * - * @param server a DirectoryMessage consisting of one of more sections. At 'Server' section needs to be present. - * @throws Mix3BadServerFormatException if a section is syntactially invalid and the error cannot be ignored. - * @throws Mix3BadServerSignatureException if the server descriptor's signature is invalid. + * (a, b) are friends, if a can send messages to b. */ - private void addServerDescriptor(DirectoryMessage server) throws Mix3BadServerFormatException, Mix3BadServerSignatureException { - try { - ServerDescriptor sd = new ServerDescriptor(server); - String key = sd.getNickname().toLowerCase(); - if (byName.containsKey(key)) { - Server s = (Server) byName.get(key); - try { - s.addDescriptor(sd); - } catch (Mix3BadServerFormatException e) { - System.err.println("Ignoring Descriptor with different identity for "+key); - } - } else { - Server s = new Server(sd); - byName.put(key, s); - } - } catch (Mix3BadServerUnrecognizedVersionException e) { - System.err.println("Ignoring unregonized version"); - } - } + /* + private boolean[][] friends; + */ + /** * Create a directory from an entire DirectoryMessage. @@ -82,11 +80,87 @@ public class Directory { */ public Directory(DirectoryMessage m, boolean checkDirectorySignature) throws Mix3BadDirectorySignatureException, + Mix3BadDirectoryFormatException, Mix3BadServerFormatException, Mix3BadServerSignatureException { byName = new Hashtable(); + + parseDirectory(m, checkDirectorySignature); + + + Collection all = byName.values(); + ArrayList useable = new ArrayList(); + for (Iterator i = all.iterator(); i.hasNext(); ) { + Server s = (Server) i.next(); + if (s.isUseable()) + useable.add(s); + } + useableServers = (Server[]) useable.toArray( new Server[useable.size()] ); + + + ArrayList recommended = new ArrayList(); + for (int i=0; i 65535) throw new Mix3BadServerFormatException("Port is not in TCP/IP port range in " + name + " section"); - protocols = entryProtocols.getValue(); + protocols = Util.tokenize(entryProtocols.getValue(), ','); } public InetAddress getIP() { @@ -110,4 +115,7 @@ public class IncomingMMTPSection { public int getPort() { return port; } + public String[] getProtocols() { + return protocols; + } } diff --git a/src/org/noreply/fancydress/directory/Server.java b/src/org/noreply/fancydress/directory/Server.java index c4052d9..45ca720 100644 --- a/src/org/noreply/fancydress/directory/Server.java +++ b/src/org/noreply/fancydress/directory/Server.java @@ -34,6 +34,11 @@ public class Server { */ ArrayList descriptors; + /** + * whether or not this node is recommended. + */ + boolean recommended; + /** * Construct a Server from a given ServerDescriptor. * @@ -46,6 +51,51 @@ public class Server { descriptors = new ArrayList(); descriptors.add(descriptor); + recommended = false; + } + + /** + * Set this node recommended. + * + * This is done by the Directory according to the recommended-servers list. + * + * @see Directory + */ + public void setRecommended() { + recommended = true; + } + + /** + * Get whether or not this node recommended. + * + * @return whether or not this node is recommended + */ + public boolean isRecommended() { + return recommended; + } + + /** + * Get whether or not this node is useable. + * + * A server is useable if it understands PacketVersions that we speak, + * has a serverdescriptor that is useable right now, and this SD has + * an Incoming/MMTP section. + * + * @return whether or not this node is useable + */ + public boolean isUseable() { + ServerDescriptor sd; + try { + sd = getDescriptor(); + } catch (Mix3NoServerDescriptorException e) { + return false; + } + String[] pv = sd.getPacketVersions(); /* getPacketVersions only returns packet versions that we understand */ + if (pv.length == 0) + return false; + if (sd.getIncomingMMTPSection() == null) + return false; + return true; } /** @@ -76,12 +126,22 @@ public class Server { return keyid; } + /** + * Get the nickname of this server. + * + * @return nickname + */ + public String getNickname() { + return nickname; + } + /** * get the the currently valid server descriptor. * * @return current server descriptor + * @throws Mix3NoServerDescriptorException if there is no valid server descriptor */ - public ServerDescriptor getDescriptor() throws Mix3Exception { + public ServerDescriptor getDescriptor() throws Mix3NoServerDescriptorException { ServerDescriptor result = null; Date now = new Date(); @@ -93,7 +153,7 @@ public class Server { result = desc; } if (result == null) - throw new Mix3Exception("No valid server descriptor found."); + throw new Mix3NoServerDescriptorException("No valid server descriptor found."); return result; } } diff --git a/src/org/noreply/fancydress/directory/ServerDescriptor.java b/src/org/noreply/fancydress/directory/ServerDescriptor.java index 020d31b..4c0cba1 100644 --- a/src/org/noreply/fancydress/directory/ServerDescriptor.java +++ b/src/org/noreply/fancydress/directory/ServerDescriptor.java @@ -23,6 +23,11 @@ import java.text.ParseException; * @see Server */ public class ServerDescriptor { + /* +ปญญญญญญญ * descriptor version we understand. +ปญญญญญญญ */ + private static final String DESCRIPTOR_VERSION = "0.2"; + /* Required */ private String descriptorVersion; private String nickname; @@ -46,7 +51,7 @@ public class ServerDescriptor { private String whyInsecure; private IncomingMMTPSection incomingMMTPSection; - private Object outgoingMMTPSection; + private OutgoingMMTPSection outgoingMMTPSection; private DeliveryMBOXSection deliveryMBOXSection; private DeliverySMTPSection deliverySMTPSection; private Object deliveryFragmentedSection; @@ -82,6 +87,11 @@ public class ServerDescriptor { incomingMMTPSection = section == null ? null : new IncomingMMTPSection(section); } catch (Mix3BadServerFormatException e) { System.err.println(e); }; + section = m.getSection("Outgoing/MMTP"); + try { + outgoingMMTPSection = section == null ? null : new OutgoingMMTPSection(section); + } catch (Mix3BadServerFormatException e) { System.err.println(e); }; + section = m.getSection("Delivery/MBOX"); try { deliveryMBOXSection = section == null ? null : new DeliveryMBOXSection(section); @@ -120,46 +130,18 @@ public class ServerDescriptor { * Whitespace is trimmed off each Packet-Version. * * @param s the comma separated list of Packet-Versions - * @param onlySupported only include Packet-Versions that we can handle * @return array of Packet-Versions. */ - public static String[] parsePacketVersions(String s, boolean onlySupported) { + public static String[] parsePacketVersions(String s) { ArrayList versions = new ArrayList(); int indexFrom = 0; int indexOf; - while ((indexOf = s.indexOf(',', indexFrom)) != -1) { - String v = s.substring(indexFrom, indexOf).trim(); - if (!v.equals("") && (Packet.isPacketVersionSupported(v) || !onlySupported )) - versions.add( v ); - indexFrom = indexOf + 1; - } - String v = s.substring(indexFrom).trim(); - if (!v.equals("") && (Packet.isPacketVersionSupported(v) || !onlySupported )) - versions.add( v ); - - String[] result = new String[versions.size()]; - for (int i=0; i