From 24994d2fa2932ffff66b0cc0647fba0bba9df316 Mon Sep 17 00:00:00 2001 From: "byte[]" Date: Thu, 10 Sep 2020 11:25:00 -0400 Subject: [PATCH] invoke query compiler to determine if name should be escaped --- lib/philomena_web/controllers/tag_controller.ex | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/lib/philomena_web/controllers/tag_controller.ex b/lib/philomena_web/controllers/tag_controller.ex index 99e56174..8ddff443 100644 --- a/lib/philomena_web/controllers/tag_controller.ex +++ b/lib/philomena_web/controllers/tag_controller.ex @@ -4,7 +4,7 @@ defmodule PhilomenaWeb.TagController do alias PhilomenaWeb.ImageLoader alias Philomena.Elasticsearch alias Philomena.{Tags, Tags.Tag} - alias Philomena.Images.Image + alias Philomena.{Images, Images.Image} alias PhilomenaWeb.TextileRenderer alias Philomena.Interactions import Ecto.Query @@ -71,7 +71,7 @@ defmodule PhilomenaWeb.TagController do dnp_entries = Enum.zip(dnp_bodies, tag.dnp_entries) - search_query = escape_name(tag) + search_query = maybe_escape_name(tag) params = Map.put(conn.params, "q", search_query) conn = Map.put(conn, :params, params) @@ -116,13 +116,23 @@ defmodule PhilomenaWeb.TagController do |> redirect(to: "/") end - def escape_name(%{name: name}) do + def maybe_escape_name(%{name: name}) do name = name |> String.replace(~r/\s+/, " ") |> String.trim() |> String.downcase() + case Images.Query.compile(nil, name) do + {:ok, %{term: %{"namespaced_tags.name" => ^name}}} -> + name + + _error -> + escape_name(name) + end + end + + defp escape_name(name) do cond do String.contains?(name, "(") or String.contains?(name, ")") -> # \ * ? " should be escaped, wrap in quotes so parser doesn't