From 9c7da2ef4834729bd6bff21063bf81c7be5f1635 Mon Sep 17 00:00:00 2001 From: Hakaba Hitoyo Date: Sat, 26 May 2018 14:02:57 +0900 Subject: output repeats at ActivityPub outbox --- lib/pleroma/web/activity_pub/views/user_view.ex | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) (limited to 'lib') diff --git a/lib/pleroma/web/activity_pub/views/user_view.ex b/lib/pleroma/web/activity_pub/views/user_view.ex index ffd76b529..011ae18a3 100644 --- a/lib/pleroma/web/activity_pub/views/user_view.ex +++ b/lib/pleroma/web/activity_pub/views/user_view.ex @@ -98,9 +98,6 @@ defmodule Pleroma.Web.ActivityPub.UserView do info = User.user_info(user) params = %{ - "type" => ["Create", "Announce"], - "actor_id" => user.ap_id, - "whole_db" => true, "limit" => "10" } @@ -111,10 +108,8 @@ defmodule Pleroma.Web.ActivityPub.UserView do params end - activities = ActivityPub.fetch_public_activities(params) - min_id = Enum.at(activities, 0).id - - activities = Enum.reverse(activities) + activities = ActivityPub.fetch_public_activities(user, nil, params) + min_id = Enum.at(Enum.reverse(activities), 0).id max_id = Enum.at(activities, 0).id collection = -- cgit v1.2.3 From e90b734f1c41c13e08b7461f5bfb42745ea7ba08 Mon Sep 17 00:00:00 2001 From: Hakaba Hitoyo Date: Sat, 26 May 2018 14:10:12 +0900 Subject: debug --- lib/pleroma/web/activity_pub/views/user_view.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/pleroma/web/activity_pub/views/user_view.ex b/lib/pleroma/web/activity_pub/views/user_view.ex index 011ae18a3..719bd128b 100644 --- a/lib/pleroma/web/activity_pub/views/user_view.ex +++ b/lib/pleroma/web/activity_pub/views/user_view.ex @@ -108,7 +108,7 @@ defmodule Pleroma.Web.ActivityPub.UserView do params end - activities = ActivityPub.fetch_public_activities(user, nil, params) + activities = ActivityPub.fetch_user_activities(user, nil, params) min_id = Enum.at(Enum.reverse(activities), 0).id max_id = Enum.at(activities, 0).id -- cgit v1.2.3 From f42ffbe9a855494c182c97f5eb641e800e562aa4 Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Tue, 12 Jun 2018 14:52:54 +0300 Subject: Initial invites support + tests. --- lib/pleroma/UserInviteToken.ex | 40 ++++++++++++++++++++++++++++++ lib/pleroma/web/router.ex | 4 +-- lib/pleroma/web/twitter_api/twitter_api.ex | 36 +++++++++++++++++++-------- 3 files changed, 67 insertions(+), 13 deletions(-) create mode 100644 lib/pleroma/UserInviteToken.ex (limited to 'lib') diff --git a/lib/pleroma/UserInviteToken.ex b/lib/pleroma/UserInviteToken.ex new file mode 100644 index 000000000..48ee1019a --- /dev/null +++ b/lib/pleroma/UserInviteToken.ex @@ -0,0 +1,40 @@ +defmodule Pleroma.UserInviteToken do + use Ecto.Schema + + import Ecto.Changeset + + alias Pleroma.{User, UserInviteToken, Repo} + + schema "user_invite_tokens" do + field(:token, :string) + field(:used, :boolean, default: false) + + timestamps() + end + + def create_token do + token = :crypto.strong_rand_bytes(32) |> Base.url_encode64() + + token = %UserInviteToken{ + used: false, + token: token + } + + Repo.insert(token) + end + + def used_changeset(struct) do + struct + |> cast(%{}, []) + |> put_change(:used, true) + end + + def mark_as_used(token) do + with %{used: false} = token <- Repo.get_by(UserInviteToken, %{token: token}), + {:ok, token} <- Repo.update(used_changeset(token)) do + {:ok, token} + else + _e -> {:error, token} + end + end +end diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index ee6a373d3..127bf4d9e 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -194,9 +194,7 @@ defmodule Pleroma.Web.Router do get("/statuses/show/:id", TwitterAPI.Controller, :fetch_status) get("/statusnet/conversation/:id", TwitterAPI.Controller, :fetch_conversation) - if @registrations_open do - post("/account/register", TwitterAPI.Controller, :register) - end + post("/account/register", TwitterAPI.Controller, :register) get("/search", TwitterAPI.Controller, :search) get("/statusnet/tags/timeline/:tag", TwitterAPI.Controller, :public_and_external_timeline) diff --git a/lib/pleroma/web/twitter_api/twitter_api.ex b/lib/pleroma/web/twitter_api/twitter_api.ex index ccc6fe8e7..8608ee9ac 100644 --- a/lib/pleroma/web/twitter_api/twitter_api.ex +++ b/lib/pleroma/web/twitter_api/twitter_api.ex @@ -1,11 +1,13 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do - alias Pleroma.{User, Activity, Repo, Object} + alias Pleroma.{UserInviteToken, User, Activity, Repo, Object} alias Pleroma.Web.ActivityPub.ActivityPub alias Pleroma.Web.TwitterAPI.UserView alias Pleroma.Web.{OStatus, CommonAPI} import Ecto.Query + @instance Application.get_env(:pleroma, :instance) @httpoison Application.get_env(:pleroma, :httpoison) + @registrations_open Keyword.get(@instance, :registrations_open) def create_status(%User{} = user, %{"status" => _} = data) do CommonAPI.post(user, data) @@ -124,6 +126,8 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do end def register_user(params) do + tokenString = params["token"] + params = %{ nickname: params["nickname"], name: params["fullname"], @@ -133,17 +137,29 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do password_confirmation: params["confirm"] } - changeset = User.register_changeset(%User{}, params) + # no need to query DB if registration is open + unless @registrations_open || is_nil(tokenString) do + token = Repo.get_by(UserInviteToken, %{token: tokenString}) + end + + cond do + @registrations_open || !is_nil(token) && !token.used -> + changeset = User.register_changeset(%User{}, params) - with {:ok, user} <- Repo.insert(changeset) do - {:ok, user} - else - {:error, changeset} -> - errors = - Ecto.Changeset.traverse_errors(changeset, fn {msg, _opts} -> msg end) - |> Jason.encode!() + with {:ok, user} <- Repo.insert(changeset) do + !@registrations_open && UserInviteToken.mark_as_used(token.token) + {:ok, user} + else + {:error, changeset} -> + errors = + Ecto.Changeset.traverse_errors(changeset, fn {msg, _opts} -> msg end) + |> Jason.encode!() + + {:error, %{error: errors}} + end - {:error, %{error: errors}} + !@registrations_open && is_nil(token) -> {:error, "Invalid token"} + !@registrations_open && token.used -> {:error, "Expired token"} end end -- cgit v1.2.3 From 9c1cf1befb9905282f6b8afcfee3cf3578f41431 Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Tue, 12 Jun 2018 15:01:40 +0300 Subject: formatting --- lib/pleroma/web/twitter_api/twitter_api.ex | 11 +++++++---- 1 file changed, 7 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 8608ee9ac..ce0da3340 100644 --- a/lib/pleroma/web/twitter_api/twitter_api.ex +++ b/lib/pleroma/web/twitter_api/twitter_api.ex @@ -143,7 +143,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do end cond do - @registrations_open || !is_nil(token) && !token.used -> + @registrations_open || (!is_nil(token) && !token.used) -> changeset = User.register_changeset(%User{}, params) with {:ok, user} <- Repo.insert(changeset) do @@ -155,11 +155,14 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do Ecto.Changeset.traverse_errors(changeset, fn {msg, _opts} -> msg end) |> Jason.encode!() - {:error, %{error: errors}} + {:error, %{error: errors}} end - !@registrations_open && is_nil(token) -> {:error, "Invalid token"} - !@registrations_open && token.used -> {:error, "Expired token"} + !@registrations_open && is_nil(token) -> + {:error, "Invalid token"} + + !@registrations_open && token.used -> + {:error, "Expired token"} end end -- cgit v1.2.3 From 0b1ca6a584219083e2d312abe2c1bdd8fab98e38 Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Sun, 17 Jun 2018 14:30:07 +0300 Subject: Token-generating task --- lib/mix/tasks/generate_invite_token.ex | 25 +++++++++++++++++++++ lib/pleroma/UserInviteToken.ex | 40 ---------------------------------- lib/pleroma/user_invite_token.ex | 40 ++++++++++++++++++++++++++++++++++ lib/pleroma/web/router.ex | 5 +++++ 4 files changed, 70 insertions(+), 40 deletions(-) create mode 100644 lib/mix/tasks/generate_invite_token.ex delete mode 100644 lib/pleroma/UserInviteToken.ex create mode 100644 lib/pleroma/user_invite_token.ex (limited to 'lib') diff --git a/lib/mix/tasks/generate_invite_token.ex b/lib/mix/tasks/generate_invite_token.ex new file mode 100644 index 000000000..a5f41ef0e --- /dev/null +++ b/lib/mix/tasks/generate_invite_token.ex @@ -0,0 +1,25 @@ +defmodule Mix.Tasks.GenerateInviteToken do + use Mix.Task + + @shortdoc "Generate password reset link for user" + def run([]) do + Mix.Task.run("app.start") + + with {:ok, token} <- Pleroma.UserInviteToken.create_token() do + IO.puts("Generated user invite token") + + IO.puts( + "Url: #{ + Pleroma.Web.Router.Helpers.redirect_url( + Pleroma.Web.Endpoint, + :registration_page, + token.token + ) + }" + ) + else + _ -> + IO.puts("Error creating token") + end + end +end diff --git a/lib/pleroma/UserInviteToken.ex b/lib/pleroma/UserInviteToken.ex deleted file mode 100644 index 48ee1019a..000000000 --- a/lib/pleroma/UserInviteToken.ex +++ /dev/null @@ -1,40 +0,0 @@ -defmodule Pleroma.UserInviteToken do - use Ecto.Schema - - import Ecto.Changeset - - alias Pleroma.{User, UserInviteToken, Repo} - - schema "user_invite_tokens" do - field(:token, :string) - field(:used, :boolean, default: false) - - timestamps() - end - - def create_token do - token = :crypto.strong_rand_bytes(32) |> Base.url_encode64() - - token = %UserInviteToken{ - used: false, - token: token - } - - Repo.insert(token) - end - - def used_changeset(struct) do - struct - |> cast(%{}, []) - |> put_change(:used, true) - end - - def mark_as_used(token) do - with %{used: false} = token <- Repo.get_by(UserInviteToken, %{token: token}), - {:ok, token} <- Repo.update(used_changeset(token)) do - {:ok, token} - else - _e -> {:error, token} - end - end -end diff --git a/lib/pleroma/user_invite_token.ex b/lib/pleroma/user_invite_token.ex new file mode 100644 index 000000000..48ee1019a --- /dev/null +++ b/lib/pleroma/user_invite_token.ex @@ -0,0 +1,40 @@ +defmodule Pleroma.UserInviteToken do + use Ecto.Schema + + import Ecto.Changeset + + alias Pleroma.{User, UserInviteToken, Repo} + + schema "user_invite_tokens" do + field(:token, :string) + field(:used, :boolean, default: false) + + timestamps() + end + + def create_token do + token = :crypto.strong_rand_bytes(32) |> Base.url_encode64() + + token = %UserInviteToken{ + used: false, + token: token + } + + Repo.insert(token) + end + + def used_changeset(struct) do + struct + |> cast(%{}, []) + |> put_change(:used, true) + end + + def mark_as_used(token) do + with %{used: false} = token <- Repo.get_by(UserInviteToken, %{token: token}), + {:ok, token} <- Repo.update(used_changeset(token)) do + {:ok, token} + else + _e -> {:error, token} + end + end +end diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index 127bf4d9e..dcbf7f008 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -344,6 +344,7 @@ defmodule Pleroma.Web.Router do end scope "/", Fallback do + get("/registration/:token", RedirectController, :registration_page) get("/*path", RedirectController, :redirector) end end @@ -358,4 +359,8 @@ defmodule Fallback.RedirectController do |> send_file(200, "priv/static/index.html") end end + + def registration_page(conn, params) do + redirector(conn, params) + end end -- cgit v1.2.3 From 082920044abeadb9daf593d7e58d210634f8b4a5 Mon Sep 17 00:00:00 2001 From: Francis Dinh Date: Thu, 21 Jun 2018 14:04:12 -0400 Subject: Normalize file extension for uploaded files --- lib/pleroma/upload.ex | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) (limited to 'lib') diff --git a/lib/pleroma/upload.ex b/lib/pleroma/upload.ex index 43df0d418..6793c4671 100644 --- a/lib/pleroma/upload.ex +++ b/lib/pleroma/upload.ex @@ -110,20 +110,20 @@ defmodule Pleroma.Upload do if should_dedupe do create_name(uuid, List.last(String.split(file.filename, ".")), type) else - unless String.contains?(file.filename, ".") do - case type do - "image/png" -> file.filename <> ".png" - "image/jpeg" -> file.filename <> ".jpg" - "image/gif" -> file.filename <> ".gif" - "video/webm" -> file.filename <> ".webm" - "video/mp4" -> file.filename <> ".mp4" - "audio/mpeg" -> file.filename <> ".mp3" - "audio/ogg" -> file.filename <> ".ogg" - "audio/wav" -> file.filename <> ".wav" - _ -> file.filename + parts = String.split(file.filename, ".") + + new_filename = + if length(parts) > 1 do + Enum.drop(parts, -1) |> Enum.join(".") + else + Enum.join(parts) end - else - file.filename + + case type do + "application/octet-stream" -> file.filename + "audio/mpeg" -> new_filename <> ".mp3" + "image/jpeg" -> new_filename <> ".jpg" + _ -> Enum.join([new_filename, String.split(type, "/") |> List.last()], ".") end end end -- cgit v1.2.3 From cb21bf5fc225899ad6cf87f5ab0253506cf0531e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tristan=20Mah=C3=A9?= Date: Tue, 26 Jun 2018 13:45:47 -0700 Subject: filter exif data #187 --- lib/pleroma/upload.ex | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'lib') diff --git a/lib/pleroma/upload.ex b/lib/pleroma/upload.ex index 43df0d418..dee281f5b 100644 --- a/lib/pleroma/upload.ex +++ b/lib/pleroma/upload.ex @@ -80,6 +80,14 @@ defmodule Pleroma.Upload do } end + def strip_exif_data(file) do + settings = Application.get_env(:pleroma, Pleroma.Upload) + @do_strip = Keyword.fetch!(settings, :strip_exif) + if @do_strip == true do + Mogrify.open(file) |> Mogrify.custom("strip") |> Mogrify.save(in_place: true) + end + end + def upload_path do settings = Application.get_env(:pleroma, Pleroma.Upload) Keyword.fetch!(settings, :uploads) -- cgit v1.2.3 From c67cf8e9af3ab9b52f34387a686a68ee4e1554b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tristan=20Mah=C3=A9?= Date: Tue, 26 Jun 2018 13:49:57 -0700 Subject: format... --- lib/pleroma/upload.ex | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/pleroma/upload.ex b/lib/pleroma/upload.ex index dee281f5b..e412e43fa 100644 --- a/lib/pleroma/upload.ex +++ b/lib/pleroma/upload.ex @@ -83,8 +83,9 @@ defmodule Pleroma.Upload do def strip_exif_data(file) do settings = Application.get_env(:pleroma, Pleroma.Upload) @do_strip = Keyword.fetch!(settings, :strip_exif) + if @do_strip == true do - Mogrify.open(file) |> Mogrify.custom("strip") |> Mogrify.save(in_place: true) + Mogrify.open(file) |> Mogrify.custom("strip") |> Mogrify.save(in_place: true) end end -- cgit v1.2.3 From d8d43f1173aaea677a74aee6315d1195d59197e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tristan=20Mah=C3=A9?= Date: Tue, 26 Jun 2018 14:03:23 -0700 Subject: do the filtering --- lib/pleroma/upload.ex | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/pleroma/upload.ex b/lib/pleroma/upload.ex index e412e43fa..1640c1f9c 100644 --- a/lib/pleroma/upload.ex +++ b/lib/pleroma/upload.ex @@ -18,6 +18,8 @@ defmodule Pleroma.Upload do File.cp!(file.path, result_file) end + strip_exif_data(content_type, file.path) + %{ "type" => "Image", "url" => [ @@ -67,6 +69,8 @@ defmodule Pleroma.Upload do File.rename(uuidpath, result_file) end + strip_exif_data(content_type, uuidpath) + %{ "type" => "Image", "url" => [ @@ -80,11 +84,12 @@ defmodule Pleroma.Upload do } end - def strip_exif_data(file) do + def strip_exif_data(content_type, file) do settings = Application.get_env(:pleroma, Pleroma.Upload) @do_strip = Keyword.fetch!(settings, :strip_exif) + [filetype, ext] = String.split(content_type, "/") - if @do_strip == true do + if filetype == "image" and @do_strip == true do Mogrify.open(file) |> Mogrify.custom("strip") |> Mogrify.save(in_place: true) end end -- cgit v1.2.3 From ca63585a329f0afa02f7d539328f5fb3485d2a29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tristan=20Mah=C3=A9?= Date: Tue, 26 Jun 2018 14:35:35 -0700 Subject: maybe I should learn proper elixir ;D --- lib/pleroma/upload.ex | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/pleroma/upload.ex b/lib/pleroma/upload.ex index 1640c1f9c..45fac9060 100644 --- a/lib/pleroma/upload.ex +++ b/lib/pleroma/upload.ex @@ -86,10 +86,10 @@ defmodule Pleroma.Upload do def strip_exif_data(content_type, file) do settings = Application.get_env(:pleroma, Pleroma.Upload) - @do_strip = Keyword.fetch!(settings, :strip_exif) + do_strip = Keyword.fetch!(settings, :strip_exif) [filetype, ext] = String.split(content_type, "/") - if filetype == "image" and @do_strip == true do + if filetype == "image" and do_strip == true do Mogrify.open(file) |> Mogrify.custom("strip") |> Mogrify.save(in_place: true) end end -- cgit v1.2.3 From dc8ace29d12e8022ef7381d273724d7e5e7e3a19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tristan=20Mah=C3=A9?= Date: Tue, 26 Jun 2018 15:09:45 -0700 Subject: use the correct end file --- lib/pleroma/upload.ex | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/pleroma/upload.ex b/lib/pleroma/upload.ex index 45fac9060..dd2bbab9f 100644 --- a/lib/pleroma/upload.ex +++ b/lib/pleroma/upload.ex @@ -18,7 +18,7 @@ defmodule Pleroma.Upload do File.cp!(file.path, result_file) end - strip_exif_data(content_type, file.path) + strip_exif_data(content_type, result_file) %{ "type" => "Image", @@ -69,7 +69,7 @@ defmodule Pleroma.Upload do File.rename(uuidpath, result_file) end - strip_exif_data(content_type, uuidpath) + strip_exif_data(content_type, result_file) %{ "type" => "Image", -- cgit v1.2.3 From a2009432408dd0e93c3eb9506ff37da788b50895 Mon Sep 17 00:00:00 2001 From: William Pitcock Date: Mon, 18 Jun 2018 05:23:54 +0000 Subject: object: add helper functions to handle various forms of a given object and return a normalized one --- lib/pleroma/object.ex | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'lib') diff --git a/lib/pleroma/object.ex b/lib/pleroma/object.ex index ff2af4a6f..1bcff5a7b 100644 --- a/lib/pleroma/object.ex +++ b/lib/pleroma/object.ex @@ -27,6 +27,10 @@ defmodule Pleroma.Object do Repo.one(from(object in Object, where: fragment("(?)->>'id' = ?", object.data, ^ap_id))) end + def normalize(obj) when is_map(obj), do: Object.get_by_ap_id(obj["id"]) + def normalize(ap_id) when is_binary(ap_id), do: Object.get_by_ap_id(ap_id) + def normalize(_), do: nil + def get_cached_by_ap_id(ap_id) do if Mix.env() == :test do get_by_ap_id(ap_id) -- cgit v1.2.3 From b036a19c213c2b3cc08c64a0d887d36b9386609d Mon Sep 17 00:00:00 2001 From: William Pitcock Date: Mon, 18 Jun 2018 20:54:59 +0000 Subject: activity: add normalize() to find a complete activity given either URI or partial structure --- lib/pleroma/activity.ex | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'lib') diff --git a/lib/pleroma/activity.ex b/lib/pleroma/activity.ex index dd6805125..bed96861f 100644 --- a/lib/pleroma/activity.ex +++ b/lib/pleroma/activity.ex @@ -78,4 +78,8 @@ defmodule Pleroma.Activity do end def get_create_activity_by_object_ap_id(_), do: nil + + def normalize(obj) when is_map(obj), do: Activity.get_by_ap_id(obj["id"]) + def normalize(ap_id) when is_binary(ap_id), do: Activity.get_by_ap_id(ap_id) + def normalize(_), do: nil end -- cgit v1.2.3 From 47189531c55ac0c3f671298e6efa8c020ce5853a Mon Sep 17 00:00:00 2001 From: William Pitcock Date: Mon, 18 Jun 2018 20:57:38 +0000 Subject: user: use Object.normalize() instead of Object.get_by_ap_id() directly. --- lib/pleroma/user.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index 94f16c3c0..df22d29a8 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -607,7 +607,7 @@ defmodule Pleroma.User do |> Enum.each(fn activity -> case activity.data["type"] do "Create" -> - ActivityPub.delete(Object.get_by_ap_id(activity.data["object"]["id"])) + ActivityPub.delete(Object.normalize(activity.data["object"])) # TODO: Do something with likes, follows, repeats. _ -> -- cgit v1.2.3 From fb04fecfb4791639369414a685be79bdd9d03309 Mon Sep 17 00:00:00 2001 From: William Pitcock Date: Mon, 18 Jun 2018 20:58:09 +0000 Subject: streamer: use Object.normalize() instead of Object.get_by_ap_id() directly. --- lib/pleroma/web/streamer.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/pleroma/web/streamer.ex b/lib/pleroma/web/streamer.ex index ce38f3cc3..c61bad830 100644 --- a/lib/pleroma/web/streamer.ex +++ b/lib/pleroma/web/streamer.ex @@ -158,7 +158,7 @@ defmodule Pleroma.Web.Streamer do user = User.get_cached_by_ap_id(socket.assigns[:user].ap_id) blocks = user.info["blocks"] || [] - parent = Object.get_by_ap_id(item.data["object"]) + parent = Object.normalize(item.data["object"]) unless is_nil(parent) or item.actor in blocks or parent.data["actor"] in blocks do send(socket.transport_pid, {:text, represent_update(item, user)}) -- cgit v1.2.3 From 15d624e07797719e9ec1cf112b8beaa08dad2562 Mon Sep 17 00:00:00 2001 From: William Pitcock Date: Mon, 18 Jun 2018 21:01:33 +0000 Subject: activitypub: use Object.normalize() instead of Object.get_by_ap_id() directly. --- lib/pleroma/web/activity_pub/activity_pub.ex | 6 +++--- lib/pleroma/web/activity_pub/transmogrifier.ex | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) (limited to 'lib') diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index 195679fad..93219d76a 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -670,7 +670,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do recv_timeout: 20000 ), {:ok, data} <- Jason.decode(body), - nil <- Object.get_by_ap_id(data["id"]), + nil <- Object.normalize(data), params <- %{ "type" => "Create", "to" => data["to"], @@ -679,7 +679,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do "object" => data }, {:ok, activity} <- Transmogrifier.handle_incoming(params) do - {:ok, Object.get_by_ap_id(activity.data["object"]["id"])} + {:ok, Object.normalize(activity.data["object"])} else object = %Object{} -> {:ok, object} @@ -688,7 +688,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do Logger.info("Couldn't get object via AP, trying out OStatus fetching...") case OStatus.fetch_activity_from_url(id) do - {:ok, [activity | _]} -> {:ok, Object.get_by_ap_id(activity.data["object"]["id"])} + {:ok, [activity | _]} -> {:ok, Object.normalize(activity.data["object"])} e -> e end end diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex index 30cd70fb6..8b5c85f42 100644 --- a/lib/pleroma/web/activity_pub/transmogrifier.ex +++ b/lib/pleroma/web/activity_pub/transmogrifier.ex @@ -412,7 +412,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do def handle_incoming(_), do: :error def get_obj_helper(id) do - if object = Object.get_by_ap_id(id), do: {:ok, object}, else: nil + if object = Object.normalize(id), do: {:ok, object}, else: nil end def set_reply_to_uri(%{"inReplyTo" => inReplyTo} = object) do -- cgit v1.2.3 From 49da04c5094e698dca4dbf5788127177702f288b Mon Sep 17 00:00:00 2001 From: William Pitcock Date: Mon, 18 Jun 2018 21:08:12 +0000 Subject: common api: use Object.normalize() instead of Object.get_by_ap_id() directly. --- lib/pleroma/web/common_api/common_api.ex | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'lib') diff --git a/lib/pleroma/web/common_api/common_api.ex b/lib/pleroma/web/common_api/common_api.ex index 8845419c2..3f18a68e8 100644 --- a/lib/pleroma/web/common_api/common_api.ex +++ b/lib/pleroma/web/common_api/common_api.ex @@ -7,7 +7,7 @@ defmodule Pleroma.Web.CommonAPI do def delete(activity_id, user) do with %Activity{data: %{"object" => %{"id" => object_id}}} <- Repo.get(Activity, activity_id), - %Object{} = object <- Object.get_by_ap_id(object_id), + %Object{} = object <- Object.normalize(object_id), true <- user.info["is_moderator"] || user.ap_id == object.data["actor"], {:ok, delete} <- ActivityPub.delete(object) do {:ok, delete} @@ -16,7 +16,7 @@ defmodule Pleroma.Web.CommonAPI do def repeat(id_or_ap_id, user) do with %Activity{} = activity <- get_by_id_or_ap_id(id_or_ap_id), - object <- Object.get_by_ap_id(activity.data["object"]["id"]) do + object <- Object.normalize(activity.data["object"]["id"]) do ActivityPub.announce(user, object) else _ -> @@ -26,7 +26,7 @@ defmodule Pleroma.Web.CommonAPI do def unrepeat(id_or_ap_id, user) do with %Activity{} = activity <- get_by_id_or_ap_id(id_or_ap_id), - object <- Object.get_by_ap_id(activity.data["object"]["id"]) do + object <- Object.normalize(activity.data["object"]["id"]) do ActivityPub.unannounce(user, object) else _ -> @@ -37,7 +37,7 @@ defmodule Pleroma.Web.CommonAPI do def favorite(id_or_ap_id, user) do with %Activity{} = activity <- get_by_id_or_ap_id(id_or_ap_id), false <- activity.data["actor"] == user.ap_id, - object <- Object.get_by_ap_id(activity.data["object"]["id"]) do + object <- Object.normalize(activity.data["object"]["id"]) do ActivityPub.like(user, object) else _ -> @@ -48,7 +48,7 @@ defmodule Pleroma.Web.CommonAPI do def unfavorite(id_or_ap_id, user) do with %Activity{} = activity <- get_by_id_or_ap_id(id_or_ap_id), false <- activity.data["actor"] == user.ap_id, - object <- Object.get_by_ap_id(activity.data["object"]["id"]) do + object <- Object.normalize(activity.data["object"]["id"]) do ActivityPub.unlike(user, object) else _ -> -- cgit v1.2.3 From bc05548370862a2a5daba20d4577b56fabc169ea Mon Sep 17 00:00:00 2001 From: William Pitcock Date: Mon, 18 Jun 2018 21:08:37 +0000 Subject: ostatus: use Object.normalize() instead of Object.get_by_ap_id() directly. --- lib/pleroma/web/ostatus/handlers/delete_handler.ex | 2 +- lib/pleroma/web/ostatus/ostatus.ex | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) (limited to 'lib') diff --git a/lib/pleroma/web/ostatus/handlers/delete_handler.ex b/lib/pleroma/web/ostatus/handlers/delete_handler.ex index 4f3016b65..6330d7f64 100644 --- a/lib/pleroma/web/ostatus/handlers/delete_handler.ex +++ b/lib/pleroma/web/ostatus/handlers/delete_handler.ex @@ -6,7 +6,7 @@ defmodule Pleroma.Web.OStatus.DeleteHandler do def handle_delete(entry, _doc \\ nil) do with id <- XML.string_from_xpath("//id", entry), - object when not is_nil(object) <- Object.get_by_ap_id(id), + %Object{} = object <- Object.normalize(id), {:ok, delete} <- ActivityPub.delete(object, false) do delete end diff --git a/lib/pleroma/web/ostatus/ostatus.ex b/lib/pleroma/web/ostatus/ostatus.ex index f0ff0624f..916c894eb 100644 --- a/lib/pleroma/web/ostatus/ostatus.ex +++ b/lib/pleroma/web/ostatus/ostatus.ex @@ -89,7 +89,7 @@ defmodule Pleroma.Web.OStatus do def make_share(entry, doc, retweeted_activity) do with {:ok, actor} <- find_make_or_update_user(doc), - %Object{} = object <- Object.get_by_ap_id(retweeted_activity.data["object"]["id"]), + %Object{} = object <- Object.normalize(retweeted_activity.data["object"]), id when not is_nil(id) <- string_from_xpath("/entry/id", entry), {:ok, activity, _object} = ActivityPub.announce(actor, object, id, false) do {:ok, activity} @@ -107,7 +107,7 @@ defmodule Pleroma.Web.OStatus do def make_favorite(entry, doc, favorited_activity) do with {:ok, actor} <- find_make_or_update_user(doc), - %Object{} = object <- Object.get_by_ap_id(favorited_activity.data["object"]["id"]), + %Object{} = object <- Object.normalize(favorited_activity.data["object"]), id when not is_nil(id) <- string_from_xpath("/entry/id", entry), {:ok, activity, _object} = ActivityPub.like(actor, object, id, false) do {:ok, activity} -- cgit v1.2.3 From 5b240c3b187260498cbebbd540872975fb30bafe Mon Sep 17 00:00:00 2001 From: William Pitcock Date: Mon, 18 Jun 2018 21:20:18 +0000 Subject: federator: use Activity.normalize() instead of directly using Activity.get_by_ap_id(). --- lib/pleroma/web/federator/federator.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/pleroma/web/federator/federator.ex b/lib/pleroma/web/federator/federator.ex index 8ca530031..ccefb0bdf 100644 --- a/lib/pleroma/web/federator/federator.ex +++ b/lib/pleroma/web/federator/federator.ex @@ -95,7 +95,7 @@ defmodule Pleroma.Web.Federator do params = Utils.normalize_params(params) with {:ok, _user} <- ap_enabled_actor(params["actor"]), - nil <- Activity.get_by_ap_id(params["id"]), + nil <- Activity.normalize(params["id"]), {:ok, _activity} <- Transmogrifier.handle_incoming(params) do else %Activity{} -> -- cgit v1.2.3 From 6f4ca7ddf7f70b219ef1223f6343707ff6910f90 Mon Sep 17 00:00:00 2001 From: William Pitcock Date: Mon, 18 Jun 2018 21:20:44 +0000 Subject: ostatus: use Activity.normalize() instead of directly using Activity.get_by_ap_id(). --- lib/pleroma/web/ostatus/activity_representer.ex | 2 +- lib/pleroma/web/ostatus/ostatus_controller.ex | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/pleroma/web/ostatus/activity_representer.ex b/lib/pleroma/web/ostatus/activity_representer.ex index 4179d86c9..5d831459b 100644 --- a/lib/pleroma/web/ostatus/activity_representer.ex +++ b/lib/pleroma/web/ostatus/activity_representer.ex @@ -246,7 +246,7 @@ defmodule Pleroma.Web.OStatus.ActivityRepresenter do author = if with_author, do: [{:author, UserRepresenter.to_simple_form(user)}], else: [] mentions = (activity.recipients || []) |> get_mentions - follow_activity = Activity.get_by_ap_id(follow_activity["id"]) + follow_activity = Activity.normalize(follow_activity) [ {:"activity:object-type", ['http://activitystrea.ms/schema/1.0/activity']}, diff --git a/lib/pleroma/web/ostatus/ostatus_controller.ex b/lib/pleroma/web/ostatus/ostatus_controller.ex index 2f72fdb16..00bffbd5d 100644 --- a/lib/pleroma/web/ostatus/ostatus_controller.ex +++ b/lib/pleroma/web/ostatus/ostatus_controller.ex @@ -107,7 +107,7 @@ defmodule Pleroma.Web.OStatus.OStatusController do def activity(conn, %{"uuid" => uuid}) do with id <- o_status_url(conn, :activity, uuid), - {_, %Activity{} = activity} <- {:activity, Activity.get_by_ap_id(id)}, + {_, %Activity{} = activity} <- {:activity, Activity.normalize(id)}, {_, true} <- {:public?, ActivityPub.is_public?(activity)}, %User{} = user <- User.get_cached_by_ap_id(activity.data["actor"]) do case get_format(conn) do -- cgit v1.2.3 From 7c63e70de1b92ab8119732fe92040dea7f545b3d Mon Sep 17 00:00:00 2001 From: William Pitcock Date: Mon, 18 Jun 2018 21:21:03 +0000 Subject: activitypub: use Activity.normalize() in several places instead of using Activity.get_by_ap_id() directly. --- lib/pleroma/web/activity_pub/activity_pub.ex | 2 +- lib/pleroma/web/activity_pub/transmogrifier.ex | 18 ++---------------- 2 files changed, 3 insertions(+), 17 deletions(-) (limited to 'lib') diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index 93219d76a..464832a1e 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -30,7 +30,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do end def insert(map, local \\ true) when is_map(map) do - with nil <- Activity.get_by_ap_id(map["id"]), + with nil <- Activity.normalize(map), map <- lazy_put_activity_defaults(map), :ok <- check_actor_is_active(map["actor"]), {:ok, map} <- MRF.filter(map), diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex index 8b5c85f42..9d7c64743 100644 --- a/lib/pleroma/web/activity_pub/transmogrifier.ex +++ b/lib/pleroma/web/activity_pub/transmogrifier.ex @@ -460,14 +460,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do # Mastodon Accept/Reject requires a non-normalized object containing the actor URIs, # because of course it does. def prepare_outgoing(%{"type" => "Accept"} = data) do - follow_activity_id = - if is_binary(data["object"]) do - data["object"] - else - data["object"]["id"] - end - - with follow_activity <- Activity.get_by_ap_id(follow_activity_id) do + with follow_activity <- Activity.normalize(data["object"]) do object = %{ "actor" => follow_activity.actor, "object" => follow_activity.data["object"], @@ -485,14 +478,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do end def prepare_outgoing(%{"type" => "Reject"} = data) do - follow_activity_id = - if is_binary(data["object"]) do - data["object"] - else - data["object"]["id"] - end - - with follow_activity <- Activity.get_by_ap_id(follow_activity_id) do + with follow_activity <- Activity.normalize(data["object"]) do object = %{ "actor" => follow_activity.actor, "object" => follow_activity.data["object"], -- cgit v1.2.3 From 4f6de34f4f40d408fb9200a5c4c908aec3ed9e91 Mon Sep 17 00:00:00 2001 From: William Pitcock Date: Sat, 23 Jun 2018 06:53:29 +0000 Subject: mastodon api: use info["default_scope"] if available for post scope --- 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 9d3f526c9..09e6b0b59 100644 --- a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex +++ b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex @@ -873,7 +873,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do }, compose: %{ me: "#{user.id}", - default_privacy: "public", + default_privacy: user.info["default_scope"] || "public", default_sensitive: false }, media_attachments: %{ -- cgit v1.2.3 From dcdf7b6686fe3732ac8f9a93570dfa8a1412783a Mon Sep 17 00:00:00 2001 From: William Pitcock Date: Sat, 23 Jun 2018 06:55:32 +0000 Subject: twitter api: user view: show default message scope if known --- lib/pleroma/web/twitter_api/views/user_view.ex | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (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 711008973..9c8460378 100644 --- a/lib/pleroma/web/twitter_api/views/user_view.ex +++ b/lib/pleroma/web/twitter_api/views/user_view.ex @@ -52,7 +52,8 @@ defmodule Pleroma.Web.TwitterAPI.UserView do "cover_photo" => User.banner_url(user) |> MediaProxy.url(), "background_image" => image_url(user.info["background"]) |> MediaProxy.url(), "is_local" => user.local, - "locked" => !!user.info["locked"] + "locked" => !!user.info["locked"], + "default_scope" => user.info["default_scope"] || "public" } if assigns[:token] do -- cgit v1.2.3 From 2f14996d9afedbc4dbd75a518cf191636f926f74 Mon Sep 17 00:00:00 2001 From: William Pitcock Date: Sat, 23 Jun 2018 07:02:49 +0000 Subject: twitter api: allow setting default_scope --- lib/pleroma/web/twitter_api/twitter_api_controller.ex | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'lib') diff --git a/lib/pleroma/web/twitter_api/twitter_api_controller.ex b/lib/pleroma/web/twitter_api/twitter_api_controller.ex index 8f5b3c786..65e67396b 100644 --- a/lib/pleroma/web/twitter_api/twitter_api_controller.ex +++ b/lib/pleroma/web/twitter_api/twitter_api_controller.ex @@ -431,6 +431,19 @@ defmodule Pleroma.Web.TwitterAPI.Controller do user end + user = + if default_scope = params["default_scope"] do + with new_info <- Map.put(user.info, "default_scope", default_scope), + change <- User.info_changeset(user, %{info: new_info}), + {:ok, user} <- User.update_and_set_cache(change) do + user + else + _e -> user + end + else + user + end + with changeset <- User.update_changeset(user, params), {:ok, user} <- User.update_and_set_cache(changeset) do CommonAPI.update(user) -- cgit v1.2.3 From c42f28b82c01423d05b85514797bf3bce692628d Mon Sep 17 00:00:00 2001 From: William Pitcock Date: Sun, 24 Jun 2018 05:33:22 +0000 Subject: transmogrifier: accept Article activities --- lib/pleroma/web/activity_pub/transmogrifier.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex index 30cd70fb6..1b60170d9 100644 --- a/lib/pleroma/web/activity_pub/transmogrifier.ex +++ b/lib/pleroma/web/activity_pub/transmogrifier.ex @@ -122,7 +122,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do # TODO: validate those with a Ecto scheme # - tags # - emoji - def handle_incoming(%{"type" => "Create", "object" => %{"type" => "Note"} = object} = data) do + def handle_incoming(%{"type" => "Create", "object" => %{"type" => objtype} = object} = data) when objtype in ["Article", "Note"] do with nil <- Activity.get_create_activity_by_object_ap_id(object["id"]), %User{} = user <- User.get_or_fetch_by_ap_id(data["actor"]) do object = fix_object(data["object"]) -- cgit v1.2.3 From bd479606ba2b645db46ef5312f06323534cfd9c9 Mon Sep 17 00:00:00 2001 From: William Pitcock Date: Sun, 24 Jun 2018 06:52:17 +0000 Subject: utils: make_create_data: add support for Article objects --- lib/pleroma/web/activity_pub/utils.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/pleroma/web/activity_pub/utils.ex b/lib/pleroma/web/activity_pub/utils.ex index 64329b710..8b41a3bec 100644 --- a/lib/pleroma/web/activity_pub/utils.ex +++ b/lib/pleroma/web/activity_pub/utils.ex @@ -128,7 +128,7 @@ defmodule Pleroma.Web.ActivityPub.Utils do Inserts a full object if it is contained in an activity. """ def insert_full_object(%{"object" => %{"type" => type} = object_data}) - when is_map(object_data) and type in ["Note"] do + when is_map(object_data) and type in ["Article", "Note"] do with {:ok, _} <- Object.create(object_data) do :ok end -- cgit v1.2.3 From 121c1f62306e416f1f6106d1751b55a5eb9f9075 Mon Sep 17 00:00:00 2001 From: William Pitcock Date: Sun, 24 Jun 2018 05:33:34 +0000 Subject: twitter api: refactor activity html generation, add support for Articles --- lib/pleroma/web/twitter_api/views/activity_view.ex | 41 +++++++++++++++++----- 1 file changed, 32 insertions(+), 9 deletions(-) (limited to 'lib') diff --git a/lib/pleroma/web/twitter_api/views/activity_view.ex b/lib/pleroma/web/twitter_api/views/activity_view.ex index 62ce3b7b5..0779872fe 100644 --- a/lib/pleroma/web/twitter_api/views/activity_view.ex +++ b/lib/pleroma/web/twitter_api/views/activity_view.ex @@ -228,15 +228,7 @@ defmodule Pleroma.Web.TwitterAPI.ActivityView do tags = if possibly_sensitive, do: Enum.uniq(["nsfw" | tags]), else: tags - summary = activity.data["object"]["summary"] - content = object["content"] - - content = - if !!summary and summary != "" do - "#{activity.data["object"]["summary"]}
#{content}" - else - content - end + {summary, content} = render_content(object) html = HtmlSanitizeEx.basic_html(content) @@ -266,4 +258,35 @@ defmodule Pleroma.Web.TwitterAPI.ActivityView do "visibility" => Pleroma.Web.MastodonAPI.StatusView.get_visibility(object) } end + + def render_content(%{"type" => "Note"} = object) do + summary = object["summary"] + content = + if !!summary and summary != "" do + "

