From 5f35fdcf5d7bc0dc6054eda06d565268f9e79b33 Mon Sep 17 00:00:00 2001 From: href Date: Wed, 22 Nov 2017 19:06:07 +0100 Subject: media proxy: good enough wip --- lib/pleroma/web/mastodon_api/views/account_view.ex | 5 ++- lib/pleroma/web/mastodon_api/views/status_view.ex | 5 ++- lib/pleroma/web/media_proxy/controller.ex | 49 ++++++++++++++++++++++ lib/pleroma/web/media_proxy/media_proxy.ex | 33 +++++++++++++++ lib/pleroma/web/router.ex | 8 ++++ .../twitter_api/representers/object_representer.ex | 2 +- lib/pleroma/web/twitter_api/views/user_view.ex | 7 ++-- 7 files changed, 101 insertions(+), 8 deletions(-) create mode 100644 lib/pleroma/web/media_proxy/controller.ex create mode 100644 lib/pleroma/web/media_proxy/media_proxy.ex (limited to 'lib') diff --git a/lib/pleroma/web/mastodon_api/views/account_view.ex b/lib/pleroma/web/mastodon_api/views/account_view.ex index 02f1e60bb..1d5918988 100644 --- a/lib/pleroma/web/mastodon_api/views/account_view.ex +++ b/lib/pleroma/web/mastodon_api/views/account_view.ex @@ -3,6 +3,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountView do alias Pleroma.User alias Pleroma.Web.MastodonAPI.AccountView alias Pleroma.Web.CommonAPI.Utils + alias Pleroma.Web.MediaProxy defp image_url(%{"url" => [ %{ "href" => href } | _ ]}), do: href defp image_url(_), do: nil @@ -12,10 +13,10 @@ defmodule Pleroma.Web.MastodonAPI.AccountView do end def render("account.json", %{user: user}) do - image = User.avatar_url(user) + image = User.avatar_url(user) |> MediaProxy.url() user_info = User.user_info(user) - header = image_url(user.info["banner"]) || "https://placehold.it/700x335" + header = (image_url(user.info["banner"]) || "https://placehold.it/700x335") |> MediaProxy.url() %{ id: to_string(user.id), diff --git a/lib/pleroma/web/mastodon_api/views/status_view.ex b/lib/pleroma/web/mastodon_api/views/status_view.ex index 5585a5605..64f315597 100644 --- a/lib/pleroma/web/mastodon_api/views/status_view.ex +++ b/lib/pleroma/web/mastodon_api/views/status_view.ex @@ -3,6 +3,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do alias Pleroma.Web.MastodonAPI.{AccountView, StatusView} alias Pleroma.{User, Activity} alias Pleroma.Web.CommonAPI.Utils + alias Pleroma.Web.MediaProxy def render("index.json", opts) do render_many(opts.activities, StatusView, "status.json", opts) @@ -121,9 +122,9 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do %{ id: to_string(attachment["id"] || hash_id), - url: href, + url: MediaProxy.url(href), remote_url: href, - preview_url: href, + preview_url: MediaProxy.url(href), text_url: href, type: type } diff --git a/lib/pleroma/web/media_proxy/controller.ex b/lib/pleroma/web/media_proxy/controller.ex new file mode 100644 index 000000000..84c6e9c8b --- /dev/null +++ b/lib/pleroma/web/media_proxy/controller.ex @@ -0,0 +1,49 @@ +defmodule Pleroma.Web.MediaProxy.MediaProxyController do + use Pleroma.Web, :controller + require Logger + + def remote(conn, %{"sig" => sig, "url" => url}) do + {:ok, url} = Pleroma.MediaProxy.decode_url(sig, url) + url = url |> URI.encode() + case proxy_request(url) do + {:ok, content_type, body} -> + conn + |> put_resp_content_type(content_type) + |> set_cache_header(:default) + |> send_resp(200, body) + other -> + conn + |> set_cache_header(:error) + |> redirect(external: url) + end + end + + defp proxy_request(link) do + instance = ) + headers = [{"user-agent", "Pleroma/MediaProxy; #{Pleroma.Web.base_url()} <#{Application.get_env(:pleroma, :instance)[:email]}>"}] + options = [:insecure, {:follow_redirect, true}] + case :hackney.request(:get, link, headers, "", options) do + {:ok, 200, headers, client} -> + headers = Enum.into(headers, Map.new) + {:ok, body} = :hackney.body(client) + {:ok, headers["Content-Type"], body} + {:ok, status, _, _} -> + Logger.warn "MediaProxy: request failed, status #{status}, link: #{link}" + {:error, :bad_status} + {:error, error} -> + Logger.warn "MediaProxy: request failed, error #{inspect error}, link: #{link}" + {:error, error} + end + end + + @cache_control %{ + default: "public, max-age=1209600", + error: "public, must-revalidate, max-age=160", + } + + defp set_cache_header(conn, true), do: set_cache_header(conn, :default) + defp set_cache_header(conn, false), do: set_cache_header(conn, :error) + defp set_cache_header(conn, key) when is_atom(key), do: set_cache_header(conn, @cache_control[key]) + defp set_cache_header(conn, value) when is_binary(value), do: Plug.Conn.put_resp_header(conn, "cache-control", value) + +end diff --git a/lib/pleroma/web/media_proxy/media_proxy.ex b/lib/pleroma/web/media_proxy/media_proxy.ex new file mode 100644 index 000000000..9c1d71748 --- /dev/null +++ b/lib/pleroma/web/media_proxy/media_proxy.ex @@ -0,0 +1,33 @@ +defmodule Pleroma.Web.MediaProxy do + @base64_opts [padding: false] + @base64_key Application.get_env(:pleroma, Pleroma.Web.Endpoint)[:secret_key_base] + + def url(nil), do: nil + + def url(url) do + if String.starts_with?(url, Pleroma.Web.base_url) do + url + else + base64 = Base.url_encode64(url, @base64_opts) + sig = :crypto.hmac(:sha, @base64_key, base64) + sig64 = sig |> Base.url_encode64(@base64_opts) + cache_url("#{sig64}/#{base64}") + end + end + + def decode_url(sig, url) do + sig = Base.url_decode64!(sig, @base64_opts) + local_sig = :crypto.hmac(:sha, @base64_key, url) + if local_sig == sig do + {:ok, Base.url_decode64!(url, @base64_opts)} + else + {:error, :invalid_signature} + end + end + + defp cache_url(path) do + "/proxy/" <> path + end + + +end diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index 6806e8a75..799021c24 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -233,6 +233,14 @@ defmodule Pleroma.Web.Router do delete "/auth/sign_out", MastodonAPIController, :logout end + pipeline :remote_media do + plug :accepts, ["html"] + end + scope "/proxy/", Pleroma.Web.MediaProxy do + pipe_through :remote_media + get "/:sig/:url", MediaProxyController, :remote + end + scope "/", Fallback do get "/*path", RedirectController, :redirector end diff --git a/lib/pleroma/web/twitter_api/representers/object_representer.ex b/lib/pleroma/web/twitter_api/representers/object_representer.ex index c39b60760..69eaeb36c 100644 --- a/lib/pleroma/web/twitter_api/representers/object_representer.ex +++ b/lib/pleroma/web/twitter_api/representers/object_representer.ex @@ -6,7 +6,7 @@ defmodule Pleroma.Web.TwitterAPI.Representers.ObjectRepresenter do data = object.data url = List.first(data["url"]) %{ - url: url["href"], + url: url["href"] |> Pleroma.Web.MediaProxy.url(), mimetype: url["mediaType"], id: data["uuid"], oembed: false diff --git a/lib/pleroma/web/twitter_api/views/user_view.ex b/lib/pleroma/web/twitter_api/views/user_view.ex index 3dc18eff8..eeef1c037 100644 --- a/lib/pleroma/web/twitter_api/views/user_view.ex +++ b/lib/pleroma/web/twitter_api/views/user_view.ex @@ -2,6 +2,7 @@ defmodule Pleroma.Web.TwitterAPI.UserView do use Pleroma.Web, :view alias Pleroma.User alias Pleroma.Web.CommonAPI.Utils + alias Pleroma.Web.MediaProxy def render("show.json", %{user: user = %User{}} = assigns) do render_one(user, Pleroma.Web.TwitterAPI.UserView, "user.json", assigns) @@ -12,7 +13,7 @@ defmodule Pleroma.Web.TwitterAPI.UserView do end def render("user.json", %{user: user = %User{}} = assigns) do - image = User.avatar_url(user) + image = User.avatar_url(user) |> MediaProxy.url() {following, follows_you, statusnet_blocking} = if assigns[:for] do { User.following?(assigns[:for], user), @@ -44,8 +45,8 @@ defmodule Pleroma.Web.TwitterAPI.UserView do "screen_name" => user.nickname, "statuses_count" => user_info[:note_count], "statusnet_profile_url" => user.ap_id, - "cover_photo" => image_url(user.info["banner"]), - "background_image" => image_url(user.info["background"]) + "cover_photo" => image_url(user.info["banner"]) |> MediaProxy.url(), + "background_image" => image_url(user.info["background"]) |> MediaProxy.url(), } end -- cgit v1.2.3 From e28c110eba5a4c8c5b4b3d2f552a8706db511c51 Mon Sep 17 00:00:00 2001 From: href Date: Wed, 22 Nov 2017 19:14:03 +0100 Subject: mandatory typo fix... --- lib/pleroma/web/media_proxy/controller.ex | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/pleroma/web/media_proxy/controller.ex b/lib/pleroma/web/media_proxy/controller.ex index 84c6e9c8b..fece7cf45 100644 --- a/lib/pleroma/web/media_proxy/controller.ex +++ b/lib/pleroma/web/media_proxy/controller.ex @@ -3,7 +3,7 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do require Logger def remote(conn, %{"sig" => sig, "url" => url}) do - {:ok, url} = Pleroma.MediaProxy.decode_url(sig, url) + {:ok, url} = Pleroma.Web.MediaProxy.decode_url(sig, url) url = url |> URI.encode() case proxy_request(url) do {:ok, content_type, body} -> @@ -19,7 +19,6 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do end defp proxy_request(link) do - instance = ) headers = [{"user-agent", "Pleroma/MediaProxy; #{Pleroma.Web.base_url()} <#{Application.get_env(:pleroma, :instance)[:email]}>"}] options = [:insecure, {:follow_redirect, true}] case :hackney.request(:get, link, headers, "", options) do -- cgit v1.2.3 From 1cb5cbdc6c1cd065e90961a9d538cb72610ae481 Mon Sep 17 00:00:00 2001 From: href Date: Tue, 28 Nov 2017 21:44:25 +0100 Subject: Improve error handling, add configuration --- lib/pleroma/web/media_proxy/controller.ex | 55 ++++++++++++++++++------------ lib/pleroma/web/media_proxy/media_proxy.ex | 17 ++++----- 2 files changed, 40 insertions(+), 32 deletions(-) (limited to 'lib') diff --git a/lib/pleroma/web/media_proxy/controller.ex b/lib/pleroma/web/media_proxy/controller.ex index fece7cf45..dc122fc3a 100644 --- a/lib/pleroma/web/media_proxy/controller.ex +++ b/lib/pleroma/web/media_proxy/controller.ex @@ -2,19 +2,27 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do use Pleroma.Web, :controller require Logger + @cache_control %{ + default: "public, max-age=1209600", + error: "public, must-revalidate, max-age=160", + } + def remote(conn, %{"sig" => sig, "url" => url}) do - {:ok, url} = Pleroma.Web.MediaProxy.decode_url(sig, url) - url = url |> URI.encode() - case proxy_request(url) do - {:ok, content_type, body} -> - conn - |> put_resp_content_type(content_type) - |> set_cache_header(:default) - |> send_resp(200, body) - other -> - conn - |> set_cache_header(:error) - |> redirect(external: url) + config = Application.get_env(:pleroma, :media_proxy, []) + with \ + true <- Keyword.get(config, :enabled, false), + {:ok, url} <- Pleroma.Web.MediaProxy.decode_url(sig, url), + url = URI.encode(url), + {:ok, content_type, body} <- proxy_request(url) + do + conn + |> put_resp_content_type(content_type) + |> set_cache_header(:default) + |> send_resp(200, body) + else + false -> send_error(conn, 404) + {:error, :invalid_signature} -> send_error(conn, 403) + {:error, {:http, _, url}} -> redirect_or_error(conn, url, Keyword.get(config, :redirect_on_failure, true)) end end @@ -28,21 +36,24 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do {:ok, headers["Content-Type"], body} {:ok, status, _, _} -> Logger.warn "MediaProxy: request failed, status #{status}, link: #{link}" - {:error, :bad_status} + {:error, {:http, :bad_status, link}} {:error, error} -> Logger.warn "MediaProxy: request failed, error #{inspect error}, link: #{link}" - {:error, error} + {:error, {:http, error, link}} end end - @cache_control %{ - default: "public, max-age=1209600", - error: "public, must-revalidate, max-age=160", - } + defp set_cache_header(conn, key) do + Plug.Conn.put_resp_header(conn, "cache-control", @cache_control[key]) + end + + defp redirect_or_error(conn, url, true), do: redirect(conn, external: url) + defp redirect_or_error(conn, url, _), do: send_error(conn, 502, "Media proxy error: " <> url) - defp set_cache_header(conn, true), do: set_cache_header(conn, :default) - defp set_cache_header(conn, false), do: set_cache_header(conn, :error) - defp set_cache_header(conn, key) when is_atom(key), do: set_cache_header(conn, @cache_control[key]) - defp set_cache_header(conn, value) when is_binary(value), do: Plug.Conn.put_resp_header(conn, "cache-control", value) + defp send_error(conn, code, body \\ "") do + conn + |> set_cache_header(:error) + |> send_resp(code, body) + end end diff --git a/lib/pleroma/web/media_proxy/media_proxy.ex b/lib/pleroma/web/media_proxy/media_proxy.ex index 9c1d71748..21ebdfbbc 100644 --- a/lib/pleroma/web/media_proxy/media_proxy.ex +++ b/lib/pleroma/web/media_proxy/media_proxy.ex @@ -1,23 +1,25 @@ defmodule Pleroma.Web.MediaProxy do @base64_opts [padding: false] - @base64_key Application.get_env(:pleroma, Pleroma.Web.Endpoint)[:secret_key_base] def url(nil), do: nil def url(url) do - if String.starts_with?(url, Pleroma.Web.base_url) do + config = Application.get_env(:pleroma, :media_proxy, []) + if !Keyword.get(config, :enabled, false) or String.starts_with?(url, Pleroma.Web.base_url) do url else + secret = Application.get_env(:pleroma, Pleroma.Web.Endpoint)[:secret_key_base] base64 = Base.url_encode64(url, @base64_opts) - sig = :crypto.hmac(:sha, @base64_key, base64) + sig = :crypto.hmac(:sha, secret, base64) sig64 = sig |> Base.url_encode64(@base64_opts) - cache_url("#{sig64}/#{base64}") + Keyword.get(config, :base_url, Pleroma.Web.base_url) <> "/proxy/#{sig64}/#{base64}" end end def decode_url(sig, url) do + secret = Application.get_env(:pleroma, Pleroma.Web.Endpoint)[:secret_key_base] sig = Base.url_decode64!(sig, @base64_opts) - local_sig = :crypto.hmac(:sha, @base64_key, url) + local_sig = :crypto.hmac(:sha, secret, url) if local_sig == sig do {:ok, Base.url_decode64!(url, @base64_opts)} else @@ -25,9 +27,4 @@ defmodule Pleroma.Web.MediaProxy do end end - defp cache_url(path) do - "/proxy/" <> path - end - - end -- cgit v1.2.3 From 077faaed8c81113ab7b365facecf7180a5fb0417 Mon Sep 17 00:00:00 2001 From: href Date: Mon, 11 Dec 2017 02:31:37 +0100 Subject: Limit body size to 25MB --- lib/pleroma/web/media_proxy/controller.ex | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) (limited to 'lib') diff --git a/lib/pleroma/web/media_proxy/controller.ex b/lib/pleroma/web/media_proxy/controller.ex index dc122fc3a..d6a1866bf 100644 --- a/lib/pleroma/web/media_proxy/controller.ex +++ b/lib/pleroma/web/media_proxy/controller.ex @@ -2,6 +2,8 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do use Pleroma.Web, :controller require Logger + @max_body_length 25 * 1048576 + @cache_control %{ default: "public, max-age=1209600", error: "public, must-revalidate, max-age=160", @@ -29,11 +31,13 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do defp proxy_request(link) do headers = [{"user-agent", "Pleroma/MediaProxy; #{Pleroma.Web.base_url()} <#{Application.get_env(:pleroma, :instance)[:email]}>"}] options = [:insecure, {:follow_redirect, true}] - case :hackney.request(:get, link, headers, "", options) do - {:ok, 200, headers, client} -> - headers = Enum.into(headers, Map.new) - {:ok, body} = :hackney.body(client) - {:ok, headers["Content-Type"], body} + with \ + {:ok, 200, headers, client} <- :hackney.request(:get, link, headers, "", options), + {:ok, body} <- proxy_request_body(client) + do + headers = Enum.into(headers, Map.new) + {:ok, headers["Content-Type"], body} + else {:ok, status, _, _} -> Logger.warn "MediaProxy: request failed, status #{status}, link: #{link}" {:error, {:http, :bad_status, link}} @@ -56,4 +60,18 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do |> send_resp(code, body) end + defp proxy_request_body(client), do: proxy_request_body(client, <<>>) + defp proxy_request_body(client, body) when byte_size(body) < @max_body_length do + case :hackney.stream_body(client) do + {:ok, data} -> proxy_request_body(client, <>) + :done -> {:ok, body} + {:error, reason} -> {:error, reason} + end + end + defp proxy_request_body(client, _) do + :hackney.close(client) + {:error, :body_too_large} + end + + end -- cgit v1.2.3 From b00e230760891d97c5d8c68e9e5c63b1545f10e9 Mon Sep 17 00:00:00 2001 From: eal Date: Mon, 11 Dec 2017 18:14:33 +0200 Subject: Add a bunch of useless HTML to mentions. --- lib/pleroma/web/common_api/utils.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/pleroma/web/common_api/utils.ex b/lib/pleroma/web/common_api/utils.ex index 1a23b1ad2..2687d6663 100644 --- a/lib/pleroma/web/common_api/utils.ex +++ b/lib/pleroma/web/common_api/utils.ex @@ -91,7 +91,7 @@ defmodule Pleroma.Web.CommonAPI.Utils do Enum.reduce(mentions, step_one, fn ({match, %User{ap_id: ap_id}, uuid}, text) -> short_match = String.split(match, "@") |> tl() |> hd() - String.replace(text, uuid, "@#{short_match}") + String.replace(text, uuid, "@#{short_match}") end) end -- cgit v1.2.3 From 8e82547179e3e2dab3fde111f162d07e3fb98df7 Mon Sep 17 00:00:00 2001 From: href Date: Tue, 12 Dec 2017 11:45:55 +0100 Subject: fix content-type and fallback to image/jpeg --- lib/pleroma/web/media_proxy/controller.ex | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'lib') diff --git a/lib/pleroma/web/media_proxy/controller.ex b/lib/pleroma/web/media_proxy/controller.ex index d6a1866bf..0ac70c9d8 100644 --- a/lib/pleroma/web/media_proxy/controller.ex +++ b/lib/pleroma/web/media_proxy/controller.ex @@ -33,10 +33,11 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do options = [:insecure, {:follow_redirect, true}] with \ {:ok, 200, headers, client} <- :hackney.request(:get, link, headers, "", options), - {:ok, body} <- proxy_request_body(client) + headers = Enum.into(headers, Map.new), + {:ok, body} <- proxy_request_body(client), + content_type <- proxy_request_content_type(headers, body) do - headers = Enum.into(headers, Map.new) - {:ok, headers["Content-Type"], body} + {:ok, content_type, body} else {:ok, status, _, _} -> Logger.warn "MediaProxy: request failed, status #{status}, link: #{link}" @@ -73,5 +74,10 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do {:error, :body_too_large} end + # TODO: the body is passed here as well because some hosts do not provide a content-type. + # At some point we may want to use magic numbers to discover the content-type and reply a proper one. + defp proxy_request_content_type(headers, _body) do + headers["Content-Type"] || headers["content-type"] || "image/jpeg" + end end -- cgit v1.2.3 From f909aec050498a366d8b0ed6c1b5439b5b0891f1 Mon Sep 17 00:00:00 2001 From: href Date: Tue, 12 Dec 2017 12:30:24 +0100 Subject: proxy emojis (i fix emojos better than gargon but sshhhhh) --- lib/pleroma/formatter.ex | 3 ++- lib/pleroma/web/media_proxy/media_proxy.ex | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/pleroma/formatter.ex b/lib/pleroma/formatter.ex index c98db2d94..eed5b5786 100644 --- a/lib/pleroma/formatter.ex +++ b/lib/pleroma/formatter.ex @@ -1,5 +1,6 @@ defmodule Pleroma.Formatter do alias Pleroma.User + alias Pleroma.Web.MediaProxy @link_regex ~r/https?:\/\/[\w\.\/?=\-#%&@~\(\)]+[\w\/]/u def linkify(text) do @@ -125,7 +126,7 @@ defmodule Pleroma.Formatter do end Enum.reduce(all_emoji, text, fn ({emoji, file}, text) -> - String.replace(text, ":#{emoji}:", "#{emoji}") + String.replace(text, ":#{emoji}:", "#{emoji}") end) end diff --git a/lib/pleroma/web/media_proxy/media_proxy.ex b/lib/pleroma/web/media_proxy/media_proxy.ex index 21ebdfbbc..23efc18fa 100644 --- a/lib/pleroma/web/media_proxy/media_proxy.ex +++ b/lib/pleroma/web/media_proxy/media_proxy.ex @@ -3,6 +3,8 @@ defmodule Pleroma.Web.MediaProxy do def url(nil), do: nil + def url(url = "/" <> _), do: url + def url(url) do config = Application.get_env(:pleroma, :media_proxy, []) if !Keyword.get(config, :enabled, false) or String.starts_with?(url, Pleroma.Web.base_url) do -- cgit v1.2.3 From 39ccfdc08439401a01c84a4d45488d0145afa937 Mon Sep 17 00:00:00 2001 From: eal Date: Tue, 12 Dec 2017 18:35:23 +0200 Subject: Add follow import. --- lib/pleroma/web/router.ex | 5 +++++ .../web/twitter_api/controllers/util_controller.ex | 20 +++++++++++++++++++- 2 files changed, 24 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index 6806e8a75..6ec5e3097 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -51,6 +51,11 @@ defmodule Pleroma.Web.Router do get "/emoji", UtilController, :emoji end + scope "/api/pleroma", Pleroma.Web.TwitterAPI do + pipe_through :authenticated_api + post "/follow_import", UtilController, :follow_import + end + scope "/oauth", Pleroma.Web.OAuth do get "/authorize", OAuthController, :authorize post "/authorize", OAuthController, :create_authorization diff --git a/lib/pleroma/web/twitter_api/controllers/util_controller.ex b/lib/pleroma/web/twitter_api/controllers/util_controller.ex index de2abd4d1..c76486392 100644 --- a/lib/pleroma/web/twitter_api/controllers/util_controller.ex +++ b/lib/pleroma/web/twitter_api/controllers/util_controller.ex @@ -2,7 +2,7 @@ defmodule Pleroma.Web.TwitterAPI.UtilController do use Pleroma.Web, :controller alias Pleroma.Web alias Pleroma.Formatter - + alias Pleroma.Web.ActivityPub.ActivityPub alias Pleroma.{Repo, PasswordResetToken, User} def show_password_reset(conn, %{"token" => token}) do @@ -73,4 +73,22 @@ defmodule Pleroma.Web.TwitterAPI.UtilController do def emoji(conn, _params) do json conn, Enum.into(Formatter.get_custom_emoji(), %{}) end + + def follow_import(%{assigns: %{user: user}} = conn, %{"list" => list}) do + errors = list + |> String.split() + |> Enum.map(fn nick -> + with %User{} = follower <- User.get_cached_by_ap_id(user.ap_id), + %User{} = followed <- User.get_or_fetch_by_nickname(nick), + {:ok, follower} <- User.follow(follower, followed), + {:ok, _activity} <- ActivityPub.follow(follower, followed) do + :ok + else + _e -> nick + end + end) + |> Enum.reject(fn x -> x == :ok end) + + json conn, %{"failed follows" => errors} + end end -- cgit v1.2.3 From d89193a8d77f67ad5f6ccc7897889c1ef2d030fa Mon Sep 17 00:00:00 2001 From: eal Date: Tue, 12 Dec 2017 21:03:28 +0200 Subject: Allow uploading a file for follow import. --- lib/pleroma/web/twitter_api/controllers/util_controller.ex | 3 +++ 1 file changed, 3 insertions(+) (limited to 'lib') diff --git a/lib/pleroma/web/twitter_api/controllers/util_controller.ex b/lib/pleroma/web/twitter_api/controllers/util_controller.ex index c76486392..8eeaa0064 100644 --- a/lib/pleroma/web/twitter_api/controllers/util_controller.ex +++ b/lib/pleroma/web/twitter_api/controllers/util_controller.ex @@ -74,6 +74,9 @@ defmodule Pleroma.Web.TwitterAPI.UtilController do json conn, Enum.into(Formatter.get_custom_emoji(), %{}) end + def follow_import(conn, %{"list" => %Plug.Upload{} = listfile}) do + follow_import(conn, %{"list" => File.read!(listfile.path)}) + end def follow_import(%{assigns: %{user: user}} = conn, %{"list" => list}) do errors = list |> String.split() -- cgit v1.2.3 From fdfb508259f45154313df0ae343ee6ca26802505 Mon Sep 17 00:00:00 2001 From: eal Date: Tue, 12 Dec 2017 21:04:41 +0200 Subject: Run follow import in the background. --- .../web/twitter_api/controllers/util_controller.ex | 24 +++++++++++----------- 1 file changed, 12 insertions(+), 12 deletions(-) (limited to 'lib') diff --git a/lib/pleroma/web/twitter_api/controllers/util_controller.ex b/lib/pleroma/web/twitter_api/controllers/util_controller.ex index 8eeaa0064..9079d2f9b 100644 --- a/lib/pleroma/web/twitter_api/controllers/util_controller.ex +++ b/lib/pleroma/web/twitter_api/controllers/util_controller.ex @@ -1,5 +1,6 @@ defmodule Pleroma.Web.TwitterAPI.UtilController do use Pleroma.Web, :controller + require Logger alias Pleroma.Web alias Pleroma.Formatter alias Pleroma.Web.ActivityPub.ActivityPub @@ -78,20 +79,19 @@ defmodule Pleroma.Web.TwitterAPI.UtilController do follow_import(conn, %{"list" => File.read!(listfile.path)}) end def follow_import(%{assigns: %{user: user}} = conn, %{"list" => list}) do - errors = list - |> String.split() + Task.start_link(fn -> + String.split(list) |> Enum.map(fn nick -> - with %User{} = follower <- User.get_cached_by_ap_id(user.ap_id), - %User{} = followed <- User.get_or_fetch_by_nickname(nick), - {:ok, follower} <- User.follow(follower, followed), - {:ok, _activity} <- ActivityPub.follow(follower, followed) do - :ok - else - _e -> nick - end + with %User{} = follower <- User.get_cached_by_ap_id(user.ap_id), + %User{} = followed <- User.get_or_fetch_by_nickname(nick), + {:ok, follower} <- User.follow(follower, followed) do + ActivityPub.follow(follower, followed) + else + _e -> Logger.debug "follow_import: following #{nick} failed" + end + end) end) - |> Enum.reject(fn x -> x == :ok end) - json conn, %{"failed follows" => errors} + json conn, "job started" end end -- cgit v1.2.3 From 1969773fb4a8a6b2cf4354cd4e879bfe6c08dca6 Mon Sep 17 00:00:00 2001 From: eal Date: Mon, 18 Dec 2017 16:23:04 +0200 Subject: Fix follower/following lists. Add tests. --- lib/pleroma/web/router.ex | 4 ++-- lib/pleroma/web/twitter_api/twitter_api_controller.ex | 10 ++++++---- 2 files changed, 8 insertions(+), 6 deletions(-) (limited to 'lib') diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index 6806e8a75..8d8566490 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -142,6 +142,8 @@ defmodule Pleroma.Web.Router do get "/qvitter/statuses/user_timeline", TwitterAPI.Controller, :user_timeline get "/users/show", TwitterAPI.Controller, :show_user + get "/statuses/followers", TwitterAPI.Controller, :followers + get "/statuses/friends", TwitterAPI.Controller, :friends get "/statuses/show/:id", TwitterAPI.Controller, :fetch_status get "/statusnet/conversation/:id", TwitterAPI.Controller, :fetch_conversation @@ -188,8 +190,6 @@ defmodule Pleroma.Web.Router do post "/qvitter/update_avatar", TwitterAPI.Controller, :update_avatar - get "/statuses/followers", TwitterAPI.Controller, :followers - get "/statuses/friends", TwitterAPI.Controller, :friends get "/friends/ids", TwitterAPI.Controller, :friends_ids get "/friendships/no_retweets/ids", TwitterAPI.Controller, :empty_array diff --git a/lib/pleroma/web/twitter_api/twitter_api_controller.ex b/lib/pleroma/web/twitter_api/twitter_api_controller.ex index 73d96c73d..5284a8847 100644 --- a/lib/pleroma/web/twitter_api/twitter_api_controller.ex +++ b/lib/pleroma/web/twitter_api/twitter_api_controller.ex @@ -263,16 +263,18 @@ defmodule Pleroma.Web.TwitterAPI.Controller do end end - def followers(%{assigns: %{user: user}} = conn, _params) do - with {:ok, followers} <- User.get_followers(user) do + def followers(conn, params) do + with {:ok, user} <- TwitterAPI.get_user(conn.assigns.user, params), + {:ok, followers} <- User.get_followers(user) do render(conn, UserView, "index.json", %{users: followers, for: user}) else _e -> bad_request_reply(conn, "Can't get followers") end end - def friends(%{assigns: %{user: user}} = conn, _params) do - with {:ok, friends} <- User.get_friends(user) do + def friends(conn, params) do + with {:ok, user} <- TwitterAPI.get_user(conn.assigns.user, params), + {:ok, friends} <- User.get_friends(user) do render(conn, UserView, "index.json", %{users: friends, for: user}) else _e -> bad_request_reply(conn, "Can't get friends") -- cgit v1.2.3 From 846d59a536544b246960322c874d1569fd79c54b Mon Sep 17 00:00:00 2001 From: Lain Iwakura Date: Mon, 18 Dec 2017 16:16:22 +0100 Subject: Send out salmons before websub. --- lib/pleroma/web/federator/federator.ex | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'lib') diff --git a/lib/pleroma/web/federator/federator.ex b/lib/pleroma/web/federator/federator.ex index b23ed5fcc..c9f9dc7a1 100644 --- a/lib/pleroma/web/federator/federator.ex +++ b/lib/pleroma/web/federator/federator.ex @@ -41,12 +41,12 @@ defmodule Pleroma.Web.Federator do def handle(:publish, activity) do Logger.debug(fn -> "Running publish for #{activity.data["id"]}" end) with actor when not is_nil(actor) <- User.get_cached_by_ap_id(activity.data["actor"]) do - Logger.debug(fn -> "Sending #{activity.data["id"]} out via websub" end) - Websub.publish(Pleroma.Web.OStatus.feed_path(actor), actor, activity) - {:ok, actor} = WebFinger.ensure_keys_present(actor) Logger.debug(fn -> "Sending #{activity.data["id"]} out via salmon" end) Pleroma.Web.Salmon.publish(actor, activity) + + Logger.debug(fn -> "Sending #{activity.data["id"]} out via websub" end) + Websub.publish(Pleroma.Web.OStatus.feed_path(actor), actor, activity) end end -- cgit v1.2.3 From 47887ac8489d929f6c948814a8bacd14fc579ab9 Mon Sep 17 00:00:00 2001 From: Lain Iwakura Date: Mon, 18 Dec 2017 16:56:03 +0100 Subject: MastoAPI: Fix always-sensitive bugs. --- lib/pleroma/formatter.ex | 2 +- lib/pleroma/web/mastodon_api/mastodon_api_controller.ex | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/pleroma/formatter.ex b/lib/pleroma/formatter.ex index c98db2d94..a482c74e4 100644 --- a/lib/pleroma/formatter.ex +++ b/lib/pleroma/formatter.ex @@ -10,7 +10,7 @@ defmodule Pleroma.Formatter do def parse_tags(text, data \\ %{}) do Regex.scan(@tag_regex, text) |> Enum.map(fn (["#" <> tag = full_tag]) -> {full_tag, String.downcase(tag)} end) - |> (fn map -> if data["sensitive"], do: [{"#nsfw", "nsfw"}] ++ map, else: map end).() + |> (fn map -> if data["sensitive"] in [true, "True", "true"], do: [{"#nsfw", "nsfw"}] ++ map, else: map end).() end def parse_mentions(text) do diff --git a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex index e50f53ba4..a17068be8 100644 --- a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex +++ b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex @@ -162,7 +162,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do def public_timeline(%{assigns: %{user: user}} = conn, params) do params = params |> Map.put("type", ["Create", "Announce"]) - |> Map.put("local_only", !!params["local"]) + |> Map.put("local_only", params["local"] in [true, "True", "true"]) |> Map.put("blocking_user", user) activities = ActivityPub.fetch_public_activities(params) -- cgit v1.2.3 From f1f79c0dca9198e2a427f988b60e4222f8afda57 Mon Sep 17 00:00:00 2001 From: Lain Iwakura Date: Tue, 19 Dec 2017 16:15:07 +0100 Subject: Fix timelines in subway tooter. --- lib/pleroma/formatter.ex | 2 +- lib/pleroma/web/mastodon_api/mastodon_api_controller.ex | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/pleroma/formatter.ex b/lib/pleroma/formatter.ex index a482c74e4..2cf4b9ca4 100644 --- a/lib/pleroma/formatter.ex +++ b/lib/pleroma/formatter.ex @@ -10,7 +10,7 @@ defmodule Pleroma.Formatter do def parse_tags(text, data \\ %{}) do Regex.scan(@tag_regex, text) |> Enum.map(fn (["#" <> tag = full_tag]) -> {full_tag, String.downcase(tag)} end) - |> (fn map -> if data["sensitive"] in [true, "True", "true"], do: [{"#nsfw", "nsfw"}] ++ map, else: map end).() + |> (fn map -> if data["sensitive"] in [true, "True", "true", "1"], do: [{"#nsfw", "nsfw"}] ++ map, else: map end).() end def parse_mentions(text) do diff --git a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex index a17068be8..ffa6f42c8 100644 --- a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex +++ b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex @@ -162,7 +162,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do def public_timeline(%{assigns: %{user: user}} = conn, params) do params = params |> Map.put("type", ["Create", "Announce"]) - |> Map.put("local_only", params["local"] in [true, "True", "true"]) + |> Map.put("local_only", params["local"] in [true, "True", "true", "1"]) |> Map.put("blocking_user", user) activities = ActivityPub.fetch_public_activities(params) -- cgit v1.2.3 From 0ccd0e5cc99417428877e61d09a1fa4ea5578625 Mon Sep 17 00:00:00 2001 From: href Date: Thu, 21 Dec 2017 20:59:10 +0100 Subject: Remove a useless URI.encode call in MediaProxy --- lib/pleroma/web/media_proxy/controller.ex | 1 - 1 file changed, 1 deletion(-) (limited to 'lib') diff --git a/lib/pleroma/web/media_proxy/controller.ex b/lib/pleroma/web/media_proxy/controller.ex index 0ac70c9d8..560a65353 100644 --- a/lib/pleroma/web/media_proxy/controller.ex +++ b/lib/pleroma/web/media_proxy/controller.ex @@ -14,7 +14,6 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do with \ true <- Keyword.get(config, :enabled, false), {:ok, url} <- Pleroma.Web.MediaProxy.decode_url(sig, url), - url = URI.encode(url), {:ok, content_type, body} <- proxy_request(url) do conn -- cgit v1.2.3 From 5c09d8d3f199a3f323471f9ba4578371226cd726 Mon Sep 17 00:00:00 2001 From: eal Date: Sat, 23 Dec 2017 16:40:43 +0200 Subject: Unlink follow import process from the one processing request. Mistakes were made. --- lib/pleroma/web/twitter_api/controllers/util_controller.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/pleroma/web/twitter_api/controllers/util_controller.ex b/lib/pleroma/web/twitter_api/controllers/util_controller.ex index 9079d2f9b..9d5654995 100644 --- a/lib/pleroma/web/twitter_api/controllers/util_controller.ex +++ b/lib/pleroma/web/twitter_api/controllers/util_controller.ex @@ -79,7 +79,7 @@ defmodule Pleroma.Web.TwitterAPI.UtilController do follow_import(conn, %{"list" => File.read!(listfile.path)}) end def follow_import(%{assigns: %{user: user}} = conn, %{"list" => list}) do - Task.start_link(fn -> + Task.start(fn -> String.split(list) |> Enum.map(fn nick -> with %User{} = follower <- User.get_cached_by_ap_id(user.ap_id), -- cgit v1.2.3 From 5ddd15d794bc8f9be3ca073589bab1f92b001cce Mon Sep 17 00:00:00 2001 From: Jeff Becker Date: Sat, 30 Dec 2017 11:35:53 -0500 Subject: make httppoison use configurable http proxy --- lib/pleroma/http/http.ex | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 lib/pleroma/http/http.ex (limited to 'lib') diff --git a/lib/pleroma/http/http.ex b/lib/pleroma/http/http.ex new file mode 100644 index 000000000..31135411c --- /dev/null +++ b/lib/pleroma/http/http.ex @@ -0,0 +1,14 @@ + +defmodule Pleroma.HTTP do + use HTTPoison.Base + + def process_request_options(options) do + config = Application.get_env(:pleroma, :http, []) + proxy = Keyword.get(config, :proxy_url, "") + case proxy do + "" -> options + _ -> options ++ [proxy: proxy] + end + end + +end -- cgit v1.2.3 From 1e185b9301ec85cd2aaeb1faf075aaa86f733373 Mon Sep 17 00:00:00 2001 From: Jeff Becker Date: Sun, 31 Dec 2017 09:25:00 -0500 Subject: apply proxy settings to media_proxy --- lib/pleroma/web/media_proxy/controller.ex | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/pleroma/web/media_proxy/controller.ex b/lib/pleroma/web/media_proxy/controller.ex index 560a65353..9327e7253 100644 --- a/lib/pleroma/web/media_proxy/controller.ex +++ b/lib/pleroma/web/media_proxy/controller.ex @@ -2,6 +2,8 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do use Pleroma.Web, :controller require Logger + @httpoison Application.get_env(:pleroma, :httpoison) + @max_body_length 25 * 1048576 @cache_control %{ @@ -29,7 +31,7 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do defp proxy_request(link) do headers = [{"user-agent", "Pleroma/MediaProxy; #{Pleroma.Web.base_url()} <#{Application.get_env(:pleroma, :instance)[:email]}>"}] - options = [:insecure, {:follow_redirect, true}] + options = @httpoison.process_request_options([:insecure, {:follow_redirect, true}]) with \ {:ok, 200, headers, client} <- :hackney.request(:get, link, headers, "", options), headers = Enum.into(headers, Map.new), -- cgit v1.2.3 From 29b7e822fbd5a9001cd31705da5f46672941813c Mon Sep 17 00:00:00 2001 From: Sebastian Huebner Date: Tue, 9 Jan 2018 12:31:11 +0100 Subject: added question about activating mediaproxy to config generator --- lib/mix/tasks/generate_config.ex | 3 ++- lib/mix/tasks/sample_config.eex | 5 +++++ 2 files changed, 7 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/mix/tasks/generate_config.ex b/lib/mix/tasks/generate_config.ex index f20f93e4d..0dfbda226 100644 --- a/lib/mix/tasks/generate_config.ex +++ b/lib/mix/tasks/generate_config.ex @@ -8,11 +8,12 @@ defmodule Mix.Tasks.GenerateConfig do domain = IO.gets("What is your domain name? (e.g. pleroma.soykaf.com): ") |> String.trim name = IO.gets("What is the name of your instance? (e.g. Pleroma/Soykaf): ") |> String.trim email = IO.gets("What's your admin email address: ") |> String.trim + mediaproxy = IO.gets("Do you want to activate the mediaproxy? (true/false): ") |> String.trim secret = :crypto.strong_rand_bytes(64) |> Base.encode64 |> binary_part(0, 64) dbpass = :crypto.strong_rand_bytes(64) |> Base.encode64 |> binary_part(0, 64) resultSql = EEx.eval_file("lib/mix/tasks/sample_psql.eex", [dbpass: dbpass]) - result = EEx.eval_file("lib/mix/tasks/sample_config.eex", [domain: domain, email: email, name: name, secret: secret, dbpass: dbpass]) + result = EEx.eval_file("lib/mix/tasks/sample_config.eex", [domain: domain, email: email, name: name, secret: secret, mediaproxy: mediaproxy, dbpass: dbpass]) IO.puts("\nWriting config to config/generated_config.exs.\n\nCheck it and configure your database, then copy it to either config/dev.secret.exs or config/prod.secret.exs") File.write("config/generated_config.exs", result) diff --git a/lib/mix/tasks/sample_config.eex b/lib/mix/tasks/sample_config.eex index 85a7c554e..05f11c95d 100644 --- a/lib/mix/tasks/sample_config.eex +++ b/lib/mix/tasks/sample_config.eex @@ -10,6 +10,11 @@ config :pleroma, :instance, limit: 5000, registrations_open: true +config :pleroma, :media_proxy, + enabled: <%= mediaproxy %>, + redirect_on_failure: true, + #base_url: "https://cache.pleroma.social" + # Configure your database config :pleroma, Pleroma.Repo, adapter: Ecto.Adapters.Postgres, -- cgit v1.2.3 From d56ab43609985801c853b8743f4c33f691f59924 Mon Sep 17 00:00:00 2001 From: eal Date: Fri, 12 Jan 2018 22:38:14 +0200 Subject: Ask for proxy URL if proxy enabled. Also change the true/false question to y/n --- lib/mix/tasks/generate_config.ex | 12 ++++++++++-- lib/mix/tasks/sample_config.eex | 2 +- 2 files changed, 11 insertions(+), 3 deletions(-) (limited to 'lib') diff --git a/lib/mix/tasks/generate_config.ex b/lib/mix/tasks/generate_config.ex index 0dfbda226..2d962124f 100644 --- a/lib/mix/tasks/generate_config.ex +++ b/lib/mix/tasks/generate_config.ex @@ -8,12 +8,20 @@ defmodule Mix.Tasks.GenerateConfig do domain = IO.gets("What is your domain name? (e.g. pleroma.soykaf.com): ") |> String.trim name = IO.gets("What is the name of your instance? (e.g. Pleroma/Soykaf): ") |> String.trim email = IO.gets("What's your admin email address: ") |> String.trim - mediaproxy = IO.gets("Do you want to activate the mediaproxy? (true/false): ") |> String.trim + mediaproxy = IO.gets("Do you want to activate the mediaproxy? (y/N): ") + |> String.trim() + |> String.downcase() + |> String.starts_with?("y") + proxy_url = if mediaproxy do + IO.gets("What is the mediaproxy's URL? (e.g. https://cache.example.com): ") |> String.trim + else + "https://cache.example.com" + end secret = :crypto.strong_rand_bytes(64) |> Base.encode64 |> binary_part(0, 64) dbpass = :crypto.strong_rand_bytes(64) |> Base.encode64 |> binary_part(0, 64) resultSql = EEx.eval_file("lib/mix/tasks/sample_psql.eex", [dbpass: dbpass]) - result = EEx.eval_file("lib/mix/tasks/sample_config.eex", [domain: domain, email: email, name: name, secret: secret, mediaproxy: mediaproxy, dbpass: dbpass]) + result = EEx.eval_file("lib/mix/tasks/sample_config.eex", [domain: domain, email: email, name: name, secret: secret, mediaproxy: mediaproxy, proxy_url: proxy_url, dbpass: dbpass]) IO.puts("\nWriting config to config/generated_config.exs.\n\nCheck it and configure your database, then copy it to either config/dev.secret.exs or config/prod.secret.exs") File.write("config/generated_config.exs", result) diff --git a/lib/mix/tasks/sample_config.eex b/lib/mix/tasks/sample_config.eex index 05f11c95d..9330fae2d 100644 --- a/lib/mix/tasks/sample_config.eex +++ b/lib/mix/tasks/sample_config.eex @@ -13,7 +13,7 @@ config :pleroma, :instance, config :pleroma, :media_proxy, enabled: <%= mediaproxy %>, redirect_on_failure: true, - #base_url: "https://cache.pleroma.social" + base_url: "<%= proxy_url %>" # Configure your database config :pleroma, Pleroma.Repo, -- cgit v1.2.3 From 9717166d105cec6f9c878653aec2d409265e80a6 Mon Sep 17 00:00:00 2001 From: eal Date: Sat, 13 Jan 2018 18:24:16 +0200 Subject: Add a stats agent for storing data from expensive queries. --- lib/pleroma/application.ex | 1 + lib/pleroma/stats.ex | 38 ++++++++++++++++++++++ .../web/mastodon_api/mastodon_api_controller.ex | 12 +++++-- lib/pleroma/web/router.ex | 1 + 4 files changed, 49 insertions(+), 3 deletions(-) create mode 100644 lib/pleroma/stats.ex (limited to 'lib') diff --git a/lib/pleroma/application.ex b/lib/pleroma/application.ex index 2969ca3c4..cdfca8b1a 100644 --- a/lib/pleroma/application.ex +++ b/lib/pleroma/application.ex @@ -21,6 +21,7 @@ defmodule Pleroma.Application do ]]), worker(Pleroma.Web.Federator, []), worker(Pleroma.Web.ChatChannel.ChatChannelState, []), + worker(Pleroma.Stats, []), ] ++ if Mix.env == :test, do: [], else: [worker(Pleroma.Web.Streamer, [])] diff --git a/lib/pleroma/stats.ex b/lib/pleroma/stats.ex new file mode 100644 index 000000000..45fa27b55 --- /dev/null +++ b/lib/pleroma/stats.ex @@ -0,0 +1,38 @@ +defmodule Pleroma.Stats do + use Agent + import Ecto.Query + alias Pleroma.{User, Repo, Activity} + + def start_link do + agent = Agent.start_link(fn -> %{} end, name: __MODULE__) + schedule_update() + agent + end + + def get do + Agent.get(__MODULE__, fn stats -> stats end) + end + + def schedule_update do + update_stats() + spawn(fn -> + Process.sleep(1000 * 60 * 60 * 1) # 1 hour + schedule_update() + end) + end + + def update_stats do + peers = from(u in Pleroma.User, + select: fragment("?->'host'", u.info), + where: u.local != ^true) + |> Repo.all() |> Enum.uniq() + domain_count = Enum.count(peers) + status_query = from p in Activity, + where: p.local == ^true, + where: fragment("?->'object'->>'type' = ?", p.data, ^"Note") + status_count = Repo.aggregate(status_query, :count, :id) + Agent.update(__MODULE__, fn _ -> + %{peers: peers, domain_count: domain_count, status_count: status_count} + end) + end +end diff --git a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex index ffa6f42c8..6ca7a6076 100644 --- a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex +++ b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex @@ -1,6 +1,6 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do use Pleroma.Web, :controller - alias Pleroma.{Repo, Activity, User, Notification} + alias Pleroma.{Repo, Activity, User, Notification, Stats} alias Pleroma.Web alias Pleroma.Web.MastodonAPI.{StatusView, AccountView, MastodonView} alias Pleroma.Web.ActivityPub.ActivityPub @@ -94,6 +94,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do def masto_instance(conn, _params) do user_count = Repo.aggregate(User.local_user_query, :count, :id) + %{domain_count: domain_count, status_count: status_count} = Stats.get() response = %{ uri: Web.base_url, title: Keyword.get(@instance, :name), @@ -104,9 +105,9 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do streaming_api: String.replace(Web.base_url, ["http","https"], "wss") }, stats: %{ - status_count: 2, + status_count: status_count, user_count: user_count, - domain_count: 3 + domain_count: domain_count }, max_toot_chars: Keyword.get(@instance, :limit) } @@ -114,6 +115,11 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do json(conn, response) end + def peers(conn, _params) do + %{peers: peers} = Stats.get() + json(conn, peers) + end + defp mastodonized_emoji do Pleroma.Formatter.get_custom_emoji() |> Enum.map(fn {shortcode, relative_url} -> diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index 8e6681e68..09104fc86 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -106,6 +106,7 @@ defmodule Pleroma.Web.Router do scope "/api/v1", Pleroma.Web.MastodonAPI do pipe_through :api get "/instance", MastodonAPIController, :masto_instance + get "/instance/peers", MastodonAPIController, :peers post "/apps", MastodonAPIController, :create_app get "/custom_emojis", MastodonAPIController, :custom_emojis -- cgit v1.2.3 From d8db39564eb21d9d9b572baae1886af8d0c047d5 Mon Sep 17 00:00:00 2001 From: eal Date: Sun, 14 Jan 2018 08:15:11 +0200 Subject: Move user count to stats agent. --- lib/pleroma/stats.ex | 13 +++++++++---- lib/pleroma/web/mastodon_api/mastodon_api_controller.ex | 11 ++--------- 2 files changed, 11 insertions(+), 13 deletions(-) (limited to 'lib') diff --git a/lib/pleroma/stats.ex b/lib/pleroma/stats.ex index 45fa27b55..938e5c343 100644 --- a/lib/pleroma/stats.ex +++ b/lib/pleroma/stats.ex @@ -4,13 +4,17 @@ defmodule Pleroma.Stats do alias Pleroma.{User, Repo, Activity} def start_link do - agent = Agent.start_link(fn -> %{} end, name: __MODULE__) + agent = Agent.start_link(fn -> {[], %{}} end, name: __MODULE__) schedule_update() agent end - def get do - Agent.get(__MODULE__, fn stats -> stats end) + def get_stats do + Agent.get(__MODULE__, fn {_, stats} -> stats end) + end + + def get_peers do + Agent.get(__MODULE__, fn {peers, _} -> peers end) end def schedule_update do @@ -31,8 +35,9 @@ defmodule Pleroma.Stats do where: p.local == ^true, where: fragment("?->'object'->>'type' = ?", p.data, ^"Note") status_count = Repo.aggregate(status_query, :count, :id) + user_count = Repo.aggregate(User.local_user_query, :count, :id) Agent.update(__MODULE__, fn _ -> - %{peers: peers, domain_count: domain_count, status_count: status_count} + {peers, %{domain_count: domain_count, status_count: status_count, user_count: user_count}} end) end end diff --git a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex index 6ca7a6076..0615ac11a 100644 --- a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex +++ b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex @@ -93,8 +93,6 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do @instance Application.get_env(:pleroma, :instance) def masto_instance(conn, _params) do - user_count = Repo.aggregate(User.local_user_query, :count, :id) - %{domain_count: domain_count, status_count: status_count} = Stats.get() response = %{ uri: Web.base_url, title: Keyword.get(@instance, :name), @@ -104,11 +102,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do urls: %{ streaming_api: String.replace(Web.base_url, ["http","https"], "wss") }, - stats: %{ - status_count: status_count, - user_count: user_count, - domain_count: domain_count - }, + stats: Stats.get_stats, max_toot_chars: Keyword.get(@instance, :limit) } @@ -116,8 +110,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do end def peers(conn, _params) do - %{peers: peers} = Stats.get() - json(conn, peers) + json(conn, Stats.get_peers) end defp mastodonized_emoji do -- cgit v1.2.3 From 14b086eec22486d1efc8248f5f157696e7621e5b Mon Sep 17 00:00:00 2001 From: eal Date: Mon, 15 Jan 2018 22:18:17 +0200 Subject: Add a default profile picture and banner. This removes the placehold.it dependency. --- lib/pleroma/user.ex | 4 ++-- lib/pleroma/web/mastodon_api/views/account_view.ex | 6 +----- lib/pleroma/web/twitter_api/views/user_view.ex | 2 +- 3 files changed, 4 insertions(+), 8 deletions(-) (limited to 'lib') diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index 09bcf0cb4..6ba2b165c 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -29,14 +29,14 @@ defmodule Pleroma.User do def avatar_url(user) do case user.avatar do %{"url" => [%{"href" => href} | _]} -> href - _ -> "https://placehold.it/48x48" + _ -> "#{Web.base_url()}/static/avi.png" end end def banner_url(user) do case user.info["banner"] do %{"url" => [%{"href" => href} | _]} -> href - _ -> nil + _ -> "#{Web.base_url()}/static/banner.png" end end diff --git a/lib/pleroma/web/mastodon_api/views/account_view.ex b/lib/pleroma/web/mastodon_api/views/account_view.ex index 1d5918988..d2a4dd366 100644 --- a/lib/pleroma/web/mastodon_api/views/account_view.ex +++ b/lib/pleroma/web/mastodon_api/views/account_view.ex @@ -5,19 +5,15 @@ defmodule Pleroma.Web.MastodonAPI.AccountView do alias Pleroma.Web.CommonAPI.Utils alias Pleroma.Web.MediaProxy - defp image_url(%{"url" => [ %{ "href" => href } | _ ]}), do: href - defp image_url(_), do: nil - def render("accounts.json", %{users: users} = opts) do render_many(users, AccountView, "account.json", opts) end def render("account.json", %{user: user}) do image = User.avatar_url(user) |> MediaProxy.url() + header = User.banner_url(user) |> MediaProxy.url() user_info = User.user_info(user) - header = (image_url(user.info["banner"]) || "https://placehold.it/700x335") |> MediaProxy.url() - %{ id: to_string(user.id), username: hd(String.split(user.nickname, "@")), diff --git a/lib/pleroma/web/twitter_api/views/user_view.ex b/lib/pleroma/web/twitter_api/views/user_view.ex index cc6b450fb..1b995f42f 100644 --- a/lib/pleroma/web/twitter_api/views/user_view.ex +++ b/lib/pleroma/web/twitter_api/views/user_view.ex @@ -45,7 +45,7 @@ defmodule Pleroma.Web.TwitterAPI.UserView do "screen_name" => user.nickname, "statuses_count" => user_info[:note_count], "statusnet_profile_url" => user.ap_id, - "cover_photo" => image_url(user.info["banner"]) |> MediaProxy.url(), + "cover_photo" => User.banner_url(user) |> MediaProxy.url(), "background_image" => image_url(user.info["background"]) |> MediaProxy.url(), } -- cgit v1.2.3 From b3e7d7ae6d4ab4b871ecf18706461945fd148a1b Mon Sep 17 00:00:00 2001 From: eal Date: Tue, 16 Jan 2018 15:31:03 +0200 Subject: Fetch external profile in the background. --- lib/pleroma/web/twitter_api/twitter_api.ex | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (limited to 'lib') diff --git a/lib/pleroma/web/twitter_api/twitter_api.ex b/lib/pleroma/web/twitter_api/twitter_api.ex index d04a81cd4..faecebde0 100644 --- a/lib/pleroma/web/twitter_api/twitter_api.ex +++ b/lib/pleroma/web/twitter_api/twitter_api.ex @@ -316,10 +316,12 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do def get_external_profile(for_user, uri) do with {:ok, %User{} = user} <- OStatus.find_or_make_user(uri) do - with url <- user.info["topic"], - {:ok, %{body: body}} <- @httpoison.get(url, [], follow_redirect: true, timeout: 10000, recv_timeout: 20000) do - OStatus.handle_incoming(body) - end + spawn(fn -> + with url <- user.info["topic"], + {:ok, %{body: body}} <- @httpoison.get(url, [], follow_redirect: true, timeout: 10000, recv_timeout: 20000) do + OStatus.handle_incoming(body) + end + end) {:ok, UserView.render("show.json", %{user: user, for: for_user})} else _e -> {:error, "Couldn't find user"} -- cgit v1.2.3 From bc689740f09ee8201982455988bf5f4ccb02fe57 Mon Sep 17 00:00:00 2001 From: eal Date: Tue, 16 Jan 2018 02:17:55 +0200 Subject: Add remote follow path to webfinger. --- lib/pleroma/web/ostatus/ostatus.ex | 4 ++++ lib/pleroma/web/web_finger/web_finger.ex | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/pleroma/web/ostatus/ostatus.ex b/lib/pleroma/web/ostatus/ostatus.ex index 745539b3e..e65cab3ed 100644 --- a/lib/pleroma/web/ostatus/ostatus.ex +++ b/lib/pleroma/web/ostatus/ostatus.ex @@ -22,6 +22,10 @@ defmodule Pleroma.Web.OStatus do "#{user.ap_id}/salmon" end + def remote_follow_path do + "#{Web.base_url}/ostatus_subscribe?acct={uri}" + end + def handle_incoming(xml_string) do with doc when doc != :error <- parse_document(xml_string) do entries = :xmerl_xpath.string('//entry', doc) diff --git a/lib/pleroma/web/web_finger/web_finger.ex b/lib/pleroma/web/web_finger/web_finger.ex index 026d2f98b..4ae3eab59 100644 --- a/lib/pleroma/web/web_finger/web_finger.ex +++ b/lib/pleroma/web/web_finger/web_finger.ex @@ -44,7 +44,8 @@ defmodule Pleroma.Web.WebFinger do {:Link, %{rel: "http://schemas.google.com/g/2010#updates-from", type: "application/atom+xml", href: OStatus.feed_path(user)}}, {:Link, %{rel: "http://webfinger.net/rel/profile-page", type: "text/html", href: user.ap_id}}, {:Link, %{rel: "salmon", href: OStatus.salmon_path(user)}}, - {:Link, %{rel: "magic-public-key", href: "data:application/magic-public-key,#{magic_key}"}} + {:Link, %{rel: "magic-public-key", href: "data:application/magic-public-key,#{magic_key}"}}, + {:Link, %{rel: "http://ostatus.org/schema/1.0/subscribe", template: OStatus.remote_follow_path()}} ] } |> XmlBuilder.to_doc -- cgit v1.2.3 From 47e8c8db05dbe1f9d0ad7790be9ae9ed40f4e909 Mon Sep 17 00:00:00 2001 From: eal Date: Thu, 18 Jan 2018 00:22:08 +0200 Subject: Add remote follow pages. --- lib/pleroma/web/router.ex | 13 ++++++ .../web/templates/twitter_api/util/follow.html.eex | 11 +++++ .../twitter_api/util/follow_login.html.eex | 14 +++++++ .../templates/twitter_api/util/followed.html.eex | 6 +++ .../web/twitter_api/controllers/util_controller.ex | 48 ++++++++++++++++++++++ 5 files changed, 92 insertions(+) create mode 100644 lib/pleroma/web/templates/twitter_api/util/follow.html.eex create mode 100644 lib/pleroma/web/templates/twitter_api/util/follow_login.html.eex create mode 100644 lib/pleroma/web/templates/twitter_api/util/followed.html.eex (limited to 'lib') diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index 09104fc86..63dbd6245 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -28,6 +28,13 @@ defmodule Pleroma.Web.Router do plug Pleroma.Plugs.AuthenticationPlug, %{fetcher: &Router.user_fetcher/1, optional: true} end + pipeline :pleroma_html do + plug :accepts, ["html"] + plug :fetch_session + plug Pleroma.Plugs.OAuthPlug + plug Pleroma.Plugs.AuthenticationPlug, %{fetcher: &Router.user_fetcher/1, optional: true} + end + pipeline :well_known do plug :accepts, ["xml", "xrd+xml"] end @@ -51,6 +58,12 @@ defmodule Pleroma.Web.Router do get "/emoji", UtilController, :emoji end + scope "/", Pleroma.Web.TwitterAPI do + pipe_through :pleroma_html + get "/ostatus_subscribe", UtilController, :remote_follow + post "/ostatus_subscribe", UtilController, :do_remote_follow + end + scope "/api/pleroma", Pleroma.Web.TwitterAPI do pipe_through :authenticated_api post "/follow_import", UtilController, :follow_import diff --git a/lib/pleroma/web/templates/twitter_api/util/follow.html.eex b/lib/pleroma/web/templates/twitter_api/util/follow.html.eex new file mode 100644 index 000000000..06359fa6c --- /dev/null +++ b/lib/pleroma/web/templates/twitter_api/util/follow.html.eex @@ -0,0 +1,11 @@ +<%= if @error == :error do %> +

