summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Felder <feld@feld.me>2024-07-25 11:18:27 -0400
committerMark Felder <feld@feld.me>2024-07-25 11:46:30 -0400
commit1a482a73c3b99f7fdc512b734dd746e9f9cd396d (patch)
treebaccde2c722f4bdff582056f8a7a428ee3109100
parent700c1066801ba1400a32c819fb0e608aa834aa51 (diff)
downloadpleroma-1a482a73c3b99f7fdc512b734dd746e9f9cd396d.tar.gz
pleroma-1a482a73c3b99f7fdc512b734dd746e9f9cd396d.zip
Fix Optimistic Inbox for failed signatures
When signatures fail on incoming activities we put the job into Oban to be processed later instead of doing the user fetching and validation inline which is expensive and increases latency on the incoming POST request. Unfortunately we did not retain the :method, :request_path, and :query_string parameters from the conn so the signature validation and Oban Job would always fail. This was most obvious when Mastodon sends Deletes for users your server has never seen before.
-rw-r--r--changelog.d/optimistic-inbox-sigs.fix1
-rw-r--r--lib/pleroma/web/activity_pub/activity_pub_controller.ex11
-rw-r--r--lib/pleroma/workers/receiver_worker.ex17
3 files changed, 25 insertions, 4 deletions
diff --git a/changelog.d/optimistic-inbox-sigs.fix b/changelog.d/optimistic-inbox-sigs.fix
new file mode 100644
index 000000000..53ffe6b5b
--- /dev/null
+++ b/changelog.d/optimistic-inbox-sigs.fix
@@ -0,0 +1 @@
+Fix Optimistic Inbox for failed signatures
diff --git a/lib/pleroma/web/activity_pub/activity_pub_controller.ex b/lib/pleroma/web/activity_pub/activity_pub_controller.ex
index e6161455d..cdd054e1a 100644
--- a/lib/pleroma/web/activity_pub/activity_pub_controller.ex
+++ b/lib/pleroma/web/activity_pub/activity_pub_controller.ex
@@ -293,8 +293,15 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubController do
json(conn, "ok")
end
- def inbox(%{assigns: %{valid_signature: false}, req_headers: req_headers} = conn, params) do
- Federator.incoming_ap_doc(%{req_headers: req_headers, params: params})
+ def inbox(%{assigns: %{valid_signature: false}} = conn, params) do
+ Federator.incoming_ap_doc(%{
+ method: conn.method,
+ req_headers: conn.req_headers,
+ request_path: conn.request_path,
+ params: params,
+ query_string: conn.query_string
+ })
+
json(conn, "ok")
end
diff --git a/lib/pleroma/workers/receiver_worker.ex b/lib/pleroma/workers/receiver_worker.ex
index d01813c25..1a2881cd1 100644
--- a/lib/pleroma/workers/receiver_worker.ex
+++ b/lib/pleroma/workers/receiver_worker.ex
@@ -12,13 +12,26 @@ defmodule Pleroma.Workers.ReceiverWorker do
@impl Oban.Worker
def perform(%Job{
- args: %{"op" => "incoming_ap_doc", "req_headers" => req_headers, "params" => params}
+ args: %{
+ "op" => "incoming_ap_doc",
+ "method" => method,
+ "params" => params,
+ "req_headers" => req_headers,
+ "request_path" => request_path,
+ "query_string" => query_string
+ }
}) do
# Oban's serialization converts our tuple headers to lists.
# Revert it for the signature validation.
req_headers = Enum.into(req_headers, [], &List.to_tuple(&1))
- conn_data = %{params: params, req_headers: req_headers}
+ conn_data = %{
+ method: method,
+ params: params,
+ req_headers: req_headers,
+ request_path: request_path,
+ query_string: query_string
+ }
with {:ok, %User{} = _actor} <- User.get_or_fetch_by_ap_id(conn_data.params["actor"]),
{:ok, _public_key} <- Signature.refetch_public_key(conn_data),