commit 5b73e0eb9afe09b0f9e73773b4310644de987837 Author: iwakeh iwakeh@users.ourproject.org Date: Tue Dec 22 22:00:00 2015 +0000
task-17824 addendum. --- .../descriptor/impl/DirSourceEntryImpl.java | 35 +++-- .../impl/DirectoryKeyCertificateImpl.java | 53 ++++---- .../descriptor/impl/DirectorySignatureImpl.java | 41 +++--- .../descriptor/impl/DownloadCoordinatorImpl.java | 75 ++++++----- .../descriptor/impl/ExtraInfoDescriptorImpl.java | 62 ++++----- .../descriptor/impl/MicrodescriptorImpl.java | 72 +++++----- .../descriptor/impl/NetworkStatusEntryImpl.java | 25 ++-- .../descriptor/impl/NetworkStatusImpl.java | 27 ++-- .../torproject/descriptor/impl/ParseHelper.java | 12 ++ .../descriptor/impl/RelayDirectoryImpl.java | 64 +++++---- .../descriptor/impl/RelayNetworkStatusImpl.java | 61 +++++---- .../impl/RelayNetworkStatusVoteImpl.java | 14 +- .../descriptor/impl/ServerDescriptorImpl.java | 137 ++++++++++---------- 13 files changed, 377 insertions(+), 301 deletions(-)
diff --git a/src/org/torproject/descriptor/impl/DirSourceEntryImpl.java b/src/org/torproject/descriptor/impl/DirSourceEntryImpl.java index 3a59d5b..3ea0179 100644 --- a/src/org/torproject/descriptor/impl/DirSourceEntryImpl.java +++ b/src/org/torproject/descriptor/impl/DirSourceEntryImpl.java @@ -80,25 +80,34 @@ public class DirSourceEntryImpl implements DirSourceEntry { boolean skipCrypto = false; while (s.hasNext()) { String line = s.next(); - if (line.startsWith("dir-source")) { + String[] parts = line.split(" "); + switch (parts[0]) { + case "dir-source": this.parseDirSourceLine(line); - } else if (line.startsWith("contact")) { + break; + case "contact": this.parseContactLine(line); - } else if (line.startsWith("vote-digest")) { + break; + case "vote-digest": this.parseVoteDigestLine(line); - } else if (line.startsWith("-----BEGIN")) { + break; + case "-----BEGIN": skipCrypto = true; - } else if (line.startsWith("-----END")) { + break; + case "-----END": skipCrypto = false; - } else if (!skipCrypto) { - if (this.failUnrecognizedDescriptorLines) { - throw new DescriptorParseException("Unrecognized line '" - + line + "' in dir-source entry."); - } else { - if (this.unrecognizedLines == null) { - this.unrecognizedLines = new ArrayList<>(); + break; + default: + if (!skipCrypto) { + if (this.failUnrecognizedDescriptorLines) { + throw new DescriptorParseException("Unrecognized line '" + + line + "' in dir-source entry."); + } else { + if (this.unrecognizedLines == null) { + this.unrecognizedLines = new ArrayList<>(); + } + this.unrecognizedLines.add(line); } - this.unrecognizedLines.add(line); } } } diff --git a/src/org/torproject/descriptor/impl/DirectoryKeyCertificateImpl.java b/src/org/torproject/descriptor/impl/DirectoryKeyCertificateImpl.java index 2b7d3ea..1039bbd 100644 --- a/src/org/torproject/descriptor/impl/DirectoryKeyCertificateImpl.java +++ b/src/org/torproject/descriptor/impl/DirectoryKeyCertificateImpl.java @@ -98,33 +98,34 @@ public class DirectoryKeyCertificateImpl extends DescriptorImpl this.parseDirKeyCertificationLine(line, parts); nextCrypto = "dir-key-certification"; break; + case "-----BEGIN": + crypto = new StringBuilder(); + crypto.append(line).append("\n"); + break; + case "-----END": + crypto.append(line).append("\n"); + String cryptoString = crypto.toString(); + crypto = null; + switch (nextCrypto) { + case "dir-identity-key": + this.dirIdentityKey = cryptoString; + break; + case "dir-signing-key": + this.dirSigningKey = cryptoString; + break; + case "dir-key-crosscert": + this.dirKeyCrosscert = cryptoString; + break; + case "dir-key-certification": + this.dirKeyCertification = cryptoString; + break; + default: + throw new DescriptorParseException("Unrecognized crypto " + + "block in directory key certificate."); + } + nextCrypto = ""; default: - if (line.startsWith("-----BEGIN")) { - crypto = new StringBuilder(); - crypto.append(line).append("\n"); - } else if (line.startsWith("-----END")) { - crypto.append(line).append("\n"); - String cryptoString = crypto.toString(); - crypto = null; - switch (nextCrypto) { - case "dir-identity-key": - this.dirIdentityKey = cryptoString; - break; - case "dir-signing-key": - this.dirSigningKey = cryptoString; - break; - case "dir-key-crosscert": - this.dirKeyCrosscert = cryptoString; - break; - case "dir-key-certification": - this.dirKeyCertification = cryptoString; - break; - default: - throw new DescriptorParseException("Unrecognized crypto " - + "block in directory key certificate."); - } - nextCrypto = ""; - } else if (crypto != null) { + if (crypto != null) { crypto.append(line).append("\n"); } else { if (this.failUnrecognizedDescriptorLines) { diff --git a/src/org/torproject/descriptor/impl/DirectorySignatureImpl.java b/src/org/torproject/descriptor/impl/DirectorySignatureImpl.java index 8cf6589..18de918 100644 --- a/src/org/torproject/descriptor/impl/DirectorySignatureImpl.java +++ b/src/org/torproject/descriptor/impl/DirectorySignatureImpl.java @@ -40,13 +40,19 @@ public class DirectorySignatureImpl implements DirectorySignature { StringBuilder crypto = null; while (s.hasNext()) { String line = s.next(); - if (line.startsWith("directory-signature ")) { - String[] parts = line.split(" ", -1); + String[] parts = line.split(" ", -1); + String keyword = parts[0]; + switch (keyword) { + case "directory-signature": int algorithmOffset = 0; - if (parts.length == 4) { + switch (parts.length) { + case 4: this.algorithm = parts[1]; algorithmOffset = 1; - } else if (parts.length != 3) { + break; + case 3: + break; + default: throw new DescriptorParseException("Illegal line '" + line + "'."); } @@ -54,25 +60,30 @@ public class DirectorySignatureImpl implements DirectorySignature { parts[1 + algorithmOffset]); this.signingKeyDigest = ParseHelper.parseTwentyByteHexString( line, parts[2 + algorithmOffset]); - } else if (line.startsWith("-----BEGIN")) { + break; + case "-----BEGIN": crypto = new StringBuilder(); crypto.append(line).append("\n"); - } else if (line.startsWith("-----END")) { + break; + case "-----END": crypto.append(line).append("\n"); String cryptoString = crypto.toString(); crypto = null; this.signature = cryptoString; - } else if (crypto != null) { - crypto.append(line).append("\n"); - } else { - if (this.failUnrecognizedDescriptorLines) { - throw new DescriptorParseException("Unrecognized line '" - + line + "' in dir-source entry."); + break; + default: + if (crypto != null) { + crypto.append(line).append("\n"); } else { - if (this.unrecognizedLines == null) { - this.unrecognizedLines = new ArrayList<>(); + if (this.failUnrecognizedDescriptorLines) { + throw new DescriptorParseException("Unrecognized line '" + + line + "' in dir-source entry."); + } else { + if (this.unrecognizedLines == null) { + this.unrecognizedLines = new ArrayList<>(); + } + this.unrecognizedLines.add(line); } - this.unrecognizedLines.add(line); } } } diff --git a/src/org/torproject/descriptor/impl/DownloadCoordinatorImpl.java b/src/org/torproject/descriptor/impl/DownloadCoordinatorImpl.java index e95f9da..6a73090 100644 --- a/src/org/torproject/descriptor/impl/DownloadCoordinatorImpl.java +++ b/src/org/torproject/descriptor/impl/DownloadCoordinatorImpl.java @@ -203,48 +203,51 @@ public class DownloadCoordinatorImpl implements DownloadCoordinator { if (response.getException() != null) { this.runningDirectories.remove(nickname); } - if (response.getDescriptorType().equals("consensus")) { - this.requestingConsensuses.remove(nickname); - if (response.getResponseCode() == 200 && - response.getDescriptors() != null) { - if (this.includeCurrentReferencedVotes) { - /* TODO Only add votes if the consensus is not older than one - * hour. Or does that make no sense? */ - for (Descriptor parsedDescriptor : response.getDescriptors()) { - if (!(parsedDescriptor instanceof - RelayNetworkStatusConsensus)) { - continue; - } - RelayNetworkStatusConsensus parsedConsensus = - (RelayNetworkStatusConsensus) parsedDescriptor; - for (DirSourceEntry dirSource : - parsedConsensus.getDirSourceEntries().values()) { - String identity = dirSource.getIdentity(); - if (!this.missingVotes.contains(identity)) { - boolean alreadyRequested = false; - for (Set<String> requestedBefore : - this.requestedVotes.values()) { - if (requestedBefore.contains(identity)) { - alreadyRequested = true; - break; + switch (response.getDescriptorType()) { + case "consensus": + this.requestingConsensuses.remove(nickname); + if (response.getResponseCode() == 200 && + response.getDescriptors() != null) { + if (this.includeCurrentReferencedVotes) { + /* TODO Only add votes if the consensus is not older than one + * hour. Or does that make no sense? */ + for (Descriptor parsedDescriptor : + response.getDescriptors()) { + if (!(parsedDescriptor instanceof + RelayNetworkStatusConsensus)) { + continue; + } + RelayNetworkStatusConsensus parsedConsensus = + (RelayNetworkStatusConsensus) parsedDescriptor; + for (DirSourceEntry dirSource : + parsedConsensus.getDirSourceEntries().values()) { + String identity = dirSource.getIdentity(); + if (!this.missingVotes.contains(identity)) { + boolean alreadyRequested = false; + for (Set<String> requestedBefore : + this.requestedVotes.values()) { + if (requestedBefore.contains(identity)) { + alreadyRequested = true; + break; + } + } + if (!alreadyRequested) { + this.missingVotes.add(identity); } - } - if (!alreadyRequested) { - this.missingVotes.add(identity); } } } + /* TODO Later, add referenced server descriptors. */ } - /* TODO Later, add referenced server descriptors. */ + } else { + this.missingConsensus = true; + } + break; + case "vote": + String requestedVote = requestingVotes.remove(nickname); + if (response.getResponseCode() != 200) { + this.missingVotes.add(requestedVote); } - } else { - this.missingConsensus = true; - } - } else if (response.getDescriptorType().equals("vote")) { - String requestedVote = requestingVotes.remove(nickname); - if (response.getResponseCode() != 200) { - this.missingVotes.add(requestedVote); - } } if (response.getRequestEnd() != 0L) { this.descriptorQueue.add(response); diff --git a/src/org/torproject/descriptor/impl/ExtraInfoDescriptorImpl.java b/src/org/torproject/descriptor/impl/ExtraInfoDescriptorImpl.java index 4fcf4c9..3255bd9 100644 --- a/src/org/torproject/descriptor/impl/ExtraInfoDescriptorImpl.java +++ b/src/org/torproject/descriptor/impl/ExtraInfoDescriptorImpl.java @@ -238,40 +238,42 @@ public abstract class ExtraInfoDescriptorImpl extends DescriptorImpl case "router-digest-sha256": this.parseRouterDigestSha256Line(line, lineNoOpt, partsNoOpt); break; - default: - if (line.startsWith("-----BEGIN")) { - cryptoLines = new ArrayList<>(); - cryptoLines.add(line); - } else if (line.startsWith("-----END")) { - cryptoLines.add(line); - StringBuilder sb = new StringBuilder(); - for (String cryptoLine : cryptoLines) { - sb.append("\n").append(cryptoLine); - } - String cryptoString = sb.toString().substring(1); - switch (nextCrypto) { - case "router-signature": - this.routerSignature = cryptoString; - break; - case "identity-ed25519": - this.identityEd25519 = cryptoString; - this.parseIdentityEd25519CryptoBlock(cryptoString); - break; - default: - if (this.failUnrecognizedDescriptorLines) { - throw new DescriptorParseException("Unrecognized crypto " - + "block '" + cryptoString + "' in extra-info " - + "descriptor."); - } else { - if (this.unrecognizedLines == null) { - this.unrecognizedLines = new ArrayList<>(); - } - this.unrecognizedLines.addAll(cryptoLines); + case "-----BEGIN": + cryptoLines = new ArrayList<>(); + cryptoLines.add(line); + break; + case "-----END": + cryptoLines.add(line); + StringBuilder sb = new StringBuilder(); + for (String cryptoLine : cryptoLines) { + sb.append("\n").append(cryptoLine); + } + String cryptoString = sb.toString().substring(1); + switch (nextCrypto) { + case "router-signature": + this.routerSignature = cryptoString; + break; + case "identity-ed25519": + this.identityEd25519 = cryptoString; + this.parseIdentityEd25519CryptoBlock(cryptoString); + break; + default: + if (this.failUnrecognizedDescriptorLines) { + throw new DescriptorParseException("Unrecognized crypto " + + "block '" + cryptoString + "' in extra-info " + + "descriptor."); + } else { + if (this.unrecognizedLines == null) { + this.unrecognizedLines = new ArrayList<>(); } + this.unrecognizedLines.addAll(cryptoLines); } cryptoLines = null; nextCrypto = ""; - } else if (cryptoLines != null) { + } + break; + default: + if (cryptoLines != null) { cryptoLines.add(line); } else { ParseHelper.parseKeyword(line, partsNoOpt[0]); diff --git a/src/org/torproject/descriptor/impl/MicrodescriptorImpl.java b/src/org/torproject/descriptor/impl/MicrodescriptorImpl.java index d303fa0..cf8f3e6 100644 --- a/src/org/torproject/descriptor/impl/MicrodescriptorImpl.java +++ b/src/org/torproject/descriptor/impl/MicrodescriptorImpl.java @@ -89,22 +89,24 @@ public class MicrodescriptorImpl extends DescriptorImpl case "id": this.parseIdLine(line, parts); break; + case "-----BEGIN": + crypto = new StringBuilder(); + crypto.append(line).append("\n"); + break; + case "-----END": + crypto.append(line).append("\n"); + String cryptoString = crypto.toString(); + crypto = null; + if (nextCrypto.equals("onion-key")) { + this.onionKey = cryptoString; + } else { + throw new DescriptorParseException("Unrecognized crypto " + + "block in microdescriptor."); + } + nextCrypto = ""; + break; default: - if (line.startsWith("-----BEGIN")) { - crypto = new StringBuilder(); - crypto.append(line).append("\n"); - } else if (line.startsWith("-----END")) { - crypto.append(line).append("\n"); - String cryptoString = crypto.toString(); - crypto = null; - if (nextCrypto.equals("onion-key")) { - this.onionKey = cryptoString; - } else { - throw new DescriptorParseException("Unrecognized crypto " - + "block in microdescriptor."); - } - nextCrypto = ""; - } else if (crypto != null) { + if (crypto != null) { crypto.append(line).append("\n"); } else { ParseHelper.parseKeyword(line, parts[0]); @@ -191,15 +193,20 @@ public class MicrodescriptorImpl extends DescriptorImpl boolean isValid = true; if (parts.length != 3) { isValid = false; - } else if (!parts[1].equals("accept") && !parts[1].equals("reject")) { - isValid = false; - } else { - String[] ports = parts[2].split(",", -1); - for (int i = 0; i < ports.length; i++) { - if (ports[i].length() < 1) { - isValid = false; - break; + } else { + switch (parts[1]) { + case "accept": + case "reject": + String[] ports = parts[2].split(",", -1); + for (int i = 0; i < ports.length; i++) { + if (ports[i].length() < 1) { + isValid = false; + break; + } } + break; + default: + isValid = false; } } if (!isValid) { @@ -211,14 +218,19 @@ public class MicrodescriptorImpl extends DescriptorImpl throws DescriptorParseException { if (parts.length != 3) { throw new DescriptorParseException("Illegal line '" + line + "'."); - } else if ("ed25519".equals(parts[1])) { - ParseHelper.parseThirtyTwoByteBase64String(line, parts[2]); - this.ed25519Identity = parts[2]; - } else if ("rsa1024".equals(parts[1])) { - ParseHelper.parseTwentyByteBase64String(line, parts[2]); - this.rsa1024Identity = parts[2]; } else { - throw new DescriptorParseException("Illegal line '" + line + "'."); + switch (parts[1]) { + case "ed25519": + ParseHelper.parseThirtyTwoByteBase64String(line, parts[2]); + this.ed25519Identity = parts[2]; + break; + case "rsa1024": + ParseHelper.parseTwentyByteBase64String(line, parts[2]); + this.rsa1024Identity = parts[2]; + break; + default: + throw new DescriptorParseException("Illegal line '" + line + "'."); + } } }
diff --git a/src/org/torproject/descriptor/impl/NetworkStatusEntryImpl.java b/src/org/torproject/descriptor/impl/NetworkStatusEntryImpl.java index c5f0704..a17973e 100644 --- a/src/org/torproject/descriptor/impl/NetworkStatusEntryImpl.java +++ b/src/org/torproject/descriptor/impl/NetworkStatusEntryImpl.java @@ -213,18 +213,23 @@ public class NetworkStatusEntryImpl implements NetworkStatusEntry { boolean isValid = true; if (parts.length != 3) { isValid = false; - } else if (!parts[1].equals("accept") && !parts[1].equals("reject")) { - isValid = false; } else { - this.defaultPolicy = parts[1]; - this.portList = parts[2]; - String[] ports = parts[2].split(",", -1); - for (int i = 0; i < ports.length; i++) { - if (ports[i].length() < 1) { - isValid = false; - break; + switch (parts[1]) { + case "accept": + case "reject": + this.defaultPolicy = parts[1]; + this.portList = parts[2]; + String[] ports = parts[2].split(",", -1); + for (int i = 0; i < ports.length; i++) { + if (ports[i].length() < 1) { + isValid = false; + break; + } + } + break; + default: + isValid = false; } - } } if (!isValid) { throw new DescriptorParseException("Illegal line '" + line + "'."); diff --git a/src/org/torproject/descriptor/impl/NetworkStatusImpl.java b/src/org/torproject/descriptor/impl/NetworkStatusImpl.java index a9c2483..9a950cf 100644 --- a/src/org/torproject/descriptor/impl/NetworkStatusImpl.java +++ b/src/org/torproject/descriptor/impl/NetworkStatusImpl.java @@ -177,19 +177,22 @@ public abstract class NetworkStatusImpl extends DescriptorImpl { protected String[] parseClientOrServerVersions(String line, String[] parts) throws DescriptorParseException { String[] result = null; - if (parts.length > 2) { - throw new DescriptorParseException("Illegal versions line '" + line - + "'."); - } else if (parts.length == 2) { - result = parts[1].split(",", -1); - for (String version : result) { - if (version.length() < 1) { - throw new DescriptorParseException("Illegal versions line '" - + line + "'."); + switch (parts.length) { + case 1: + result = new String[0]; + break; + case 2: + result = parts[1].split(",", -1); + for (String version : result) { + if (version.length() < 1) { + throw new DescriptorParseException("Illegal versions line '" + + line + "'."); + } } - } - } else if (parts.length == 1) { - result = new String[0]; + break; + default: + throw new DescriptorParseException("Illegal versions line '" + line + + "'."); } return result; } diff --git a/src/org/torproject/descriptor/impl/ParseHelper.java b/src/org/torproject/descriptor/impl/ParseHelper.java index 43a44d1..6ae549b 100644 --- a/src/org/torproject/descriptor/impl/ParseHelper.java +++ b/src/org/torproject/descriptor/impl/ParseHelper.java @@ -263,6 +263,18 @@ public class ParseHelper { return nickname; }
+ public static boolean parseBoolean(String b, String line) + throws DescriptorParseException { + switch (b) { + case "1": + return true; + case "0": + return false; + default: + throw new DescriptorParseException("Illegal line '" + line + "'."); + } + } + private static Pattern twentyByteBase64Pattern = Pattern.compile("^[0-9a-zA-Z+/]{27}$"); public static String parseTwentyByteBase64String(String line, diff --git a/src/org/torproject/descriptor/impl/RelayDirectoryImpl.java b/src/org/torproject/descriptor/impl/RelayDirectoryImpl.java index ac17f54..873326d 100644 --- a/src/org/torproject/descriptor/impl/RelayDirectoryImpl.java +++ b/src/org/torproject/descriptor/impl/RelayDirectoryImpl.java @@ -227,23 +227,25 @@ public class RelayDirectoryImpl extends DescriptorImpl case "router-status": routerStatusLine = line; break; + case "-----BEGIN": + crypto = new StringBuilder(); + crypto.append(line).append("\n"); + break; + case "-----END": + crypto.append(line).append("\n"); + String cryptoString = crypto.toString(); + crypto = null; + if (nextCrypto.equals("dir-signing-key") && + this.dirSigningKey == null) { + this.dirSigningKey = cryptoString; + } else { + throw new DescriptorParseException("Unrecognized crypto " + + "block in v1 directory."); + } + nextCrypto = ""; + break; default: - if (line.startsWith("-----BEGIN")) { - crypto = new StringBuilder(); - crypto.append(line).append("\n"); - } else if (line.startsWith("-----END")) { - crypto.append(line).append("\n"); - String cryptoString = crypto.toString(); - crypto = null; - if (nextCrypto.equals("dir-signing-key") && - this.dirSigningKey == null) { - this.dirSigningKey = cryptoString; - } else { - throw new DescriptorParseException("Unrecognized crypto " - + "block in v1 directory."); - } - nextCrypto = ""; - } else if (crypto != null) { + if (crypto != null) { crypto.append(line).append("\n"); } else { if (this.failUnrecognizedDescriptorLines) { @@ -313,13 +315,16 @@ public class RelayDirectoryImpl extends DescriptorImpl line.substring("opt ".length()) : line; String[] partsNoOpt = lineNoOpt.split("[ \t]+"); String keyword = partsNoOpt[0]; - if (keyword.equals("directory-signature")) { + switch (keyword) { + case "directory-signature": this.parseDirectorySignatureLine(line, lineNoOpt, partsNoOpt); nextCrypto = "directory-signature"; - } else if (line.startsWith("-----BEGIN")) { + break; + case "-----BEGIN": crypto = new StringBuilder(); crypto.append(line).append("\n"); - } else if (line.startsWith("-----END")) { + break; + case "-----END": crypto.append(line).append("\n"); String cryptoString = crypto.toString(); crypto = null; @@ -330,16 +335,19 @@ public class RelayDirectoryImpl extends DescriptorImpl + "block in v2 network status."); } nextCrypto = ""; - } else if (crypto != null) { - crypto.append(line).append("\n"); - } else if (this.failUnrecognizedDescriptorLines) { - throw new DescriptorParseException("Unrecognized line '" + line - + "' in v2 network status."); - } else { - if (this.unrecognizedLines == null) { - this.unrecognizedLines = new ArrayList<>(); + break; + default: + if (crypto != null) { + crypto.append(line).append("\n"); + } else if (this.failUnrecognizedDescriptorLines) { + throw new DescriptorParseException("Unrecognized line '" + line + + "' in v2 network status."); + } else { + if (this.unrecognizedLines == null) { + this.unrecognizedLines = new ArrayList<>(); + } + this.unrecognizedLines.add(line); } - this.unrecognizedLines.add(line); } } } diff --git a/src/org/torproject/descriptor/impl/RelayNetworkStatusImpl.java b/src/org/torproject/descriptor/impl/RelayNetworkStatusImpl.java index 7788040..9ac3284 100644 --- a/src/org/torproject/descriptor/impl/RelayNetworkStatusImpl.java +++ b/src/org/torproject/descriptor/impl/RelayNetworkStatusImpl.java @@ -126,22 +126,23 @@ public class RelayNetworkStatusImpl extends NetworkStatusImpl case "dir-options": this.parseDirOptionsLine(line, parts); break; + case "-----BEGIN": + crypto = new StringBuilder(); + crypto.append(line).append("\n"); + break; + case "-----END": + crypto.append(line).append("\n"); + String cryptoString = crypto.toString(); + crypto = null; + if (nextCrypto.equals("dir-signing-key")) { + this.dirSigningKey = cryptoString; + } else { + throw new DescriptorParseException("Unrecognized crypto " + + "block in v2 network status."); + } + nextCrypto = ""; default: - if (line.startsWith("-----BEGIN")) { - crypto = new StringBuilder(); - crypto.append(line).append("\n"); - } else if (line.startsWith("-----END")) { - crypto.append(line).append("\n"); - String cryptoString = crypto.toString(); - crypto = null; - if (nextCrypto.equals("dir-signing-key")) { - this.dirSigningKey = cryptoString; - } else { - throw new DescriptorParseException("Unrecognized crypto " - + "block in v2 network status."); - } - nextCrypto = ""; - } else if (crypto != null) { + if (crypto != null) { crypto.append(line).append("\n"); } else if (this.failUnrecognizedDescriptorLines) { throw new DescriptorParseException("Unrecognized line '" + line @@ -172,13 +173,16 @@ public class RelayNetworkStatusImpl extends NetworkStatusImpl String line = s.next(); String[] parts = line.split("[ \t]+"); String keyword = parts[0]; - if (keyword.equals("directory-signature")) { + switch (keyword) { + case "directory-signature": this.parseDirectorySignatureLine(line, parts); nextCrypto = "directory-signature"; - } else if (line.startsWith("-----BEGIN")) { + break; + case "-----BEGIN": crypto = new StringBuilder(); crypto.append(line).append("\n"); - } else if (line.startsWith("-----END")) { + break; + case "-----END": crypto.append(line).append("\n"); String cryptoString = crypto.toString(); crypto = null; @@ -189,16 +193,19 @@ public class RelayNetworkStatusImpl extends NetworkStatusImpl + "block in v2 network status."); } nextCrypto = ""; - } else if (crypto != null) { - crypto.append(line).append("\n"); - } else if (this.failUnrecognizedDescriptorLines) { - throw new DescriptorParseException("Unrecognized line '" + line - + "' in v2 network status."); - } else { - if (this.unrecognizedLines == null) { - this.unrecognizedLines = new ArrayList<>(); + break; + default: + if (crypto != null) { + crypto.append(line).append("\n"); + } else if (this.failUnrecognizedDescriptorLines) { + throw new DescriptorParseException("Unrecognized line '" + line + + "' in v2 network status."); + } else { + if (this.unrecognizedLines == null) { + this.unrecognizedLines = new ArrayList<>(); + } + this.unrecognizedLines.add(line); } - this.unrecognizedLines.add(line); } } } diff --git a/src/org/torproject/descriptor/impl/RelayNetworkStatusVoteImpl.java b/src/org/torproject/descriptor/impl/RelayNetworkStatusVoteImpl.java index d74ef65..c16a9f9 100644 --- a/src/org/torproject/descriptor/impl/RelayNetworkStatusVoteImpl.java +++ b/src/org/torproject/descriptor/impl/RelayNetworkStatusVoteImpl.java @@ -148,12 +148,14 @@ public class RelayNetworkStatusVoteImpl extends NetworkStatusImpl case "dir-key-crosscert": case "dir-key-certification": break; + case "-----BEGIN": + skipCrypto = true; + break; + case "-----END": + skipCrypto = false; + break; default: - if (line.startsWith("-----BEGIN")) { - skipCrypto = true; - } else if (line.startsWith("-----END")) { - skipCrypto = false; - } else if (!skipCrypto) { + if (!skipCrypto) { if (this.failUnrecognizedDescriptorLines) { throw new DescriptorParseException("Unrecognized line '" + line + "' in vote."); @@ -313,6 +315,8 @@ public class RelayNetworkStatusVoteImpl extends NetworkStatusImpl case "ignoring-advertised-bws": this.ignoringAdvertisedBws = Integer.parseInt(e.getValue()); break; + default: + // empty } } } catch (NumberFormatException ex) { diff --git a/src/org/torproject/descriptor/impl/ServerDescriptorImpl.java b/src/org/torproject/descriptor/impl/ServerDescriptorImpl.java index 84ad2a1..8b6e983 100644 --- a/src/org/torproject/descriptor/impl/ServerDescriptorImpl.java +++ b/src/org/torproject/descriptor/impl/ServerDescriptorImpl.java @@ -171,51 +171,53 @@ public abstract class ServerDescriptorImpl extends DescriptorImpl this.parseNtorOnionKeyCrosscert(line, lineNoOpt, partsNoOpt); nextCrypto = "ntor-onion-key-crosscert"; break; - default: - if (line.startsWith("-----BEGIN")) { - cryptoLines = new ArrayList<>(); - cryptoLines.add(line); - } else if (line.startsWith("-----END")) { - cryptoLines.add(line); - StringBuilder sb = new StringBuilder(); - for (String cryptoLine : cryptoLines) { - sb.append("\n").append(cryptoLine); - } - String cryptoString = sb.toString().substring(1); - switch (nextCrypto) { - case "onion-key": - this.onionKey = cryptoString; - break; - case "signing-key": - this.signingKey = cryptoString; - break; - case "router-signature": - this.routerSignature = cryptoString; - break; - case "identity-ed25519": - this.identityEd25519 = cryptoString; - this.parseIdentityEd25519CryptoBlock(cryptoString); - break; - case "onion-key-crosscert": - this.onionKeyCrosscert = cryptoString; - break; - case "ntor-onion-key-crosscert": - this.ntorOnionKeyCrosscert = cryptoString; - break; - default: - if (this.failUnrecognizedDescriptorLines) { - throw new DescriptorParseException("Unrecognized crypto " - + "block '" + cryptoString + "' in server descriptor."); - } else { - if (this.unrecognizedLines == null) { - this.unrecognizedLines = new ArrayList<>(); - } - this.unrecognizedLines.addAll(cryptoLines); + case "-----BEGIN": + cryptoLines = new ArrayList<>(); + cryptoLines.add(line); + break; + case "-----END": + cryptoLines.add(line); + StringBuilder sb = new StringBuilder(); + for (String cryptoLine : cryptoLines) { + sb.append("\n").append(cryptoLine); + } + String cryptoString = sb.toString().substring(1); + switch (nextCrypto) { + case "onion-key": + this.onionKey = cryptoString; + break; + case "signing-key": + this.signingKey = cryptoString; + break; + case "router-signature": + this.routerSignature = cryptoString; + break; + case "identity-ed25519": + this.identityEd25519 = cryptoString; + this.parseIdentityEd25519CryptoBlock(cryptoString); + break; + case "onion-key-crosscert": + this.onionKeyCrosscert = cryptoString; + break; + case "ntor-onion-key-crosscert": + this.ntorOnionKeyCrosscert = cryptoString; + break; + default: + if (this.failUnrecognizedDescriptorLines) { + throw new DescriptorParseException("Unrecognized crypto " + + "block '" + cryptoString + "' in server descriptor."); + } else { + if (this.unrecognizedLines == null) { + this.unrecognizedLines = new ArrayList<>(); } + this.unrecognizedLines.addAll(cryptoLines); } - cryptoLines = null; - nextCrypto = ""; - } else if (cryptoLines != null) { + } + cryptoLines = null; + nextCrypto = ""; + break; + default: + if (cryptoLines != null) { cryptoLines.add(line); } else { ParseHelper.parseKeyword(line, partsNoOpt[0]); @@ -317,13 +319,7 @@ public abstract class ServerDescriptorImpl extends DescriptorImpl if (partsNoOpt.length != 2) { throw new DescriptorParseException("Illegal line '" + line + "'."); } - if (partsNoOpt[1].equals("1")) { - this.hibernating = true; - } else if (partsNoOpt[1].equals("0")) { - this.hibernating = false; - } else { - throw new DescriptorParseException("Illegal line '" + line + "'."); - } + this.hibernating = ParseHelper.parseBoolean(partsNoOpt[1], line); }
private void parseUptimeLine(String line, String lineNoOpt, @@ -438,13 +434,7 @@ public abstract class ServerDescriptorImpl extends DescriptorImpl if (partsNoOpt.length != 2) { throw new DescriptorParseException("Illegal line '" + line + "'."); } - if (partsNoOpt[1].equals("1")) { - this.usesEnhancedDnsLogic = true; - } else if (partsNoOpt[1].equals("0")) { - this.usesEnhancedDnsLogic = false; - } else { - throw new DescriptorParseException("Illegal line '" + line + "'."); - } + this.usesEnhancedDnsLogic = ParseHelper.parseBoolean(partsNoOpt[1], line); }
private void parseCachesExtraInfoLine(String line, String lineNoOpt, @@ -490,10 +480,15 @@ public abstract class ServerDescriptorImpl extends DescriptorImpl String[] partsNoOpt) throws DescriptorParseException { int linkIndex = -1, circuitIndex = -1; for (int i = 1; i < partsNoOpt.length; i++) { - if (partsNoOpt[i].equals("Link")) { + switch (partsNoOpt[i]) { + case "Link": linkIndex = i; - } else if (partsNoOpt[i].equals("Circuit")) { + break; + case "Circuit": circuitIndex = i; + break; + default: + // empty } } if (linkIndex < 0 || circuitIndex < 0 || circuitIndex < linkIndex) { @@ -555,19 +550,23 @@ public abstract class ServerDescriptorImpl extends DescriptorImpl boolean isValid = true; if (partsNoOpt.length != 3) { isValid = false; - } else if (!partsNoOpt[1].equals("accept") && - !partsNoOpt[1].equals("reject")) { - isValid = false; } else { - this.ipv6DefaultPolicy = partsNoOpt[1]; - this.ipv6PortList = partsNoOpt[2]; - String[] ports = partsNoOpt[2].split(",", -1); - for (int i = 0; i < ports.length; i++) { - if (ports[i].length() < 1) { - isValid = false; + switch (partsNoOpt[1]) { + case "accept": + case "reject": + this.ipv6DefaultPolicy = partsNoOpt[1]; + this.ipv6PortList = partsNoOpt[2]; + String[] ports = partsNoOpt[2].split(",", -1); + for (int i = 0; i < ports.length; i++) { + if (ports[i].length() < 1) { + isValid = false; + break; + } + } break; + default: + isValid = false; } - } } if (!isValid) { throw new DescriptorParseException("Illegal line '" + line + "'.");