Error fetching user

+<% else %> +

Remote follow

+ +

<%= @name %>

+ <%= form_for @conn, util_path(@conn, :do_remote_follow), [as: "user"], fn f -> %> + <%= hidden_input f, :id, value: @id %> + <%= submit "Authorize" %> + <% end %> +<% end %> diff --git a/lib/pleroma/web/templates/twitter_api/util/follow_login.html.eex b/lib/pleroma/web/templates/twitter_api/util/follow_login.html.eex new file mode 100644 index 000000000..4e3a2be67 --- /dev/null +++ b/lib/pleroma/web/templates/twitter_api/util/follow_login.html.eex @@ -0,0 +1,14 @@ +<%= if @error do %> +

<%= @error %>

+<% end %> +

Log in to follow

+

<%= @name %>

+ +<%= form_for @conn, util_path(@conn, :do_remote_follow), [as: "authorization"], fn f -> %> +<%= text_input f, :name, placeholder: "Username" %> +
+<%= password_input f, :password, placeholder: "Password" %> +
+<%= hidden_input f, :id, value: @id %> +<%= submit "Authorize" %> +<% end %> diff --git a/lib/pleroma/web/templates/twitter_api/util/followed.html.eex b/lib/pleroma/web/templates/twitter_api/util/followed.html.eex new file mode 100644 index 000000000..da473d502 --- /dev/null +++ b/lib/pleroma/web/templates/twitter_api/util/followed.html.eex @@ -0,0 +1,6 @@ +<%= if @error do %> +

