diff options
author | kaniini <nenolod@gmail.com> | 2019-03-03 16:00:49 +0000 |
---|---|---|
committer | kaniini <nenolod@gmail.com> | 2019-03-03 16:00:49 +0000 |
commit | ace4231628ad1af08c8696fb7fe6983549f62631 (patch) | |
tree | c310e7065122b6c3a6e5a07d0f3eeaad1f2ef546 /lib | |
parent | 6c6a2dbfdd7ae4043633c3201693c5c49538ef84 (diff) | |
parent | f2452d5700afc48284638ae2cd1bff4886571d8c (diff) | |
download | pleroma-ace4231628ad1af08c8696fb7fe6983549f62631.tar.gz |
Merge branch 'features/bio_rel_me' into 'develop'
Add rel=me to the User bio
Closes #423
See merge request pleroma/pleroma!813
Diffstat (limited to 'lib')
-rw-r--r-- | lib/pleroma/user.ex | 9 | ||||
-rw-r--r-- | lib/pleroma/web/rel_me.ex | 51 |
2 files changed, 59 insertions, 1 deletions
diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index 78543b426..50e7e7ccd 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -22,6 +22,7 @@ defmodule Pleroma.User do alias Pleroma.Web.OAuth alias Pleroma.Web.ActivityPub.Utils alias Pleroma.Web.ActivityPub.ActivityPub + alias Pleroma.Web.RelMe require Logger @@ -1232,8 +1233,14 @@ defmodule Pleroma.User do {String.trim(name, ":"), url} end) + # TODO: get profile URLs other than user.ap_id + profile_urls = [user.ap_id] + bio - |> CommonUtils.format_input("text/plain", mentions_format: :full) + |> CommonUtils.format_input("text/plain", + mentions_format: :full, + rel: &RelMe.maybe_put_rel_me(&1, profile_urls) + ) |> elem(0) |> Formatter.emojify(emoji) end diff --git a/lib/pleroma/web/rel_me.ex b/lib/pleroma/web/rel_me.ex new file mode 100644 index 000000000..a07db966f --- /dev/null +++ b/lib/pleroma/web/rel_me.ex @@ -0,0 +1,51 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.RelMe do + @hackney_options [ + pool: :media, + timeout: 2_000, + recv_timeout: 2_000, + max_body: 2_000_000 + ] + + if Mix.env() == :test do + def parse(url) when is_binary(url), do: parse_url(url) + else + def parse(url) when is_binary(url) do + Cachex.fetch!(:rel_me_cache, url, fn _ -> + {:commit, parse_url(url)} + end) + rescue + e -> {:error, "Cachex error: #{inspect(e)}"} + end + end + + def parse(_), do: {:error, "No URL provided"} + + defp parse_url(url) do + {:ok, %Tesla.Env{body: html}} = Pleroma.HTTP.get(url, [], adapter: @hackney_options) + + data = + Floki.attribute(html, "link[rel=me]", "href") ++ Floki.attribute(html, "a[rel=me]", "href") + + {:ok, data} + rescue + e -> {:error, "Parsing error: #{inspect(e)}"} + end + + def maybe_put_rel_me("http" <> _ = target_page, profile_urls) when is_list(profile_urls) do + {:ok, rel_me_hrefs} = parse(target_page) + + true = Enum.any?(rel_me_hrefs, fn x -> x in profile_urls end) + + "me" + rescue + _ -> nil + end + + def maybe_put_rel_me(_, _) do + nil + end +end |