[tor-commits] [onionoo/master] Support searches for more than 1 search term.
karsten at torproject.org
karsten at torproject.org
Mon Jun 18 10:11:32 UTC 2012
commit 11883dde69d6c936c9aadd8eb2db498de5606991
Author: Karsten Loesing <karsten.loesing at gmx.net>
Date: Mon Jun 18 12:09:31 2012 +0200
Support searches for more than 1 search term.
Works only for search=... parameter, not for search/... URLs.
Implements #5248.
---
src/org/torproject/onionoo/ResourceServlet.java | 39 ++++++++++++++++-------
web/index.html | 4 ++
2 files changed, 31 insertions(+), 12 deletions(-)
diff --git a/src/org/torproject/onionoo/ResourceServlet.java b/src/org/torproject/onionoo/ResourceServlet.java
index 41f4c5a..ba1d434 100644
--- a/src/org/torproject/onionoo/ResourceServlet.java
+++ b/src/org/torproject/onionoo/ResourceServlet.java
@@ -241,14 +241,14 @@ public class ResourceServlet extends HttpServlet {
runningRequested);
}
if (parameterMap.containsKey("search")) {
- String searchTerm = this.parseSearchParameter(
+ String[] searchTerms = this.parseSearchParameters(
parameterMap.get("search"));
- if (searchTerm == null) {
+ if (searchTerms == null) {
response.sendError(HttpServletResponse.SC_BAD_REQUEST);
return;
}
- this.filterBySearchTerm(filteredRelays, filteredBridges,
- searchTerm);
+ this.filterBySearchTerms(filteredRelays, filteredBridges,
+ searchTerms);
}
if (parameterMap.containsKey("lookup")) {
String fingerprintParameter = this.parseFingerprintParameter(
@@ -383,12 +383,12 @@ public class ResourceServlet extends HttpServlet {
} else if (uri.equals("/" + resourceType + "/bridges")) {
result.put("type", "bridges");
} else if (uri.startsWith("/" + resourceType + "/search/")) {
- String searchParameter = this.parseSearchParameter(uri.substring(
- ("/" + resourceType + "/search/").length()));
- if (searchParameter == null) {
+ String[] searchParameters = this.parseSearchParameters(
+ uri.substring(("/" + resourceType + "/search/").length()));
+ if (searchParameters == null || searchParameters.length != 1) {
result = null;
} else {
- result.put("search", searchParameter);
+ result.put("search", searchParameters[0]);
}
} else if (uri.startsWith("/" + resourceType + "/lookup/")) {
String fingerprintParameter = this.parseFingerprintParameter(
@@ -408,11 +408,19 @@ public class ResourceServlet extends HttpServlet {
Pattern.compile("^\\$?[0-9a-fA-F]{1,40}$|" /* Fingerprint. */
+ "^[0-9a-zA-Z\\.]{1,19}$|" /* Nickname or IPv4 address. */
+ "^\\[[0-9a-fA-F:\\.]{1,39}\\]?$"); /* IPv6 address. */
- private String parseSearchParameter(String parameter) {
- if (!searchParameterPattern.matcher(parameter).matches()) {
- return null;
+ private String[] parseSearchParameters(String parameter) {
+ String[] searchParameters;
+ if (parameter.contains(" ")) {
+ searchParameters = parameter.split(" ");
+ } else {
+ searchParameters = new String[] { parameter };
}
- return parameter;
+ for (String searchParameter : searchParameters) {
+ if (!searchParameterPattern.matcher(searchParameter).matches()) {
+ return null;
+ }
+ }
+ return searchParameters;
}
private static Pattern fingerprintParameterPattern =
@@ -467,6 +475,13 @@ public class ResourceServlet extends HttpServlet {
}
}
+ private void filterBySearchTerms(Map<String, String> filteredRelays,
+ Map<String, String> filteredBridges, String[] searchTerms) {
+ for (String searchTerm : searchTerms) {
+ filterBySearchTerm(filteredRelays, filteredBridges, searchTerm);
+ }
+ }
+
private void filterBySearchTerm(Map<String, String> filteredRelays,
Map<String, String> filteredBridges, String searchTerm) {
Set<String> removeRelays = new HashSet<String>();
diff --git a/web/index.html b/web/index.html
index bd44108..d9ac6e8 100755
--- a/web/index.html
+++ b/web/index.html
@@ -612,11 +612,15 @@ matching the beginning of a nickname, (possibly $-prefixed) fingerprint,
or IP address, and bridges with the nickname or (possibly $-prefixed)
hashed fingerprint.
Searches are case-insensitive.
+If multiple search terms are given, separated by spaces, the intersection
+of all relays and bridges matching all search terms will be returned.
Full fingerprints should always be hashed using SHA-1, regardless of
searching for a relay or a bridge, in order to not accidentally leak
non-hashed bridge fingerprints in the URL.
<font color="blue">Extended search to bridge nicknames on June 14,
2012.</font>
+<font color="blue">Extended search to multiple search terms on June 18,
+2012.</font>
</td></tr>
<tr><td><b>lookup</b></td><td>Return only the relay with the parameter
value matching the fingerprint or the bridge with the parameter value
More information about the tor-commits
mailing list