Error following account

+<% else %> +

Account followed!

+<% end %> + diff --git a/lib/pleroma/web/twitter_api/controllers/util_controller.ex b/lib/pleroma/web/twitter_api/controllers/util_controller.ex index 9d5654995..a1d56e3ab 100644 --- a/lib/pleroma/web/twitter_api/controllers/util_controller.ex +++ b/lib/pleroma/web/twitter_api/controllers/util_controller.ex @@ -2,6 +2,8 @@ defmodule Pleroma.Web.TwitterAPI.UtilController do use Pleroma.Web, :controller require Logger alias Pleroma.Web + alias Pleroma.Web.OStatus + alias Comeonin.Pbkdf2 alias Pleroma.Formatter alias Pleroma.Web.ActivityPub.ActivityPub alias Pleroma.{Repo, PasswordResetToken, User} @@ -30,6 +32,52 @@ defmodule Pleroma.Web.TwitterAPI.UtilController do json(conn, "ok") end + def remote_follow(%{assigns: %{user: user}} = conn, %{"acct" => acct}) do + {err, followee} = OStatus.find_or_make_user(acct) + avatar = User.avatar_url(followee) + name = followee.nickname + id = followee.id + + if !!user do + conn + |> render("follow.html", %{error: err, acct: acct, avatar: avatar, name: name, id: id}) + else + conn + |> render("follow_login.html", %{error: false, acct: acct, avatar: avatar, name: name, id: id}) + end + end + + def do_remote_follow(conn, %{"authorization" => %{"name" => username, "password" => password, "id" => id}}) do + followee = Repo.get(User, id) + avatar = User.avatar_url(followee) + name = followee.nickname + with %User{} = user <- User.get_cached_by_nickname(username), + true <- Pbkdf2.checkpw(password, user.password_hash), + %User{} = followed <- Repo.get(User, id), + {:ok, follower} <- User.follow(user, followee), + {:ok, _activity} <- ActivityPub.follow(follower, followee) do + conn + |> render("followed.html", %{error: false}) + else + _e -> + conn + |> render("follow_login.html", %{error: "Wrong username or password", id: id, name: name, avatar: avatar}) + end + end + def do_remote_follow(%{assigns: %{user: user}} = conn, %{"user" => %{"id" => id}}) do + with %User{} = followee <- Repo.get(User, id), + {:ok, follower} <- User.follow(user, followee), + {:ok, _activity} <- ActivityPub.follow(follower, followee) do + conn + |> render("followed.html", %{error: false}) + else + e -> + Logger.debug("Remote follow failed with error #{inspect e}") + conn + |> render("followed.html", %{error: inspect(e)}) + end + end + @instance Application.get_env(:pleroma, :instance) def config(conn, _params) do case get_format(conn) do -- cgit v1.2.3 From fb5aa34092cf8aa04b3b7001e81cf1585ee0041a Mon Sep 17 00:00:00 2001 From: eal Date: Thu, 18 Jan 2018 03:42:09 +0200 Subject: Revert "Add remote follow path to webfinger." This reverts commit bc689740f09ee8201982455988bf5f4ccb02fe57. --- lib/pleroma/web/ostatus/ostatus.ex | 4 ---- lib/pleroma/web/web_finger/web_finger.ex | 3 +-- 2 files changed, 1 insertion(+), 6 deletions(-) (limited to 'lib') diff --git a/lib/pleroma/web/ostatus/ostatus.ex b/lib/pleroma/web/ostatus/ostatus.ex index e65cab3ed..745539b3e 100644 --- a/lib/pleroma/web/ostatus/ostatus.ex +++ b/lib/pleroma/web/ostatus/ostatus.ex @@ -22,10 +22,6 @@ defmodule Pleroma.Web.OStatus do "#{user.ap_id}/salmon" end - def remote_follow_path do - "#{Web.base_url}/ostatus_subscribe?acct={uri}" - end - def handle_incoming(xml_string) do with doc when doc != :error <- parse_document(xml_string) do entries = :xmerl_xpath.string('//entry', doc) diff --git a/lib/pleroma/web/web_finger/web_finger.ex b/lib/pleroma/web/web_finger/web_finger.ex index 4ae3eab59..026d2f98b 100644 --- a/lib/pleroma/web/web_finger/web_finger.ex +++ b/lib/pleroma/web/web_finger/web_finger.ex @@ -44,8 +44,7 @@ defmodule Pleroma.Web.WebFinger do {:Link, %{rel: "http://schemas.google.com/g/2010#updates-from", type: "application/atom+xml", href: OStatus.feed_path(user)}}, {:Link, %{rel: "http://webfinger.net/rel/profile-page", type: "text/html", href: user.ap_id}}, {:Link, %{rel: "salmon", href: OStatus.salmon_path(user)}}, - {:Link, %{rel: "magic-public-key", href: "data:application/magic-public-key,#{magic_key}"}}, - {:Link, %{rel: "http://ostatus.org/schema/1.0/subscribe", template: OStatus.remote_follow_path()}} + {:Link, %{rel: "magic-public-key", href: "data:application/magic-public-key,#{magic_key}"}} ] } |> XmlBuilder.to_doc -- cgit v1.2.3 From b259b4e4d1dc27528b99744fffabfb05c676ec3f Mon Sep 17 00:00:00 2001 From: eal Date: Thu, 18 Jan 2018 03:42:18 +0200 Subject: Revert "Add remote follow pages." This reverts commit 47e8c8db05dbe1f9d0ad7790be9ae9ed40f4e909. --- lib/pleroma/web/router.ex | 13 ------ .../web/templates/twitter_api/util/follow.html.eex | 11 ----- .../twitter_api/util/follow_login.html.eex | 14 ------- .../templates/twitter_api/util/followed.html.eex | 6 --- .../web/twitter_api/controllers/util_controller.ex | 48 ---------------------- 5 files changed, 92 deletions(-) delete mode 100644 lib/pleroma/web/templates/twitter_api/util/follow.html.eex delete mode 100644 lib/pleroma/web/templates/twitter_api/util/follow_login.html.eex delete mode 100644 lib/pleroma/web/templates/twitter_api/util/followed.html.eex (limited to 'lib') diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index 63dbd6245..09104fc86 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -28,13 +28,6 @@ defmodule Pleroma.Web.Router do plug Pleroma.Plugs.AuthenticationPlug, %{fetcher: &Router.user_fetcher/1, optional: true} end - pipeline :pleroma_html do - plug :accepts, ["html"] - plug :fetch_session - plug Pleroma.Plugs.OAuthPlug - plug Pleroma.Plugs.AuthenticationPlug, %{fetcher: &Router.user_fetcher/1, optional: true} - end - pipeline :well_known do plug :accepts, ["xml", "xrd+xml"] end @@ -58,12 +51,6 @@ defmodule Pleroma.Web.Router do get "/emoji", UtilController, :emoji end - scope "/", Pleroma.Web.TwitterAPI do - pipe_through :pleroma_html - get "/ostatus_subscribe", UtilController, :remote_follow - post "/ostatus_subscribe", UtilController, :do_remote_follow - end - scope "/api/pleroma", Pleroma.Web.TwitterAPI do pipe_through :authenticated_api post "/follow_import", UtilController, :follow_import diff --git a/lib/pleroma/web/templates/twitter_api/util/follow.html.eex b/lib/pleroma/web/templates/twitter_api/util/follow.html.eex deleted file mode 100644 index 06359fa6c..000000000 --- a/lib/pleroma/web/templates/twitter_api/util/follow.html.eex +++ /dev/null @@ -1,11 +0,0 @@ -<%= if @error == :error do %> -

