aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsxsdv1 <sxsdv1@gmail.com>2018-12-29 18:21:45 +0100
committersxsdv1 <sxsdv1@gmail.com>2018-12-30 12:01:39 +0100
commit569bad821006add1719123f6e2830f23542921d2 (patch)
treec221080fd786f84284e28cf76bf778a06eed51b2
parent26dc2dddab6103a3e6e44a3c7ba097283302fc2a (diff)
downloadpleroma-569bad821006add1719123f6e2830f23542921d2.tar.gz
Create activity when client posts to outbox
-rw-r--r--lib/pleroma/web/activity_pub/activity_pub_controller.ex35
-rw-r--r--test/web/activity_pub/activity_pub_controller_test.exs14
2 files changed, 43 insertions, 6 deletions
diff --git a/lib/pleroma/web/activity_pub/activity_pub_controller.ex b/lib/pleroma/web/activity_pub/activity_pub_controller.ex
index 9f083d0a5..dca74db73 100644
--- a/lib/pleroma/web/activity_pub/activity_pub_controller.ex
+++ b/lib/pleroma/web/activity_pub/activity_pub_controller.ex
@@ -4,11 +4,12 @@
defmodule Pleroma.Web.ActivityPub.ActivityPubController do
use Pleroma.Web, :controller
- alias Pleroma.{User, Object}
+ alias Pleroma.{Activity, User, Object}
alias Pleroma.Web.ActivityPub.{ObjectView, UserView}
alias Pleroma.Web.ActivityPub.ActivityPub
alias Pleroma.Web.ActivityPub.Relay
alias Pleroma.Web.ActivityPub.Utils
+ alias Pleroma.Web.ActivityPub.Transmogrifier
alias Pleroma.Web.Federator
require Logger
@@ -166,11 +167,33 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubController do
def update_outbox(%{assigns: %{user: user}} = conn, %{"nickname" => nickname} = params) do
if nickname == user.nickname do
- Logger.info("update outbox #{inspect(params)}")
-
- conn
- |> put_status(:created)
- |> json("ok!")
+ actor = user.ap_id()
+
+ params =
+ params
+ |> Map.drop(["id"])
+ |> Map.put("actor", actor)
+ |> Transmogrifier.fix_addressing()
+
+ object =
+ params["object"]
+ |> Map.merge(Map.take(params, ["to", "cc"]))
+ |> Map.put("attributedTo", actor)
+ |> Transmogrifier.fix_object()
+
+ with {:ok, %Activity{} = activity} <-
+ ActivityPub.create(%{
+ to: params["to"],
+ actor: user,
+ context: object["context"],
+ object: object,
+ additional: Map.take(params, ["cc"])
+ }) do
+ conn
+ |> put_status(:created)
+ |> put_resp_header("location", activity.data["id"])
+ |> json(%{"id" => activity.data["id"]})
+ end
else
conn
|> put_status(:forbidden)
diff --git a/test/web/activity_pub/activity_pub_controller_test.exs b/test/web/activity_pub/activity_pub_controller_test.exs
index 589645dd6..cb95e0e09 100644
--- a/test/web/activity_pub/activity_pub_controller_test.exs
+++ b/test/web/activity_pub/activity_pub_controller_test.exs
@@ -178,6 +178,20 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do
assert json_response(conn, 403)
end
+
+ test "it inserts an incoming activity into the database", %{conn: conn} do
+ data = File.read!("test/fixtures/activitypub-client-post-activity.json") |> Poison.decode!()
+ user = insert(:user)
+
+ conn =
+ conn
+ |> assign(:user, user)
+ |> put_req_header("content-type", "application/activity+json")
+ |> post("/users/#{user.nickname}/outbox", data)
+
+ result = json_response(conn, 201)
+ assert Activity.get_by_ap_id(result["id"])
+ end
end
describe "/users/:nickname/followers" do