commit 01878416dc3bad327279913af37a105edfbfdc02 Author: Karsten Loesing karsten.loesing@gmx.net Date: Fri May 18 17:40:01 2012 +0200
Correctly handle @type annotations when parsing descriptors. --- .../torproject/descriptor/impl/DescriptorImpl.java | 46 +++++++++++--------- .../descriptor/impl/NetworkStatusImpl.java | 3 +- 2 files changed, 28 insertions(+), 21 deletions(-)
diff --git a/src/org/torproject/descriptor/impl/DescriptorImpl.java b/src/org/torproject/descriptor/impl/DescriptorImpl.java index 88db60a..7062b58 100644 --- a/src/org/torproject/descriptor/impl/DescriptorImpl.java +++ b/src/org/torproject/descriptor/impl/DescriptorImpl.java @@ -26,30 +26,31 @@ public abstract class DescriptorImpl implements Descriptor { System.arraycopy(rawDescriptorBytes, 0, first100Chars, 0, first100Chars.length); String firstLines = new String(first100Chars); - if (firstLines.startsWith("network-status-version 3\n") || - firstLines.contains("\nnetwork-status-version 3\n")) { - if (firstLines.contains("\nvote-status consensus\n")) { - parsedDescriptors.addAll(RelayNetworkStatusConsensusImpl. - parseConsensuses(rawDescriptorBytes, - failUnrecognizedDescriptorLines)); - } else if (firstLines.contains("\nvote-status vote\n")) { - parsedDescriptors.addAll(RelayNetworkStatusVoteImpl. - parseVotes(rawDescriptorBytes, - failUnrecognizedDescriptorLines)); - } else { - throw new DescriptorParseException("Could not detect relay " - + "network status type in descriptor starting with '" - + firstLines + "'."); - } + if (firstLines.startsWith("@type network-status-consensus-3 1.0\n") || + ((firstLines.startsWith("network-status-version 3\n") || + firstLines.contains("\nnetwork-status-version 3\n")) && + firstLines.contains("\nvote-status consensus\n"))) { + parsedDescriptors.addAll(RelayNetworkStatusConsensusImpl. + parseConsensuses(rawDescriptorBytes, + failUnrecognizedDescriptorLines)); + } else if (firstLines.startsWith("@type network-status-vote-3 1.0\n") + || ((firstLines.startsWith("network-status-version 3\n") || + firstLines.contains("\nnetwork-status-version 3\n")) && + firstLines.contains("\nvote-status vote\n"))) { + parsedDescriptors.addAll(RelayNetworkStatusVoteImpl. + parseVotes(rawDescriptorBytes, + failUnrecognizedDescriptorLines)); } else if (firstLines.startsWith("r ")) { parsedDescriptors.add(new BridgeNetworkStatusImpl( rawDescriptorBytes, fileName, failUnrecognizedDescriptorLines)); - } else if (firstLines.startsWith("router ") || + } else if (firstLines.startsWith("@type server-descriptor 1.0\n") || + firstLines.startsWith("router ") || firstLines.contains("\nrouter ")) { parsedDescriptors.addAll(ServerDescriptorImpl. parseDescriptors(rawDescriptorBytes, failUnrecognizedDescriptorLines)); - } else if (firstLines.startsWith("extra-info ") || + } else if (firstLines.startsWith("@type extra-info 1.0\n") || + firstLines.startsWith("extra-info ") || firstLines.contains("\nextra-info ")) { parsedDescriptors.addAll(ExtraInfoDescriptorImpl. parseDescriptors(rawDescriptorBytes, @@ -59,14 +60,19 @@ public abstract class DescriptorImpl implements Descriptor { parsedDescriptors.addAll(BridgePoolAssignmentImpl. parseDescriptors(rawDescriptorBytes, failUnrecognizedDescriptorLines)); - } else if (firstLines.startsWith("dir-key-certificate-version ")) { + } else if (firstLines.startsWith("@type dir-key-certificate-3 1.0") || + firstLines.startsWith("dir-key-certificate-version ") || + firstLines.contains("\ndir-key-certificate-version ")) { parsedDescriptors.addAll(DirectoryKeyCertificateImpl. parseDescriptors(rawDescriptorBytes, failUnrecognizedDescriptorLines)); - } else if (firstLines.startsWith("ExitNode ")) { + } else if (firstLines.startsWith("ExitNode ") || + firstLines.contains("\nExitNode ")) { parsedDescriptors.add(new ExitListImpl(rawDescriptorBytes, fileName, failUnrecognizedDescriptorLines)); - } else if (firstLines.startsWith("network-status-version 2\n")) { + } else if (firstLines.startsWith("@type network-status-2 1.0\n") || + firstLines.startsWith("network-status-version 2\n") || + firstLines.contains("\nnetwork-status-version 2\n")) { parsedDescriptors.add(new RelayNetworkStatusImpl(rawDescriptorBytes, failUnrecognizedDescriptorLines)); } else { diff --git a/src/org/torproject/descriptor/impl/NetworkStatusImpl.java b/src/org/torproject/descriptor/impl/NetworkStatusImpl.java index 5a6af9e..94a76bf 100644 --- a/src/org/torproject/descriptor/impl/NetworkStatusImpl.java +++ b/src/org/torproject/descriptor/impl/NetworkStatusImpl.java @@ -22,7 +22,8 @@ public abstract class NetworkStatusImpl extends DescriptorImpl { throws DescriptorParseException { super(rawDescriptorBytes, failUnrecognizedDescriptorLines, blankLinesAllowed); - this.splitAndParseParts(rawDescriptorBytes, containsDirSourceEntries); + this.splitAndParseParts(this.rawDescriptorBytes, + containsDirSourceEntries); }
private void splitAndParseParts(byte[] rawDescriptorBytes,
tor-commits@lists.torproject.org