Error fetching user

-<% else %> -

Remote follow

- -

<%= @name %>

- <%= form_for @conn, util_path(@conn, :do_remote_follow), [as: "user"], fn f -> %> - <%= hidden_input f, :id, value: @id %> - <%= submit "Authorize" %> - <% end %> -<% end %> diff --git a/lib/pleroma/web/templates/twitter_api/util/follow_login.html.eex b/lib/pleroma/web/templates/twitter_api/util/follow_login.html.eex deleted file mode 100644 index 4e3a2be67..000000000 --- a/lib/pleroma/web/templates/twitter_api/util/follow_login.html.eex +++ /dev/null @@ -1,14 +0,0 @@ -<%= if @error do %> -

<%= @error %>

-<% end %> -

Log in to follow

-

<%= @name %>

- -<%= form_for @conn, util_path(@conn, :do_remote_follow), [as: "authorization"], fn f -> %> -<%= text_input f, :name, placeholder: "Username" %> -
-<%= password_input f, :password, placeholder: "Password" %> -
-<%= hidden_input f, :id, value: @id %> -<%= submit "Authorize" %> -<% end %> diff --git a/lib/pleroma/web/templates/twitter_api/util/followed.html.eex b/lib/pleroma/web/templates/twitter_api/util/followed.html.eex deleted file mode 100644 index da473d502..000000000 --- a/lib/pleroma/web/templates/twitter_api/util/followed.html.eex +++ /dev/null @@ -1,6 +0,0 @@ -<%= if @error do %> -

