diff --git a/webui/locale/messages_en.po b/webui/locale/messages_en.po index ee52382e..6fb7302b 100644 --- a/webui/locale/messages_en.po +++ b/webui/locale/messages_en.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: I2P MuWire\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-10-14 16:54+0000\n" +"POT-Creation-Date: 2022-02-07 01:30+0000\n" "Language: en\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -207,8 +207,8 @@ msgstr "" #: build/tmp_jsp/com/muwire/webui/TrustUsers_jsp.java:200 #: build/tmp_jsp/com/muwire/webui/Uploads_jsp.java:219 #: build/tmp_jsp/com/muwire/webui/Uploads_jsp.java:221 -#: src/main/java//com/muwire/webui/SearchServlet.java:265 -#: src/main/java//com/muwire/webui/SearchServlet.java:266 +#: src/main/java//com/muwire/webui/SearchServlet.java:267 +#: src/main/java//com/muwire/webui/SearchServlet.java:268 msgid "B/sec" msgstr "" @@ -1239,18 +1239,22 @@ msgid "MuWire is initializing, please wait" msgstr "" #: src/main/java//com/muwire/webui/SearchServlet.java:43 -#: src/main/java//com/muwire/webui/SearchServlet.java:75 -#: src/main/java//com/muwire/webui/SearchServlet.java:94 -#: src/main/java//com/muwire/webui/SearchServlet.java:130 -#: src/main/java//com/muwire/webui/SearchServlet.java:172 -#: src/main/java//com/muwire/webui/SearchServlet.java:211 -#: src/main/java//com/muwire/webui/SearchServlet.java:260 +#: src/main/java//com/muwire/webui/SearchServlet.java:77 +#: src/main/java//com/muwire/webui/SearchServlet.java:96 +#: src/main/java//com/muwire/webui/SearchServlet.java:132 +#: src/main/java//com/muwire/webui/SearchServlet.java:174 +#: src/main/java//com/muwire/webui/SearchServlet.java:213 +#: src/main/java//com/muwire/webui/SearchServlet.java:262 msgid "" "MuWire failed to initialize. Please close the browser window and restart " "the plugin" msgstr "" -#: src/main/java//com/muwire/webui/SearchServlet.java:54 +#: src/main/java//com/muwire/webui/SearchServlet.java:52 +msgid "Invalid regular expression" +msgstr "" + +#: src/main/java//com/muwire/webui/SearchServlet.java:56 msgid "Please enter a search keyword or file hash" msgstr "" diff --git a/webui/src/main/java/com/muwire/webui/SearchManager.java b/webui/src/main/java/com/muwire/webui/SearchManager.java index 77083475..96930f59 100644 --- a/webui/src/main/java/com/muwire/webui/SearchManager.java +++ b/webui/src/main/java/com/muwire/webui/SearchManager.java @@ -7,6 +7,7 @@ import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.UUID; +import java.util.regex.Pattern; import com.muwire.core.Core; import com.muwire.core.SplitPattern; @@ -21,6 +22,7 @@ import net.i2p.data.Signature; class SearchManager { + static final UUID INVALID_REGEX_UUID = UUID.randomUUID(); private final Core core; @@ -37,8 +39,6 @@ class SearchManager { else { UUID uuid = UUID.randomUUID(); - SearchResults searchResults = new SearchResults(uuid, search); - results.put(uuid, searchResults); boolean hashSearch = false; byte [] root = null; @@ -50,18 +50,40 @@ class SearchManager { // not a hash search } } + + boolean regexSearch = false; + if (search.length() > 1 && search.startsWith("/") && search.endsWith("/")) { + search = search.substring(1, search.length() - 1); + try { + Pattern.compile(search); + regexSearch = true; + } catch (Exception e) { + // not a valid regex + return INVALID_REGEX_UUID; + } + } + + SearchResults searchResults = new SearchResults(uuid, search); + results.put(uuid, searchResults); SearchEvent searchEvent = new SearchEvent(); searchEvent.setOobInfohash(true); searchEvent.setCompressedResults(true); searchEvent.setPersona(core.getMe()); searchEvent.setUuid(uuid); + searchEvent.setRegex(regexSearch); byte[] payload; if (hashSearch) { searchEvent.setSearchHash(root); payload = root; } else { - String[] nonEmpty = SplitPattern.termify(search); - payload = String.join(" ", nonEmpty).getBytes(StandardCharsets.UTF_8); + String[] nonEmpty; + if (regexSearch) { + nonEmpty = new String[] { search }; + payload = search.getBytes(StandardCharsets.UTF_8); + } else { + nonEmpty = SplitPattern.termify(search); + payload = String.join(" ", nonEmpty).getBytes(StandardCharsets.UTF_8); + } searchEvent.setSearchTerms(Arrays.asList(nonEmpty)); searchEvent.setSearchComments(core.getMuOptions().getSearchComments()); searchEvent.setCollections(core.getMuOptions().getSearchCollections()); diff --git a/webui/src/main/java/com/muwire/webui/SearchServlet.java b/webui/src/main/java/com/muwire/webui/SearchServlet.java index d0b7d2f5..94ed6cc8 100644 --- a/webui/src/main/java/com/muwire/webui/SearchServlet.java +++ b/webui/src/main/java/com/muwire/webui/SearchServlet.java @@ -48,7 +48,9 @@ public class SearchServlet extends HttpServlet { if (action.equals("start")) { String search = req.getParameter("search"); UUID newUUID = searchManager.newSearch(search); - if (newUUID != null) + if (newUUID == SearchManager.INVALID_REGEX_UUID) + resp.sendError(403, _t("Invalid regular expression")); + else if (newUUID != null) resp.sendRedirect("/MuWire/Home?uuid=" + newUUID.toString()); else resp.sendError(403, _t("Please enter a search keyword or file hash"));