#{summary}

#{object["content"]}" + else + object["content"] + end + + {summary, content} + end + + def render_content(%{"type" => "Article"} = object) do + summary = object["name"] || object["summary"] + content = + if !!summary and summary != "" do + "

#{summary}

#{object["content"]}" + else + object["content"] + end + + {summary, content} + end + + def render_content(object) do + summary = object["summary"] || "Unhandled activity type: #{object["type"]}" + content = "

#{summary}

#{object["content"]}" + + {summary, content} + end end -- cgit v1.2.3 From ea982e7503767f645dc26235e04c541ce976de71 Mon Sep 17 00:00:00 2001 From: William Pitcock Date: Sun, 24 Jun 2018 06:14:17 +0000 Subject: mastodon api: add interpreter for Article activity types --- lib/pleroma/web/mastodon_api/views/status_view.ex | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/pleroma/web/mastodon_api/views/status_view.ex b/lib/pleroma/web/mastodon_api/views/status_view.ex index 59898457b..f7ad87bad 100644 --- a/lib/pleroma/web/mastodon_api/views/status_view.ex +++ b/lib/pleroma/web/mastodon_api/views/status_view.ex @@ -128,7 +128,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do in_reply_to_id: reply_to && to_string(reply_to.id), in_reply_to_account_id: reply_to_user && to_string(reply_to_user.id), reblog: nil, - content: HtmlSanitizeEx.basic_html(object["content"]), + content: render_content(object), created_at: created_at, reblogs_count: announcement_count, favourites_count: like_count, @@ -207,4 +207,20 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do "direct" end end + + def render_content(%{"type" => "Article"} = object) do + summary = object["name"] + content = + if !!summary and summary != "" do + "