Error following account

-<% else %> -

Account followed!

-<% end %> - diff --git a/lib/pleroma/web/twitter_api/controllers/util_controller.ex b/lib/pleroma/web/twitter_api/controllers/util_controller.ex index a1d56e3ab..9d5654995 100644 --- a/lib/pleroma/web/twitter_api/controllers/util_controller.ex +++ b/lib/pleroma/web/twitter_api/controllers/util_controller.ex @@ -2,8 +2,6 @@ defmodule Pleroma.Web.TwitterAPI.UtilController do use Pleroma.Web, :controller require Logger alias Pleroma.Web - alias Pleroma.Web.OStatus - alias Comeonin.Pbkdf2 alias Pleroma.Formatter alias Pleroma.Web.ActivityPub.ActivityPub alias Pleroma.{Repo, PasswordResetToken, User} @@ -32,52 +30,6 @@ defmodule Pleroma.Web.TwitterAPI.UtilController do json(conn, "ok") end - def remote_follow(%{assigns: %{user: user}} = conn, %{"acct" => acct}) do - {err, followee} = OStatus.find_or_make_user(acct) - avatar = User.avatar_url(followee) - name = followee.nickname - id = followee.id - - if !!user do - conn - |> render("follow.html", %{error: err, acct: acct, avatar: avatar, name: name, id: id}) - else - conn - |> render("follow_login.html", %{error: false, acct: acct, avatar: avatar, name: name, id: id}) - end - end - - def do_remote_follow(conn, %{"authorization" => %{"name" => username, "password" => password, "id" => id}}) do - followee = Repo.get(User, id) - avatar = User.avatar_url(followee) - name = followee.nickname - with %User{} = user <- User.get_cached_by_nickname(username), - true <- Pbkdf2.checkpw(password, user.password_hash), - %User{} = followed <- Repo.get(User, id), - {:ok, follower} <- User.follow(user, followee), - {:ok, _activity} <- ActivityPub.follow(follower, followee) do - conn - |> render("followed.html", %{error: false}) - else - _e -> - conn - |> render("follow_login.html", %{error: "Wrong username or password", id: id, name: name, avatar: avatar}) - end - end - def do_remote_follow(%{assigns: %{user: user}} = conn, %{"user" => %{"id" => id}}) do - with %User{} = followee <- Repo.get(User, id), - {:ok, follower} <- User.follow(user, followee), - {:ok, _activity} <- ActivityPub.follow(follower, followee) do - conn - |> render("followed.html", %{error: false}) - else - e -> - Logger.debug("Remote follow failed with error #{inspect e}") - conn - |> render("followed.html", %{error: inspect(e)}) - end - end - @instance Application.get_env(:pleroma, :instance) def config(conn, _params) do case get_format(conn) do -- cgit v1.2.3 From 57d413e65541f47a3c303be88c0ac6d4bfed33a9 Mon Sep 17 00:00:00 2001 From: eal Date: Thu, 18 Jan 2018 18:42:32 +0200 Subject: Revert "Revert "Add remote follow path to webfinger."" This reverts commit fb5aa34092cf8aa04b3b7001e81cf1585ee0041a. --- lib/pleroma/web/ostatus/ostatus.ex | 4 ++++ lib/pleroma/web/web_finger/web_finger.ex | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/pleroma/web/ostatus/ostatus.ex b/lib/pleroma/web/ostatus/ostatus.ex index 745539b3e..e65cab3ed 100644 --- a/lib/pleroma/web/ostatus/ostatus.ex +++ b/lib/pleroma/web/ostatus/ostatus.ex @@ -22,6 +22,10 @@ defmodule Pleroma.Web.OStatus do "#{user.ap_id}/salmon" end + def remote_follow_path do + "#{Web.base_url}/ostatus_subscribe?acct={uri}" + end + def handle_incoming(xml_string) do with doc when doc != :error <- parse_document(xml_string) do entries = :xmerl_xpath.string('//entry', doc) diff --git a/lib/pleroma/web/web_finger/web_finger.ex b/lib/pleroma/web/web_finger/web_finger.ex index 026d2f98b..4ae3eab59 100644 --- a/lib/pleroma/web/web_finger/web_finger.ex +++ b/lib/pleroma/web/web_finger/web_finger.ex @@ -44,7 +44,8 @@ defmodule Pleroma.Web.WebFinger do {:Link, %{rel: "http://schemas.google.com/g/2010#updates-from", type: "application/atom+xml", href: OStatus.feed_path(user)}}, {:Link, %{rel: "http://webfinger.net/rel/profile-page", type: "text/html", href: user.ap_id}}, {:Link, %{rel: "salmon", href: OStatus.salmon_path(user)}}, - {:Link, %{rel: "magic-public-key", href: "data:application/magic-public-key,#{magic_key}"}} + {:Link, %{rel: "magic-public-key", href: "data:application/magic-public-key,#{magic_key}"}}, + {:Link, %{rel: "http://ostatus.org/schema/1.0/subscribe", template: OStatus.remote_follow_path()}} ] } |> XmlBuilder.to_doc -- cgit v1.2.3 From beb13bf3a9b207119d70bb817ff1ea92f17a11be Mon Sep 17 00:00:00 2001 From: eal Date: Thu, 18 Jan 2018 18:42:44 +0200 Subject: Revert "Revert "Add remote follow pages."" This reverts commit b259b4e4d1dc27528b99744fffabfb05c676ec3f. --- lib/pleroma/web/router.ex | 13 ++++++ .../web/templates/twitter_api/util/follow.html.eex | 11 +++++ .../twitter_api/util/follow_login.html.eex | 14 +++++++ .../templates/twitter_api/util/followed.html.eex | 6 +++ .../web/twitter_api/controllers/util_controller.ex | 48 ++++++++++++++++++++++ 5 files changed, 92 insertions(+) create mode 100644 lib/pleroma/web/templates/twitter_api/util/follow.html.eex create mode 100644 lib/pleroma/web/templates/twitter_api/util/follow_login.html.eex create mode 100644 lib/pleroma/web/templates/twitter_api/util/followed.html.eex (limited to 'lib') diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index 09104fc86..63dbd6245 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -28,6 +28,13 @@ defmodule Pleroma.Web.Router do plug Pleroma.Plugs.AuthenticationPlug, %{fetcher: &Router.user_fetcher/1, optional: true} end + pipeline :pleroma_html do + plug :accepts, ["html"] + plug :fetch_session + plug Pleroma.Plugs.OAuthPlug + plug Pleroma.Plugs.AuthenticationPlug, %{fetcher: &Router.user_fetcher/1, optional: true} + end + pipeline :well_known do plug :accepts, ["xml", "xrd+xml"] end @@ -51,6 +58,12 @@ defmodule Pleroma.Web.Router do get "/emoji", UtilController, :emoji end + scope "/", Pleroma.Web.TwitterAPI do + pipe_through :pleroma_html + get "/ostatus_subscribe", UtilController, :remote_follow + post "/ostatus_subscribe", UtilController, :do_remote_follow + end + scope "/api/pleroma", Pleroma.Web.TwitterAPI do pipe_through :authenticated_api post "/follow_import", UtilController, :follow_import diff --git a/lib/pleroma/web/templates/twitter_api/util/follow.html.eex b/lib/pleroma/web/templates/twitter_api/util/follow.html.eex new file mode 100644 index 000000000..06359fa6c --- /dev/null +++ b/lib/pleroma/web/templates/twitter_api/util/follow.html.eex @@ -0,0 +1,11 @@ +<%= if @error == :error do %> +

