commit c9218fbd3b8f029857cca1cde4c16dc5099f129d Author: Karsten Loesing karsten.loesing@gmx.net Date: Tue Jul 24 09:11:18 2018 +0200
Allow for URLs that specify list of fingerprints.
Implements #25448. --- CHANGELOG.md | 8 ++++++ .../torproject/onionoo/server/RequestHandler.java | 25 +++++++++-------- .../torproject/onionoo/server/ResourceServlet.java | 31 +++++++++------------- .../onionoo/server/ResourceServletTest.java | 14 ++++++++++ 4 files changed, 48 insertions(+), 30 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md index cd11502..00a0c6a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +# Changes in version 6.2-1.16.0 - 2018-07-?? + + * Medium changes + - Support a comma-separated list of fingerprints in the lookup + parameter to allow for URLs that specify a list of relays or + bridges. + + # Changes in version 6.1-1.15.0 - 2018-07-16
* Medium changes diff --git a/src/main/java/org/torproject/onionoo/server/RequestHandler.java b/src/main/java/org/torproject/onionoo/server/RequestHandler.java index b9d9b23..344178b 100644 --- a/src/main/java/org/torproject/onionoo/server/RequestHandler.java +++ b/src/main/java/org/torproject/onionoo/server/RequestHandler.java @@ -54,9 +54,9 @@ public class RequestHandler { System.arraycopy(search, 0, this.search, 0, search.length); }
- private String lookup; + private String[] lookup;
- public void setLookup(String lookup) { + public void setLookup(String[] lookup) { this.lookup = lookup; }
@@ -340,17 +340,20 @@ public class RequestHandler { /* Not filtering by looking up relay or bridge. */ return; } - String fingerprint = this.lookup; - SummaryDocument relayLine = this.filteredRelays.get(fingerprint); - this.filteredRelays.clear(); - if (relayLine != null) { - this.filteredRelays.put(fingerprint, relayLine); + Map<String, SummaryDocument> matchingRelays = new HashMap<>(); + for (String fingerprint : this.lookup) { + if (this.filteredRelays.containsKey(fingerprint)) { + matchingRelays.put(fingerprint, this.filteredRelays.get(fingerprint)); + } } - SummaryDocument bridgeLine = this.filteredBridges.get(fingerprint); - this.filteredBridges.clear(); - if (bridgeLine != null) { - this.filteredBridges.put(fingerprint, bridgeLine); + this.filteredRelays = matchingRelays; + Map<String, SummaryDocument> matchingBridges = new HashMap<>(); + for (String fingerprint : this.lookup) { + if (this.filteredBridges.containsKey(fingerprint)) { + matchingBridges.put(fingerprint, this.filteredBridges.get(fingerprint)); + } } + this.filteredBridges = matchingBridges; }
private void filterByFingerprint() { diff --git a/src/main/java/org/torproject/onionoo/server/ResourceServlet.java b/src/main/java/org/torproject/onionoo/server/ResourceServlet.java index e119518..534dc0c 100644 --- a/src/main/java/org/torproject/onionoo/server/ResourceServlet.java +++ b/src/main/java/org/torproject/onionoo/server/ResourceServlet.java @@ -211,24 +211,22 @@ public class ResourceServlet extends HttpServlet { rh.setRunning(runningRequested ? "true" : "false"); } if (parameterMap.containsKey("lookup")) { - String lookupParameter = this.parseFingerprintParameter( + String[] lookupParameter = this.parseFingerprintParameter( parameterMap.get("lookup")); if (lookupParameter == null) { response.sendError(HttpServletResponse.SC_BAD_REQUEST); return; } - String fingerprint = lookupParameter.toUpperCase(); - rh.setLookup(fingerprint); + rh.setLookup(lookupParameter); } if (parameterMap.containsKey("fingerprint")) { - String fingerprintParameter = this.parseFingerprintParameter( + String[] fingerprintParameter = this.parseFingerprintParameter( parameterMap.get("fingerprint")); - if (fingerprintParameter == null) { + if (null == fingerprintParameter || 1 != fingerprintParameter.length) { response.sendError(HttpServletResponse.SC_BAD_REQUEST); return; } - String fingerprint = fingerprintParameter.toUpperCase(); - rh.setFingerprint(fingerprint); + rh.setFingerprint(fingerprintParameter[0]); } if (parameterMap.containsKey("country")) { String countryCodeParameter = this.parseCountryCodeParameter( @@ -360,14 +358,13 @@ public class ResourceServlet extends HttpServlet { rh.setLimit(limitParameter); } if (parameterMap.containsKey("family")) { - String familyParameter = this.parseFingerprintParameter( + String[] familyParameter = this.parseFingerprintParameter( parameterMap.get("family")); - if (familyParameter == null) { - response.sendError(HttpServletResponse.SC_BAD_REQUEST); + if (null == familyParameter || 1 != familyParameter.length) { + response.sendError(HttpServletResponse.SC_BAD_REQUEST); return; } - String family = familyParameter.toUpperCase(); - rh.setFamily(family); + rh.setFamily(familyParameter[0]); } rh.handleRequest(); long parsedRequestMillis = System.currentTimeMillis(); @@ -473,18 +470,14 @@ public class ResourceServlet extends HttpServlet { }
private static Pattern fingerprintParameterPattern = - Pattern.compile("^[0-9a-zA-Z]{1,40}$"); + Pattern.compile("((^|,)[0-9a-zA-Z]{40})+$");
- private String parseFingerprintParameter(String parameter) { + private String[] parseFingerprintParameter(String parameter) { if (!fingerprintParameterPattern.matcher(parameter).matches()) { /* Fingerprint contains non-hex character(s). */ return null; } - if (parameter.length() != 40) { - /* Only full fingerprints are accepted. */ - return null; - } - return parameter; + return parameter.toUpperCase().split(","); }
private static Pattern countryCodeParameterPattern = diff --git a/src/test/java/org/torproject/onionoo/server/ResourceServletTest.java b/src/test/java/org/torproject/onionoo/server/ResourceServletTest.java index 2bc8203..8100c00 100644 --- a/src/test/java/org/torproject/onionoo/server/ResourceServletTest.java +++ b/src/test/java/org/torproject/onionoo/server/ResourceServletTest.java @@ -1042,6 +1042,20 @@ public class ResourceServletTest { }
@Test(timeout = 100) + public void testLookupTwoFingerprints() { + this.assertSummaryDocument( + "/summary?lookup=000C5F55BD4814B917CC474BD537F1A3B33CCE2A," + + "1FEDE50ED8DBA1DD9F9165F78C8131E4A44AB756", 1, + new String[] { "TorkaZ" }, 1, new String[] { "gummy" }); + } + + @Test(timeout = 100) + public void testLookupFingerprintTrailingComma() { + this.assertErrorStatusCode( + "/summary?lookup=000C5F55BD4814B917CC474BD537F1A3B33CCE2A,", 400); + } + + @Test(timeout = 100) public void testFingerprintRelayFingerprint() { this.assertSummaryDocument( "/summary?fingerprint=000C5F55BD4814B917CC474BD537F1A3B33CCE2A",
tor-commits@lists.torproject.org