This reverts merge request !2677chores/our-libs-hex-releases
@@ -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 | |||
@@ -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", | |||
@@ -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] | |||
} | |||
] | |||
}, | |||
@@ -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`) | |||
@@ -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} | |||
] | |||
@@ -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 | |||
@@ -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 | |||
@@ -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"}, | |||
@@ -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"}, | |||
@@ -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 |
@@ -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 | |||