Revert "Merge branch 'linkify' into 'develop'"
authorlain <lain@soykaf.club>
Tue, 21 Jul 2020 22:17:34 +0000 (22:17 +0000)
committerlain <lain@soykaf.club>
Tue, 21 Jul 2020 22:17:34 +0000 (22:17 +0000)
This reverts merge request !2677

CHANGELOG.md
config/config.exs
config/description.exs
docs/configuration/cheatsheet.md
lib/pleroma/config/config_db.ex
lib/pleroma/formatter.ex
lib/pleroma/web/rich_media/helpers.ex
mix.exs
mix.lock
priv/repo/migrations/20200716195806_autolinker_to_linkify.exs [deleted file]
test/formatter_test.exs

index f4397ec3c9c48b18ff1896be1c7045237c3c9f2a..08027007339d1cb6e6fd0cf76949e3d3018964f9 100644 (file)
@@ -7,7 +7,6 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
 
 ### Changed
 - **Breaking:** Elixir >=1.9 is now required (was >= 1.8)
-- **Breaking:** Configuration: `:auto_linker, :opts` moved to `:pleroma, Pleroma.Formatter`. Old config namespace is deprecated.
 - In Conversations, return only direct messages as `last_status`
 - Using the `only_media` filter on timelines will now exclude reblog media
 - MFR policy to set global expiration for all local Create activities
index 406bf2a9bd367d1ba83f1bc3d60fd36968096d55..2d3f35e70253cc3cf654ad4e792a8fecbb0f07c8 100644 (file)
@@ -527,14 +527,16 @@ config :pleroma, :workers,
     federator_outgoing: 5
   ]
 
-config :pleroma, Pleroma.Formatter,
-  class: false,
-  rel: "ugc",
-  new_window: false,
-  truncate: false,
-  strip_prefix: false,
-  extra: true,
-  validate_tld: :no_scheme
+config :auto_linker,
+  opts: [
+    extra: true,
+    # TODO: Set to :no_scheme when it works properly
+    validate_tld: true,
+    class: false,
+    strip_prefix: false,
+    new_window: false,
+    rel: "ugc"
+  ]
 
 config :pleroma, :ldap,
   enabled: System.get_env("LDAP_ENABLED") == "true",