#{summary}

#{object["content"]}" + else + object["content"] + end + + HtmlSanitizeEx.basic_html(content) + end + + def render_content(object) do + HtmlSanitizeEx.basic_html(object["content"]) + end end -- cgit v1.2.3 From 66819ea784509fbed3f7db8056ececf150339b35 Mon Sep 17 00:00:00 2001 From: William Pitcock Date: Sun, 24 Jun 2018 06:30:23 +0000 Subject: twitter api: use ActivityView.render_content() where appropriate instead of duplicating the logic --- .../web/twitter_api/representers/activity_representer.ex | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) (limited to 'lib') diff --git a/lib/pleroma/web/twitter_api/representers/activity_representer.ex b/lib/pleroma/web/twitter_api/representers/activity_representer.ex index 57837205e..bb77e61f3 100644 --- a/lib/pleroma/web/twitter_api/representers/activity_representer.ex +++ b/lib/pleroma/web/twitter_api/representers/activity_representer.ex @@ -4,7 +4,7 @@ defmodule Pleroma.Web.TwitterAPI.Representers.ActivityRepresenter do use Pleroma.Web.TwitterAPI.Representers.BaseRepresenter alias Pleroma.Web.TwitterAPI.Representers.ObjectRepresenter alias Pleroma.{Activity, User} - alias Pleroma.Web.TwitterAPI.{TwitterAPI, UserView} + alias Pleroma.Web.TwitterAPI.{TwitterAPI, UserView, ActivityView} alias Pleroma.Web.CommonAPI.Utils alias Pleroma.Formatter @@ -164,14 +164,7 @@ defmodule Pleroma.Web.TwitterAPI.Representers.ActivityRepresenter do tags = if possibly_sensitive, do: Enum.uniq(["nsfw" | tags]), else: tags - summary = activity.data["object"]["summary"] - - content = - if !!summary and summary != "" do - "#{activity.data["object"]["summary"]}
#{content}" - else - content - end + {summary, content} = ActivityView.render_content(object) html = HtmlSanitizeEx.basic_html(content) -- cgit v1.2.3 From 971bb4f2bde125c1f8397c244a6fbdec0d26716b Mon Sep 17 00:00:00 2001 From: William Pitcock Date: Sun, 24 Jun 2018 06:34:44 +0000 Subject: activity interpretation: formatting --- lib/pleroma/web/activity_pub/transmogrifier.ex | 3 ++- lib/pleroma/web/mastodon_api/views/status_view.ex | 1 + lib/pleroma/web/twitter_api/views/activity_view.ex | 2 ++ 3 files changed, 5 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex index 1b60170d9..59c4b90e7 100644 --- a/lib/pleroma/web/activity_pub/transmogrifier.ex +++ b/lib/pleroma/web/activity_pub/transmogrifier.ex @@ -122,7 +122,8 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do # TODO: validate those with a Ecto scheme # - tags # - emoji - def handle_incoming(%{"type" => "Create", "object" => %{"type" => objtype} = object} = data) when objtype in ["Article", "Note"] do + def handle_incoming(%{"type" => "Create", "object" => %{"type" => objtype} = object} = data) + when objtype in ["Article", "Note"] do with nil <- Activity.get_create_activity_by_object_ap_id(object["id"]), %User{} = user <- User.get_or_fetch_by_ap_id(data["actor"]) do object = fix_object(data["object"]) diff --git a/lib/pleroma/web/mastodon_api/views/status_view.ex b/lib/pleroma/web/mastodon_api/views/status_view.ex index f7ad87bad..6b48c41c1 100644 --- a/lib/pleroma/web/mastodon_api/views/status_view.ex +++ b/lib/pleroma/web/mastodon_api/views/status_view.ex @@ -210,6 +210,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do def render_content(%{"type" => "Article"} = object) do summary = object["name"] + content = if !!summary and summary != "" do "

