Function Pleroma.Web.ActivityPub.Transmogrifier.fix_explicit_addressing/3 failed when the "to" field containts nil
Environment
- Pleroma version: 2.0.50-1802-gc2a052a3-v-develop
- Elixir version: Elixir 1.9.4 (compiled with Erlang/OTP 22)
- Operating system: NixOS 20.03
- PostgreSQL version: 12.2
Bug description
There are errors in console related to some inbound requests, causing all these requests to fail:
18:40:27.795 [error] #PID<0.23125.0> running Pleroma.Web.Endpoint (connection #PID<0.23124.0>, stream id 1) terminated
Server: birds.garden:80 (http)
Request: POST /inbox
** (exit) an exception was raised:
** (FunctionClauseError) no function clause matching in Plug.Conn.resp/3
(plug) lib/plug/conn.ex:577: Plug.Conn.resp(%Plug.Conn{adapter: {Plug.Cowboy.Conn, :...},
assigns: %{digest: "SHA-256=…", kind: :error, layout: false, locale: "en", reason:
%FunctionClauseError{args: nil, arity: 2, clauses: nil, function: :ends_with?, kind: nil, module: String},
remote_ip_found: true,
stack: [
{String, :ends_with?, [nil, "/followers"], [file: 'lib/string.ex', line: 2065]},
{Pleroma.Web.ActivityPub.Transmogrifier, :"-fix_explicit_addressing/3-fun-2-", 2, [file: 'lib/pleroma/web/activity_pub/transmogrifier.ex', line: 88]},
{Enum, :reject_list, 2, [file: 'lib/enum.ex', line: 3029]}, {Enum, :reject_list, 2, [file: 'lib/enum.ex', line: 3032]},
{Pleroma.Web.ActivityPub.Transmogrifier, :fix_explicit_addressing, 3, [file: 'lib/pleroma/web/activity_pub/transmogrifier.ex', line: 88]},
{Pleroma.Web.ActivityPub.Transmogrifier, :fix_addressing, 1, [file: 'lib/pleroma/web/activity_pub/transmogrifier.ex', line: 153]},
{Pleroma.Web.ActivityPub.Transmogrifier, :handle_incoming, 2, [file: 'lib/pleroma/web/activity_pub/transmogrifier.ex', line: 451]},
{Pleroma.Object.Fetcher, :fetch_object_from_id, 2, [file: 'lib/pleroma/object/fetcher.ex', line: 72]}
], status: 500, valid_signature: false
}, …
They are caused by a lack of checking for nil. After some diggind it turned out that nil is contained in list "to".
Here is one real example: [nil, "https://www.w3.org/ns/activitystreams#Public", "https://cmpwn.com/users/sir"]
Quick-and-dirty patch:
--- a/lib/pleroma/web/activity_pub/transmogrifier.ex
+++ b/lib/pleroma/web/activity_pub/transmogrifier.ex
@@ -85,7 +85,7 @@ def fix_explicit_addressing(
final_cc =
(cc ++ explicit_cc)
- |> Enum.reject(fn x -> String.ends_with?(x, "/followers") and x != follower_collection end)
+ |> Enum.reject(fn x -> String.ends_with?(x||"", "/followers") and x != follower_collection end)
|> Enum.uniq()
object