index b97b0a7ec984b5b52ba33c72dada10ed883c7a81..f1c6773f1962b224fe336ce20ae0c7436d50410d 100644 (file)
@@ -2216,12 +2216,11 @@ config :pleroma, :config_description, [
     ]
   },
   %{
-    group: :pleroma,
-    key: Pleroma.Formatter,
+    group: :auto_linker,
+    key: :opts,
     label: "Auto Linker",
     type: :group,
-    description:
-      "Configuration for Pleroma's link formatter which parses mentions, hashtags, and URLs.",
+    description: "Configuration for the auto_linker library",
     children: [
       %{
         key: :class,
@@ -2238,31 +2237,24 @@ config :pleroma, :config_description, [
       %{
         key: :new_window,
         type: :boolean,
-        description: "Link URLs will open in a new window/tab."
+        description: "Link URLs will open in new window/tab"
       },
       %{
         key: :truncate,
         type: [:integer, false],
         description:
-          "Set to a number to truncate URLs longer than the number. Truncated URLs will end in `...`",
+          "Set to a number to truncate URLs longer then the number. Truncated URLs will end in `..`",
         suggestions: [15, false]
       },
       %{
         key: :strip_prefix,
         type: :boolean,
-        description: "Strip the scheme prefix."
+        description: "Strip the scheme prefix"
       },
       %{
         key: :extra,
         type: :boolean,
         description: "Link URLs with rarely used schemes (magnet, ipfs, irc, etc.)"
-      },
-      %{
-        key: :validate_tld,
-        type: [:atom, :boolean],
-        description:
-          "Set to false to disable TLD validation for URLs/emails. Can be set to :no_scheme to validate TLDs only for URLs without a scheme (e.g `example.com` will be validated, but `http://example.loki` won't)",
-        suggestions: [:no_scheme, true]
       }
     ]
   },
index 042ad30c97caf0c223855e23029de3c1beebb45c..6c1babba32251c38e7dfaa5ad67895ff0988603c 100644 (file)
@@ -934,29 +934,30 @@ Configure OAuth 2 provider capabilities:
 ### :uri_schemes
 * `valid_schemes`: List of the scheme part that is considered valid to be an URL.
 
-### Pleroma.Formatter
+### :auto_linker
 
-Configuration for Pleroma's link formatter which parses mentions, hashtags, and URLs.
+Configuration for the `auto_linker` library:
 
-* `class` - specify the class to be added to the generated link (default: `false`)
-* `rel` - specify the rel attribute (default: `ugc`)
-* `new_window` - adds `target="_blank"` attribute (default: `false`)
-* `truncate` - Set to a number to truncate URLs longer then the number. Truncated URLs will end in `...` (default: `false`)
-* `strip_prefix` - Strip the scheme prefix (default: `false`)
-* `extra` - link URLs with rarely used schemes (magnet, ipfs, irc, etc.) (default: `true`)
-* `validate_tld` - Set to false to disable TLD validation for URLs/emails. Can be set to :no_scheme to validate TLDs only for urls without a scheme (e.g `example.com` will be validated, but `http://example.loki` won't) (default: `:no_scheme`)
+* `class: "auto-linker"` - specify the class to be added to the generated link. false to clear.
+* `rel: "noopener noreferrer"` - override the rel attribute. false to clear.
+* `new_window: true` - set to false to remove `target='_blank'` attribute.
+* `scheme: false` - Set to true to link urls with schema `http://google.com`.
+* `truncate: false` - Set to a number to truncate urls longer then the number. Truncated urls will end in `..`.
+* `strip_prefix: true` - Strip the scheme prefix.
+* `extra: false` - link urls with rarely used schemes (magnet, ipfs, irc, etc.).
 
 Example:
 
 ```elixir
-config :pleroma, Pleroma.Formatter,
-  class: false,
-  rel: "ugc",
-  new_window: false,
-  truncate: false,
-  strip_prefix: false,
-  extra: true,
-  validate_tld: :no_scheme
+config :auto_linker,
+  opts: [
+    scheme: true,
+    extra: true,
+    class: false,
+    strip_prefix: false,
+    new_window: false,
+    rel: "ugc"
+  ]
 ```
 
 ## Custom Runtime Modules (`:modules`)
index e5b7811aa51b27530ef020d5bcaa0813018b9798..1a89d8895bda0c40db8117538ddae08d4a76995d 100644 (file)
@@ -156,6 +156,7 @@ defmodule Pleroma.ConfigDB do
       {:quack, :meta},
       {:mime, :types},
       {:cors_plug, [:max_age, :methods, :expose, :headers]},
+      {:auto_linker, :opts},
       {:swarm, :node_blacklist},
       {:logger, :backends}
     ]
index 0c450eae4ec6e26ac75280cd942556ce2e428440..02a93a8dc2989e68af9594ad549ba7145c02f2a8 100644 (file)
@@ -10,15 +10,11 @@ defmodule Pleroma.Formatter do
   @link_regex ~r"((?:http(s)?:\/\/)?[\w.-]+(?:\.[\w\.-]+)+[\w\-\._~%:/?#[\]@!\$&'\(\)\*\+,;=.]+)|[0-9a-z+\-\.]+:[0-9a-z$-_.+!*'(),]+"ui
   @markdown_characters_regex ~r/(`|\*|_|{|}|[|]|\(|\)|#|\+|-|\.|!)/
 
-  defp linkify_opts do
-    Pleroma.Config.get(Pleroma.Formatter) ++
-      [
-        hashtag: true,
-        hashtag_handler: &Pleroma.Formatter.hashtag_handler/4,
-        mention: true,
-        mention_handler: &Pleroma.Formatter.mention_handler/4
-      ]
-  end
+  @auto_linker_config hashtag: true,
+                      hashtag_handler: &Pleroma.Formatter.hashtag_handler/4,
+                      mention: true,
+                      mention_handler: &Pleroma.Formatter.mention_handler/4,
+                      scheme: true
 
   def escape_mention_handler("@" <> nickname = mention, buffer, _, _) do
     case User.get_cached_by_nickname(nickname) do
@@ -84,19 +80,19 @@ defmodule Pleroma.Formatter do
   @spec linkify(String.t(), keyword()) ::
           {String.t(), [{String.t(), User.t()}], [{String.t(), String.t()}]}
   def linkify(text, options \\ []) do
-    options = linkify_opts() ++ options
+    options = options ++ @auto_linker_config
 
     if options[:safe_mention] && Regex.named_captures(@safe_mention_regex, text) do
       %{"mentions" => mentions, "rest" => rest} = Regex.named_captures(@safe_mention_regex, text)
       acc = %{mentions: MapSet.new(), tags: MapSet.new()}
 
-      {text_mentions, %{mentions: mentions}} = Linkify.link_map(mentions, acc, options)
-      {text_rest, %{tags: tags}} = Linkify.link_map(rest, acc, options)
+      {text_mentions, %{mentions: mentions}} = AutoLinker.link_map(mentions, acc, options)
+      {text_rest, %{tags: tags}} = AutoLinker.link_map(rest, acc, options)
 
       {text_mentions <> text_rest, MapSet.to_list(mentions), MapSet.to_list(tags)}
     else
       acc = %{mentions: MapSet.new(), tags: MapSet.new()}
-      {text, %{mentions: mentions, tags: tags}} = Linkify.link_map(text, acc, options)
+      {text, %{mentions: mentions, tags: tags}} = AutoLinker.link_map(text, acc, options)
 
       {text, MapSet.to_list(mentions), MapSet.to_list(tags)}
     end
@@ -115,9 +111,9 @@ defmodule Pleroma.Formatter do
 
     if options[:safe_mention] && Regex.named_captures(@safe_mention_regex, text) do
       %{"mentions" => mentions, "rest" => rest} = Regex.named_captures(@safe_mention_regex, text)
-      Linkify.link(mentions, options) <> Linkify.link(rest, options)
+      AutoLinker.link(mentions, options) <> AutoLinker.link(rest, options)
     else
-      Linkify.link(text, options)
+      AutoLinker.link(text, options)
     end
   end
 
index 747f2dc6be5a2e22832b364c7ed93f15b4aaf512..1729141e996bba5fc9de39846da505390e311f0a 100644 (file)
@@ -11,10 +11,10 @@ defmodule Pleroma.Web.RichMedia.Helpers do
 
   @spec validate_page_url(URI.t() | binary()) :: :ok | :error
   defp validate_page_url(page_url) when is_binary(page_url) do
-    validate_tld = Pleroma.Config.get([Pleroma.Formatter, :validate_tld])
+    validate_tld = Application.get_env(:auto_linker, :opts)[:validate_tld]
 
     page_url
-    |> Linkify.Parser.url?(validate_tld: validate_tld)
+    |> AutoLinker.Parser.url?(scheme: true, validate_tld: validate_tld)
     |> parse_uri(page_url)
   end
 
diff --git a/mix.exs b/mix.exs
index f44d7a887cefaf290af7bbee1a428a77a3efa0b8..52b4cf26840b460fb387ec2670f0a02c7dbfad0c 100644 (file)
--- a/mix.exs
+++ b/mix.exs
@@ -166,7 +166,9 @@ defmodule Pleroma.Mixfile do
       {:floki, "~> 0.25"},
       {:timex, "~> 3.5"},
       {:ueberauth, "~> 0.4"},
-      {:linkify, "~> 0.2.0"},
+      {:auto_linker,
+       git: "https://git.pleroma.social/pleroma/auto_linker.git",
+       ref: "95e8188490e97505c56636c1379ffdf036c1fdde"},
       {:http_signatures,
        git: "https://git.pleroma.social/pleroma/http_signatures.git",
        ref: "293d77bb6f4a67ac8bde1428735c3b42f22cbb30"},
index 6430ddd19f725c214a5c150e61b6e7b55fc01c4e..8dd37a40fc5deb77a483ba0d98b5d2def8929e92 100644 (file)
--- a/mix.lock
+++ b/mix.lock
@@ -1,5 +1,6 @@
 %{
   "accept": {:hex, :accept, "0.3.5", "b33b127abca7cc948bbe6caa4c263369abf1347cfa9d8e699c6d214660f10cd1", [:rebar3], [], "hexpm", "11b18c220bcc2eab63b5470c038ef10eb6783bcb1fcdb11aa4137defa5ac1bb8"},
+  "auto_linker": {:git, "https://git.pleroma.social/pleroma/auto_linker.git", "95e8188490e97505c56636c1379ffdf036c1fdde", [ref: "95e8188490e97505c56636c1379ffdf036c1fdde"]},
   "base62": {:hex, :base62, "1.2.1", "4866763e08555a7b3917064e9eef9194c41667276c51b59de2bc42c6ea65f806", [:mix], [{:custom_base, "~> 0.2.1", [hex: :custom_base, repo: "hexpm", optional: false]}], "hexpm", "3b29948de2013d3f93aa898c884a9dff847e7aec75d9d6d8c1dc4c61c2716c42"},
   "base64url": {:hex, :base64url, "0.0.1", "36a90125f5948e3afd7be97662a1504b934dd5dac78451ca6e9abf85a10286be", [:rebar], [], "hexpm"},
   "bbcode": {:git, "https://git.pleroma.social/pleroma/elixir-libraries/bbcode.git", "f2d267675e9a7e1ad1ea9beb4cc23382762b66c2", [ref: "v0.2.0"]},
@@ -62,7 +63,6 @@
   "jose": {:hex, :jose, "1.10.1", "16d8e460dae7203c6d1efa3f277e25b5af8b659febfc2f2eb4bacf87f128b80a", [:mix, :rebar3], [], "hexpm", "3c7ddc8a9394b92891db7c2771da94bf819834a1a4c92e30857b7d582e2f8257"},
   "jumper": {:hex, :jumper, "1.0.1", "3c00542ef1a83532b72269fab9f0f0c82bf23a35e27d278bfd9ed0865cecabff", [:mix], [], "hexpm", "318c59078ac220e966d27af3646026db9b5a5e6703cb2aa3e26bcfaba65b7433"},
   "libring": {:hex, :libring, "1.4.0", "41246ba2f3fbc76b3971f6bce83119dfec1eee17e977a48d8a9cfaaf58c2a8d6", [:mix], [], "hexpm"},
-  "linkify": {:hex, :linkify, "0.2.0", "2518bbbea21d2caa9d372424e1ad845b640c6630e2d016f1bd1f518f9ebcca28", [:mix], [], "hexpm", "b8ca8a68b79e30b7938d6c996085f3db14939f29538a59ca5101988bb7f917f6"},
   "makeup": {:hex, :makeup, "1.0.0", "671df94cf5a594b739ce03b0d0316aa64312cee2574b6a44becb83cd90fb05dc", [:mix], [{:nimble_parsec, "~> 0.5.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "a10c6eb62cca416019663129699769f0c2ccf39428b3bb3c0cb38c718a0c186d"},
   "makeup_elixir": {:hex, :makeup_elixir, "0.14.0", "cf8b7c66ad1cff4c14679698d532f0b5d45a3968ffbcbfd590339cb57742f1ae", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "d4b316c7222a85bbaa2fd7c6e90e37e953257ad196dc229505137c5e505e9eff"},
   "meck": {:hex, :meck, "0.8.13", "ffedb39f99b0b99703b8601c6f17c7f76313ee12de6b646e671e3188401f7866", [:rebar3], [], "hexpm", "d34f013c156db51ad57cc556891b9720e6a1c1df5fe2e15af999c84d6cebeb1a"},
diff --git a/priv/repo/migrations/20200716195806_autolinker_to_linkify.exs b/priv/repo/migrations/20200716195806_autolinker_to_linkify.exs
deleted file mode 100644 (file)
index 9ec4203..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-defmodule Pleroma.Repo.Migrations.AutolinkerToLinkify do
-  use Ecto.Migration
-
-  alias Pleroma.Repo
-  alias Pleroma.ConfigDB
-
-  @autolinker_path %{group: :auto_linker, key: :opts}
-  @linkify_path %{group: :pleroma, key: Pleroma.Formatter}
-
-  @compat_opts [:class, :rel, :new_window, :truncate, :strip_prefix, :extra]
-
-  def change do
-    with {:ok, {old, new}} <- maybe_get_params() do
-      move_config(old, new)
-    end
-  end
-
-  defp move_config(%{} = old, %{} = new) do
-    {:ok, _} = ConfigDB.update_or_create(new)
-    {:ok, _} = ConfigDB.delete(old)
-    :ok
-  end
-
-  defp maybe_get_params() do
-    with %ConfigDB{value: opts} <- ConfigDB.get_by_params(@autolinker_path),
-         %{} = opts <- transform_opts(opts),
-         %{} = linkify_params <- Map.put(@linkify_path, :value, opts) do
-      {:ok, {@autolinker_path, linkify_params}}
-    end
-  end
-
-  defp transform_opts(opts) when is_list(opts) do
-    opts
-    |> Enum.into(%{})
-    |> Map.take(@compat_opts)
-  end
-end
index 8713ab9c22fbefdb4d761e6f62a610280f99e325..bef5a2c28813b045cf8ba07cdc9ae84691140d65 100644 (file)
@@ -255,36 +255,6 @@ defmodule Pleroma.FormatterTest do
 
       assert {_text, ^expected_mentions, []} = Formatter.linkify(text)
     end
-
-    test "it parses URL containing local mention" do
-      _user = insert(:user, %{nickname: "lain"})
-
-      text = "https://example.com/@lain"
-
-      expected = ~S(<a href="https://example.com/@lain" rel="ugc">https://example.com/@lain</a>)
-
-      assert {^expected, [], []} = Formatter.linkify(text)
-    end
-
-    test "it correctly parses angry face D:< with mention" do
-      lain =
-        insert(:user, %{
-          nickname: "lain@lain.com",
-          ap_id: "https://lain.com/users/lain",
-          id: "9qrWmR0cKniB0YU0TA"
-        })
-
-      text = "@lain@lain.com D:<"
-
-      expected_text =
-        ~S(<span class="h-card"><a class="u-url mention" data-user="9qrWmR0cKniB0YU0TA" href="https://lain.com/users/lain" rel="ugc">@<span>lain</span></a></span> D:<)
-
-      expected_mentions = [
-        {"@lain@lain.com", lain}
-      ]
-
-      assert {^expected_text, ^expected_mentions, []} = Formatter.linkify(text)
-    end
   end
 
   describe ".parse_tags" do