#{summary}

#{object["content"]}" diff --git a/lib/pleroma/web/twitter_api/views/activity_view.ex b/lib/pleroma/web/twitter_api/views/activity_view.ex index 0779872fe..f418249e2 100644 --- a/lib/pleroma/web/twitter_api/views/activity_view.ex +++ b/lib/pleroma/web/twitter_api/views/activity_view.ex @@ -261,6 +261,7 @@ defmodule Pleroma.Web.TwitterAPI.ActivityView do def render_content(%{"type" => "Note"} = object) do summary = object["summary"] + content = if !!summary and summary != "" do "

#{summary}

#{object["content"]}" @@ -273,6 +274,7 @@ defmodule Pleroma.Web.TwitterAPI.ActivityView do def render_content(%{"type" => "Article"} = object) do summary = object["name"] || object["summary"] + content = if !!summary and summary != "" do "

#{summary}

#{object["content"]}" -- cgit v1.2.3 From 0bfbf15b379a95e7fad50e8f611cf6c5e67cfa9c Mon Sep 17 00:00:00 2001 From: Jorty Date: Sat, 30 Jun 2018 15:08:31 -0400 Subject: Allow emojis to be added automatically --- .../web/twitter_api/controllers/util_controller.ex | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 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 7a0c37ce9..db6142dc8 100644 --- a/lib/pleroma/web/twitter_api/controllers/util_controller.ex +++ b/lib/pleroma/web/twitter_api/controllers/util_controller.ex @@ -173,7 +173,25 @@ defmodule Pleroma.Web.TwitterAPI.UtilController do end def emoji(conn, _params) do - json(conn, Enum.into(Formatter.get_custom_emoji(), %{})) + emoji_dir = Path.join(:code.priv_dir(:pleroma), "static/emoji") + + shortcode_emoji_glob = + Path.join( + emoji_dir, + Application.get_env(:pleroma, :emoji, []) |> + Keyword.get(:glob, "by-shortcode/**/*.png") + ) + shortcode_emoji = + Path.wildcard(shortcode_emoji_glob) |> + Enum.map(fn path -> + shortcode = Path.basename(path, ".png") + serve_path = Path.join("/emoji", Path.relative_to(path, emoji_dir)) + {shortcode, serve_path} + end) + + emoji = Enum.into(Formatter.get_custom_emoji(), shortcode_emoji) |> Enum.into(%{}) + + json(conn, emoji) end def follow_import(conn, %{"list" => %Plug.Upload{} = listfile}) do -- cgit v1.2.3 From c171f9790bc2d6a1b215792ade1b1cfc7e458ac4 Mon Sep 17 00:00:00 2001 From: Jorty Date: Sat, 30 Jun 2018 17:20:08 -0400 Subject: Move emoji glob setting to config.exs Also, a bit of formatting, and the glob includes an "/emoji/" prefix to make it more intuitive to users --- .../web/twitter_api/controllers/util_controller.ex | 37 +++++++++++++--------- 1 file changed, 22 insertions(+), 15 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 db6142dc8..73a46bb5e 100644 --- a/lib/pleroma/web/twitter_api/controllers/util_controller.ex +++ b/lib/pleroma/web/twitter_api/controllers/util_controller.ex @@ -173,23 +173,30 @@ defmodule Pleroma.Web.TwitterAPI.UtilController do end def emoji(conn, _params) do - emoji_dir = Path.join(:code.priv_dir(:pleroma), "static/emoji") - - shortcode_emoji_glob = - Path.join( - emoji_dir, - Application.get_env(:pleroma, :emoji, []) |> - Keyword.get(:glob, "by-shortcode/**/*.png") - ) + static_dir = Path.join(:code.priv_dir(:pleroma), "static") + + emoji_shortcode_glob = + Application.get_env(:pleroma, :emoji, []) + |> Keyword.get(:shortcode_glob) + shortcode_emoji = - Path.wildcard(shortcode_emoji_glob) |> - Enum.map(fn path -> - shortcode = Path.basename(path, ".png") - serve_path = Path.join("/emoji", Path.relative_to(path, emoji_dir)) - {shortcode, serve_path} - end) + case emoji_shortcode_glob do + nil -> + [] + + glob -> + Path.join(static_dir, glob) + |> Path.wildcard() + |> Enum.map(fn path -> + shortcode = Path.basename(path, ".png") + serve_path = Path.join("/", Path.relative_to(path, static_dir)) + {shortcode, serve_path} + end) + end - emoji = Enum.into(Formatter.get_custom_emoji(), shortcode_emoji) |> Enum.into(%{}) + emoji = + Enum.into(Formatter.get_custom_emoji(), shortcode_emoji) + |> Enum.into(%{}) json(conn, emoji) end -- cgit v1.2.3 From 748fff6544cc70476bb0892a661d4d8c7f6ee295 Mon Sep 17 00:00:00 2001 From: Jorty Date: Sat, 30 Jun 2018 20:35:34 -0400 Subject: Fix auto-shortcode emoji Emoji were broken due to `Pleroma.Formatter` not knowing about the auto-shortcode emoji. This moves that logic from `Pleroma.Web.TwitterAPI.UtilController` to `Pleroma.Formatter`. Additionally, it's now possible to specify multiple shortcode globs, and the default globs were changed to `["/emoji/custom/**/*.png"]`, since that's in the .gitignore and the files there would have to be shortcode emoji anyway. --- lib/pleroma/formatter.ex | 23 +++++++++++++++++- .../web/twitter_api/controllers/util_controller.ex | 27 +--------------------- 2 files changed, 23 insertions(+), 27 deletions(-) (limited to 'lib') diff --git a/lib/pleroma/formatter.ex b/lib/pleroma/formatter.ex index df7ffbc41..0aaf21538 100644 --- a/lib/pleroma/formatter.ex +++ b/lib/pleroma/formatter.ex @@ -116,7 +116,28 @@ defmodule Pleroma.Formatter do _ -> [] end) - @emoji @finmoji_with_filenames ++ @emoji_from_file + @emoji_from_globs ( + static_path = Path.join(:code.priv_dir(:pleroma), "static") + + globs = + Application.get_env(:pleroma, :emoji, []) + |> Keyword.get(:shortcode_globs, []) + + paths = + Enum.map(globs, fn glob -> + Path.join(static_path, glob) + |> Path.wildcard() + end) + |> Enum.concat() + + Enum.map(paths, fn path -> + shortcode = Path.basename(path, Path.extname(path)) + external_path = Path.join("/", Path.relative_to(path, static_path)) + {shortcode, external_path} + end) + ) + + @emoji @finmoji_with_filenames ++ @emoji_from_globs ++ @emoji_from_file def emojify(text, emoji \\ @emoji) def emojify(text, nil), do: text diff --git a/lib/pleroma/web/twitter_api/controllers/util_controller.ex b/lib/pleroma/web/twitter_api/controllers/util_controller.ex index 73a46bb5e..7a0c37ce9 100644 --- a/lib/pleroma/web/twitter_api/controllers/util_controller.ex +++ b/lib/pleroma/web/twitter_api/controllers/util_controller.ex @@ -173,32 +173,7 @@ defmodule Pleroma.Web.TwitterAPI.UtilController do end def emoji(conn, _params) do - static_dir = Path.join(:code.priv_dir(:pleroma), "static") - - emoji_shortcode_glob = - Application.get_env(:pleroma, :emoji, []) - |> Keyword.get(:shortcode_glob) - - shortcode_emoji = - case emoji_shortcode_glob do - nil -> - [] - - glob -> - Path.join(static_dir, glob) - |> Path.wildcard() - |> Enum.map(fn path -> - shortcode = Path.basename(path, ".png") - serve_path = Path.join("/", Path.relative_to(path, static_dir)) - {shortcode, serve_path} - end) - end - - emoji = - Enum.into(Formatter.get_custom_emoji(), shortcode_emoji) - |> Enum.into(%{}) - - json(conn, emoji) + json(conn, Enum.into(Formatter.get_custom_emoji(), %{})) end def follow_import(conn, %{"list" => %Plug.Upload{} = listfile}) do -- cgit v1.2.3 From 7a351cb36f64ae98fa3d28d5133fa0a49d376659 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Mon, 2 Jul 2018 06:28:21 +0200 Subject: [Pleroma.Web.MastodonAPI.StatusView]: Fill the url field for statuses Closes: https://git.pleroma.social/pleroma/pleroma/issues/231 --- lib/pleroma/web/mastodon_api/views/status_view.ex | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/pleroma/web/mastodon_api/views/status_view.ex b/lib/pleroma/web/mastodon_api/views/status_view.ex index 59898457b..39abb4c6b 100644 --- a/lib/pleroma/web/mastodon_api/views/status_view.ex +++ b/lib/pleroma/web/mastodon_api/views/status_view.ex @@ -54,8 +54,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do %{ id: to_string(activity.id), uri: object, - # TODO: This might be wrong, check with mastodon. - url: nil, + url: object, account: AccountView.render("account.json", %{user: user}), in_reply_to_id: nil, in_reply_to_account_id: nil, -- cgit v1.2.3 From 4326cb992019f0a050cde3775a4d36219750dbbc Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Tue, 26 Jun 2018 13:51:35 +0200 Subject: [Pleroma.Web.Nodeinfo.NodeinfoController]: add mediaProxy metadata Closes: https://git.pleroma.social/pleroma/pleroma/issues/229 --- lib/pleroma/web/nodeinfo/nodeinfo_controller.ex | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'lib') diff --git a/lib/pleroma/web/nodeinfo/nodeinfo_controller.ex b/lib/pleroma/web/nodeinfo/nodeinfo_controller.ex index aec77168a..e7e2794ae 100644 --- a/lib/pleroma/web/nodeinfo/nodeinfo_controller.ex +++ b/lib/pleroma/web/nodeinfo/nodeinfo_controller.ex @@ -4,8 +4,6 @@ defmodule Pleroma.Web.Nodeinfo.NodeinfoController do alias Pleroma.Stats alias Pleroma.Web - @instance Application.get_env(:pleroma, :instance) - def schemas(conn, _params) do response = %{ links: [ @@ -21,6 +19,8 @@ defmodule Pleroma.Web.Nodeinfo.NodeinfoController do # Schema definition: https://github.com/jhass/nodeinfo/blob/master/schemas/2.0/schema.json def nodeinfo(conn, %{"version" => "2.0"}) do + @instance = Application.get_env(:pleroma, :instance) + @media_proxy = Application.get_env(:pleroma, :media_proxy) stats = Stats.get_stats() response = %{ @@ -42,7 +42,8 @@ defmodule Pleroma.Web.Nodeinfo.NodeinfoController do localPosts: stats.status_count || 0 }, metadata: %{ - nodeName: Keyword.get(@instance, :name) + nodeName: Keyword.get(@instance, :name), + mediaProxy: Keyword.get(@media_proxy, :enabled) } } -- cgit v1.2.3 From 85465512578d8113366e71d9122d336b8fd49fa4 Mon Sep 17 00:00:00 2001 From: William Pitcock Date: Thu, 12 Jul 2018 02:45:48 +0000 Subject: activitypub: switch to using x509 representation for public keys instead of pkcs#1 --- lib/pleroma/web/activity_pub/views/user_view.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/pleroma/web/activity_pub/views/user_view.ex b/lib/pleroma/web/activity_pub/views/user_view.ex index f4b2e0610..41bfe5048 100644 --- a/lib/pleroma/web/activity_pub/views/user_view.ex +++ b/lib/pleroma/web/activity_pub/views/user_view.ex @@ -12,7 +12,7 @@ defmodule Pleroma.Web.ActivityPub.UserView do def render("user.json", %{user: user}) do {:ok, user} = WebFinger.ensure_keys_present(user) {:ok, _, public_key} = Salmon.keys_from_pem(user.info["keys"]) - public_key = :public_key.pem_entry_encode(:RSAPublicKey, public_key) + public_key = :public_key.pem_entry_encode(:SubjectPublicKeyInfo, public_key) public_key = :public_key.pem_encode([public_key]) %{ -- cgit v1.2.3 From b806aa36c89f2f7359580c716f98d41b58cb87f9 Mon Sep 17 00:00:00 2001 From: lambda Date: Thu, 12 Jul 2018 06:00:55 +0000 Subject: Update nodeinfo_controller.ex --- lib/pleroma/web/nodeinfo/nodeinfo_controller.ex | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'lib') diff --git a/lib/pleroma/web/nodeinfo/nodeinfo_controller.ex b/lib/pleroma/web/nodeinfo/nodeinfo_controller.ex index e7e2794ae..12aca4a10 100644 --- a/lib/pleroma/web/nodeinfo/nodeinfo_controller.ex +++ b/lib/pleroma/web/nodeinfo/nodeinfo_controller.ex @@ -19,22 +19,22 @@ defmodule Pleroma.Web.Nodeinfo.NodeinfoController do # Schema definition: https://github.com/jhass/nodeinfo/blob/master/schemas/2.0/schema.json def nodeinfo(conn, %{"version" => "2.0"}) do - @instance = Application.get_env(:pleroma, :instance) - @media_proxy = Application.get_env(:pleroma, :media_proxy) + instance = Application.get_env(:pleroma, :instance) + media_proxy = Application.get_env(:pleroma, :media_proxy) stats = Stats.get_stats() response = %{ version: "2.0", software: %{ name: "pleroma", - version: Keyword.get(@instance, :version) + version: Keyword.get(instance, :version) }, protocols: ["ostatus", "activitypub"], services: %{ inbound: [], outbound: [] }, - openRegistrations: Keyword.get(@instance, :registrations_open), + openRegistrations: Keyword.get(instance, :registrations_open), usage: %{ users: %{ total: stats.user_count || 0 @@ -42,8 +42,8 @@ defmodule Pleroma.Web.Nodeinfo.NodeinfoController do localPosts: stats.status_count || 0 }, metadata: %{ - nodeName: Keyword.get(@instance, :name), - mediaProxy: Keyword.get(@media_proxy, :enabled) + nodeName: Keyword.get(instance, :name), + mediaProxy: Keyword.get(media_proxy, :enabled) } } -- cgit v1.2.3 From 3b799f22b7cd6afd9fb8bc8c7800ec770585a957 Mon Sep 17 00:00:00 2001 From: William Pitcock Date: Sat, 23 Jun 2018 06:08:09 +0000 Subject: twitterapi: activity view: expose message summary text --- lib/pleroma/web/twitter_api/views/activity_view.ex | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/pleroma/web/twitter_api/views/activity_view.ex b/lib/pleroma/web/twitter_api/views/activity_view.ex index f418249e2..55b5287f5 100644 --- a/lib/pleroma/web/twitter_api/views/activity_view.ex +++ b/lib/pleroma/web/twitter_api/views/activity_view.ex @@ -255,7 +255,8 @@ defmodule Pleroma.Web.TwitterAPI.ActivityView do "tags" => tags, "activity_type" => "post", "possibly_sensitive" => possibly_sensitive, - "visibility" => Pleroma.Web.MastodonAPI.StatusView.get_visibility(object) + "visibility" => Pleroma.Web.MastodonAPI.StatusView.get_visibility(object), + "summary" => summary } end -- cgit v1.2.3 From 152a526237abb846b96a3c7b4001c8bd0c7409f9 Mon Sep 17 00:00:00 2001 From: William Pitcock Date: Sun, 24 Jun 2018 05:33:34 +0000 Subject: twitter api: refactor activity html generation, add support for Articles --- lib/pleroma/web/twitter_api/views/activity_view.ex | 2 -- 1 file changed, 2 deletions(-) (limited to 'lib') diff --git a/lib/pleroma/web/twitter_api/views/activity_view.ex b/lib/pleroma/web/twitter_api/views/activity_view.ex index 55b5287f5..cb7c4cb96 100644 --- a/lib/pleroma/web/twitter_api/views/activity_view.ex +++ b/lib/pleroma/web/twitter_api/views/activity_view.ex @@ -262,7 +262,6 @@ defmodule Pleroma.Web.TwitterAPI.ActivityView do def render_content(%{"type" => "Note"} = object) do summary = object["summary"] - content = if !!summary and summary != "" do "

