forked from AkkomaGang/akkoma
constants: add as_public constant and use it everywhere
This commit is contained in:
parent
9d78b3b281
commit
b93498eb52
26 changed files with 104 additions and 89 deletions
|
@ -8,6 +8,7 @@ defmodule Mix.Tasks.Pleroma.Database do
|
||||||
alias Pleroma.Repo
|
alias Pleroma.Repo
|
||||||
alias Pleroma.User
|
alias Pleroma.User
|
||||||
require Logger
|
require Logger
|
||||||
|
require Pleroma.Constants
|
||||||
import Mix.Pleroma
|
import Mix.Pleroma
|
||||||
use Mix.Task
|
use Mix.Task
|
||||||
|
|
||||||
|
@ -99,10 +100,15 @@ def run(["prune_objects" | args]) do
|
||||||
NaiveDateTime.utc_now()
|
NaiveDateTime.utc_now()
|
||||||
|> NaiveDateTime.add(-(deadline * 86_400))
|
|> NaiveDateTime.add(-(deadline * 86_400))
|
||||||
|
|
||||||
public = "https://www.w3.org/ns/activitystreams#Public"
|
|
||||||
|
|
||||||
from(o in Object,
|
from(o in Object,
|
||||||
where: fragment("?->'to' \\? ? OR ?->'cc' \\? ?", o.data, ^public, o.data, ^public),
|
where:
|
||||||
|
fragment(
|
||||||
|
"?->'to' \\? ? OR ?->'cc' \\? ?",
|
||||||
|
o.data,
|
||||||
|
^Pleroma.Constants.as_public(),
|
||||||
|
o.data,
|
||||||
|
^Pleroma.Constants.as_public()
|
||||||
|
),
|
||||||
where: o.inserted_at < ^time_deadline,
|
where: o.inserted_at < ^time_deadline,
|
||||||
where:
|
where:
|
||||||
fragment("split_part(?->>'actor', '/', 3) != ?", o.data, ^Pleroma.Web.Endpoint.host())
|
fragment("split_part(?->>'actor', '/', 3) != ?", o.data, ^Pleroma.Web.Endpoint.host())
|
||||||
|
|
|
@ -9,6 +9,8 @@ defmodule Pleroma.Activity.Search do
|
||||||
alias Pleroma.User
|
alias Pleroma.User
|
||||||
alias Pleroma.Web.ActivityPub.Visibility
|
alias Pleroma.Web.ActivityPub.Visibility
|
||||||
|
|
||||||
|
require Pleroma.Constants
|
||||||
|
|
||||||
import Ecto.Query
|
import Ecto.Query
|
||||||
|
|
||||||
def search(user, search_query, options \\ []) do
|
def search(user, search_query, options \\ []) do
|
||||||
|
@ -39,7 +41,7 @@ def maybe_restrict_author(query, _), do: query
|
||||||
defp restrict_public(q) do
|
defp restrict_public(q) do
|
||||||
from([a, o] in q,
|
from([a, o] in q,
|
||||||
where: fragment("?->>'type' = 'Create'", a.data),
|
where: fragment("?->>'type' = 'Create'", a.data),
|
||||||
where: "https://www.w3.org/ns/activitystreams#Public" in a.recipients
|
where: ^Pleroma.Constants.as_public() in a.recipients
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
9
lib/pleroma/constants.ex
Normal file
9
lib/pleroma/constants.ex
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
# Pleroma: A lightweight social networking server
|
||||||
|
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
|
||||||
|
# SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
|
||||||
|
defmodule Pleroma.Constants do
|
||||||
|
use Const
|
||||||
|
|
||||||
|
const(as_public, do: "https://www.w3.org/ns/activitystreams#Public")
|
||||||
|
end
|
|
@ -23,6 +23,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do
|
||||||
import Pleroma.Web.ActivityPub.Visibility
|
import Pleroma.Web.ActivityPub.Visibility
|
||||||
|
|
||||||
require Logger
|
require Logger
|
||||||
|
require Pleroma.Constants
|
||||||
|
|
||||||
# For Announce activities, we filter the recipients based on following status for any actors
|
# For Announce activities, we filter the recipients based on following status for any actors
|
||||||
# that match actual users. See issue #164 for more information about why this is necessary.
|
# that match actual users. See issue #164 for more information about why this is necessary.
|
||||||
|
@ -207,8 +208,6 @@ def stream_out_participations(%Object{data: %{"context" => context}}, user) do
|
||||||
def stream_out_participations(_, _), do: :noop
|
def stream_out_participations(_, _), do: :noop
|
||||||
|
|
||||||
def stream_out(activity) do
|
def stream_out(activity) do
|
||||||
public = "https://www.w3.org/ns/activitystreams#Public"
|
|
||||||
|
|
||||||
if activity.data["type"] in ["Create", "Announce", "Delete"] do
|
if activity.data["type"] in ["Create", "Announce", "Delete"] do
|
||||||
object = Object.normalize(activity)
|
object = Object.normalize(activity)
|
||||||
# Do not stream out poll replies
|
# Do not stream out poll replies
|
||||||
|
@ -216,7 +215,7 @@ def stream_out(activity) do
|
||||||
Pleroma.Web.Streamer.stream("user", activity)
|
Pleroma.Web.Streamer.stream("user", activity)
|
||||||
Pleroma.Web.Streamer.stream("list", activity)
|
Pleroma.Web.Streamer.stream("list", activity)
|
||||||
|
|
||||||
if Enum.member?(activity.data["to"], public) do
|
if get_visibility(activity) == "public" do
|
||||||
Pleroma.Web.Streamer.stream("public", activity)
|
Pleroma.Web.Streamer.stream("public", activity)
|
||||||
|
|
||||||
if activity.local do
|
if activity.local do
|
||||||
|
@ -238,12 +237,7 @@ def stream_out(activity) do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
# TODO: Write test, replace with visibility test
|
if get_visibility(activity) == "direct",
|
||||||
if !Enum.member?(activity.data["cc"] || [], public) &&
|
|
||||||
!Enum.member?(
|
|
||||||
activity.data["to"],
|
|
||||||
User.get_cached_by_ap_id(activity.data["actor"]).follower_address
|
|
||||||
),
|
|
||||||
do: Pleroma.Web.Streamer.stream("direct", activity)
|
do: Pleroma.Web.Streamer.stream("direct", activity)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -514,7 +508,7 @@ def flag(
|
||||||
end
|
end
|
||||||
|
|
||||||
defp fetch_activities_for_context_query(context, opts) do
|
defp fetch_activities_for_context_query(context, opts) do
|
||||||
public = ["https://www.w3.org/ns/activitystreams#Public"]
|
public = [Pleroma.Constants.as_public()]
|
||||||
|
|
||||||
recipients =
|
recipients =
|
||||||
if opts["user"], do: [opts["user"].ap_id | opts["user"].following] ++ public, else: public
|
if opts["user"], do: [opts["user"].ap_id | opts["user"].following] ++ public, else: public
|
||||||
|
@ -555,7 +549,7 @@ def fetch_latest_activity_id_for_context(context, opts \\ %{}) do
|
||||||
end
|
end
|
||||||
|
|
||||||
def fetch_public_activities(opts \\ %{}) do
|
def fetch_public_activities(opts \\ %{}) do
|
||||||
q = fetch_activities_query(["https://www.w3.org/ns/activitystreams#Public"], opts)
|
q = fetch_activities_query([Pleroma.Constants.as_public()], opts)
|
||||||
|
|
||||||
q
|
q
|
||||||
|> restrict_unlisted()
|
|> restrict_unlisted()
|
||||||
|
@ -646,10 +640,9 @@ defp user_activities_recipients(%{"godmode" => true}) do
|
||||||
|
|
||||||
defp user_activities_recipients(%{"reading_user" => reading_user}) do
|
defp user_activities_recipients(%{"reading_user" => reading_user}) do
|
||||||
if reading_user do
|
if reading_user do
|
||||||
["https://www.w3.org/ns/activitystreams#Public"] ++
|
[Pleroma.Constants.as_public()] ++ [reading_user.ap_id | reading_user.following]
|
||||||
[reading_user.ap_id | reading_user.following]
|
|
||||||
else
|
else
|
||||||
["https://www.w3.org/ns/activitystreams#Public"]
|
[Pleroma.Constants.as_public()]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -834,7 +827,7 @@ defp restrict_unlisted(query) do
|
||||||
fragment(
|
fragment(
|
||||||
"not (coalesce(?->'cc', '{}'::jsonb) \\?| ?)",
|
"not (coalesce(?->'cc', '{}'::jsonb) \\?| ?)",
|
||||||
activity.data,
|
activity.data,
|
||||||
^["https://www.w3.org/ns/activitystreams#Public"]
|
^[Pleroma.Constants.as_public()]
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
@ -971,7 +964,7 @@ def fetch_activities_bounded_query(query, recipients, recipients_with_public) do
|
||||||
where:
|
where:
|
||||||
fragment("? && ?", activity.recipients, ^recipients) or
|
fragment("? && ?", activity.recipients, ^recipients) or
|
||||||
(fragment("? && ?", activity.recipients, ^recipients_with_public) and
|
(fragment("? && ?", activity.recipients, ^recipients_with_public) and
|
||||||
"https://www.w3.org/ns/activitystreams#Public" in activity.recipients)
|
^Pleroma.Constants.as_public() in activity.recipients)
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,9 @@
|
||||||
|
|
||||||
defmodule Pleroma.Web.ActivityPub.MRF.HellthreadPolicy do
|
defmodule Pleroma.Web.ActivityPub.MRF.HellthreadPolicy do
|
||||||
alias Pleroma.User
|
alias Pleroma.User
|
||||||
|
|
||||||
|
require Pleroma.Constants
|
||||||
|
|
||||||
@moduledoc "Block messages with too much mentions (configurable)"
|
@moduledoc "Block messages with too much mentions (configurable)"
|
||||||
|
|
||||||
@behaviour Pleroma.Web.ActivityPub.MRF
|
@behaviour Pleroma.Web.ActivityPub.MRF
|
||||||
|
@ -19,12 +22,12 @@ defp delist_message(message, threshold) when threshold > 0 do
|
||||||
when follower_collection? and recipients > threshold ->
|
when follower_collection? and recipients > threshold ->
|
||||||
message
|
message
|
||||||
|> Map.put("to", [follower_collection])
|
|> Map.put("to", [follower_collection])
|
||||||
|> Map.put("cc", ["https://www.w3.org/ns/activitystreams#Public"])
|
|> Map.put("cc", [Pleroma.Constants.as_public()])
|
||||||
|
|
||||||
{:public, recipients} when recipients > threshold ->
|
{:public, recipients} when recipients > threshold ->
|
||||||
message
|
message
|
||||||
|> Map.put("to", [])
|
|> Map.put("to", [])
|
||||||
|> Map.put("cc", ["https://www.w3.org/ns/activitystreams#Public"])
|
|> Map.put("cc", [Pleroma.Constants.as_public()])
|
||||||
|
|
||||||
_ ->
|
_ ->
|
||||||
message
|
message
|
||||||
|
@ -51,10 +54,10 @@ defp get_recipient_count(message) do
|
||||||
recipients = (message["to"] || []) ++ (message["cc"] || [])
|
recipients = (message["to"] || []) ++ (message["cc"] || [])
|
||||||
follower_collection = User.get_cached_by_ap_id(message["actor"]).follower_address
|
follower_collection = User.get_cached_by_ap_id(message["actor"]).follower_address
|
||||||
|
|
||||||
if Enum.member?(recipients, "https://www.w3.org/ns/activitystreams#Public") do
|
if Enum.member?(recipients, Pleroma.Constants.as_public()) do
|
||||||
recipients =
|
recipients =
|
||||||
recipients
|
recipients
|
||||||
|> List.delete("https://www.w3.org/ns/activitystreams#Public")
|
|> List.delete(Pleroma.Constants.as_public())
|
||||||
|> List.delete(follower_collection)
|
|> List.delete(follower_collection)
|
||||||
|
|
||||||
{:public, length(recipients)}
|
{:public, length(recipients)}
|
||||||
|
|
|
@ -3,6 +3,8 @@
|
||||||
# SPDX-License-Identifier: AGPL-3.0-only
|
# SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
|
||||||
defmodule Pleroma.Web.ActivityPub.MRF.KeywordPolicy do
|
defmodule Pleroma.Web.ActivityPub.MRF.KeywordPolicy do
|
||||||
|
require Pleroma.Constants
|
||||||
|
|
||||||
@moduledoc "Reject or Word-Replace messages with a keyword or regex"
|
@moduledoc "Reject or Word-Replace messages with a keyword or regex"
|
||||||
|
|
||||||
@behaviour Pleroma.Web.ActivityPub.MRF
|
@behaviour Pleroma.Web.ActivityPub.MRF
|
||||||
|
@ -31,12 +33,12 @@ defp check_reject(%{"object" => %{"content" => content, "summary" => summary}} =
|
||||||
defp check_ftl_removal(
|
defp check_ftl_removal(
|
||||||
%{"to" => to, "object" => %{"content" => content, "summary" => summary}} = message
|
%{"to" => to, "object" => %{"content" => content, "summary" => summary}} = message
|
||||||
) do
|
) do
|
||||||
if "https://www.w3.org/ns/activitystreams#Public" in to and
|
if Pleroma.Constants.as_public() in to and
|
||||||
Enum.any?(Pleroma.Config.get([:mrf_keyword, :federated_timeline_removal]), fn pattern ->
|
Enum.any?(Pleroma.Config.get([:mrf_keyword, :federated_timeline_removal]), fn pattern ->
|
||||||
string_matches?(content, pattern) or string_matches?(summary, pattern)
|
string_matches?(content, pattern) or string_matches?(summary, pattern)
|
||||||
end) do
|
end) do
|
||||||
to = List.delete(to, "https://www.w3.org/ns/activitystreams#Public")
|
to = List.delete(to, Pleroma.Constants.as_public())
|
||||||
cc = ["https://www.w3.org/ns/activitystreams#Public" | message["cc"] || []]
|
cc = [Pleroma.Constants.as_public() | message["cc"] || []]
|
||||||
|
|
||||||
message =
|
message =
|
||||||
message
|
message
|
||||||
|
|
|
@ -10,7 +10,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.RejectNonPublic do
|
||||||
|
|
||||||
@behaviour Pleroma.Web.ActivityPub.MRF
|
@behaviour Pleroma.Web.ActivityPub.MRF
|
||||||
|
|
||||||
@public "https://www.w3.org/ns/activitystreams#Public"
|
require Pleroma.Constants
|
||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
def filter(%{"type" => "Create"} = object) do
|
def filter(%{"type" => "Create"} = object) do
|
||||||
|
@ -19,8 +19,8 @@ def filter(%{"type" => "Create"} = object) do
|
||||||
# Determine visibility
|
# Determine visibility
|
||||||
visibility =
|
visibility =
|
||||||
cond do
|
cond do
|
||||||
@public in object["to"] -> "public"
|
Pleroma.Constants.as_public() in object["to"] -> "public"
|
||||||
@public in object["cc"] -> "unlisted"
|
Pleroma.Constants.as_public() in object["cc"] -> "unlisted"
|
||||||
user.follower_address in object["to"] -> "followers"
|
user.follower_address in object["to"] -> "followers"
|
||||||
true -> "direct"
|
true -> "direct"
|
||||||
end
|
end
|
||||||
|
|
|
@ -8,6 +8,8 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicy do
|
||||||
@moduledoc "Filter activities depending on their origin instance"
|
@moduledoc "Filter activities depending on their origin instance"
|
||||||
@behaviour MRF
|
@behaviour MRF
|
||||||
|
|
||||||
|
require Pleroma.Constants
|
||||||
|
|
||||||
defp check_accept(%{host: actor_host} = _actor_info, object) do
|
defp check_accept(%{host: actor_host} = _actor_info, object) do
|
||||||
accepts =
|
accepts =
|
||||||
Pleroma.Config.get([:mrf_simple, :accept])
|
Pleroma.Config.get([:mrf_simple, :accept])
|
||||||
|
@ -89,14 +91,10 @@ defp check_ftl_removal(%{host: actor_host} = _actor_info, object) do
|
||||||
object =
|
object =
|
||||||
with true <- MRF.subdomain_match?(timeline_removal, actor_host),
|
with true <- MRF.subdomain_match?(timeline_removal, actor_host),
|
||||||
user <- User.get_cached_by_ap_id(object["actor"]),
|
user <- User.get_cached_by_ap_id(object["actor"]),
|
||||||
true <- "https://www.w3.org/ns/activitystreams#Public" in object["to"] do
|
true <- Pleroma.Constants.as_public() in object["to"] do
|
||||||
to =
|
to = List.delete(object["to"], Pleroma.Constants.as_public()) ++ [user.follower_address]
|
||||||
List.delete(object["to"], "https://www.w3.org/ns/activitystreams#Public") ++
|
|
||||||
[user.follower_address]
|
|
||||||
|
|
||||||
cc =
|
cc = List.delete(object["cc"], user.follower_address) ++ [Pleroma.Constants.as_public()]
|
||||||
List.delete(object["cc"], user.follower_address) ++
|
|
||||||
["https://www.w3.org/ns/activitystreams#Public"]
|
|
||||||
|
|
||||||
object
|
object
|
||||||
|> Map.put("to", to)
|
|> Map.put("to", to)
|
||||||
|
|
|
@ -19,7 +19,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.TagPolicy do
|
||||||
- `mrf_tag:disable-any-subscription`: Reject any follow requests
|
- `mrf_tag:disable-any-subscription`: Reject any follow requests
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@public "https://www.w3.org/ns/activitystreams#Public"
|
require Pleroma.Constants
|
||||||
|
|
||||||
defp get_tags(%User{tags: tags}) when is_list(tags), do: tags
|
defp get_tags(%User{tags: tags}) when is_list(tags), do: tags
|
||||||
defp get_tags(_), do: []
|
defp get_tags(_), do: []
|
||||||
|
@ -70,9 +70,9 @@ defp process_tag(
|
||||||
) do
|
) do
|
||||||
user = User.get_cached_by_ap_id(actor)
|
user = User.get_cached_by_ap_id(actor)
|
||||||
|
|
||||||
if Enum.member?(to, @public) do
|
if Enum.member?(to, Pleroma.Constants.as_public()) do
|
||||||
to = List.delete(to, @public) ++ [user.follower_address]
|
to = List.delete(to, Pleroma.Constants.as_public()) ++ [user.follower_address]
|
||||||
cc = List.delete(cc, user.follower_address) ++ [@public]
|
cc = List.delete(cc, user.follower_address) ++ [Pleroma.Constants.as_public()]
|
||||||
|
|
||||||
object =
|
object =
|
||||||
object
|
object
|
||||||
|
@ -103,9 +103,10 @@ defp process_tag(
|
||||||
) do
|
) do
|
||||||
user = User.get_cached_by_ap_id(actor)
|
user = User.get_cached_by_ap_id(actor)
|
||||||
|
|
||||||
if Enum.member?(to, @public) or Enum.member?(cc, @public) do
|
if Enum.member?(to, Pleroma.Constants.as_public()) or
|
||||||
to = List.delete(to, @public) ++ [user.follower_address]
|
Enum.member?(cc, Pleroma.Constants.as_public()) do
|
||||||
cc = List.delete(cc, @public)
|
to = List.delete(to, Pleroma.Constants.as_public()) ++ [user.follower_address]
|
||||||
|
cc = List.delete(cc, Pleroma.Constants.as_public())
|
||||||
|
|
||||||
object =
|
object =
|
||||||
object
|
object
|
||||||
|
|
|
@ -11,6 +11,8 @@ defmodule Pleroma.Web.ActivityPub.Publisher do
|
||||||
alias Pleroma.Web.ActivityPub.Relay
|
alias Pleroma.Web.ActivityPub.Relay
|
||||||
alias Pleroma.Web.ActivityPub.Transmogrifier
|
alias Pleroma.Web.ActivityPub.Transmogrifier
|
||||||
|
|
||||||
|
require Pleroma.Constants
|
||||||
|
|
||||||
import Pleroma.Web.ActivityPub.Visibility
|
import Pleroma.Web.ActivityPub.Visibility
|
||||||
|
|
||||||
@behaviour Pleroma.Web.Federator.Publisher
|
@behaviour Pleroma.Web.Federator.Publisher
|
||||||
|
@ -117,8 +119,6 @@ defp get_cc_ap_ids(ap_id, recipients) do
|
||||||
|> Enum.map(& &1.ap_id)
|
|> Enum.map(& &1.ap_id)
|
||||||
end
|
end
|
||||||
|
|
||||||
@as_public "https://www.w3.org/ns/activitystreams#Public"
|
|
||||||
|
|
||||||
defp maybe_use_sharedinbox(%User{info: %{source_data: data}}),
|
defp maybe_use_sharedinbox(%User{info: %{source_data: data}}),
|
||||||
do: (is_map(data["endpoints"]) && Map.get(data["endpoints"], "sharedInbox")) || data["inbox"]
|
do: (is_map(data["endpoints"]) && Map.get(data["endpoints"], "sharedInbox")) || data["inbox"]
|
||||||
|
|
||||||
|
@ -145,7 +145,7 @@ def determine_inbox(
|
||||||
type == "Delete" ->
|
type == "Delete" ->
|
||||||
maybe_use_sharedinbox(user)
|
maybe_use_sharedinbox(user)
|
||||||
|
|
||||||
@as_public in to || @as_public in cc ->
|
Pleroma.Constants.as_public() in to || Pleroma.Constants.as_public() in cc ->
|
||||||
maybe_use_sharedinbox(user)
|
maybe_use_sharedinbox(user)
|
||||||
|
|
||||||
length(to) + length(cc) > 1 ->
|
length(to) + length(cc) > 1 ->
|
||||||
|
|
|
@ -19,6 +19,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
|
||||||
import Ecto.Query
|
import Ecto.Query
|
||||||
|
|
||||||
require Logger
|
require Logger
|
||||||
|
require Pleroma.Constants
|
||||||
|
|
||||||
@doc """
|
@doc """
|
||||||
Modifies an incoming AP object (mastodon format) to our internal format.
|
Modifies an incoming AP object (mastodon format) to our internal format.
|
||||||
|
@ -102,8 +103,7 @@ def fix_explicit_addressing(object) do
|
||||||
|
|
||||||
follower_collection = User.get_cached_by_ap_id(Containment.get_actor(object)).follower_address
|
follower_collection = User.get_cached_by_ap_id(Containment.get_actor(object)).follower_address
|
||||||
|
|
||||||
explicit_mentions =
|
explicit_mentions = explicit_mentions ++ [Pleroma.Constants.as_public(), follower_collection]
|
||||||
explicit_mentions ++ ["https://www.w3.org/ns/activitystreams#Public", follower_collection]
|
|
||||||
|
|
||||||
fix_explicit_addressing(object, explicit_mentions, follower_collection)
|
fix_explicit_addressing(object, explicit_mentions, follower_collection)
|
||||||
end
|
end
|
||||||
|
@ -115,11 +115,11 @@ def fix_implicit_addressing(%{"to" => to, "cc" => cc} = object, followers_collec
|
||||||
|
|
||||||
if followers_collection not in recipients do
|
if followers_collection not in recipients do
|
||||||
cond do
|
cond do
|
||||||
"https://www.w3.org/ns/activitystreams#Public" in cc ->
|
Pleroma.Constants.as_public() in cc ->
|
||||||
to = to ++ [followers_collection]
|
to = to ++ [followers_collection]
|
||||||
Map.put(object, "to", to)
|
Map.put(object, "to", to)
|
||||||
|
|
||||||
"https://www.w3.org/ns/activitystreams#Public" in to ->
|
Pleroma.Constants.as_public() in to ->
|
||||||
cc = cc ++ [followers_collection]
|
cc = cc ++ [followers_collection]
|
||||||
Map.put(object, "cc", cc)
|
Map.put(object, "cc", cc)
|
||||||
|
|
||||||
|
@ -480,8 +480,7 @@ def handle_incoming(
|
||||||
{:ok, %User{} = follower} <- User.get_or_fetch_by_ap_id(follower),
|
{:ok, %User{} = follower} <- User.get_or_fetch_by_ap_id(follower),
|
||||||
{:ok, activity} <- ActivityPub.follow(follower, followed, id, false) do
|
{:ok, activity} <- ActivityPub.follow(follower, followed, id, false) do
|
||||||
with deny_follow_blocked <- Pleroma.Config.get([:user, :deny_follow_blocked]),
|
with deny_follow_blocked <- Pleroma.Config.get([:user, :deny_follow_blocked]),
|
||||||
{_, false} <-
|
{_, false} <- {:user_blocked, User.blocks?(followed, follower) && deny_follow_blocked},
|
||||||
{:user_blocked, User.blocks?(followed, follower) && deny_follow_blocked},
|
|
||||||
{_, false} <- {:user_locked, User.locked?(followed)},
|
{_, false} <- {:user_locked, User.locked?(followed)},
|
||||||
{_, {:ok, follower}} <- {:follow, User.follow(follower, followed)},
|
{_, {:ok, follower}} <- {:follow, User.follow(follower, followed)},
|
||||||
{_, {:ok, _}} <-
|
{_, {:ok, _}} <-
|
||||||
|
|
|
@ -18,6 +18,7 @@ defmodule Pleroma.Web.ActivityPub.Utils do
|
||||||
import Ecto.Query
|
import Ecto.Query
|
||||||
|
|
||||||
require Logger
|
require Logger
|
||||||
|
require Pleroma.Constants
|
||||||
|
|
||||||
@supported_object_types ["Article", "Note", "Video", "Page", "Question", "Answer"]
|
@supported_object_types ["Article", "Note", "Video", "Page", "Question", "Answer"]
|
||||||
@supported_report_states ~w(open closed resolved)
|
@supported_report_states ~w(open closed resolved)
|
||||||
|
@ -418,7 +419,7 @@ def make_follow_data(
|
||||||
"type" => "Follow",
|
"type" => "Follow",
|
||||||
"actor" => follower_id,
|
"actor" => follower_id,
|
||||||
"to" => [followed_id],
|
"to" => [followed_id],
|
||||||
"cc" => ["https://www.w3.org/ns/activitystreams#Public"],
|
"cc" => [Pleroma.Constants.as_public()],
|
||||||
"object" => followed_id,
|
"object" => followed_id,
|
||||||
"state" => "pending"
|
"state" => "pending"
|
||||||
}
|
}
|
||||||
|
@ -510,7 +511,7 @@ def make_announce_data(
|
||||||
"actor" => ap_id,
|
"actor" => ap_id,
|
||||||
"object" => id,
|
"object" => id,
|
||||||
"to" => [user.follower_address, object.data["actor"]],
|
"to" => [user.follower_address, object.data["actor"]],
|
||||||
"cc" => ["https://www.w3.org/ns/activitystreams#Public"],
|
"cc" => [Pleroma.Constants.as_public()],
|
||||||
"context" => object.data["context"]
|
"context" => object.data["context"]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -530,7 +531,7 @@ def make_unannounce_data(
|
||||||
"actor" => ap_id,
|
"actor" => ap_id,
|
||||||
"object" => activity.data,
|
"object" => activity.data,
|
||||||
"to" => [user.follower_address, activity.data["actor"]],
|
"to" => [user.follower_address, activity.data["actor"]],
|
||||||
"cc" => ["https://www.w3.org/ns/activitystreams#Public"],
|
"cc" => [Pleroma.Constants.as_public()],
|
||||||
"context" => context
|
"context" => context
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -547,7 +548,7 @@ def make_unlike_data(
|
||||||
"actor" => ap_id,
|
"actor" => ap_id,
|
||||||
"object" => activity.data,
|
"object" => activity.data,
|
||||||
"to" => [user.follower_address, activity.data["actor"]],
|
"to" => [user.follower_address, activity.data["actor"]],
|
||||||
"cc" => ["https://www.w3.org/ns/activitystreams#Public"],
|
"cc" => [Pleroma.Constants.as_public()],
|
||||||
"context" => context
|
"context" => context
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -556,7 +557,7 @@ def make_unlike_data(
|
||||||
|
|
||||||
def add_announce_to_object(
|
def add_announce_to_object(
|
||||||
%Activity{
|
%Activity{
|
||||||
data: %{"actor" => actor, "cc" => ["https://www.w3.org/ns/activitystreams#Public"]}
|
data: %{"actor" => actor, "cc" => [Pleroma.Constants.as_public()]}
|
||||||
},
|
},
|
||||||
object
|
object
|
||||||
) do
|
) do
|
||||||
|
@ -765,7 +766,7 @@ defp get_updated_targets(
|
||||||
) do
|
) do
|
||||||
cc = Map.get(data, "cc", [])
|
cc = Map.get(data, "cc", [])
|
||||||
follower_address = User.get_cached_by_ap_id(data["actor"]).follower_address
|
follower_address = User.get_cached_by_ap_id(data["actor"]).follower_address
|
||||||
public = "https://www.w3.org/ns/activitystreams#Public"
|
public = Pleroma.Constants.as_public()
|
||||||
|
|
||||||
case visibility do
|
case visibility do
|
||||||
"public" ->
|
"public" ->
|
||||||
|
|
|
@ -8,14 +8,14 @@ defmodule Pleroma.Web.ActivityPub.Visibility do
|
||||||
alias Pleroma.Repo
|
alias Pleroma.Repo
|
||||||
alias Pleroma.User
|
alias Pleroma.User
|
||||||
|
|
||||||
@public "https://www.w3.org/ns/activitystreams#Public"
|
require Pleroma.Constants
|
||||||
|
|
||||||
@spec is_public?(Object.t() | Activity.t() | map()) :: boolean()
|
@spec is_public?(Object.t() | Activity.t() | map()) :: boolean()
|
||||||
def is_public?(%Object{data: %{"type" => "Tombstone"}}), do: false
|
def is_public?(%Object{data: %{"type" => "Tombstone"}}), do: false
|
||||||
def is_public?(%Object{data: data}), do: is_public?(data)
|
def is_public?(%Object{data: data}), do: is_public?(data)
|
||||||
def is_public?(%Activity{data: data}), do: is_public?(data)
|
def is_public?(%Activity{data: data}), do: is_public?(data)
|
||||||
def is_public?(%{"directMessage" => true}), do: false
|
def is_public?(%{"directMessage" => true}), do: false
|
||||||
def is_public?(data), do: @public in (data["to"] ++ (data["cc"] || []))
|
def is_public?(data), do: Pleroma.Constants.as_public() in (data["to"] ++ (data["cc"] || []))
|
||||||
|
|
||||||
def is_private?(activity) do
|
def is_private?(activity) do
|
||||||
with false <- is_public?(activity),
|
with false <- is_public?(activity),
|
||||||
|
@ -73,10 +73,10 @@ def get_visibility(object) do
|
||||||
cc = object.data["cc"] || []
|
cc = object.data["cc"] || []
|
||||||
|
|
||||||
cond do
|
cond do
|
||||||
@public in to ->
|
Pleroma.Constants.as_public() in to ->
|
||||||
"public"
|
"public"
|
||||||
|
|
||||||
@public in cc ->
|
Pleroma.Constants.as_public() in cc ->
|
||||||
"unlisted"
|
"unlisted"
|
||||||
|
|
||||||
# this should use the sql for the object's activity
|
# this should use the sql for the object's activity
|
||||||
|
|
|
@ -21,8 +21,7 @@ def get_user(plug), do: implementation().get_user(plug)
|
||||||
def create_from_registration(plug, registration),
|
def create_from_registration(plug, registration),
|
||||||
do: implementation().create_from_registration(plug, registration)
|
do: implementation().create_from_registration(plug, registration)
|
||||||
|
|
||||||
@callback get_registration(Plug.Conn.t()) ::
|
@callback get_registration(Plug.Conn.t()) :: {:ok, Registration.t()} | {:error, any()}
|
||||||
{:ok, Registration.t()} | {:error, any()}
|
|
||||||
def get_registration(plug), do: implementation().get_registration(plug)
|
def get_registration(plug), do: implementation().get_registration(plug)
|
||||||
|
|
||||||
@callback handle_error(Plug.Conn.t(), any()) :: any()
|
@callback handle_error(Plug.Conn.t(), any()) :: any()
|
||||||
|
|
|
@ -300,8 +300,7 @@ def pin(id_or_ap_id, %{ap_id: user_ap_id} = user) do
|
||||||
}
|
}
|
||||||
} = activity <- get_by_id_or_ap_id(id_or_ap_id),
|
} = activity <- get_by_id_or_ap_id(id_or_ap_id),
|
||||||
true <- Visibility.is_public?(activity),
|
true <- Visibility.is_public?(activity),
|
||||||
%{valid?: true} = info_changeset <-
|
%{valid?: true} = info_changeset <- User.Info.add_pinnned_activity(user.info, activity),
|
||||||
User.Info.add_pinnned_activity(user.info, activity),
|
|
||||||
changeset <-
|
changeset <-
|
||||||
Ecto.Changeset.change(user) |> Ecto.Changeset.put_embed(:info, info_changeset),
|
Ecto.Changeset.change(user) |> Ecto.Changeset.put_embed(:info, info_changeset),
|
||||||
{:ok, _user} <- User.update_and_set_cache(changeset) do
|
{:ok, _user} <- User.update_and_set_cache(changeset) do
|
||||||
|
|
|
@ -19,6 +19,7 @@ defmodule Pleroma.Web.CommonAPI.Utils do
|
||||||
alias Pleroma.Web.MediaProxy
|
alias Pleroma.Web.MediaProxy
|
||||||
|
|
||||||
require Logger
|
require Logger
|
||||||
|
require Pleroma.Constants
|
||||||
|
|
||||||
# This is a hack for twidere.
|
# This is a hack for twidere.
|
||||||
def get_by_id_or_ap_id(id) do
|
def get_by_id_or_ap_id(id) do
|
||||||
|
@ -66,7 +67,7 @@ def attachments_from_ids_descs(ids, descs_str) do
|
||||||
@spec get_to_and_cc(User.t(), list(String.t()), Activity.t() | nil, String.t()) ::
|
@spec get_to_and_cc(User.t(), list(String.t()), Activity.t() | nil, String.t()) ::
|
||||||
{list(String.t()), list(String.t())}
|
{list(String.t()), list(String.t())}
|
||||||
def get_to_and_cc(user, mentioned_users, inReplyTo, "public") do
|
def get_to_and_cc(user, mentioned_users, inReplyTo, "public") do
|
||||||
to = ["https://www.w3.org/ns/activitystreams#Public" | mentioned_users]
|
to = [Pleroma.Constants.as_public() | mentioned_users]
|
||||||
cc = [user.follower_address]
|
cc = [user.follower_address]
|
||||||
|
|
||||||
if inReplyTo do
|
if inReplyTo do
|
||||||
|
@ -78,7 +79,7 @@ def get_to_and_cc(user, mentioned_users, inReplyTo, "public") do
|
||||||
|
|
||||||
def get_to_and_cc(user, mentioned_users, inReplyTo, "unlisted") do
|
def get_to_and_cc(user, mentioned_users, inReplyTo, "unlisted") do
|
||||||
to = [user.follower_address | mentioned_users]
|
to = [user.follower_address | mentioned_users]
|
||||||
cc = ["https://www.w3.org/ns/activitystreams#Public"]
|
cc = [Pleroma.Constants.as_public()]
|
||||||
|
|
||||||
if inReplyTo do
|
if inReplyTo do
|
||||||
{Enum.uniq([inReplyTo.data["actor"] | to]), cc}
|
{Enum.uniq([inReplyTo.data["actor"] | to]), cc}
|
||||||
|
|
|
@ -49,6 +49,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
|
||||||
import Ecto.Query
|
import Ecto.Query
|
||||||
|
|
||||||
require Logger
|
require Logger
|
||||||
|
require Pleroma.Constants
|
||||||
|
|
||||||
@rate_limited_relations_actions ~w(follow unfollow)a
|
@rate_limited_relations_actions ~w(follow unfollow)a
|
||||||
|
|
||||||
|
@ -1224,10 +1225,9 @@ def user_favourites(%{assigns: %{user: for_user}} = conn, %{"id" => id} = params
|
||||||
|
|
||||||
recipients =
|
recipients =
|
||||||
if for_user do
|
if for_user do
|
||||||
["https://www.w3.org/ns/activitystreams#Public"] ++
|
[Pleroma.Constants.as_public()] ++ [for_user.ap_id | for_user.following]
|
||||||
[for_user.ap_id | for_user.following]
|
|
||||||
else
|
else
|
||||||
["https://www.w3.org/ns/activitystreams#Public"]
|
[Pleroma.Constants.as_public()]
|
||||||
end
|
end
|
||||||
|
|
||||||
activities =
|
activities =
|
||||||
|
|
|
@ -365,8 +365,7 @@ def registration_details(%Plug.Conn{} = conn, %{"authorization" => auth_attrs})
|
||||||
def register(%Plug.Conn{} = conn, %{"authorization" => _, "op" => "connect"} = params) do
|
def register(%Plug.Conn{} = conn, %{"authorization" => _, "op" => "connect"} = params) do
|
||||||
with registration_id when not is_nil(registration_id) <- get_session_registration_id(conn),
|
with registration_id when not is_nil(registration_id) <- get_session_registration_id(conn),
|
||||||
%Registration{} = registration <- Repo.get(Registration, registration_id),
|
%Registration{} = registration <- Repo.get(Registration, registration_id),
|
||||||
{_, {:ok, auth}} <-
|
{_, {:ok, auth}} <- {:create_authorization, do_create_authorization(conn, params)},
|
||||||
{:create_authorization, do_create_authorization(conn, params)},
|
|
||||||
%User{} = user <- Repo.preload(auth, :user).user,
|
%User{} = user <- Repo.preload(auth, :user).user,
|
||||||
{:ok, _updated_registration} <- Registration.bind_to_user(registration, user) do
|
{:ok, _updated_registration} <- Registration.bind_to_user(registration, user) do
|
||||||
conn
|
conn
|
||||||
|
|
|
@ -44,8 +44,7 @@ def get_by_refresh_token(%App{id: app_id} = _app, token) do
|
||||||
|> Repo.find_resource()
|
|> Repo.find_resource()
|
||||||
end
|
end
|
||||||
|
|
||||||
@spec exchange_token(App.t(), Authorization.t()) ::
|
@spec exchange_token(App.t(), Authorization.t()) :: {:ok, Token.t()} | {:error, Changeset.t()}
|
||||||
{:ok, Token.t()} | {:error, Changeset.t()}
|
|
||||||
def exchange_token(app, auth) do
|
def exchange_token(app, auth) do
|
||||||
with {:ok, auth} <- Authorization.use_token(auth),
|
with {:ok, auth} <- Authorization.use_token(auth),
|
||||||
true <- auth.app_id == app.id do
|
true <- auth.app_id == app.id do
|
||||||
|
|
|
@ -9,6 +9,7 @@ defmodule Pleroma.Web.OStatus.ActivityRepresenter do
|
||||||
alias Pleroma.Web.OStatus.UserRepresenter
|
alias Pleroma.Web.OStatus.UserRepresenter
|
||||||
|
|
||||||
require Logger
|
require Logger
|
||||||
|
require Pleroma.Constants
|
||||||
|
|
||||||
defp get_href(id) do
|
defp get_href(id) do
|
||||||
with %Object{data: %{"external_url" => external_url}} <- Object.get_cached_by_ap_id(id) do
|
with %Object{data: %{"external_url" => external_url}} <- Object.get_cached_by_ap_id(id) do
|
||||||
|
@ -34,7 +35,7 @@ defp get_mentions(to) do
|
||||||
Enum.map(to, fn id ->
|
Enum.map(to, fn id ->
|
||||||
cond do
|
cond do
|
||||||
# Special handling for the AP/Ostatus public collections
|
# Special handling for the AP/Ostatus public collections
|
||||||
"https://www.w3.org/ns/activitystreams#Public" == id ->
|
Pleroma.Constants.as_public() == id ->
|
||||||
{:link,
|
{:link,
|
||||||
[
|
[
|
||||||
rel: "mentioned",
|
rel: "mentioned",
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
|
|
||||||
defmodule Pleroma.Web.OStatus.NoteHandler do
|
defmodule Pleroma.Web.OStatus.NoteHandler do
|
||||||
require Logger
|
require Logger
|
||||||
|
require Pleroma.Constants
|
||||||
|
|
||||||
alias Pleroma.Activity
|
alias Pleroma.Activity
|
||||||
alias Pleroma.Object
|
alias Pleroma.Object
|
||||||
|
@ -49,7 +50,7 @@ def get_people_mentions(entry) do
|
||||||
def get_collection_mentions(entry) do
|
def get_collection_mentions(entry) do
|
||||||
transmogrify = fn
|
transmogrify = fn
|
||||||
"http://activityschema.org/collection/public" ->
|
"http://activityschema.org/collection/public" ->
|
||||||
"https://www.w3.org/ns/activitystreams#Public"
|
Pleroma.Constants.as_public()
|
||||||
|
|
||||||
group ->
|
group ->
|
||||||
group
|
group
|
||||||
|
@ -126,7 +127,7 @@ def handle_note(entry, doc \\ nil, options \\ []) do
|
||||||
to <- make_to_list(actor, mentions),
|
to <- make_to_list(actor, mentions),
|
||||||
date <- XML.string_from_xpath("//published", entry),
|
date <- XML.string_from_xpath("//published", entry),
|
||||||
unlisted <- XML.string_from_xpath("//mastodon:scope", entry) == "unlisted",
|
unlisted <- XML.string_from_xpath("//mastodon:scope", entry) == "unlisted",
|
||||||
cc <- if(unlisted, do: ["https://www.w3.org/ns/activitystreams#Public"], else: []),
|
cc <- if(unlisted, do: [Pleroma.Constants.as_public()], else: []),
|
||||||
note <-
|
note <-
|
||||||
CommonAPI.Utils.make_note_data(
|
CommonAPI.Utils.make_note_data(
|
||||||
actor.ap_id,
|
actor.ap_id,
|
||||||
|
|
|
@ -19,8 +19,7 @@ defp is_aws_signed_url(nil), do: nil
|
||||||
defp is_aws_signed_url(image) when is_binary(image) do
|
defp is_aws_signed_url(image) when is_binary(image) do
|
||||||
%URI{host: host, query: query} = URI.parse(image)
|
%URI{host: host, query: query} = URI.parse(image)
|
||||||
|
|
||||||
if String.contains?(host, "amazonaws.com") and
|
if String.contains?(host, "amazonaws.com") and String.contains?(query, "X-Amz-Expires") do
|
||||||
String.contains?(query, "X-Amz-Expires") do
|
|
||||||
image
|
image
|
||||||
else
|
else
|
||||||
nil
|
nil
|
||||||
|
|
|
@ -15,6 +15,8 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do
|
||||||
|
|
||||||
import Ecto.Query
|
import Ecto.Query
|
||||||
|
|
||||||
|
require Pleroma.Constants
|
||||||
|
|
||||||
def create_status(%User{} = user, %{"status" => _} = data) do
|
def create_status(%User{} = user, %{"status" => _} = data) do
|
||||||
CommonAPI.post(user, data)
|
CommonAPI.post(user, data)
|
||||||
end
|
end
|
||||||
|
@ -286,7 +288,7 @@ def search(_user, %{"q" => query} = params) do
|
||||||
from(
|
from(
|
||||||
[a, o] in Activity.with_preloaded_object(Activity),
|
[a, o] in Activity.with_preloaded_object(Activity),
|
||||||
where: fragment("?->>'type' = 'Create'", a.data),
|
where: fragment("?->>'type' = 'Create'", a.data),
|
||||||
where: "https://www.w3.org/ns/activitystreams#Public" in a.recipients,
|
where: ^Pleroma.Constants.as_public() in a.recipients,
|
||||||
where:
|
where:
|
||||||
fragment(
|
fragment(
|
||||||
"to_tsvector('english', ?->>'content') @@ plainto_tsquery('english', ?)",
|
"to_tsvector('english', ?->>'content') @@ plainto_tsquery('english', ?)",
|
||||||
|
|
|
@ -19,6 +19,7 @@ defmodule Pleroma.Web.TwitterAPI.ActivityView do
|
||||||
|
|
||||||
import Ecto.Query
|
import Ecto.Query
|
||||||
require Logger
|
require Logger
|
||||||
|
require Pleroma.Constants
|
||||||
|
|
||||||
defp query_context_ids([]), do: []
|
defp query_context_ids([]), do: []
|
||||||
|
|
||||||
|
@ -91,7 +92,7 @@ defp get_user(ap_id, opts) do
|
||||||
String.ends_with?(ap_id, "/followers") ->
|
String.ends_with?(ap_id, "/followers") ->
|
||||||
nil
|
nil
|
||||||
|
|
||||||
ap_id == "https://www.w3.org/ns/activitystreams#Public" ->
|
ap_id == Pleroma.Constants.as_public() ->
|
||||||
nil
|
nil
|
||||||
|
|
||||||
user = User.get_cached_by_ap_id(ap_id) ->
|
user = User.get_cached_by_ap_id(ap_id) ->
|
||||||
|
|
|
@ -10,6 +10,8 @@ defmodule Pleroma.Web.TwitterAPI.NotificationView do
|
||||||
alias Pleroma.Web.TwitterAPI.ActivityView
|
alias Pleroma.Web.TwitterAPI.ActivityView
|
||||||
alias Pleroma.Web.TwitterAPI.UserView
|
alias Pleroma.Web.TwitterAPI.UserView
|
||||||
|
|
||||||
|
require Pleroma.Constants
|
||||||
|
|
||||||
defp get_user(ap_id, opts) do
|
defp get_user(ap_id, opts) do
|
||||||
cond do
|
cond do
|
||||||
user = opts[:users][ap_id] ->
|
user = opts[:users][ap_id] ->
|
||||||
|
@ -18,7 +20,7 @@ defp get_user(ap_id, opts) do
|
||||||
String.ends_with?(ap_id, "/followers") ->
|
String.ends_with?(ap_id, "/followers") ->
|
||||||
nil
|
nil
|
||||||
|
|
||||||
ap_id == "https://www.w3.org/ns/activitystreams#Public" ->
|
ap_id == Pleroma.Constants.as_public() ->
|
||||||
nil
|
nil
|
||||||
|
|
||||||
true ->
|
true ->
|
||||||
|
|
|
@ -124,8 +124,7 @@ test "renders body for follow activity" do
|
||||||
{:ok, _, _, activity} = CommonAPI.follow(user, other_user)
|
{:ok, _, _, activity} = CommonAPI.follow(user, other_user)
|
||||||
object = Object.normalize(activity)
|
object = Object.normalize(activity)
|
||||||
|
|
||||||
assert Impl.format_body(%{activity: activity}, user, object) ==
|
assert Impl.format_body(%{activity: activity}, user, object) == "@Bob has followed you"
|
||||||
"@Bob has followed you"
|
|
||||||
end
|
end
|
||||||
|
|
||||||
test "renders body for announce activity" do
|
test "renders body for announce activity" do
|
||||||
|
@ -156,7 +155,6 @@ test "renders body for like activity" do
|
||||||
{:ok, activity, _} = CommonAPI.favorite(activity.id, user)
|
{:ok, activity, _} = CommonAPI.favorite(activity.id, user)
|
||||||
object = Object.normalize(activity)
|
object = Object.normalize(activity)
|
||||||
|
|
||||||
assert Impl.format_body(%{activity: activity}, user, object) ==
|
assert Impl.format_body(%{activity: activity}, user, object) == "@Bob has favorited your post"
|
||||||
"@Bob has favorited your post"
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue