From a4335e391f6818b9ea09520f60ca8c436d643f38 Mon Sep 17 00:00:00 2001 From: Hakaba Hitoyo Date: Wed, 31 Jan 2018 22:51:25 +0900 Subject: [PATCH 1/8] provide instance thumbnail at /api/v1/instance --- .../web/mastodon_api/mastodon_api_controller.ex | 1 + priv/static/instance-thumbnail.jpeg | Bin 0 -> 47702 bytes 2 files changed, 1 insertion(+) create mode 100644 priv/static/instance-thumbnail.jpeg 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) } diff --git a/priv/static/instance-thumbnail.jpeg b/priv/static/instance-thumbnail.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..b7e01264423996c3f97edaa72c5da199b30b96e4 GIT binary patch literal 47702 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

0m4 z447{)Xr4B9;<$5lU_oc5s(VhosdjoJd49k`x%)84`quXU$$tpz|F+y0wa?xkA5EV* zFqz*bnH@w^iU03%%y<`1W}QOfyg=Y*K;^4p2 zYhOqc`#5D5-vIl=!rQqCAx-b>lM&KAS5EILM%$|K+SZ$zMVZES6rkxstwa#`3lz&( zDhj6BXYFzu&2ayDrrs%+jfuzORCdi&=cw$XcT*fQ%JuHZbstFmr}tRjA=b<-hC?0j zd|BAJt0okC@2ZbxIWvCHu`mOcGr&p2%Vw>-@C*dkAtnr^T zdjFor&qP1*iRgeL|A*P)ZCoa3dhUXpfz4?w&8`Q!NDYG#lIj Date: Wed, 31 Jan 2018 22:57:43 +0900 Subject: [PATCH 2/8] provide instance thumbnail at /api/v1/instance (debug) --- priv/static/{ => static}/instance-thumbnail.jpeg | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename priv/static/{ => static}/instance-thumbnail.jpeg (100%) diff --git a/priv/static/instance-thumbnail.jpeg b/priv/static/static/instance-thumbnail.jpeg similarity index 100% rename from priv/static/instance-thumbnail.jpeg rename to priv/static/static/instance-thumbnail.jpeg From e47f60c05376b9e2af0c90a984014003aac22104 Mon Sep 17 00:00:00 2001 From: Hakaba Hitoyo Date: Wed, 31 Jan 2018 23:04:34 +0900 Subject: [PATCH 3/8] provide instance thumbnail at /api/v1/instance (debug) --- .../web/mastodon_api/mastodon_api_controller.ex | 2 +- .../thumbnail.jpeg} | Bin 2 files changed, 1 insertion(+), 1 deletion(-) rename priv/static/{static/instance-thumbnail.jpeg => instance/thumbnail.jpeg} (100%) 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) } diff --git a/priv/static/static/instance-thumbnail.jpeg b/priv/static/instance/thumbnail.jpeg similarity index 100% rename from priv/static/static/instance-thumbnail.jpeg rename to priv/static/instance/thumbnail.jpeg From 03c15a54f562dfcc26afeefbe00921e446ff5c31 Mon Sep 17 00:00:00 2001 From: Hakaba Hitoyo Date: Wed, 31 Jan 2018 23:09:47 +0900 Subject: [PATCH 4/8] provide instance thumbnail at /api/v1/instance (debug) --- lib/pleroma/web/endpoint.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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. From ab8b9ababab97ed40720b86bb1d2631dbdcf4c61 Mon Sep 17 00:00:00 2001 From: eal Date: Wed, 31 Jan 2018 16:23:31 +0200 Subject: [PATCH 5/8] Split emoji to default and custom. --- config/{emoji.txt => emoji_default.txt} | 0 lib/pleroma/formatter.ex | 20 +++++++++++++------- 2 files changed, 13 insertions(+), 7 deletions(-) rename config/{emoji.txt => emoji_default.txt} (100%) diff --git a/config/emoji.txt b/config/emoji_default.txt similarity index 100% rename from config/emoji.txt rename to config/emoji_default.txt 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 _ -> [] From 15cb3f2b01dfd914fa414174602ad03b41dfa768 Mon Sep 17 00:00:00 2001 From: eal Date: Wed, 31 Jan 2018 23:47:42 +0200 Subject: [PATCH 6/8] Revert renaming emoji.txt --- config/{emoji_default.txt => emoji.txt} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename config/{emoji_default.txt => emoji.txt} (100%) diff --git a/config/emoji_default.txt b/config/emoji.txt similarity index 100% rename from config/emoji_default.txt rename to config/emoji.txt From ab83e0de6d389428cec11fe94280d675a38f00d0 Mon Sep 17 00:00:00 2001 From: eal Date: Thu, 1 Feb 2018 21:41:19 +0200 Subject: [PATCH 7/8] TwitterAPI: Add is_local to user view. --- lib/pleroma/web/twitter_api/views/user_view.ex | 1 + test/web/twitter_api/views/user_view_test.exs | 12 ++++++++---- 2 files changed, 9 insertions(+), 4 deletions(-) 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 diff --git a/test/web/twitter_api/views/user_view_test.exs b/test/web/twitter_api/views/user_view_test.exs index 3f84e4116..e68230a86 100644 --- a/test/web/twitter_api/views/user_view_test.exs +++ b/test/web/twitter_api/views/user_view_test.exs @@ -56,7 +56,8 @@ defmodule Pleroma.Web.TwitterAPI.UserViewTest do "rights" => %{}, "statusnet_profile_url" => user.ap_id, "cover_photo" => banner, - "background_image" => nil + "background_image" => nil, + "is_local" => true } assert represented == UserView.render("show.json", %{user: user}) @@ -88,7 +89,8 @@ defmodule Pleroma.Web.TwitterAPI.UserViewTest do "rights" => %{}, "statusnet_profile_url" => user.ap_id, "cover_photo" => banner, - "background_image" => nil + "background_image" => nil, + "is_local" => true } assert represented == UserView.render("show.json", %{user: user, for: follower}) @@ -121,7 +123,8 @@ defmodule Pleroma.Web.TwitterAPI.UserViewTest do "rights" => %{}, "statusnet_profile_url" => follower.ap_id, "cover_photo" => banner, - "background_image" => nil + "background_image" => nil, + "is_local" => true } assert represented == UserView.render("show.json", %{user: follower, for: user}) @@ -154,7 +157,8 @@ defmodule Pleroma.Web.TwitterAPI.UserViewTest do "rights" => %{}, "statusnet_profile_url" => user.ap_id, "cover_photo" => banner, - "background_image" => nil + "background_image" => nil, + "is_local" => true } blocker = Repo.get(User, blocker.id) From 29be70c0082ea09f03896c7e52e2b8a9cdbea641 Mon Sep 17 00:00:00 2001 From: eal Date: Fri, 2 Feb 2018 00:00:48 +0200 Subject: [PATCH 8/8] Add remote following of local profiles. --- lib/pleroma/web/router.ex | 1 + .../twitter_api/util/subscribe.html.eex | 10 +++++++++ .../controllers/util_controller.ex | 21 +++++++++++++++++++ lib/pleroma/web/web_finger/web_finger.ex | 4 +++- test/web/ostatus/ostatus_test.exs | 6 ++++-- 5 files changed, 39 insertions(+), 3 deletions(-) create mode 100644 lib/pleroma/web/templates/twitter_api/util/subscribe.html.eex 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 diff --git a/test/web/ostatus/ostatus_test.exs b/test/web/ostatus/ostatus_test.exs index de01612b3..b27f8cb55 100644 --- a/test/web/ostatus/ostatus_test.exs +++ b/test/web/ostatus/ostatus_test.exs @@ -302,7 +302,8 @@ defmodule Pleroma.Web.OStatusTest do "host" => "social.heldscal.la", "fqn" => user, "bio" => "cofe", - "avatar" => %{"type" => "Image", "url" => [%{"href" => "https://social.heldscal.la/avatar/29191-original-20170421154949.jpeg", "mediaType" => "image/jpeg", "type" => "Link"}]} + "avatar" => %{"type" => "Image", "url" => [%{"href" => "https://social.heldscal.la/avatar/29191-original-20170421154949.jpeg", "mediaType" => "image/jpeg", "type" => "Link"}]}, + "subscribe_address" => "https://social.heldscal.la/main/ostatussub?profile={uri}" } assert data == expected end @@ -325,7 +326,8 @@ defmodule Pleroma.Web.OStatusTest do "host" => "social.heldscal.la", "fqn" => user, "bio" => "cofe", - "avatar" => %{"type" => "Image", "url" => [%{"href" => "https://social.heldscal.la/avatar/29191-original-20170421154949.jpeg", "mediaType" => "image/jpeg", "type" => "Link"}]} + "avatar" => %{"type" => "Image", "url" => [%{"href" => "https://social.heldscal.la/avatar/29191-original-20170421154949.jpeg", "mediaType" => "image/jpeg", "type" => "Link"}]}, + "subscribe_address" => "https://social.heldscal.la/main/ostatussub?profile={uri}" } assert data == expected end