#{summary}

#{object["content"]}" @@ -275,7 +274,6 @@ defmodule Pleroma.Web.TwitterAPI.ActivityView do def render_content(%{"type" => "Article"} = object) do summary = object["name"] || object["summary"] - content = if !!summary and summary != "" do "

#{summary}

#{object["content"]}" -- cgit v1.2.3 From f03e57f7647f4d302359680c7eb7fe48433c7beb Mon Sep 17 00:00:00 2001 From: William Pitcock Date: Sun, 24 Jun 2018 06:22:53 +0000 Subject: twitter api: activity representer: add summary field for testsuite --- lib/pleroma/web/twitter_api/representers/activity_representer.ex | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/pleroma/web/twitter_api/representers/activity_representer.ex b/lib/pleroma/web/twitter_api/representers/activity_representer.ex index bb77e61f3..26bfb79af 100644 --- a/lib/pleroma/web/twitter_api/representers/activity_representer.ex +++ b/lib/pleroma/web/twitter_api/representers/activity_representer.ex @@ -191,7 +191,8 @@ defmodule Pleroma.Web.TwitterAPI.Representers.ActivityRepresenter do "tags" => tags, "activity_type" => "post", "possibly_sensitive" => possibly_sensitive, - "visibility" => Pleroma.Web.MastodonAPI.StatusView.get_visibility(object) + "visibility" => Pleroma.Web.MastodonAPI.StatusView.get_visibility(object), + "summary" => object["summary"] } end -- cgit v1.2.3 From b832df1e158aa945a3c481804da0a839f18d46c5 Mon Sep 17 00:00:00 2001 From: William Pitcock Date: Thu, 12 Jul 2018 16:12:54 +0000 Subject: formatting --- lib/pleroma/web/twitter_api/views/activity_view.ex | 2 ++ 1 file changed, 2 insertions(+) (limited to 'lib') diff --git a/lib/pleroma/web/twitter_api/views/activity_view.ex b/lib/pleroma/web/twitter_api/views/activity_view.ex index cb7c4cb96..55b5287f5 100644 --- a/lib/pleroma/web/twitter_api/views/activity_view.ex +++ b/lib/pleroma/web/twitter_api/views/activity_view.ex @@ -262,6 +262,7 @@ defmodule Pleroma.Web.TwitterAPI.ActivityView do def render_content(%{"type" => "Note"} = object) do summary = object["summary"] + content = if !!summary and summary != "" do "

#{summary}

#{object["content"]}" @@ -274,6 +275,7 @@ defmodule Pleroma.Web.TwitterAPI.ActivityView do def render_content(%{"type" => "Article"} = object) do summary = object["name"] || object["summary"] + content = if !!summary and summary != "" do "

#{summary}