Error fetching user

+<% else %> +

Remote follow

+ +

<%= @name %>

+ <%= form_for @conn, util_path(@conn, :do_remote_follow), [as: "user"], fn f -> %> + <%= hidden_input f, :id, value: @id %> + <%= submit "Authorize" %> + <% end %> +<% end %> diff --git a/lib/pleroma/web/templates/twitter_api/util/follow_login.html.eex b/lib/pleroma/web/templates/twitter_api/util/follow_login.html.eex new file mode 100644 index 000000000..4e3a2be67 --- /dev/null +++ b/lib/pleroma/web/templates/twitter_api/util/follow_login.html.eex @@ -0,0 +1,14 @@ +<%= if @error do %> +

<%= @error %>

+<% end %> +

Log in to follow

+

<%= @name %>

+ +<%= form_for @conn, util_path(@conn, :do_remote_follow), [as: "authorization"], fn f -> %> +<%= text_input f, :name, placeholder: "Username" %> +
+<%= password_input f, :password, placeholder: "Password" %> +
+<%= hidden_input f, :id, value: @id %> +<%= submit "Authorize" %> +<% end %> diff --git a/lib/pleroma/web/templates/twitter_api/util/followed.html.eex b/lib/pleroma/web/templates/twitter_api/util/followed.html.eex new file mode 100644 index 000000000..da473d502 --- /dev/null +++ b/lib/pleroma/web/templates/twitter_api/util/followed.html.eex @@ -0,0 +1,6 @@ +<%= if @error do %> +

Error following account

+<% else %> +

Account followed!

