From 4a178b3d6589bbb9ab08e8a768cc0a3a5d5e9629 Mon Sep 17 00:00:00 2001 From: William Pitcock Date: Sat, 14 Apr 2018 09:20:18 +0000 Subject: ActivityPub: implement MRF core hook and baseline noop policy object --- lib/pleroma/web/activity_pub/activity_pub.ex | 6 +++++- lib/pleroma/web/activity_pub/mrf/drop_policy.ex | 8 ++++++++ lib/pleroma/web/activity_pub/mrf/noop_policy.ex | 5 +++++ 3 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 lib/pleroma/web/activity_pub/mrf/drop_policy.ex create mode 100644 lib/pleroma/web/activity_pub/mrf/noop_policy.ex (limited to 'lib') diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index 04b50c1cc..bfb0e04be 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -10,6 +10,9 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do @httpoison Application.get_env(:pleroma, :httpoison) + @instance Application.get_env(:pleroma, :instance) + @rewrite_policy Keyword.get(@instance, :rewrite_policy) + def get_recipients(data) do (data["to"] || []) ++ (data["cc"] || []) end @@ -17,7 +20,8 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do def insert(map, local \\ true) when is_map(map) do with nil <- Activity.get_by_ap_id(map["id"]), map <- lazy_put_activity_defaults(map), - :ok <- insert_full_object(map) do + :ok <- insert_full_object(map), + {:ok, map} <- @rewrite_policy.filter(map) do {:ok, activity} = Repo.insert(%Activity{ data: map, diff --git a/lib/pleroma/web/activity_pub/mrf/drop_policy.ex b/lib/pleroma/web/activity_pub/mrf/drop_policy.ex new file mode 100644 index 000000000..4333bca28 --- /dev/null +++ b/lib/pleroma/web/activity_pub/mrf/drop_policy.ex @@ -0,0 +1,8 @@ +defmodule Pleroma.Web.ActivityPub.MRF.DropPolicy do + require Logger + + def filter(object) do + Logger.info("REJECTING #{inspect(object)}") + {:reject, object} + end +end diff --git a/lib/pleroma/web/activity_pub/mrf/noop_policy.ex b/lib/pleroma/web/activity_pub/mrf/noop_policy.ex new file mode 100644 index 000000000..9dd3acb04 --- /dev/null +++ b/lib/pleroma/web/activity_pub/mrf/noop_policy.ex @@ -0,0 +1,5 @@ +defmodule Pleroma.Web.ActivityPub.MRF.NoOpPolicy do + def filter(object) do + {:ok, object} + end +end -- cgit v1.2.3 From d24ddd9fb9fb5254b2e80cbe70ba9bc83f2cd0da Mon Sep 17 00:00:00 2001 From: William Pitcock Date: Sat, 14 Apr 2018 11:31:12 +0000 Subject: ActivityPub MRF: implement the SimplePolicy policy --- lib/pleroma/web/activity_pub/mrf/simple_policy.ex | 65 +++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 lib/pleroma/web/activity_pub/mrf/simple_policy.ex (limited to 'lib') diff --git a/lib/pleroma/web/activity_pub/mrf/simple_policy.ex b/lib/pleroma/web/activity_pub/mrf/simple_policy.ex new file mode 100644 index 000000000..1322744f1 --- /dev/null +++ b/lib/pleroma/web/activity_pub/mrf/simple_policy.ex @@ -0,0 +1,65 @@ +defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicy do + alias Pleroma.User + + @mrf_policy Application.get_env(:pleroma, :mrf_simple) + + @reject Keyword.get(@mrf_policy, :reject) + defp check_reject(actor_info, object) do + if actor_info.host in @reject do + {:reject, nil} + else + {:ok, object} + end + end + + @media_removal Keyword.get(@mrf_policy, :media_removal) + defp check_media_removal(actor_info, object) do + if actor_info.host in @media_removal do + object = Map.delete(object, "attachments") + end + + {:ok, object} + end + + @media_nsfw Keyword.get(@mrf_policy, :media_nsfw) + defp check_media_nsfw(actor_info, object) do + if actor_info.host in @media_nsfw and object["attachment"] != nil and length(object["attachment"]) > 0 do + tags = (object["tag"] || []) ++ ["nsfw"] + object = Map.put(object, "tags", tags) + object = Map.put(object, "sensitive", true) + end + + {:ok, object} + end + + @ftl_removal Keyword.get(@mrf_policy, :federated_timeline_removal) + defp check_ftl_removal(actor_info, object) do + if actor_info.host in @ftl_removal do + user = User.get_by_ap_id(object["actor"]) + + # flip to/cc relationship to make the post unlisted + if "https://www.w3.org/ns/activitystreams#Public" in object["to"] and user.follower_address in object["cc"] do + to = List.delete(object["to"], "https://www.w3.org/ns/activitystreams#Public") ++ [user.follower_address] + cc = List.delete(object["cc"], user.follower_address) ++ ["https://www.w3.org/ns/activitystreams#Public"] + + object = Map.put(object, "to", to) + object = Map.put(object, "cc", cc) + end + end + + {:ok, object} + end + + def filter(object) do + actor_info = URI.parse(object["actor"]) + + with {:ok, object} <- check_reject(actor_info, object), + {:ok, object} <- check_media_removal(actor_info, object), + {:ok, object} <- check_media_nsfw(actor_info, object), + {:ok, object} <- check_ftl_removal(actor_info, object) do + {:ok, object} + else + e -> {:reject, nil} + end + end +end -- cgit v1.2.3 From f08f9d449811d7a67b5c901889b0fef2e9ab8da9 Mon Sep 17 00:00:00 2001 From: "nenolod@dereferenced.org" Date: Thu, 19 Apr 2018 12:29:35 +0000 Subject: ActivityPub MRF: fix nsfw tagging of objects with attachments by looking at the right object (the child in this case) --- lib/pleroma/web/activity_pub/mrf/simple_policy.ex | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (limited to 'lib') diff --git a/lib/pleroma/web/activity_pub/mrf/simple_policy.ex b/lib/pleroma/web/activity_pub/mrf/simple_policy.ex index 1322744f1..cb8eaf1ec 100644 --- a/lib/pleroma/web/activity_pub/mrf/simple_policy.ex +++ b/lib/pleroma/web/activity_pub/mrf/simple_policy.ex @@ -23,10 +23,12 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicy do @media_nsfw Keyword.get(@mrf_policy, :media_nsfw) defp check_media_nsfw(actor_info, object) do - if actor_info.host in @media_nsfw and object["attachment"] != nil and length(object["attachment"]) > 0 do - tags = (object["tag"] || []) ++ ["nsfw"] - object = Map.put(object, "tags", tags) - object = Map.put(object, "sensitive", true) + child_object = object["object"] + if actor_info.host in @media_nsfw and child_object["attachment"] != nil and length(child_object["attachment"]) > 0 do + tags = (child_object["tag"] || []) ++ ["nsfw"] + child_object = Map.put(child_object, "tags", tags) + child_object = Map.put(child_object, "sensitive", true) + object = Map.put(object, "object", child_object) end {:ok, object} -- cgit v1.2.3 From 9972678a68605d24373f785f783d0fe60f77afdc Mon Sep 17 00:00:00 2001 From: Dashie Date: Tue, 24 Apr 2018 11:34:18 +0200 Subject: Add User.decrease_note_count and call it from ActivityPub.delete --- lib/pleroma/user.ex | 10 ++++++++++ lib/pleroma/web/activity_pub/activity_pub.ex | 3 ++- 2 files changed, 12 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index c77fd6816..0bc7dcab0 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -322,6 +322,16 @@ defmodule Pleroma.User do update_and_set_cache(cs) end + def decrease_note_count(%User{} = user) do + note_count = (user.info["note_count"] || 0) + note_count = if note_count <= 0, do: 0, else: note_count - 1 + new_info = Map.put(user.info, "note_count", note_count) + + cs = info_changeset(user, %{info: new_info}) + + update_and_set_cache(cs) + end + def update_note_count(%User{} = user) do note_count_query = from( diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index d071135c4..448ea8752 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -172,7 +172,8 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do with Repo.delete(object), Repo.delete_all(Activity.all_non_create_by_object_ap_id_q(id)), {:ok, activity} <- insert(data, local), - :ok <- maybe_federate(activity) do + :ok <- maybe_federate(activity), + {:ok, actor} <- User.decrease_note_count(user) do {:ok, activity} end end -- cgit v1.2.3 From afe892ddac566d05e45446127f276d84d431bbb2 Mon Sep 17 00:00:00 2001 From: Dashie Date: Tue, 24 Apr 2018 14:12:23 +0200 Subject: Correct syntax with mix format --- 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 0bc7dcab0..e9196ae03 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -323,7 +323,7 @@ defmodule Pleroma.User do end def decrease_note_count(%User{} = user) do - note_count = (user.info["note_count"] || 0) + note_count = user.info["note_count"] || 0 note_count = if note_count <= 0, do: 0, else: note_count - 1 new_info = Map.put(user.info, "note_count", note_count) -- cgit v1.2.3 From c78e7d8b1159b5f36c4776d00f5e4b86a73d3ef5 Mon Sep 17 00:00:00 2001 From: lain Date: Tue, 24 Apr 2018 21:25:31 +0200 Subject: Fix formatting. --- lib/pleroma/web/activity_pub/mrf/simple_policy.ex | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) (limited to 'lib') diff --git a/lib/pleroma/web/activity_pub/mrf/simple_policy.ex b/lib/pleroma/web/activity_pub/mrf/simple_policy.ex index cb8eaf1ec..4dfb0c867 100644 --- a/lib/pleroma/web/activity_pub/mrf/simple_policy.ex +++ b/lib/pleroma/web/activity_pub/mrf/simple_policy.ex @@ -24,7 +24,9 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicy do @media_nsfw Keyword.get(@mrf_policy, :media_nsfw) defp check_media_nsfw(actor_info, object) do child_object = object["object"] - if actor_info.host in @media_nsfw and child_object["attachment"] != nil and length(child_object["attachment"]) > 0 do + + if actor_info.host in @media_nsfw and child_object["attachment"] != nil and + length(child_object["attachment"]) > 0 do tags = (child_object["tag"] || []) ++ ["nsfw"] child_object = Map.put(child_object, "tags", tags) child_object = Map.put(child_object, "sensitive", true) @@ -40,9 +42,15 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicy do user = User.get_by_ap_id(object["actor"]) # flip to/cc relationship to make the post unlisted - if "https://www.w3.org/ns/activitystreams#Public" in object["to"] and user.follower_address in object["cc"] do - to = List.delete(object["to"], "https://www.w3.org/ns/activitystreams#Public") ++ [user.follower_address] - cc = List.delete(object["cc"], user.follower_address) ++ ["https://www.w3.org/ns/activitystreams#Public"] + if "https://www.w3.org/ns/activitystreams#Public" in object["to"] and + user.follower_address in object["cc"] do + to = + List.delete(object["to"], "https://www.w3.org/ns/activitystreams#Public") ++ + [user.follower_address] + + cc = + List.delete(object["cc"], user.follower_address) ++ + ["https://www.w3.org/ns/activitystreams#Public"] object = Map.put(object, "to", to) object = Map.put(object, "cc", cc) -- cgit v1.2.3 From 715c90e54fe57b38124c224e8464b8effeba258a Mon Sep 17 00:00:00 2001 From: Normandy Date: Tue, 24 Apr 2018 21:58:45 +0000 Subject: Fix typo in MastoFE login page. see https://git.pleroma.social/pleroma/mastofe/issues/13 --- lib/pleroma/web/templates/mastodon_api/mastodon/login.html.eex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/pleroma/web/templates/mastodon_api/mastodon/login.html.eex b/lib/pleroma/web/templates/mastodon_api/mastodon/login.html.eex index 2bb54977e..34cd7ed89 100644 --- a/lib/pleroma/web/templates/mastodon_api/mastodon/login.html.eex +++ b/lib/pleroma/web/templates/mastodon_api/mastodon/login.html.eex @@ -1,4 +1,4 @@ -

Login in to Mastodon Frontend

+

Login to Mastodon Frontend

<%= if @error do %>

<%= @error %>

<% end %> -- cgit v1.2.3 From 279b1d19f0bf90b76f37256ef20993f821e3024f Mon Sep 17 00:00:00 2001 From: lain Date: Wed, 25 Apr 2018 15:41:59 +0200 Subject: Align local bio limits to remote limit. --- 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 e9196ae03..207674999 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -104,7 +104,7 @@ defmodule Pleroma.User do |> cast(params, [:bio, :name]) |> unique_constraint(:nickname) |> validate_format(:nickname, ~r/^[a-zA-Z\d]+$/) - |> validate_length(:bio, max: 1000) + |> validate_length(:bio, max: 5000) |> validate_length(:name, min: 1, max: 100) end -- cgit v1.2.3 From a7eb148d6100d20e19a33cb1c1132657b8a9ada1 Mon Sep 17 00:00:00 2001 From: lain Date: Wed, 25 Apr 2018 16:10:18 +0200 Subject: Optionally deactivate public timelines. --- lib/pleroma/web/router.ex | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) (limited to 'lib') diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index 8f63fdc70..cecf5527c 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -5,6 +5,8 @@ defmodule Pleroma.Web.Router do @instance Application.get_env(:pleroma, :instance) @federating Keyword.get(@instance, :federating) + @public Keyword.get(@instance, :public) + @registrations_open Keyword.get(@instance, :registrations_open) def user_fetcher(username) do {:ok, Repo.get_by(User, %{nickname: username})} @@ -160,21 +162,9 @@ defmodule Pleroma.Web.Router do get("/statusnet/version", TwitterAPI.UtilController, :version) end - @instance Application.get_env(:pleroma, :instance) - @registrations_open Keyword.get(@instance, :registrations_open) - scope "/api", Pleroma.Web do pipe_through(:api) - get("/statuses/public_timeline", TwitterAPI.Controller, :public_timeline) - - get( - "/statuses/public_and_external_timeline", - TwitterAPI.Controller, - :public_and_external_timeline - ) - - get("/statuses/networkpublic_timeline", TwitterAPI.Controller, :public_and_external_timeline) get("/statuses/user_timeline", TwitterAPI.Controller, :user_timeline) get("/qvitter/statuses/user_timeline", TwitterAPI.Controller, :user_timeline) get("/users/show", TwitterAPI.Controller, :show_user) @@ -192,6 +182,24 @@ defmodule Pleroma.Web.Router do get("/statusnet/tags/timeline/:tag", TwitterAPI.Controller, :public_and_external_timeline) end + scope "/api", Pleroma.Web do + if @public do + pipe_through(:api) + else + pipe_through(:authenticated_api) + end + + get("/statuses/public_timeline", TwitterAPI.Controller, :public_timeline) + + get( + "/statuses/public_and_external_timeline", + TwitterAPI.Controller, + :public_and_external_timeline + ) + + get("/statuses/networkpublic_timeline", TwitterAPI.Controller, :public_and_external_timeline) + end + scope "/api", Pleroma.Web do pipe_through(:authenticated_api) -- cgit v1.2.3 From 90bbd946145ad5d622044fea396b7d5d4a14f575 Mon Sep 17 00:00:00 2001 From: William Pitcock Date: Wed, 25 Apr 2018 21:25:56 +0000 Subject: ActivityPub MRF SimplePolicy: fix media stripping --- lib/pleroma/web/activity_pub/mrf/simple_policy.ex | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/pleroma/web/activity_pub/mrf/simple_policy.ex b/lib/pleroma/web/activity_pub/mrf/simple_policy.ex index 4dfb0c867..ea1af0f4d 100644 --- a/lib/pleroma/web/activity_pub/mrf/simple_policy.ex +++ b/lib/pleroma/web/activity_pub/mrf/simple_policy.ex @@ -15,7 +15,8 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicy do @media_removal Keyword.get(@mrf_policy, :media_removal) defp check_media_removal(actor_info, object) do if actor_info.host in @media_removal do - object = Map.delete(object, "attachments") + child_object = Map.delete(object["object"], "attachment") + object = Map.put(object, "object", child_object) end {:ok, object} -- cgit v1.2.3