aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorkaniini <nenolod@gmail.com>2019-03-03 16:00:49 +0000
committerkaniini <nenolod@gmail.com>2019-03-03 16:00:49 +0000
commitace4231628ad1af08c8696fb7fe6983549f62631 (patch)
treec310e7065122b6c3a6e5a07d0f3eeaad1f2ef546 /lib
parent6c6a2dbfdd7ae4043633c3201693c5c49538ef84 (diff)
parentf2452d5700afc48284638ae2cd1bff4886571d8c (diff)
downloadpleroma-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.ex9
-rw-r--r--lib/pleroma/web/rel_me.ex51
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