From d60d9366bbd66ced34324dbec8b161c5c8a27ab1 Mon Sep 17 00:00:00 2001 From: zzz Date: Sun, 20 Apr 2025 15:23:28 -0400 Subject: [PATCH] SusiDNS: Add b32 and dest reverse lookups strip any URL parts from search string --- .../src/i2p/susi/dns/AddressbookBean.java | 12 +++++- .../src/i2p/susi/dns/NamingServiceBean.java | 40 +++++++++++++++++-- 2 files changed, 46 insertions(+), 6 deletions(-) diff --git a/apps/susidns/src/java/src/i2p/susi/dns/AddressbookBean.java b/apps/susidns/src/java/src/i2p/susi/dns/AddressbookBean.java index 28f86771c6..0660750553 100644 --- a/apps/susidns/src/java/src/i2p/susi/dns/AddressbookBean.java +++ b/apps/susidns/src/java/src/i2p/susi/dns/AddressbookBean.java @@ -58,9 +58,17 @@ public class AddressbookBean extends BaseBean public String getSearch() { return search; } - public void setSearch(String search) { - this.search = DataHelper.stripHTML(search).trim(); // XSS; + + public void setSearch(String s) { + search = DataHelper.stripHTML(s).trim(); // XSS; + if (search.startsWith("http://")) + search = search.substring(7); + else if (search.startsWith("https://")) + search = search.substring(8); + if (search.endsWith("/")) + search = search.substring(0, search.length() - 1); } + public boolean isHasFilter() { return filter != null && filter.length() > 0; diff --git a/apps/susidns/src/java/src/i2p/susi/dns/NamingServiceBean.java b/apps/susidns/src/java/src/i2p/susi/dns/NamingServiceBean.java index 8488bdcc9c..7a55377ea2 100644 --- a/apps/susidns/src/java/src/i2p/susi/dns/NamingServiceBean.java +++ b/apps/susidns/src/java/src/i2p/susi/dns/NamingServiceBean.java @@ -32,6 +32,7 @@ import java.net.URISyntaxException; import java.util.Arrays; import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Locale; @@ -42,9 +43,12 @@ import java.util.SortedMap; import net.i2p.app.ClientAppManager; import net.i2p.client.naming.NamingService; import net.i2p.client.naming.SingleFileNamingService; +import net.i2p.data.Base32; +import net.i2p.data.Base64; import net.i2p.data.DataFormatException; import net.i2p.data.DataHelper; import net.i2p.data.Destination; +import net.i2p.data.Hash; import net.i2p.servlet.RequestWrapper; import net.i2p.util.PortMapper; @@ -184,9 +188,37 @@ public class NamingServiceBean extends AddressbookBean if (limit > 0) searchProps.setProperty("limit", Integer.toString(limit)); } - if (search != null && search.length() > 0) - searchProps.setProperty("search", search.toLowerCase(Locale.US)); - results = service.getEntries(searchProps); + + Hash reverse = null; + if (search != null && search.length() > 0) { + if (search.length() == 60 && search.endsWith(".b32.i2p")) { + byte[] b = Base32.decode(search.substring(0, 52)); + if (b != null) + reverse = new Hash(b); + } else if (search.length() >= 516) { + byte[] b = Base64.decode(search); + if (b != null) + reverse = _context.sha().calculateHash(b); + } + if (reverse == null) + searchProps.setProperty("search", search.toLowerCase(Locale.US)); + } + if (reverse != null) { + List names = service.reverseLookupAll(reverse); + if (names != null) { + results = new HashMap(names.size()); + for (String name : names) { + Destination d = service.lookup(name, searchProps, null); + if (d != null) + results.put(name, d); + } + } else { + results = Collections.emptyMap(); + } + + } else { + results = service.getEntries(searchProps); + } debug("Result count: " + results.size()); for (Map.Entry entry : results.entrySet()) { @@ -201,7 +233,7 @@ public class NamingServiceBean extends AddressbookBean continue; } } - if( search != null && search.length() > 0 ) { + if (search != null && search.length() > 0 && reverse == null) { if( name.indexOf( search ) == -1 ) { continue; }