- extended runtime module support, see config cheatsheet
- quote posting; quotes are limited to public posts
+### Changed
+- quarantining is now considered absolutely; public activities are no longer
+ an exception.
+
### Fixed
- Updated mastoFE path, for the newer version
key_placeholder: "instance",
value_placeholder: "reason",
description:
- "List of ActivityPub instances where private (DMs, followers-only) activities will not be sent and the reason for doing so",
+ "List of ActivityPub instances where activities will not be sent, and the reason for doing so",
suggestions: [
{"quarantined.com", "Reason"},
{"*.quarantined.com", "Reason"}
* `federation_reachability_timeout_days`: Timeout (in days) of each external federation target being unreachable prior to pausing federating to it.
* `allow_relay`: Permits remote instances to subscribe to all public posts of your instance. This may increase the visibility of your instance.
* `public`: Makes the client API in authenticated mode-only except for user-profiles. Useful for disabling the Local Timeline and The Whole Known Network. Note that there is a dependent setting restricting or allowing unauthenticated access to specific resources, see `restrict_unauthenticated` for more details.
-* `quarantined_instances`: ActivityPub instances where private (DMs, followers-only) activities will not be send.
+* `quarantined_instances`: ActivityPub instances where activities will not be sent. They can still reach there via other means, we just won't send them.
* `allowed_post_formats`: MIME-type list of formats allowed to be posted (transformed into HTML).
* `extended_nickname_format`: Set to `true` to use extended local nicknames format (allows underscores/dashes). This will break federation with
older software for theses nicknames.
end
end
- defp should_federate?(inbox, public) do
- if public do
- true
- else
- %{host: host} = URI.parse(inbox)
+ defp should_federate?(inbox) do
+ %{host: host} = URI.parse(inbox)
- quarantined_instances =
- Config.get([:instance, :quarantined_instances], [])
- |> Pleroma.Web.ActivityPub.MRF.instance_list_from_tuples()
- |> Pleroma.Web.ActivityPub.MRF.subdomains_regex()
+ quarantined_instances =
+ Config.get([:instance, :quarantined_instances], [])
+ |> Pleroma.Web.ActivityPub.MRF.instance_list_from_tuples()
+ |> Pleroma.Web.ActivityPub.MRF.subdomains_regex()
- !Pleroma.Web.ActivityPub.MRF.subdomain_match?(quarantined_instances, host)
- end
+ !Pleroma.Web.ActivityPub.MRF.subdomain_match?(quarantined_instances, host)
end
@spec recipients(User.t(), Activity.t()) :: list(User.t()) | []
def publish(%User{} = actor, %{data: %{"bcc" => bcc}} = activity)
when is_list(bcc) and bcc != [] do
- public = is_public?(activity)
{:ok, data} = Transmogrifier.prepare_outgoing(activity.data)
recipients = recipients(actor, activity)
recipients
|> Enum.filter(&User.ap_enabled?/1)
|> Enum.map(fn actor -> actor.inbox end)
- |> Enum.filter(fn inbox -> should_federate?(inbox, public) end)
+ |> Enum.filter(fn inbox -> should_federate?(inbox) end)
|> Instances.filter_reachable()
Repo.checkout(fn ->
determine_inbox(activity, user)
end)
|> Enum.uniq()
- |> Enum.filter(fn inbox -> should_federate?(inbox, public) end)
+ |> Enum.filter(fn inbox -> should_federate?(inbox) end)
|> Instances.filter_reachable()
|> Enum.each(fn {inbox, unreachable_since} ->
Pleroma.Web.Federator.Publisher.enqueue_one(
:ok
end
- setup_all do: clear_config([:instance, :federating], true)
+ setup_all do
+ clear_config([:instance, :federating], true)
+ clear_config([:instance, :quarantined_instances], [])
+ end
describe "gather_webfinger_links/1" do
test "it returns links" do
end
describe "publish/2" do
- test_with_mock "doesn't publish a non-public activity to quarantined instances.",
+ test_with_mock "doesn't publish any activity to quarantined instances.",
Pleroma.Web.Federator.Publisher,
[:passthrough],
[] do
recipients: [follower.ap_id]
)
+ public_note_activity =
+ insert(:note_activity,
+ user: actor,
+ recipients: [follower.ap_id, @as_public]
+ )
+
res = Publisher.publish(actor, note_activity)
assert res == :ok
+ :ok = Publisher.publish(actor, public_note_activity)
+
assert not called(
Pleroma.Web.Federator.Publisher.enqueue_one(Publisher, %{
inbox: "https://domain.com/users/nick1/inbox",
id: note_activity.data["id"]
})
)
+
+ assert not called(
+ Pleroma.Web.Federator.Publisher.enqueue_one(Publisher, %{
+ inbox: "https://domain.com/users/nick1/inbox",
+ actor_id: actor.id,
+ id: public_note_activity.data["id"]
+ })
+ )
end
test_with_mock "Publishes a non-public activity to non-quarantined instances.",
Pleroma.Web.Federator.Publisher,
[:passthrough],
[] do
+ Config.put([:instance, :quarantined_instances], [])
+
follower =
insert(:user, %{
local: false,
Pleroma.Web.Federator.Publisher,
[:passthrough],
[] do
+ clear_config([:instance, :quarantined_instances], [])
+
fetcher =
insert(:user,
local: false,