#{object["content"]}" -- cgit v1.2.3 From 590d4df77c5b6b17b12e9692e77bb24c87ecc4a2 Mon Sep 17 00:00:00 2001 From: William Pitcock Date: Thu, 12 Jul 2018 16:37:42 +0000 Subject: activitypub: more robustly handle object-to-actor associations --- lib/pleroma/web/activity_pub/transmogrifier.ex | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex index 59c4b90e7..3dd3df553 100644 --- a/lib/pleroma/web/activity_pub/transmogrifier.ex +++ b/lib/pleroma/web/activity_pub/transmogrifier.ex @@ -18,7 +18,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do """ def fix_object(object) do object - |> Map.put("actor", object["attributedTo"]) + |> fix_actor |> fix_attachments |> fix_context |> fix_in_reply_to @@ -27,6 +27,19 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do |> fix_content_map end + def fix_actor(%{"attributedTo" => actor} = object) do + # attributedTo can be a list in the case of peertube or plume + actor = + if is_list(actor) do + Enum.at(actor, 0) + else + actor + end + + object + |> Map.put("actor", actor) + end + def fix_in_reply_to(%{"inReplyTo" => in_reply_to_id} = object) when not is_nil(in_reply_to_id) do case ActivityPub.fetch_object_from_id(in_reply_to_id) do @@ -126,7 +139,10 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do when objtype in ["Article", "Note"] do with nil <- Activity.get_create_activity_by_object_ap_id(object["id"]), %User{} = user <- User.get_or_fetch_by_ap_id(data["actor"]) do - object = fix_object(data["object"]) + # prefer the activity's actor instead of attributedTo + object = + fix_object(data["object"]) + |> Map.put("actor", data["actor"]) params = %{ to: data["to"], -- cgit v1.2.3 From 0899588e4dfba7b7e65ee606378a1c1c710e4a82 Mon Sep 17 00:00:00 2001 From: William Pitcock Date: Thu, 12 Jul 2018 17:13:20 +0000 Subject: ostatus: return AS2 objects on /notice and /activities URLs like with /objects. --- lib/pleroma/web/ostatus/ostatus_controller.ex | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) (limited to 'lib') diff --git a/lib/pleroma/web/ostatus/ostatus_controller.ex b/lib/pleroma/web/ostatus/ostatus_controller.ex index 00bffbd5d..09d1b1110 100644 --- a/lib/pleroma/web/ostatus/ostatus_controller.ex +++ b/lib/pleroma/web/ostatus/ostatus_controller.ex @@ -6,6 +6,7 @@ defmodule Pleroma.Web.OStatus.OStatusController do alias Pleroma.Repo alias Pleroma.Web.{OStatus, Federator} alias Pleroma.Web.XML + alias Pleroma.Web.ActivityPub.ObjectView alias Pleroma.Web.ActivityPub.ActivityPubController alias Pleroma.Web.ActivityPub.ActivityPub @@ -90,7 +91,7 @@ defmodule Pleroma.Web.OStatus.OStatusController do %User{} = user <- User.get_cached_by_ap_id(activity.data["actor"]) do case get_format(conn) do "html" -> redirect(conn, to: "/notice/#{activity.id}") - _ -> represent_activity(conn, activity, user) + _ -> represent_activity(conn, nil, activity, user) end else {:public?, false} -> @@ -110,9 +111,9 @@ defmodule Pleroma.Web.OStatus.OStatusController do {_, %Activity{} = activity} <- {:activity, Activity.normalize(id)}, {_, true} <- {:public?, ActivityPub.is_public?(activity)}, %User{} = user <- User.get_cached_by_ap_id(activity.data["actor"]) do - case get_format(conn) do + case format = get_format(conn) do "html" -> redirect(conn, to: "/notice/#{activity.id}") - _ -> represent_activity(conn, activity, user) + _ -> represent_activity(conn, format, activity, user) end else {:public?, false} -> @@ -130,14 +131,14 @@ defmodule Pleroma.Web.OStatus.OStatusController do with {_, %Activity{} = activity} <- {:activity, Repo.get(Activity, id)}, {_, true} <- {:public?, ActivityPub.is_public?(activity)}, %User{} = user <- User.get_cached_by_ap_id(activity.data["actor"]) do - case get_format(conn) do + case format = get_format(conn) do "html" -> conn |> put_resp_content_type("text/html") |> send_file(200, "priv/static/index.html") _ -> - represent_activity(conn, activity, user) + represent_activity(conn, format, activity, user) end else {:public?, false} -> @@ -151,7 +152,13 @@ defmodule Pleroma.Web.OStatus.OStatusController do end end - defp represent_activity(conn, activity, user) do + defp represent_activity(conn, "activity+json", activity, user) do + conn + |> put_resp_header("content-type", "application/activity+json") + |> json(ObjectView.render("object.json", %{object: activity})) + end + + defp represent_activity(conn, _, activity, user) do response = activity |> ActivityRepresenter.to_simple_form(user, true) -- cgit v1.2.3 From 8472fba2a729f7764ffaf2a4744533c8a95adadb Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Thu, 12 Jul 2018 23:09:42 +0200 Subject: [Pleroma.Web.ActivityPub.Transmogrifier]: Fix actor key outside of object The code here is copied from feature/peertube by lain. Co-authored-by: lain --- lib/pleroma/web/activity_pub/transmogrifier.ex | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) (limited to 'lib') diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex index 0d2166196..6080303b6 100644 --- a/lib/pleroma/web/activity_pub/transmogrifier.ex +++ b/lib/pleroma/web/activity_pub/transmogrifier.ex @@ -13,6 +13,14 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do require Logger + def get_actor(%{"actor" => actor}) when is_binary(actor) do + actor + end + + def get_actor(%{"actor" => actor}) when is_list(actor) do + Enum.at(actor, 0) + end + @doc """ Modifies an incoming AP object (mastodon format) to our internal format. """ @@ -28,16 +36,8 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do end def fix_actor(%{"attributedTo" => actor} = object) do - # attributedTo can be a list in the case of peertube or plume - actor = - if is_list(actor) do - Enum.at(actor, 0) - else - actor - end - object - |> Map.put("actor", actor) + |> Map.put("actor", get_actor(%{"actor" => actor})) end def fix_in_reply_to(%{"inReplyTo" => in_reply_to_id} = object) @@ -137,12 +137,12 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do # - emoji def handle_incoming(%{"type" => "Create", "object" => %{"type" => objtype} = object} = data) when objtype in ["Article", "Note"] do + actor = get_actor(data) + data = Map.put(data, "actor", actor) + with nil <- Activity.get_create_activity_by_object_ap_id(object["id"]), %User{} = user <- User.get_or_fetch_by_ap_id(data["actor"]) do - # prefer the activity's actor instead of attributedTo - object = - fix_object(data["object"]) - |> Map.put("actor", data["actor"]) + object = fix_object(data["object"]) params = %{ to: data["to"], -- cgit v1.2.3 From 7501481db4be56cf7b5babeeebeb7b96273ae4db Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Thu, 12 Jul 2018 23:25:44 +0200 Subject: [Pleroma.Web.ActivityPub.Transmogrifier] Add Person finding --- lib/pleroma/web/activity_pub/transmogrifier.ex | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'lib') diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex index 6080303b6..2ebc526df 100644 --- a/lib/pleroma/web/activity_pub/transmogrifier.ex +++ b/lib/pleroma/web/activity_pub/transmogrifier.ex @@ -21,6 +21,11 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do Enum.at(actor, 0) end + def get_actor(%{"actor" => actor_list}) do + Enum.find(actor_list, fn %{"type" => type} -> type == "Person" end) + |> Map.get("id") + end + @doc """ Modifies an incoming AP object (mastodon format) to our internal format. """ -- cgit v1.2.3 From f944f8157ac078aef5edda64059a5d6d3837bf53 Mon Sep 17 00:00:00 2001 From: hakabahitoyo Date: Sat, 14 Jul 2018 00:21:38 +0900 Subject: /api/v1/suggestions endpoint --- lib/pleroma/web/mastodon_api/mastodon_api_controller.ex | 5 +++++ lib/pleroma/web/router.ex | 2 ++ 2 files changed, 7 insertions(+) (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 09e6b0b59..0184d52c8 100644 --- a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex +++ b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex @@ -1070,4 +1070,9 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do |> put_status(500) |> json("Something went wrong") end + + def suggestions(conn, _) do + conn + |> json("SUGGESTIONS!") + end end diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index 34652cdde..f1c08c681 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -140,6 +140,8 @@ defmodule Pleroma.Web.Router do get("/domain_blocks", MastodonAPIController, :domain_blocks) post("/domain_blocks", MastodonAPIController, :block_domain) delete("/domain_blocks", MastodonAPIController, :unblock_domain) + + get("/suggestions", MastodonAPIController, :suggestions) end scope "/api/web", Pleroma.Web.MastodonAPI do -- cgit v1.2.3 From 4a21c1b343c3f62d78da1651ed490daf4dde5d97 Mon Sep 17 00:00:00 2001 From: hakabahitoyo Date: Sat, 14 Jul 2018 00:44:18 +0900 Subject: mock /api/v1/suggestions --- lib/pleroma/web/mastodon_api/mastodon_api_controller.ex | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (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 0184d52c8..0f50eba84 100644 --- a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex +++ b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex @@ -1071,8 +1071,12 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do |> json("Something went wrong") end - def suggestions(conn, _) do + def suggestions(%{assigns: %{user: user}} = conn, _) do + res = %{ + host: (String.replace Web.base_url(), "https://", ""), + user: user.nickname + } conn - |> json("SUGGESTIONS!") + |> json(res) end end -- cgit v1.2.3 From 3812b627ca546287e20a55cd49544a36eefffa0b Mon Sep 17 00:00:00 2001 From: hakabahitoyo Date: Sat, 14 Jul 2018 00:52:23 +0900 Subject: better mock /api/v1/suggestions --- .../web/mastodon_api/mastodon_api_controller.ex | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) (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 0f50eba84..fb334352d 100644 --- a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex +++ b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex @@ -1072,10 +1072,20 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do end def suggestions(%{assigns: %{user: user}} = conn, _) do - res = %{ - host: (String.replace Web.base_url(), "https://", ""), - user: user.nickname - } + res = [ + %{ + username: "vaginaplant", + acct: "vaginaplant@3.distsn.org", + display_name: "Hakaba Hitoyo", + note: "Recommendation Fairness Warrior", + avatar: "https://3.distsn.org/media/1c0cbe9d-8b87-496f-b964-1af8116b8f67/D38B0A8B021DC5565D06CF40EBB744E4B7CF8F7F16347094F9CD469348DCC267.jpeg", + avatar_static: "https://3.distsn.org/media/1c0cbe9d-8b87-496f-b964-1af8116b8f67/D38B0A8B021DC5565D06CF40EBB744E4B7CF8F7F16347094F9CD469348DCC267.jpeg" + }, + %{ + username: user.nickname, + acct: user.nickname <> "@" <> (String.replace Web.base_url(), "https://", "") + } + ] conn |> json(res) end -- cgit v1.2.3 From eb0afda3a72aa08a991e25b05c98ae798655f413 Mon Sep 17 00:00:00 2001 From: hakabahitoyo Date: Sat, 14 Jul 2018 10:04:37 +0900 Subject: http access to third party user recommendation --- .../web/mastodon_api/mastodon_api_controller.ex | 30 ++++++++++------------ 1 file changed, 14 insertions(+), 16 deletions(-) (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 fb334352d..4f48a141b 100644 --- a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex +++ b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex @@ -11,6 +11,8 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do import Ecto.Query require Logger + @httpoison Application.get_env(:pleroma, :httpoison) + action_fallback(:errors) def create_app(conn, params) do @@ -1072,21 +1074,17 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do end def suggestions(%{assigns: %{user: user}} = conn, _) do - res = [ - %{ - username: "vaginaplant", - acct: "vaginaplant@3.distsn.org", - display_name: "Hakaba Hitoyo", - note: "Recommendation Fairness Warrior", - avatar: "https://3.distsn.org/media/1c0cbe9d-8b87-496f-b964-1af8116b8f67/D38B0A8B021DC5565D06CF40EBB744E4B7CF8F7F16347094F9CD469348DCC267.jpeg", - avatar_static: "https://3.distsn.org/media/1c0cbe9d-8b87-496f-b964-1af8116b8f67/D38B0A8B021DC5565D06CF40EBB744E4B7CF8F7F16347094F9CD469348DCC267.jpeg" - }, - %{ - username: user.nickname, - acct: user.nickname <> "@" <> (String.replace Web.base_url(), "https://", "") - } - ] - conn - |> json(res) + host = String.replace Web.base_url(), "https://", "" + user = user.nickname + api = "http://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-filtered-api.cgi?{{host}}+{{user}}" + url = String.replace(api, "{{host}}", host) |> String.replace("{{user}}", user) + with {:ok, %{status_code: 200, body: body}} <- + @httpoison.get(url), + {:ok, data} <- Jason.decode(body) do + conn + |> json(data) + else + e -> Logger.error("Could not decode user at fetch #{url}, #{inspect(e)}") + end end end -- cgit v1.2.3 From 127882a5d51d8243eae44ad7ed73bf6010804760 Mon Sep 17 00:00:00 2001 From: hakabahitoyo Date: Sat, 14 Jul 2018 11:41:09 +0900 Subject: configurable --- lib/pleroma/web/mastodon_api/mastodon_api_controller.ex | 4 +++- 1 file changed, 3 insertions(+), 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 4f48a141b..fd60db3d6 100644 --- a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex +++ b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex @@ -1073,10 +1073,12 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do |> json("Something went wrong") end + @suggestions Application.get_env(:pleroma, :suggestions) + def suggestions(%{assigns: %{user: user}} = conn, _) do host = String.replace Web.base_url(), "https://", "" user = user.nickname - api = "http://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-filtered-api.cgi?{{host}}+{{user}}" + api = Keyword.get(@suggestions, :third_party_engine, "") url = String.replace(api, "{{host}}", host) |> String.replace("{{user}}", user) with {:ok, %{status_code: 200, body: body}} <- @httpoison.get(url), -- cgit v1.2.3 From 2eeaf01627efb2a13d73f4cde764d3cb1fef3e98 Mon Sep 17 00:00:00 2001 From: hakabahitoyo Date: Sat, 14 Jul 2018 14:03:30 +0900 Subject: id field --- lib/pleroma/web/mastodon_api/mastodon_api_controller.ex | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (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 fd60db3d6..d87a6cb19 100644 --- a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex +++ b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex @@ -1081,10 +1081,13 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do api = Keyword.get(@suggestions, :third_party_engine, "") url = String.replace(api, "{{host}}", host) |> String.replace("{{user}}", user) with {:ok, %{status_code: 200, body: body}} <- - @httpoison.get(url), + @httpoison.get(url, [], [timeout: 300000, recv_timeout: 300000]), {:ok, data} <- Jason.decode(body) do + data2 = Enum.slice(data, 0, 40) |> Enum.map(fn(x) -> + Map.put(x, "id", User.get_or_fetch(x["acct"]).id) + end) conn - |> json(data) + |> json(data2) else e -> Logger.error("Could not decode user at fetch #{url}, #{inspect(e)}") end -- cgit v1.2.3 From e7c580828c109247de11624bae8c7286b02441e5 Mon Sep 17 00:00:00 2001 From: hakabahitoyo Date: Sun, 15 Jul 2018 20:36:26 +0900 Subject: format --- lib/pleroma/web/mastodon_api/mastodon_api_controller.ex | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) (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 d87a6cb19..e397b911d 100644 --- a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex +++ b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex @@ -1076,16 +1076,20 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do @suggestions Application.get_env(:pleroma, :suggestions) def suggestions(%{assigns: %{user: user}} = conn, _) do - host = String.replace Web.base_url(), "https://", "" + host = String.replace(Web.base_url(), "https://", "") user = user.nickname api = Keyword.get(@suggestions, :third_party_engine, "") url = String.replace(api, "{{host}}", host) |> String.replace("{{user}}", user) + with {:ok, %{status_code: 200, body: body}} <- - @httpoison.get(url, [], [timeout: 300000, recv_timeout: 300000]), + @httpoison.get(url, [], timeout: 300_000, recv_timeout: 300_000), {:ok, data} <- Jason.decode(body) do - data2 = Enum.slice(data, 0, 40) |> Enum.map(fn(x) -> - Map.put(x, "id", User.get_or_fetch(x["acct"]).id) - end) + data2 = + Enum.slice(data, 0, 40) + |> Enum.map(fn x -> + Map.put(x, "id", User.get_or_fetch(x["acct"]).id) + end) + conn |> json(data2) else -- cgit v1.2.3 From f10291a1d322eed22ae594024c9d3d9011a7d5fe Mon Sep 17 00:00:00 2001 From: William Pitcock Date: Tue, 17 Jul 2018 03:35:08 +0000 Subject: upload: use generic Document object type instead of Image (mastodon compatibility) Mastodon does not use the object name as alt text when the object is an Image. --- 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 43df0d418..92a89e296 100644 --- a/lib/pleroma/upload.ex +++ b/lib/pleroma/upload.ex @@ -19,7 +19,7 @@ defmodule Pleroma.Upload do end %{ - "type" => "Image", + "type" => "Document", "url" => [ %{ "type" => "Link", -- cgit v1.2.3 From cd19d37a90cfceb8bafb380fd8ff8e5a765b7e3d Mon Sep 17 00:00:00 2001 From: William Pitcock Date: Tue, 17 Jul 2018 03:36:11 +0000 Subject: mastodon api: use object name as alt text --- lib/pleroma/web/mastodon_api/views/status_view.ex | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/pleroma/web/mastodon_api/views/status_view.ex b/lib/pleroma/web/mastodon_api/views/status_view.ex index 4c20581d6..5dbd59dd9 100644 --- a/lib/pleroma/web/mastodon_api/views/status_view.ex +++ b/lib/pleroma/web/mastodon_api/views/status_view.ex @@ -169,7 +169,8 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do remote_url: href, preview_url: MediaProxy.url(href), text_url: href, - type: type + type: type, + description: attachment["name"] } end -- cgit v1.2.3 From 99c0252314fc3391e6fae58bdad8110d0a053fb9 Mon Sep 17 00:00:00 2001 From: William Pitcock Date: Tue, 17 Jul 2018 03:36:50 +0000 Subject: mastodon api: support descriptions in media api, add PUT endpoint for updating metadata about a media upload --- .../web/mastodon_api/mastodon_api_controller.ex | 35 +++++++++++++++++++--- lib/pleroma/web/router.ex | 1 + 2 files changed, 32 insertions(+), 4 deletions(-) (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 09e6b0b59..f270e1146 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, Stats} + alias Pleroma.{Repo, Object, Activity, User, Notification, Stats} alias Pleroma.Web alias Pleroma.Web.MastodonAPI.{StatusView, AccountView, MastodonView, ListView} alias Pleroma.Web.ActivityPub.ActivityPub @@ -428,16 +428,43 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do render(conn, AccountView, "relationships.json", %{user: user, targets: targets}) end - def upload(%{assigns: %{user: _}} = conn, %{"file" => file}) do - with {:ok, object} <- ActivityPub.upload(file) do + def update_media(%{assigns: %{user: _}} = conn, data) do + with %Object{} = object <- Repo.get(Object, data["id"]), + true <- is_binary(data["description"]), + description <- data["description"] do + new_data = %{object.data | "name" => description} + + change = Object.change(object, %{data: new_data}) + {:ok, media_obj} = Repo.update(change) + data = - object.data + new_data |> Map.put("id", object.id) render(conn, StatusView, "attachment.json", %{attachment: data}) end end + def upload(%{assigns: %{user: _}} = conn, %{"file" => file} = data) do + with {:ok, object} <- ActivityPub.upload(file) do + objdata = + if Map.has_key?(data, "description") do + Map.put(object.data, "name", data["description"]) + else + object.data + end + + change = Object.change(object, %{data: objdata}) + {:ok, object} = Repo.update(change) + + objdata = + objdata + |> Map.put("id", object.id) + + render(conn, StatusView, "attachment.json", %{attachment: objdata}) + end + end + def favourited_by(conn, %{"id" => id}) do with %Activity{data: %{"object" => %{"likes" => likes}}} <- Repo.get(Activity, id) do q = from(u in User, where: u.ap_id in ^likes) diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index 34652cdde..fc7a947aa 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -127,6 +127,7 @@ defmodule Pleroma.Web.Router do get("/notifications/:id", MastodonAPIController, :get_notification) post("/media", MastodonAPIController, :upload) + put("/media/:id", MastodonAPIController, :update_media) get("/lists", MastodonAPIController, :get_lists) get("/lists/:id", MastodonAPIController, :get_list) -- cgit v1.2.3 From df3233e7e798563afe4b5a937b0bdd13e101973b Mon Sep 17 00:00:00 2001 From: Hakaba Hitoyo Date: Tue, 17 Jul 2018 13:20:58 +0900 Subject: improve getting host name --- lib/pleroma/web/mastodon_api/mastodon_api_controller.ex | 6 +++++- 1 file changed, 5 insertions(+), 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 e397b911d..2f8139fe6 100644 --- a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex +++ b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex @@ -1076,7 +1076,11 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do @suggestions Application.get_env(:pleroma, :suggestions) def suggestions(%{assigns: %{user: user}} = conn, _) do - host = String.replace(Web.base_url(), "https://", "") + host = + Application.get_env(:pleroma, Pleroma.Web.Endpoint) + |> Keyword.get(:url) + |> Keyword.get(:host) + user = user.nickname api = Keyword.get(@suggestions, :third_party_engine, "") url = String.replace(api, "{{host}}", host) |> String.replace("{{user}}", user) -- cgit v1.2.3 From d76f0d87bebd655bcbc4259a47a4ee8fd4f00887 Mon Sep 17 00:00:00 2001 From: Hakaba Hitoyo Date: Tue, 17 Jul 2018 16:45:18 +0900 Subject: do nothing if configuration is skipped --- .../web/mastodon_api/mastodon_api_controller.ex | 45 ++++++++++++---------- 1 file changed, 25 insertions(+), 20 deletions(-) (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 2f8139fe6..ac8f794e9 100644 --- a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex +++ b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex @@ -1076,28 +1076,33 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do @suggestions Application.get_env(:pleroma, :suggestions) def suggestions(%{assigns: %{user: user}} = conn, _) do - host = - Application.get_env(:pleroma, Pleroma.Web.Endpoint) - |> Keyword.get(:url) - |> Keyword.get(:host) - - user = user.nickname - api = Keyword.get(@suggestions, :third_party_engine, "") - url = String.replace(api, "{{host}}", host) |> String.replace("{{user}}", user) - - with {:ok, %{status_code: 200, body: body}} <- - @httpoison.get(url, [], timeout: 300_000, recv_timeout: 300_000), - {:ok, data} <- Jason.decode(body) do - data2 = - Enum.slice(data, 0, 40) - |> Enum.map(fn x -> - Map.put(x, "id", User.get_or_fetch(x["acct"]).id) - end) + api = Keyword.get(@suggestions, :third_party_engine, false) + + if api do + host = + Application.get_env(:pleroma, Pleroma.Web.Endpoint) + |> Keyword.get(:url) + |> Keyword.get(:host) + + user = user.nickname + url = String.replace(api, "{{host}}", host) |> String.replace("{{user}}", user) + + with {:ok, %{status_code: 200, body: body}} <- + @httpoison.get(url, [], timeout: 300_000, recv_timeout: 300_000), + {:ok, data} <- Jason.decode(body) do + data2 = + Enum.slice(data, 0, 40) + |> Enum.map(fn x -> + Map.put(x, "id", User.get_or_fetch(x["acct"]).id) + end) - conn - |> json(data2) + conn + |> json(data2) + else + e -> Logger.error("Could not decode user at fetch #{url}, #{inspect(e)}") + end else - e -> Logger.error("Could not decode user at fetch #{url}, #{inspect(e)}") + json(conn, []) end end end -- cgit v1.2.3 From 2b7b1b3e6b276e1db7e610d46298f74a0f0c70f1 Mon Sep 17 00:00:00 2001 From: Hakaba Hitoyo Date: Tue, 17 Jul 2018 16:56:30 +0900 Subject: add suggestionsThirdPartyEngine into /nodeinfo/2.0.json --- lib/pleroma/web/nodeinfo/nodeinfo_controller.ex | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/pleroma/web/nodeinfo/nodeinfo_controller.ex b/lib/pleroma/web/nodeinfo/nodeinfo_controller.ex index 12aca4a10..77401c554 100644 --- a/lib/pleroma/web/nodeinfo/nodeinfo_controller.ex +++ b/lib/pleroma/web/nodeinfo/nodeinfo_controller.ex @@ -21,6 +21,7 @@ defmodule Pleroma.Web.Nodeinfo.NodeinfoController do def nodeinfo(conn, %{"version" => "2.0"}) do instance = Application.get_env(:pleroma, :instance) media_proxy = Application.get_env(:pleroma, :media_proxy) + suggestions = Application.get_env(:pleroma, :suggestions) stats = Stats.get_stats() response = %{ @@ -43,7 +44,8 @@ defmodule Pleroma.Web.Nodeinfo.NodeinfoController do }, metadata: %{ nodeName: Keyword.get(instance, :name), - mediaProxy: Keyword.get(media_proxy, :enabled) + mediaProxy: Keyword.get(media_proxy, :enabled), + suggestionsThirdPartyEngine: Keyword.get(@suggestions, :third_party_engine, false) } } -- cgit v1.2.3 From 8ff336e02a5a4861ba856b3d10e57cb44f1f3a45 Mon Sep 17 00:00:00 2001 From: Hakaba Hitoyo Date: Tue, 17 Jul 2018 17:00:14 +0900 Subject: debug --- lib/pleroma/web/nodeinfo/nodeinfo_controller.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/pleroma/web/nodeinfo/nodeinfo_controller.ex b/lib/pleroma/web/nodeinfo/nodeinfo_controller.ex index 77401c554..5f7d6e86e 100644 --- a/lib/pleroma/web/nodeinfo/nodeinfo_controller.ex +++ b/lib/pleroma/web/nodeinfo/nodeinfo_controller.ex @@ -45,7 +45,7 @@ defmodule Pleroma.Web.Nodeinfo.NodeinfoController do metadata: %{ nodeName: Keyword.get(instance, :name), mediaProxy: Keyword.get(media_proxy, :enabled), - suggestionsThirdPartyEngine: Keyword.get(@suggestions, :third_party_engine, false) + suggestionsThirdPartyEngine: Keyword.get(suggestions, :third_party_engine, false) } } -- cgit v1.2.3 From 5b4a21317de6a32001699b33964c7eaeb4f0bec8 Mon Sep 17 00:00:00 2001 From: Hakaba Hitoyo Date: Tue, 17 Jul 2018 17:29:18 +0900 Subject: correct error message --- 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 ac8f794e9..2ad6521cc 100644 --- a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex +++ b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex @@ -1099,7 +1099,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do conn |> json(data2) else - e -> Logger.error("Could not decode user at fetch #{url}, #{inspect(e)}") + e -> Logger.error("Could not retrieve suggestions at fetch #{url}, #{inspect(e)}") end else json(conn, []) -- cgit v1.2.3 From cf219b6addab9fffca0b2e996fa8de1d7fbcd198 Mon Sep 17 00:00:00 2001 From: William Pitcock Date: Tue, 17 Jul 2018 15:10:14 +0000 Subject: config: make instance description configurable --- lib/pleroma/web/mastodon_api/mastodon_api_controller.ex | 2 +- lib/pleroma/web/nodeinfo/nodeinfo_controller.ex | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) (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 09e6b0b59..f521960c2 100644 --- a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex +++ b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex @@ -125,7 +125,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do response = %{ uri: Web.base_url(), title: Keyword.get(@instance, :name), - description: "A Pleroma instance, an alternative fediverse server", + description: Keyword.get(@instance, :description), version: "#{@mastodon_api_level} (compatible; #{Keyword.get(@instance, :version)})", email: Keyword.get(@instance, :email), urls: %{ diff --git a/lib/pleroma/web/nodeinfo/nodeinfo_controller.ex b/lib/pleroma/web/nodeinfo/nodeinfo_controller.ex index 12aca4a10..7c67bbf1c 100644 --- a/lib/pleroma/web/nodeinfo/nodeinfo_controller.ex +++ b/lib/pleroma/web/nodeinfo/nodeinfo_controller.ex @@ -43,7 +43,9 @@ defmodule Pleroma.Web.Nodeinfo.NodeinfoController do }, metadata: %{ nodeName: Keyword.get(instance, :name), - mediaProxy: Keyword.get(media_proxy, :enabled) + nodeDescription: Keyword.get(instance, :description), + mediaProxy: Keyword.get(media_proxy, :enabled), + private: !Keyword.get(instance, :public, true) } } -- cgit v1.2.3 From b23630076f8d1597c417e98dfc702c972b29a82c Mon Sep 17 00:00:00 2001 From: William Pitcock Date: Tue, 17 Jul 2018 15:20:39 +0000 Subject: TwitterAPI: present pleroma frontend config in API --- .../web/twitter_api/controllers/util_controller.ex | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 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 7a0c37ce9..47fc79350 100644 --- a/lib/pleroma/web/twitter_api/controllers/util_controller.ex +++ b/lib/pleroma/web/twitter_api/controllers/util_controller.ex @@ -126,6 +126,8 @@ defmodule Pleroma.Web.TwitterAPI.UtilController do end @instance Application.get_env(:pleroma, :instance) + @instance_fe Application.get_env(:pleroma, :fe) + @instance_chat Application.get_env(:pleroma, :chat) def config(conn, _params) do case get_format(conn) do "xml" -> @@ -148,9 +150,24 @@ defmodule Pleroma.Web.TwitterAPI.UtilController do json(conn, %{ site: %{ name: Keyword.get(@instance, :name), + description: Keyword.get(@instance, :description), server: Web.base_url(), textlimit: to_string(Keyword.get(@instance, :limit)), - closed: if(Keyword.get(@instance, :registrations_open), do: "0", else: "1") + closed: if(Keyword.get(@instance, :registrations_open), do: "0", else: "1"), + private: if(Keyword.get(@instance, :public, true), do: "0", else: "1"), + pleromafe: %{ + theme: Keyword.get(@instance_fe, :theme), + background: Keyword.get(@instance_fe, :background), + logo: Keyword.get(@instance_fe, :logo), + redirectRootNoLogin: Keyword.get(@instance_fe, :redirect_root_no_login), + redirectRootLogin: Keyword.get(@instance_fe, :redirect_root_login), + chatDisabled: !Keyword.get(@instance_chat, :enabled), + showInstanceSpecificPanel: Keyword.get(@instance_fe, :show_instance_panel), + showWhoToFollowPanel: Keyword.get(@instance_fe, :show_who_to_follow_panel), + scopeOptionsEnabled: Keyword.get(@instance_fe, :scope_options_enabled), + whoToFollowProvider: Keyword.get(@instance_fe, :who_to_follow_provider), + whoToFollowLink: Keyword.get(@instance_fe, :who_to_follow_link) + } } }) end -- cgit v1.2.3 From e4dd58307a692aaa503fccc9cdf9ebae61293f6f Mon Sep 17 00:00:00 2001 From: Hakaba Hitoyo Date: Wed, 18 Jul 2018 09:58:59 +0900 Subject: better configuration --- lib/pleroma/web/mastodon_api/mastodon_api_controller.ex | 4 ++-- lib/pleroma/web/nodeinfo/nodeinfo_controller.ex | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) (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 2ad6521cc..5b79f9600 100644 --- a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex +++ b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex @@ -1076,9 +1076,9 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do @suggestions Application.get_env(:pleroma, :suggestions) def suggestions(%{assigns: %{user: user}} = conn, _) do - api = Keyword.get(@suggestions, :third_party_engine, false) + if Keyword.get(@suggestions, :enabled, false) do + api = Keyword.get(@suggestions, :third_party_engine, false) - if api do host = Application.get_env(:pleroma, Pleroma.Web.Endpoint) |> Keyword.get(:url) diff --git a/lib/pleroma/web/nodeinfo/nodeinfo_controller.ex b/lib/pleroma/web/nodeinfo/nodeinfo_controller.ex index 5f7d6e86e..e80e63f27 100644 --- a/lib/pleroma/web/nodeinfo/nodeinfo_controller.ex +++ b/lib/pleroma/web/nodeinfo/nodeinfo_controller.ex @@ -45,6 +45,7 @@ defmodule Pleroma.Web.Nodeinfo.NodeinfoController do metadata: %{ nodeName: Keyword.get(instance, :name), mediaProxy: Keyword.get(media_proxy, :enabled), + suggestions: Keyword.get(suggestions, :enabled, false), suggestionsThirdPartyEngine: Keyword.get(suggestions, :third_party_engine, false) } } -- cgit v1.2.3 From b12d17d2ce270e0d964f599efd4f16fba95b17ce Mon Sep 17 00:00:00 2001 From: Hakaba Hitoyo Date: Wed, 18 Jul 2018 13:36:20 +0900 Subject: configurable timeout --- lib/pleroma/web/mastodon_api/mastodon_api_controller.ex | 5 +++-- lib/pleroma/web/nodeinfo/nodeinfo_controller.ex | 7 +++++-- 2 files changed, 8 insertions(+), 4 deletions(-) (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 5b79f9600..396f11a70 100644 --- a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex +++ b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex @@ -1077,7 +1077,8 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do def suggestions(%{assigns: %{user: user}} = conn, _) do if Keyword.get(@suggestions, :enabled, false) do - api = Keyword.get(@suggestions, :third_party_engine, false) + api = Keyword.get(@suggestions, :third_party_engine, "") + timeout = Keyword.get(@suggestions, :timeout, 5000) host = Application.get_env(:pleroma, Pleroma.Web.Endpoint) @@ -1088,7 +1089,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do url = String.replace(api, "{{host}}", host) |> String.replace("{{user}}", user) with {:ok, %{status_code: 200, body: body}} <- - @httpoison.get(url, [], timeout: 300_000, recv_timeout: 300_000), + @httpoison.get(url, [], timeout: timeout, recv_timeout: timeout), {:ok, data} <- Jason.decode(body) do data2 = Enum.slice(data, 0, 40) diff --git a/lib/pleroma/web/nodeinfo/nodeinfo_controller.ex b/lib/pleroma/web/nodeinfo/nodeinfo_controller.ex index e80e63f27..42d322f89 100644 --- a/lib/pleroma/web/nodeinfo/nodeinfo_controller.ex +++ b/lib/pleroma/web/nodeinfo/nodeinfo_controller.ex @@ -45,8 +45,11 @@ defmodule Pleroma.Web.Nodeinfo.NodeinfoController do metadata: %{ nodeName: Keyword.get(instance, :name), mediaProxy: Keyword.get(media_proxy, :enabled), - suggestions: Keyword.get(suggestions, :enabled, false), - suggestionsThirdPartyEngine: Keyword.get(suggestions, :third_party_engine, false) + suggestions: %{ + enabled: Keyword.get(suggestions, :enabled, false), + thirdPartyEngine: Keyword.get(suggestions, :third_party_engine, ""), + timeout: Keyword.get(suggestions, :timeout, 5000) + } } } -- cgit v1.2.3 From 2890aef9e8924a6ddc170034679b7313372b3567 Mon Sep 17 00:00:00 2001 From: William Pitcock Date: Tue, 31 Jul 2018 21:41:18 +0000 Subject: activitypub: add digest header to outbound messages and sign it --- lib/pleroma/web/activity_pub/activity_pub.ex | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index 464832a1e..90a39ce69 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -641,8 +641,14 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do Logger.info("Federating #{id} to #{inbox}") host = URI.parse(inbox).host + digest = "SHA-256=" <> (:crypto.hash(:sha256, json) |> Base.encode64()) + signature = - Pleroma.Web.HTTPSignatures.sign(actor, %{host: host, "content-length": byte_size(json)}) + Pleroma.Web.HTTPSignatures.sign(actor, %{ + host: host, + "content-length": byte_size(json), + digest: digest + }) @httpoison.post( inbox, -- cgit v1.2.3 From 8da406afa2a53f1769e2a1a3a5e99571f30f8dea Mon Sep 17 00:00:00 2001 From: William Pitcock Date: Tue, 31 Jul 2018 23:17:47 +0000 Subject: activitypub: verify remote http signature digests by recomputing the digest and replacing the digest header --- lib/pleroma/plugs/digest.ex | 10 ++++++++++ lib/pleroma/plugs/http_signature.ex | 10 ++++++++++ lib/pleroma/web/endpoint.ex | 3 ++- 3 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 lib/pleroma/plugs/digest.ex (limited to 'lib') diff --git a/lib/pleroma/plugs/digest.ex b/lib/pleroma/plugs/digest.ex new file mode 100644 index 000000000..9d6bbb085 --- /dev/null +++ b/lib/pleroma/plugs/digest.ex @@ -0,0 +1,10 @@ +defmodule Pleroma.Web.Plugs.DigestPlug do + alias Plug.Conn + require Logger + + def read_body(conn, opts) do + {:ok, body, conn} = Conn.read_body(conn, opts) + digest = "SHA-256=" <> (:crypto.hash(:sha256, body) |> Base.encode64()) + {:ok, body, Conn.assign(conn, :digest, digest)} + end +end diff --git a/lib/pleroma/plugs/http_signature.ex b/lib/pleroma/plugs/http_signature.ex index 38bcd3a78..9e53371b7 100644 --- a/lib/pleroma/plugs/http_signature.ex +++ b/lib/pleroma/plugs/http_signature.ex @@ -19,6 +19,8 @@ defmodule Pleroma.Web.Plugs.HTTPSignaturePlug do cond do signature && String.contains?(signature, user) -> + # set (request-target) header to the appropriate value + # we also replace the digest header with the one we computed conn = conn |> put_req_header( @@ -26,6 +28,14 @@ defmodule Pleroma.Web.Plugs.HTTPSignaturePlug do String.downcase("#{conn.method}") <> " #{conn.request_path}" ) + conn = + if conn.assigns[:digest] do + conn + |> put_req_header("digest", conn.assigns[:digest]) + else + conn + end + assign(conn, :valid_signature, HTTPSignatures.validate_conn(conn)) signature -> diff --git a/lib/pleroma/web/endpoint.ex b/lib/pleroma/web/endpoint.ex index 1a012c1b4..cbedca004 100644 --- a/lib/pleroma/web/endpoint.ex +++ b/lib/pleroma/web/endpoint.ex @@ -35,7 +35,8 @@ defmodule Pleroma.Web.Endpoint do parsers: [:urlencoded, :multipart, :json], pass: ["*/*"], json_decoder: Jason, - length: Application.get_env(:pleroma, :instance) |> Keyword.get(:upload_limit) + length: Application.get_env(:pleroma, :instance) |> Keyword.get(:upload_limit), + body_reader: {Pleroma.Web.Plugs.DigestPlug, :read_body, []} ) plug(Plug.MethodOverride) -- cgit v1.2.3 From 3be58ad34ea69b1764245546c4d67a92e4d70328 Mon Sep 17 00:00:00 2001 From: William Pitcock Date: Wed, 1 Aug 2018 10:22:03 +0000 Subject: activitypub: actually send digest header when federating this is needed for backwards compatibility with non-digest pleroma instances --- lib/pleroma/web/activity_pub/activity_pub.ex | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index 90a39ce69..ec605b694 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -653,7 +653,11 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do @httpoison.post( inbox, json, - [{"Content-Type", "application/activity+json"}, {"signature", signature}], + [ + {"Content-Type", "application/activity+json"}, + {"signature", signature}, + {"digest", digest} + ], hackney: [pool: :default] ) end -- cgit v1.2.3 From f72cfada1ad5cf7ca398ceddf4f70b3b192310ca Mon Sep 17 00:00:00 2001 From: Hakaba Hitoyo Date: Thu, 2 Aug 2018 18:03:35 +0900 Subject: add suggestions/web config --- lib/pleroma/web/nodeinfo/nodeinfo_controller.ex | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/pleroma/web/nodeinfo/nodeinfo_controller.ex b/lib/pleroma/web/nodeinfo/nodeinfo_controller.ex index f9a6d9c25..2fab60274 100644 --- a/lib/pleroma/web/nodeinfo/nodeinfo_controller.ex +++ b/lib/pleroma/web/nodeinfo/nodeinfo_controller.ex @@ -50,7 +50,8 @@ defmodule Pleroma.Web.Nodeinfo.NodeinfoController do suggestions: %{ enabled: Keyword.get(suggestions, :enabled, false), thirdPartyEngine: Keyword.get(suggestions, :third_party_engine, ""), - timeout: Keyword.get(suggestions, :timeout, 5000) + timeout: Keyword.get(suggestions, :timeout, 5000), + web: Keyword.get(suggestions, :web, "") } } } -- cgit v1.2.3 From 0ee29994a5506420f9b1c26568ad15a5d7db3d6e Mon Sep 17 00:00:00 2001 From: William Pitcock Date: Sun, 5 Aug 2018 00:35:29 +0000 Subject: formatter: preserve case of hashtags when generating hashtag links, we used the casefolded version that we use in the link URLs, instead of the original version. accordingly, adjust the formatter to use the original text for the links, while keeping the casefolded version for the URLs. --- lib/pleroma/formatter.ex | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/pleroma/formatter.ex b/lib/pleroma/formatter.ex index 0aaf21538..d199c9243 100644 --- a/lib/pleroma/formatter.ex +++ b/lib/pleroma/formatter.ex @@ -244,8 +244,8 @@ defmodule Pleroma.Formatter do subs = subs ++ - Enum.map(tags, fn {_, tag, uuid} -> - url = "" + Enum.map(tags, fn {tag_text, tag, uuid} -> + url = "" {uuid, url} end) -- cgit v1.2.3 From 275c42e4382b47099d6bf70404ab8a97768628b5 Mon Sep 17 00:00:00 2001 From: William Pitcock Date: Sun, 5 Aug 2018 01:10:05 +0000 Subject: user: filter out duplicate follow requests --- lib/pleroma/user.ex | 1 + 1 file changed, 1 insertion(+) (limited to 'lib') diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index df22d29a8..fa0ea171d 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -398,6 +398,7 @@ defmodule Pleroma.User do Enum.map(reqs, fn req -> req.actor end) |> Enum.uniq() |> Enum.map(fn ap_id -> get_by_ap_id(ap_id) end) + |> Enum.filter(fn u -> !following?(u, user) end) {:ok, users} end -- cgit v1.2.3 From c2d1a5e9c4f4ef316a2833914c8f134c00c95b75 Mon Sep 17 00:00:00 2001 From: eal Date: Tue, 7 Aug 2018 21:56:50 +0300 Subject: MastoAPI AccountView: render profile emoji. --- lib/pleroma/web/mastodon_api/views/account_view.ex | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) (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 f33d615cf..cc5261616 100644 --- a/lib/pleroma/web/mastodon_api/views/account_view.ex +++ b/lib/pleroma/web/mastodon_api/views/account_view.ex @@ -14,6 +14,18 @@ defmodule Pleroma.Web.MastodonAPI.AccountView do header = User.banner_url(user) |> MediaProxy.url() user_info = User.user_info(user) + emojis = + (user.info["source_data"]["tag"] || []) + |> Enum.filter(fn %{"type" => t} -> t == "Emoji" end) + |> Enum.map(fn %{"icon" => %{"url" => url}, "name" => name} -> + %{ + "shortcode" => String.trim(name, ":"), + "url" => MediaProxy.url(url), + "static_url" => MediaProxy.url(url), + "visible_in_picker" => false + } + end) + %{ id: to_string(user.id), username: hd(String.split(user.nickname, "@")), @@ -30,7 +42,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountView do avatar_static: image, header: header, header_static: header, - emojis: [], + emojis: emojis, fields: [], source: %{ note: "", -- cgit v1.2.3 From cee63ad3f725a90fdd1a438520c33377cee8ad81 Mon Sep 17 00:00:00 2001 From: eal Date: Wed, 8 Aug 2018 08:38:25 +0300 Subject: TwitterAPI user view: add screen_name_html and description_html. --- lib/pleroma/web/twitter_api/views/user_view.ex | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) (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 9c8460378..30cf266bd 100644 --- a/lib/pleroma/web/twitter_api/views/user_view.ex +++ b/lib/pleroma/web/twitter_api/views/user_view.ex @@ -1,6 +1,7 @@ defmodule Pleroma.Web.TwitterAPI.UserView do use Pleroma.Web, :view alias Pleroma.User + alias Pleroma.Formatter alias Pleroma.Web.CommonAPI.Utils alias Pleroma.Web.MediaProxy @@ -28,9 +29,19 @@ defmodule Pleroma.Web.TwitterAPI.UserView do user_info = User.get_cached_user_info(user) + emoji = + (user.info["source_data"]["tag"] || []) + |> Enum.filter(fn %{"type" => t} -> t == "Emoji" end) + |> Enum.map(fn %{"icon" => %{"url" => url}, "name" => name} -> + {String.trim(name, ":"), url} + end) + + bio = HtmlSanitizeEx.strip_tags(user.bio) + data = %{ "created_at" => user.inserted_at |> Utils.format_naive_asctime(), - "description" => HtmlSanitizeEx.strip_tags(user.bio), + "description" => bio, + "description_html" => bio |> Formatter.emojify(emoji), "favourites_count" => 0, "followers_count" => user_info[:follower_count], "following" => following, @@ -47,6 +58,7 @@ defmodule Pleroma.Web.TwitterAPI.UserView do "delete_others_notice" => !!user.info["is_moderator"] }, "screen_name" => user.nickname, + "screen_name_html" => Formatter.emojify(user.nickname, emoji), "statuses_count" => user_info[:note_count], "statusnet_profile_url" => user.ap_id, "cover_photo" => User.banner_url(user) |> MediaProxy.url(), -- cgit v1.2.3 From ed9738e031e02a9338bedd3a8f3ff73329c101e7 Mon Sep 17 00:00:00 2001 From: eal Date: Wed, 8 Aug 2018 09:24:50 +0300 Subject: Add tests for emoji in user profiles Also use the correct field in TwitterAPI... --- lib/pleroma/web/twitter_api/views/user_view.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (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 30cf266bd..30aaaf1ce 100644 --- a/lib/pleroma/web/twitter_api/views/user_view.ex +++ b/lib/pleroma/web/twitter_api/views/user_view.ex @@ -50,6 +50,7 @@ defmodule Pleroma.Web.TwitterAPI.UserView do "friends_count" => user_info[:following_count], "id" => user.id, "name" => user.name, + "name_html" => Formatter.emojify(user.name, emoji), "profile_image_url" => image, "profile_image_url_https" => image, "profile_image_url_profile_size" => image, @@ -58,7 +59,6 @@ defmodule Pleroma.Web.TwitterAPI.UserView do "delete_others_notice" => !!user.info["is_moderator"] }, "screen_name" => user.nickname, - "screen_name_html" => Formatter.emojify(user.nickname, emoji), "statuses_count" => user_info[:note_count], "statusnet_profile_url" => user.ap_id, "cover_photo" => User.banner_url(user) |> MediaProxy.url(), -- cgit v1.2.3 From 37b802682ce1231f99976538a11c1584d48f47f4 Mon Sep 17 00:00:00 2001 From: eal Date: Thu, 9 Aug 2018 13:07:03 +0300 Subject: HTML-sanitize usernames before emojifying. --- lib/pleroma/web/twitter_api/views/user_view.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (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 30aaaf1ce..7d0f0e703 100644 --- a/lib/pleroma/web/twitter_api/views/user_view.ex +++ b/lib/pleroma/web/twitter_api/views/user_view.ex @@ -50,7 +50,7 @@ defmodule Pleroma.Web.TwitterAPI.UserView do "friends_count" => user_info[:following_count], "id" => user.id, "name" => user.name, - "name_html" => Formatter.emojify(user.name, emoji), + "name_html" => HtmlSanitizeEx.strip_tags(user.name) |> Formatter.emojify(emoji), "profile_image_url" => image, "profile_image_url_https" => image, "profile_image_url_profile_size" => image, -- cgit v1.2.3 From db5cdfa333c80eb9da419956d843ac123835994c Mon Sep 17 00:00:00 2001 From: eal Date: Thu, 9 Aug 2018 20:47:29 +0300 Subject: Remote follow: don't show confusing error if already following --- lib/pleroma/web/twitter_api/controllers/util_controller.ex | 9 +++++++++ 1 file changed, 9 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 47fc79350..24ebdf007 100644 --- a/lib/pleroma/web/twitter_api/controllers/util_controller.ex +++ b/lib/pleroma/web/twitter_api/controllers/util_controller.ex @@ -99,6 +99,10 @@ defmodule Pleroma.Web.TwitterAPI.UtilController do conn |> render("followed.html", %{error: false}) else + # Was already following user + {:error, "Could not follow user:" <> _rest} -> + render(conn, "followed.html", %{error: false}) + _e -> conn |> render("follow_login.html", %{ @@ -117,6 +121,11 @@ defmodule Pleroma.Web.TwitterAPI.UtilController do conn |> render("followed.html", %{error: false}) else + # Was already following user + {:error, "Could not follow user:" <> _rest} -> + conn + |> render("followed.html", %{error: false}) + e -> Logger.debug("Remote follow failed with error #{inspect(e)}") -- cgit v1.2.3 From e7b00f202f717ca3c7ca2d624d6ad7d79f499ac6 Mon Sep 17 00:00:00 2001 From: "trqx@goat.si" Date: Thu, 9 Aug 2018 16:17:45 +0200 Subject: fix gopher server informational messages some gopher clients did not accept those lines due to a missing tab --- lib/pleroma/gopher/server.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/pleroma/gopher/server.ex b/lib/pleroma/gopher/server.ex index f6abcd4d0..4bdd27959 100644 --- a/lib/pleroma/gopher/server.ex +++ b/lib/pleroma/gopher/server.ex @@ -54,7 +54,7 @@ defmodule Pleroma.Gopher.Server.ProtocolHandler do String.split(text, "\r") |> Enum.map(fn text -> - "i#{text}\tfake\(NULL)\t0\r\n" + "i#{text}\tfake\t(NULL)\t0\r\n" end) |> Enum.join("") end -- cgit v1.2.3 From af30f3f648db36338c997c3900a9504a8fca6fd5 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Fri, 10 Aug 2018 18:01:42 +0200 Subject: lib/pleroma/gopher/server.ex: Fix errorneous empty lines --- lib/pleroma/gopher/server.ex | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/pleroma/gopher/server.ex b/lib/pleroma/gopher/server.ex index 4bdd27959..97a1dea77 100644 --- a/lib/pleroma/gopher/server.ex +++ b/lib/pleroma/gopher/server.ex @@ -77,14 +77,14 @@ defmodule Pleroma.Gopher.Server.ProtocolHandler do link("Post ##{activity.id} by #{user.nickname}", "/notices/#{activity.id}") <> info("#{like_count} likes, #{announcement_count} repeats") <> - "\r\n" <> + "i\tfake\t(NULL)\t0\r\n" <> info( HtmlSanitizeEx.strip_tags( String.replace(activity.data["object"]["content"], "
", "\r") ) ) end) - |> Enum.join("\r\n") + |> Enum.join("i\tfake\t(NULL)\t0\r\n") end def response("") do -- cgit v1.2.3 From 1e9d152d608c83c906ed9a4ca2c6a21d644e2728 Mon Sep 17 00:00:00 2001 From: lambda Date: Sun, 12 Aug 2018 11:11:08 +0000 Subject: Update generate_invite_token.ex --- lib/mix/tasks/generate_invite_token.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/mix/tasks/generate_invite_token.ex b/lib/mix/tasks/generate_invite_token.ex index a5f41ef0e..c4daa9a6c 100644 --- a/lib/mix/tasks/generate_invite_token.ex +++ b/lib/mix/tasks/generate_invite_token.ex @@ -1,7 +1,7 @@ defmodule Mix.Tasks.GenerateInviteToken do use Mix.Task - @shortdoc "Generate password reset link for user" + @shortdoc "Generate invite token for user" def run([]) do Mix.Task.run("app.start") -- cgit v1.2.3 From ffd9ad1f0ca745ac592f7ed763aa2250ff84ff08 Mon Sep 17 00:00:00 2001 From: lain Date: Sun, 12 Aug 2018 18:41:33 +0200 Subject: Fix for elixir 1.7. --- lib/pleroma/web/twitter_api/twitter_api.ex | 4 ++-- 1 file changed, 2 insertions(+), 2 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 9d8815ce7..3bc2f350f 100644 --- a/lib/pleroma/web/twitter_api/twitter_api.ex +++ b/lib/pleroma/web/twitter_api/twitter_api.ex @@ -134,8 +134,8 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do } # no need to query DB if registration is open - unless @registrations_open || is_nil(tokenString) do - token = Repo.get_by(UserInviteToken, %{token: tokenString}) + token = unless @registrations_open || is_nil(tokenString) do + Repo.get_by(UserInviteToken, %{token: tokenString}) end cond do -- cgit v1.2.3 From 8c0c93004127f58d1d4f8b3458de66830c30ad29 Mon Sep 17 00:00:00 2001 From: lain Date: Sun, 12 Aug 2018 19:42:21 +0200 Subject: formatting --- lib/pleroma/web/twitter_api/twitter_api.ex | 7 ++++--- 1 file changed, 4 insertions(+), 3 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 3bc2f350f..dbad08e66 100644 --- a/lib/pleroma/web/twitter_api/twitter_api.ex +++ b/lib/pleroma/web/twitter_api/twitter_api.ex @@ -134,9 +134,10 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do } # no need to query DB if registration is open - token = unless @registrations_open || is_nil(tokenString) do - Repo.get_by(UserInviteToken, %{token: tokenString}) - end + token = + unless @registrations_open || is_nil(tokenString) do + Repo.get_by(UserInviteToken, %{token: tokenString}) + end cond do @registrations_open || (!is_nil(token) && !token.used) -> -- cgit v1.2.3 From f446e75577d456e365eedb4e047a586d86e97b7a Mon Sep 17 00:00:00 2001 From: William Pitcock Date: Tue, 14 Aug 2018 17:05:11 +0000 Subject: activitypub: transmogrifier: add necessary translations for kroeg --- lib/pleroma/web/activity_pub/transmogrifier.ex | 27 +++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex index 2ebc526df..e5fb6e033 100644 --- a/lib/pleroma/web/activity_pub/transmogrifier.ex +++ b/lib/pleroma/web/activity_pub/transmogrifier.ex @@ -21,6 +21,10 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do Enum.at(actor, 0) end + def get_actor(%{"actor" => actor}) when is_map(actor) do + actor["id"] + end + def get_actor(%{"actor" => actor_list}) do Enum.find(actor_list, fn %{"type" => type} -> type == "Person" end) |> Map.get("id") @@ -38,6 +42,24 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do |> fix_emoji |> fix_tag |> fix_content_map + |> fix_addressing + end + + def fix_addressing_list(map, field) do + if is_binary(map[field]) do + map + |> Map.put(field, [map[field]]) + else + map + end + end + + def fix_addressing(map) do + map + |> fix_addressing_list("to") + |> fix_addressing_list("cc") + |> fix_addressing_list("bto") + |> fix_addressing_list("bcc") end def fix_actor(%{"attributedTo" => actor} = object) do @@ -143,7 +165,10 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do def handle_incoming(%{"type" => "Create", "object" => %{"type" => objtype} = object} = data) when objtype in ["Article", "Note"] do actor = get_actor(data) - data = Map.put(data, "actor", actor) + + data = + Map.put(data, "actor", actor) + |> fix_addressing with nil <- Activity.get_create_activity_by_object_ap_id(object["id"]), %User{} = user <- User.get_or_fetch_by_ap_id(data["actor"]) do -- cgit v1.2.3