+<% end %> + diff --git a/lib/pleroma/web/twitter_api/controllers/util_controller.ex b/lib/pleroma/web/twitter_api/controllers/util_controller.ex index 9d5654995..a1d56e3ab 100644 --- a/lib/pleroma/web/twitter_api/controllers/util_controller.ex +++ b/lib/pleroma/web/twitter_api/controllers/util_controller.ex @@ -2,6 +2,8 @@ defmodule Pleroma.Web.TwitterAPI.UtilController do use Pleroma.Web, :controller require Logger alias Pleroma.Web + alias Pleroma.Web.OStatus + alias Comeonin.Pbkdf2 alias Pleroma.Formatter alias Pleroma.Web.ActivityPub.ActivityPub alias Pleroma.{Repo, PasswordResetToken, User} @@ -30,6 +32,52 @@ defmodule Pleroma.Web.TwitterAPI.UtilController do json(conn, "ok") end + def remote_follow(%{assigns: %{user: user}} = conn, %{"acct" => acct}) do + {err, followee} = OStatus.find_or_make_user(acct) + avatar = User.avatar_url(followee) + name = followee.nickname + id = followee.id + + if !!user do + conn + |> render("follow.html", %{error: err, acct: acct, avatar: avatar, name: name, id: id}) + else + conn + |> render("follow_login.html", %{error: false, acct: acct, avatar: avatar, name: name, id: id}) + end + end + + def do_remote_follow(conn, %{"authorization" => %{"name" => username, "password" => password, "id" => id}}) do + followee = Repo.get(User, id) + avatar = User.avatar_url(followee) + name = followee.nickname + with %User{} = user <- User.get_cached_by_nickname(username), + true <- Pbkdf2.checkpw(password, user.password_hash), + %User{} = followed <- Repo.get(User, id), + {:ok, follower} <- User.follow(user, followee), + {:ok, _activity} <- ActivityPub.follow(follower, followee) do + conn + |> render("followed.html", %{error: false}) + else + _e -> + conn + |> render("follow_login.html", %{error: "Wrong username or password", id: id, name: name, avatar: avatar}) + end + end + def do_remote_follow(%{assigns: %{user: user}} = conn, %{"user" => %{"id" => id}}) do + with %User{} = followee <- Repo.get(User, id), + {:ok, follower} <- User.follow(user, followee), + {:ok, _activity} <- ActivityPub.follow(follower, followee) do + conn + |> render("followed.html", %{error: false}) + else + e -> + Logger.debug("Remote follow failed with error #{inspect e}") + conn + |> render("followed.html", %{error: inspect(e)}) + end + end + @instance Application.get_env(:pleroma, :instance) def config(conn, _params) do case get_format(conn) do -- cgit v1.2.3 From 0f722a8c223c1953c9c9fb45e73cc9ace92839e2 Mon Sep 17 00:00:00 2001 From: Roger Braun Date: Sat, 20 Jan 2018 18:38:30 +0100 Subject: Stats: Make less crashy and improve query. --- lib/pleroma/stats.ex | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) (limited to 'lib') diff --git a/lib/pleroma/stats.ex b/lib/pleroma/stats.ex index 938e5c343..0484f1a2d 100644 --- a/lib/pleroma/stats.ex +++ b/lib/pleroma/stats.ex @@ -5,7 +5,7 @@ defmodule Pleroma.Stats do def start_link do agent = Agent.start_link(fn -> {[], %{}} end, name: __MODULE__) - schedule_update() + spawn(fn -> schedule_update() end) agent end @@ -18,23 +18,22 @@ defmodule Pleroma.Stats do end def schedule_update do - update_stats() spawn(fn -> Process.sleep(1000 * 60 * 60 * 1) # 1 hour schedule_update() end) + update_stats() end def update_stats do peers = from(u in Pleroma.User, - select: fragment("?->'host'", u.info), + select: fragment("distinct ?->'host'", u.info), where: u.local != ^true) - |> Repo.all() |> Enum.uniq() + |> Repo.all() domain_count = Enum.count(peers) - status_query = from p in Activity, - where: p.local == ^true, - where: fragment("?->'object'->>'type' = ?", p.data, ^"Note") - status_count = Repo.aggregate(status_query, :count, :id) + status_query = from(u in User.local_user_query, + select: fragment("sum((?->>'note_count')::int)", u.info)) + status_count = Repo.one(status_query) |> IO.inspect user_count = Repo.aggregate(User.local_user_query, :count, :id) Agent.update(__MODULE__, fn _ -> {peers, %{domain_count: domain_count, status_count: status_count, user_count: user_count}} -- cgit v1.2.3 From 066fe1a697286e38c9e9ef7f2c273c4e7a50ffdc Mon Sep 17 00:00:00 2001 From: Jeff Becker Date: Mon, 29 Jan 2018 10:06:16 -0500 Subject: use nil instead of empty string --- lib/pleroma/http/http.ex | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/pleroma/http/http.ex b/lib/pleroma/http/http.ex index 31135411c..8b8a82353 100644 --- a/lib/pleroma/http/http.ex +++ b/lib/pleroma/http/http.ex @@ -4,9 +4,9 @@ defmodule Pleroma.HTTP do def process_request_options(options) do config = Application.get_env(:pleroma, :http, []) - proxy = Keyword.get(config, :proxy_url, "") + proxy = Keyword.get(config, :proxy_url, nil) case proxy do - "" -> options + nil -> options _ -> options ++ [proxy: proxy] end end -- cgit v1.2.3 From 64e51c2cfa3e6da0f4998bab5358646cba8f29fa Mon Sep 17 00:00:00 2001 From: Roger Braun Date: Mon, 29 Jan 2018 17:44:35 +0100 Subject: Fix incoming Pleroma CWs. Closes #96. --- lib/pleroma/web/ostatus/ostatus.ex | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/pleroma/web/ostatus/ostatus.ex b/lib/pleroma/web/ostatus/ostatus.ex index e65cab3ed..c35ba42be 100644 --- a/lib/pleroma/web/ostatus/ostatus.ex +++ b/lib/pleroma/web/ostatus/ostatus.ex @@ -163,8 +163,7 @@ defmodule Pleroma.Web.OStatus do Get the cw that mastodon uses. """ def get_cw(entry) do - with scope when not is_nil(scope) <- string_from_xpath("//mastodon:scope", entry), - cw when not is_nil(cw) <- string_from_xpath("/*/summary", entry) do + with cw when not is_nil(cw) <- string_from_xpath("/*/summary", entry) do cw else _e -> nil end -- cgit v1.2.3 From b713b28dfdecb4a3f67550cd982be1450d774a81 Mon Sep 17 00:00:00 2001 From: Hakaba Hitoyo Date: Tue, 30 Jan 2018 19:26:07 +0900 Subject: provide logo at feed.atom --- lib/pleroma/web/ostatus/feed_representer.ex | 3 +++ 1 file changed, 3 insertions(+) (limited to 'lib') diff --git a/lib/pleroma/web/ostatus/feed_representer.ex b/lib/pleroma/web/ostatus/feed_representer.ex index 08710f246..bda017534 100644 --- a/lib/pleroma/web/ostatus/feed_representer.ex +++ b/lib/pleroma/web/ostatus/feed_representer.ex @@ -1,6 +1,8 @@ defmodule Pleroma.Web.OStatus.FeedRepresenter do alias Pleroma.Web.OStatus alias Pleroma.Web.OStatus.{UserRepresenter, ActivityRepresenter} + alias Pleroma.User + alias Pleroma.Web.MediaProxy def to_simple_form(user, activities, _users) do most_recent_update = (List.first(activities) || user).updated_at @@ -25,6 +27,7 @@ defmodule Pleroma.Web.OStatus.FeedRepresenter do {:id, h.(OStatus.feed_path(user))}, {:title, ['#{user.nickname}\'s timeline']}, {:updated, h.(most_recent_update)}, + {:logo, (User.avatar_url(user) |> MediaProxy.url())}, {:link, [rel: 'hub', href: h.(OStatus.pubsub_path(user))], []}, {:link, [rel: 'salmon', href: h.(OStatus.salmon_path(user))], []}, {:link, [rel: 'self', href: h.(OStatus.feed_path(user)), type: 'application/atom+xml'], []}, -- cgit v1.2.3 From cefb6cfea191c7a416b59d6f8e4d1f45acff4332 Mon Sep 17 00:00:00 2001 From: Hakaba Hitoyo Date: Tue, 30 Jan 2018 19:37:04 +0900 Subject: provide logo at feed.atom (debug) --- lib/pleroma/web/ostatus/feed_representer.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/pleroma/web/ostatus/feed_representer.ex b/lib/pleroma/web/ostatus/feed_representer.ex index bda017534..10860ce04 100644 --- a/lib/pleroma/web/ostatus/feed_representer.ex +++ b/lib/pleroma/web/ostatus/feed_representer.ex @@ -27,7 +27,7 @@ defmodule Pleroma.Web.OStatus.FeedRepresenter do {:id, h.(OStatus.feed_path(user))}, {:title, ['#{user.nickname}\'s timeline']}, {:updated, h.(most_recent_update)}, - {:logo, (User.avatar_url(user) |> MediaProxy.url())}, + {:logo, [to_charlist(User.avatar_url(user) |> MediaProxy.url())]}, {:link, [rel: 'hub', href: h.(OStatus.pubsub_path(user))], []}, {:link, [rel: 'salmon', href: h.(OStatus.salmon_path(user))], []}, {:link, [rel: 'self', href: h.(OStatus.feed_path(user)), type: 'application/atom+xml'], []}, -- cgit v1.2.3 From a4335e391f6818b9ea09520f60ca8c436d643f38 Mon Sep 17 00:00:00 2001 From: Hakaba Hitoyo Date: Wed, 31 Jan 2018 22:51:25 +0900 Subject: provide instance thumbnail at /api/v1/instance --- lib/pleroma/web/mastodon_api/mastodon_api_controller.ex | 1 + 1 file changed, 1 insertion(+) (limited to 'lib') diff --git a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex index 0615ac11a..ce30453cb 100644 --- a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex +++ b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex @@ -103,6 +103,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do streaming_api: String.replace(Web.base_url, ["http","https"], "wss") }, stats: Stats.get_stats, + thumbnail: Web.base_url <> "/static/instance-thumbnail.jpeg", max_toot_chars: Keyword.get(@instance, :limit) } -- cgit v1.2.3 From e47f60c05376b9e2af0c90a984014003aac22104 Mon Sep 17 00:00:00 2001 From: Hakaba Hitoyo Date: Wed, 31 Jan 2018 23:04:34 +0900 Subject: provide instance thumbnail at /api/v1/instance (debug) --- lib/pleroma/web/mastodon_api/mastodon_api_controller.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex index ce30453cb..e16a2a092 100644 --- a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex +++ b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex @@ -103,7 +103,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do streaming_api: String.replace(Web.base_url, ["http","https"], "wss") }, stats: Stats.get_stats, - thumbnail: Web.base_url <> "/static/instance-thumbnail.jpeg", + thumbnail: Web.base_url <> "/instance/thumbnail.jpeg", max_toot_chars: Keyword.get(@instance, :limit) } -- cgit v1.2.3 From 03c15a54f562dfcc26afeefbe00921e446ff5c31 Mon Sep 17 00:00:00 2001 From: Hakaba Hitoyo Date: Wed, 31 Jan 2018 23:09:47 +0900 Subject: provide instance thumbnail at /api/v1/instance (debug) --- lib/pleroma/web/endpoint.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/pleroma/web/endpoint.ex b/lib/pleroma/web/endpoint.ex index b57cf3917..725d2ee64 100644 --- a/lib/pleroma/web/endpoint.ex +++ b/lib/pleroma/web/endpoint.ex @@ -12,7 +12,7 @@ defmodule Pleroma.Web.Endpoint do at: "/media", from: "uploads", gzip: false plug Plug.Static, at: "/", from: :pleroma, - only: ~w(index.html static finmoji emoji packs sounds sw.js) + only: ~w(index.html static finmoji emoji packs sounds instance sw.js) # Code reloading can be explicitly enabled under the # :code_reloader configuration of your endpoint. -- cgit v1.2.3 From ab8b9ababab97ed40720b86bb1d2631dbdcf4c61 Mon Sep 17 00:00:00 2001 From: eal Date: Wed, 31 Jan 2018 16:23:31 +0200 Subject: Split emoji to default and custom. --- lib/pleroma/formatter.ex | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) (limited to 'lib') diff --git a/lib/pleroma/formatter.ex b/lib/pleroma/formatter.ex index 8b736797b..fdf91f56e 100644 --- a/lib/pleroma/formatter.ex +++ b/lib/pleroma/formatter.ex @@ -104,13 +104,19 @@ defmodule Pleroma.Formatter do {finmoji, "/finmoji/128px/#{finmoji}-128.png"} end) - @emoji_from_file (with {:ok, file} <- File.read("config/emoji.txt") do - file - |> String.trim - |> String.split("\n") - |> Enum.map(fn(line) -> - [name, file] = String.split(line, ", ") - {name, file} + @emoji_from_file (with {:ok, default} <- File.read("config/emoji.txt") do + custom = + with {:ok, custom} <- File.read("config/custom_emoji.txt") do + custom + else + _e -> "" + end + (default <> "\n" <> custom) + |> String.trim() + |> String.split(~r/\n+/) + |> Enum.map(fn(line) -> + [name, file] = String.split(line, ~r/,\s*/) + {name, file} end) else _ -> [] -- cgit v1.2.3 From ab83e0de6d389428cec11fe94280d675a38f00d0 Mon Sep 17 00:00:00 2001 From: eal Date: Thu, 1 Feb 2018 21:41:19 +0200 Subject: TwitterAPI: Add is_local to user view. --- lib/pleroma/web/twitter_api/views/user_view.ex | 1 + 1 file changed, 1 insertion(+) (limited to 'lib') diff --git a/lib/pleroma/web/twitter_api/views/user_view.ex b/lib/pleroma/web/twitter_api/views/user_view.ex index 1b995f42f..f49bcc0fb 100644 --- a/lib/pleroma/web/twitter_api/views/user_view.ex +++ b/lib/pleroma/web/twitter_api/views/user_view.ex @@ -47,6 +47,7 @@ defmodule Pleroma.Web.TwitterAPI.UserView do "statusnet_profile_url" => user.ap_id, "cover_photo" => User.banner_url(user) |> MediaProxy.url(), "background_image" => image_url(user.info["background"]) |> MediaProxy.url(), + "is_local" => user.local } if assigns[:token] do -- cgit v1.2.3 From 29be70c0082ea09f03896c7e52e2b8a9cdbea641 Mon Sep 17 00:00:00 2001 From: eal Date: Fri, 2 Feb 2018 00:00:48 +0200 Subject: Add remote following of local profiles. --- lib/pleroma/web/router.ex | 1 + .../templates/twitter_api/util/subscribe.html.eex | 10 ++++++++++ .../web/twitter_api/controllers/util_controller.ex | 21 +++++++++++++++++++++ lib/pleroma/web/web_finger/web_finger.ex | 4 +++- 4 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 lib/pleroma/web/templates/twitter_api/util/subscribe.html.eex (limited to 'lib') diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index 63dbd6245..6e9f40955 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -62,6 +62,7 @@ defmodule Pleroma.Web.Router do pipe_through :pleroma_html get "/ostatus_subscribe", UtilController, :remote_follow post "/ostatus_subscribe", UtilController, :do_remote_follow + post "/main/ostatus", UtilController, :remote_subscribe end scope "/api/pleroma", Pleroma.Web.TwitterAPI do diff --git a/lib/pleroma/web/templates/twitter_api/util/subscribe.html.eex b/lib/pleroma/web/templates/twitter_api/util/subscribe.html.eex new file mode 100644 index 000000000..f60accebf --- /dev/null +++ b/lib/pleroma/web/templates/twitter_api/util/subscribe.html.eex @@ -0,0 +1,10 @@ +<%= if @error do %> +

Error: <%= @error %>

+<% else %> +

Remotely follow <%= @nickname %>

+ <%= form_for @conn, util_path(@conn, :remote_subscribe), [as: "user"], fn f -> %> + <%= hidden_input f, :nickname, value: @nickname %> + <%= text_input f, :profile, placeholder: "Your account ID, e.g. lain@quitter.se" %> + <%= submit "Follow" %> + <% end %> +<% end %> diff --git a/lib/pleroma/web/twitter_api/controllers/util_controller.ex b/lib/pleroma/web/twitter_api/controllers/util_controller.ex index a1d56e3ab..0b7c64015 100644 --- a/lib/pleroma/web/twitter_api/controllers/util_controller.ex +++ b/lib/pleroma/web/twitter_api/controllers/util_controller.ex @@ -3,6 +3,7 @@ defmodule Pleroma.Web.TwitterAPI.UtilController do require Logger alias Pleroma.Web alias Pleroma.Web.OStatus + alias Pleroma.Web.WebFinger alias Comeonin.Pbkdf2 alias Pleroma.Formatter alias Pleroma.Web.ActivityPub.ActivityPub @@ -32,6 +33,26 @@ defmodule Pleroma.Web.TwitterAPI.UtilController do json(conn, "ok") end + def remote_subscribe(conn, %{"nickname" => nick, "profile" => _}) do + with %User{} = user <- User.get_cached_by_nickname(nick), + avatar = User.avatar_url(user) do + conn + |> render("subscribe.html", %{nickname: nick, avatar: avatar, error: false}) + else + _e -> render(conn, "subscribe.html", %{nickname: nick, avatar: nil, error: "Could not find user"}) + end + end + def remote_subscribe(conn, %{"user" => %{"nickname" => nick, "profile" => profile}}) do + with {:ok, %{"subscribe_address" => template}} <- WebFinger.finger(profile), + %User{ap_id: ap_id} <- User.get_cached_by_nickname(nick) do + conn + |> Phoenix.Controller.redirect(external: String.replace(template, "{uri}", ap_id)) + else + _e -> + render(conn, "subscribe.html", %{nickname: nick, avatar: nil, error: "Something went wrong."}) + end + end + def remote_follow(%{assigns: %{user: user}} = conn, %{"acct" => acct}) do {err, followee} = OStatus.find_or_make_user(acct) avatar = User.avatar_url(followee) diff --git a/lib/pleroma/web/web_finger/web_finger.ex b/lib/pleroma/web/web_finger/web_finger.ex index 4ae3eab59..95e717b17 100644 --- a/lib/pleroma/web/web_finger/web_finger.ex +++ b/lib/pleroma/web/web_finger/web_finger.ex @@ -69,11 +69,13 @@ defmodule Pleroma.Web.WebFinger do topic = XML.string_from_xpath(~s{//Link[@rel="http://schemas.google.com/g/2010#updates-from"]/@href}, doc) subject = XML.string_from_xpath("//Subject", doc) salmon = XML.string_from_xpath(~s{//Link[@rel="salmon"]/@href}, doc) + subscribe_address = XML.string_from_xpath(~s{//Link[@rel="http://ostatus.org/schema/1.0/subscribe"]/@template}, doc) data = %{ "magic_key" => magic_key, "topic" => topic, "subject" => subject, - "salmon" => salmon + "salmon" => salmon, + "subscribe_address" => subscribe_address } {:ok, data} end -- cgit v1.2.3 From f0745148a3126e3bc621170791a55713e929c682 Mon Sep 17 00:00:00 2001 From: eal Date: Thu, 1 Feb 2018 19:23:26 +0200 Subject: Add config option for enabling/disabling chat. --- lib/pleroma/application.ex | 6 +++++- lib/pleroma/web/channels/user_socket.ex | 4 +++- lib/pleroma/web/endpoint.ex | 4 +++- 3 files changed, 11 insertions(+), 3 deletions(-) (limited to 'lib') diff --git a/lib/pleroma/application.ex b/lib/pleroma/application.ex index cdfca8b1a..79b9dee9d 100644 --- a/lib/pleroma/application.ex +++ b/lib/pleroma/application.ex @@ -20,14 +20,18 @@ defmodule Pleroma.Application do limit: 2500 ]]), worker(Pleroma.Web.Federator, []), - worker(Pleroma.Web.ChatChannel.ChatChannelState, []), worker(Pleroma.Stats, []), ] ++ if Mix.env == :test, do: [], else: [worker(Pleroma.Web.Streamer, [])] + ++ if !chat_enabled(), do: [], else: [worker(Pleroma.Web.ChatChannel.ChatChannelState, [])] # See http://elixir-lang.org/docs/stable/elixir/Supervisor.html # for other strategies and supported options opts = [strategy: :one_for_one, name: Pleroma.Supervisor] Supervisor.start_link(children, opts) end + + defp chat_enabled do + Application.get_env(:pleroma, :chat, []) |> Keyword.get(:enabled) + end end diff --git a/lib/pleroma/web/channels/user_socket.ex b/lib/pleroma/web/channels/user_socket.ex index 4a9bb8e22..f18b3cb80 100644 --- a/lib/pleroma/web/channels/user_socket.ex +++ b/lib/pleroma/web/channels/user_socket.ex @@ -5,7 +5,9 @@ defmodule Pleroma.Web.UserSocket do ## Channels # channel "room:*", Pleroma.Web.RoomChannel - channel "chat:*", Pleroma.Web.ChatChannel + if Application.get_env(:pleroma, :chat) |> Keyword.get(:enabled) do + channel "chat:*", Pleroma.Web.ChatChannel + end ## Transports transport :websocket, Phoenix.Transports.WebSocket diff --git a/lib/pleroma/web/endpoint.ex b/lib/pleroma/web/endpoint.ex index 725d2ee64..8b09199e0 100644 --- a/lib/pleroma/web/endpoint.ex +++ b/lib/pleroma/web/endpoint.ex @@ -1,7 +1,9 @@ defmodule Pleroma.Web.Endpoint do use Phoenix.Endpoint, otp_app: :pleroma - socket "/socket", Pleroma.Web.UserSocket + if Application.get_env(:pleroma, :chat) |> Keyword.get(:enabled) do + socket "/socket", Pleroma.Web.UserSocket + end socket "/api/v1", Pleroma.Web.MastodonAPI.MastodonSocket # Serve at "/" the static files from "priv/static" directory. -- cgit v1.2.3 From ea6d1b2b172d88b6ea47ab044813d39b053534b2 Mon Sep 17 00:00:00 2001 From: Hakaba Hitoyo Date: Sat, 3 Feb 2018 20:43:14 +0900 Subject: move avi.png & banner.png from /priv/static/static to /priv/static/images --- lib/pleroma/user.ex | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index 6ba2b165c..81cec8265 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -29,14 +29,14 @@ defmodule Pleroma.User do def avatar_url(user) do case user.avatar do %{"url" => [%{"href" => href} | _]} -> href - _ -> "#{Web.base_url()}/static/avi.png" + _ -> "#{Web.base_url()}/images/avi.png" end end def banner_url(user) do case user.info["banner"] do %{"url" => [%{"href" => href} | _]} -> href - _ -> "#{Web.base_url()}/static/banner.png" + _ -> "#{Web.base_url()}/images/banner.png" end end -- cgit v1.2.3 From c8a29315495190c27f86b7331aa18c24e8fe9fcc Mon Sep 17 00:00:00 2001 From: Hakaba Hitoyo Date: Sat, 3 Feb 2018 20:52:01 +0900 Subject: add backend endpoint /images --- lib/pleroma/web/endpoint.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/pleroma/web/endpoint.ex b/lib/pleroma/web/endpoint.ex index 725d2ee64..ec88df692 100644 --- a/lib/pleroma/web/endpoint.ex +++ b/lib/pleroma/web/endpoint.ex @@ -12,7 +12,7 @@ defmodule Pleroma.Web.Endpoint do at: "/media", from: "uploads", gzip: false plug Plug.Static, at: "/", from: :pleroma, - only: ~w(index.html static finmoji emoji packs sounds instance sw.js) + only: ~w(index.html static finmoji emoji packs sounds images instance sw.js) # Code reloading can be explicitly enabled under the # :code_reloader configuration of your endpoint. -- cgit v1.2.3 From 286f6698eee9127928ce945e73be2e1059ba4e81 Mon Sep 17 00:00:00 2001 From: eal Date: Sun, 4 Feb 2018 15:14:08 +0200 Subject: Detect file type if none given. --- lib/pleroma/upload.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/pleroma/upload.ex b/lib/pleroma/upload.ex index 3567c6c88..c41617c68 100644 --- a/lib/pleroma/upload.ex +++ b/lib/pleroma/upload.ex @@ -9,7 +9,7 @@ defmodule Pleroma.Upload do File.cp!(file.path, result_file) # fix content type on some image uploads - content_type = if file.content_type == "application/octet-stream" do + content_type = if file.content_type in [nil, "application/octet-stream"] do get_content_type(file.path) else file.content_type -- cgit v1.2.3 From 2f291576e4eef95e6867348e24bc526058518095 Mon Sep 17 00:00:00 2001 From: Roger Braun Date: Thu, 8 Feb 2018 16:03:30 +0100 Subject: Fix compile errors on 1.4.5 --- lib/pleroma/stats.ex | 1 - lib/pleroma/web/chat_channel.ex | 1 - 2 files changed, 2 deletions(-) (limited to 'lib') diff --git a/lib/pleroma/stats.ex b/lib/pleroma/stats.ex index 0484f1a2d..737e9b62e 100644 --- a/lib/pleroma/stats.ex +++ b/lib/pleroma/stats.ex @@ -1,5 +1,4 @@ defmodule Pleroma.Stats do - use Agent import Ecto.Query alias Pleroma.{User, Repo, Activity} diff --git a/lib/pleroma/web/chat_channel.ex b/lib/pleroma/web/chat_channel.ex index 268bef17d..48a3553bf 100644 --- a/lib/pleroma/web/chat_channel.ex +++ b/lib/pleroma/web/chat_channel.ex @@ -24,7 +24,6 @@ defmodule Pleroma.Web.ChatChannel do end defmodule Pleroma.Web.ChatChannel.ChatChannelState do - use Agent @max_messages 20 def start_link do -- cgit v1.2.3 From bdb5dd21943f886a1b4181aebd73e60662536e93 Mon Sep 17 00:00:00 2001 From: Calv Collins Date: Thu, 8 Feb 2018 16:57:30 +0000 Subject: Create action_fallback for username/password incorrect input --- lib/pleroma/web/oauth/fallback_controller.ex | 19 +++++++++++++++++++ lib/pleroma/web/oauth/oauth_controller.ex | 5 +++++ lib/pleroma/web/templates/o_auth/o_auth/show.html.eex | 2 ++ 3 files changed, 26 insertions(+) create mode 100644 lib/pleroma/web/oauth/fallback_controller.ex (limited to 'lib') diff --git a/lib/pleroma/web/oauth/fallback_controller.ex b/lib/pleroma/web/oauth/fallback_controller.ex new file mode 100644 index 000000000..9ba9bc289 --- /dev/null +++ b/lib/pleroma/web/oauth/fallback_controller.ex @@ -0,0 +1,19 @@ +defmodule Pleroma.Web.OAuth.FallbackController do + use Pleroma.Web, :controller + alias Pleroma.Web.OAuth.OAuthController + + # No user + def call(conn, nil) do + conn + |> put_flash(:error, "Invalid Username/Password") + |> OAuthController.authorize(conn.params) + end + + # No password + def call(conn, false) do + conn + |> put_flash(:error, "Invalid Username/Password") + |> OAuthController.authorize(conn.params) + end + +end \ No newline at end of file diff --git a/lib/pleroma/web/oauth/oauth_controller.ex b/lib/pleroma/web/oauth/oauth_controller.ex index e8483dec0..94318bfa9 100644 --- a/lib/pleroma/web/oauth/oauth_controller.ex +++ b/lib/pleroma/web/oauth/oauth_controller.ex @@ -5,6 +5,11 @@ defmodule Pleroma.Web.OAuth.OAuthController do alias Pleroma.{Repo, User} alias Comeonin.Pbkdf2 + plug :fetch_session + plug :fetch_flash + + action_fallback Pleroma.Web.OAuth.FallbackController + def authorize(conn, params) do render conn, "show.html", %{ response_type: params["response_type"], diff --git a/lib/pleroma/web/templates/o_auth/o_auth/show.html.eex b/lib/pleroma/web/templates/o_auth/o_auth/show.html.eex index 3c6903a16..a7fa7523b 100644 --- a/lib/pleroma/web/templates/o_auth/o_auth/show.html.eex +++ b/lib/pleroma/web/templates/o_auth/o_auth/show.html.eex @@ -1,3 +1,5 @@ + +

OAuth Authorization

<%= form_for @conn, o_auth_path(@conn, :authorize), [as: "authorization"], fn f -> %> <%= label f, :name, "Name" %> -- cgit v1.2.3 From 73249fa5ff25c3f40ca79dfb9e4ce49b0dc1326b Mon Sep 17 00:00:00 2001 From: Calv Collins Date: Thu, 8 Feb 2018 18:15:59 +0000 Subject: Changed fallback controller to handle all cases from OAuthController --- lib/pleroma/web/oauth/fallback_controller.ex | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) (limited to 'lib') diff --git a/lib/pleroma/web/oauth/fallback_controller.ex b/lib/pleroma/web/oauth/fallback_controller.ex index 9ba9bc289..daa110532 100644 --- a/lib/pleroma/web/oauth/fallback_controller.ex +++ b/lib/pleroma/web/oauth/fallback_controller.ex @@ -2,15 +2,8 @@ defmodule Pleroma.Web.OAuth.FallbackController do use Pleroma.Web, :controller alias Pleroma.Web.OAuth.OAuthController - # No user - def call(conn, nil) do - conn - |> put_flash(:error, "Invalid Username/Password") - |> OAuthController.authorize(conn.params) - end - - # No password - def call(conn, false) do + # No user/password + def call(conn, _) do conn |> put_flash(:error, "Invalid Username/Password") |> OAuthController.authorize(conn.params) -- cgit v1.2.3 From 08f458e6dfabe0eb0b6c65b9054cb87df1b6fab4 Mon Sep 17 00:00:00 2001 From: Roger Braun Date: Fri, 9 Feb 2018 13:43:12 +0100 Subject: UtilController: Fix statusnet config api compatibility. --- lib/pleroma/web/twitter_api/controllers/util_controller.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/pleroma/web/twitter_api/controllers/util_controller.ex b/lib/pleroma/web/twitter_api/controllers/util_controller.ex index 0b7c64015..503719dbf 100644 --- a/lib/pleroma/web/twitter_api/controllers/util_controller.ex +++ b/lib/pleroma/web/twitter_api/controllers/util_controller.ex @@ -121,7 +121,7 @@ defmodule Pleroma.Web.TwitterAPI.UtilController do site: %{ name: Keyword.get(@instance, :name), server: Web.base_url, - textlimit: Keyword.get(@instance, :limit), + textlimit: to_string(Keyword.get(@instance, :limit)), closed: if(Keyword.get(@instance, :registrations_open), do: "0", else: "1") } }) -- cgit v1.2.3