diff --git a/config/config.exs b/config/config.exs
index ee30969e8..839e6bde6 100644
--- a/config/config.exs
+++ b/config/config.exs
@@ -16,6 +16,8 @@
config :pleroma, :emoji, shortcode_globs: ["/emoji/custom/**/*.png"]
+config :pleroma, :uri_schemes, additionnal_schemes: []
+
# Configures the endpoint
config :pleroma, Pleroma.Web.Endpoint,
url: [host: "localhost"],
diff --git a/lib/pleroma/formatter.ex b/lib/pleroma/formatter.ex
index d199c9243..3e71a3b5f 100644
--- a/lib/pleroma/formatter.ex
+++ b/lib/pleroma/formatter.ex
@@ -165,8 +165,29 @@ def get_custom_emoji() do
@emoji
end
- @link_regex ~r/https?:\/\/[\w\.\/?=\-#\+%&@~'\(\):]+[\w\/]/u
+ @link_regex ~r/[0-9a-z+\-\.]+:[0-9a-z$-_.+!*'(),]+/ui
+ # IANA got a list https://www.iana.org/assignments/uri-schemes/ but
+ # Stuff like ipfs isn’t in it
+ # There is very niche stuff
+ @uri_schemes [
+ "https://",
+ "http://",
+ "dat://",
+ "dweb://",
+ "gopher://",
+ "ipfs://",
+ "ipns://",
+ "irc:",
+ "ircs:",
+ "magnet:",
+ "mailto:",
+ "mumble:",
+ "ssb://",
+ "xmpp:"
+ ]
+
+ # TODO: make it use something other than @link_regex
def html_escape(text) do
Regex.split(@link_regex, text, include_captures: true)
|> Enum.map_every(2, fn chunk ->
@@ -176,11 +197,18 @@ def html_escape(text) do
|> Enum.join("")
end
- @doc "changes http:... links to html links"
+ @doc "changes scheme:... urls to html links"
def add_links({subs, text}) do
+ additionnal_schemes =
+ Application.get_env(:pleroma, :uri_schemes, [])
+ |> Keyword.get(:additionnal_schemes, [])
+
links =
- Regex.scan(@link_regex, text)
- |> Enum.map(fn [url] -> {Ecto.UUID.generate(), url} end)
+ text
+ |> String.split([" ", "\t", "
"])
+ |> Enum.filter(fn word -> String.starts_with?(word, @uri_schemes ++ additionnal_schemes) end)
+ |> Enum.filter(fn word -> Regex.match?(@link_regex, word) end)
+ |> Enum.map(fn url -> {Ecto.UUID.generate(), url} end)
|> Enum.sort_by(fn {_, url} -> -String.length(url) end)
uuid_text =
diff --git a/test/formatter_test.exs b/test/formatter_test.exs
index c2b3d4ac0..abbd7ac93 100644
--- a/test/formatter_test.exs
+++ b/test/formatter_test.exs
@@ -20,10 +20,10 @@ test "turns hashtags into links" do
describe ".add_links" do
test "turning urls into links" do
- text = "Hey, check out https://www.youtube.com/watch?v=8Zg1-TufF%20zY?x=1&y=2#blabla."
+ text = "Hey, check out https://www.youtube.com/watch?v=8Zg1-TufF%20zY?x=1&y=2#blabla ."
expected =
- "Hey, check out https://www.youtube.com/watch?v=8Zg1-TufF%20zY?x=1&y=2#blabla."
+ "Hey, check out https://www.youtube.com/watch?v=8Zg1-TufF%20zY?x=1&y=2#blabla ."
assert Formatter.add_links({[], text}) |> Formatter.finalize() == expected
@@ -85,6 +85,12 @@ test "turning urls into links" do
"https://pleroma.com https://pleroma.com/sucks"
assert Formatter.add_links({[], text}) |> Formatter.finalize() == expected
+
+ text = "xmpp:contact@hacktivis.me"
+
+ expected = "xmpp:contact@hacktivis.me"
+
+ assert Formatter.add_links({[], text}) |> Formatter.finalize() == expected
end
end