Merge branch 'develop' of git.pleroma.social:pleroma/pleroma into update-validator
authorlain <lain@soykaf.club>
Tue, 23 Jun 2020 08:17:12 +0000 (10:17 +0200)
committerlain <lain@soykaf.club>
Tue, 23 Jun 2020 08:17:12 +0000 (10:17 +0200)
1  2 
lib/pleroma/web/activity_pub/activity_pub.ex
lib/pleroma/web/activity_pub/transmogrifier.ex
lib/pleroma/web/mastodon_api/controllers/account_controller.ex
test/web/activity_pub/transmogrifier_test.exs

index d4605c5189ebb4988767f4d09844a0a9aacac852,d50e7c5dd839ea3ef23c7a8c15cc424a338ff81d..7a88a847c412f2818eddb863f54df41ac95980b1
@@@ -179,36 -177,19 +179,39 @@@ defmodule Pleroma.Web.MastodonAPI.Accou
        |> Maps.put_if_present(:pleroma_settings_store, params[:pleroma_settings_store])
        |> Maps.put_if_present(:default_scope, params[:default_scope])
        |> Maps.put_if_present(:default_scope, params["source"]["privacy"])
+       |> Maps.put_if_present(:actor_type, params[:bot], fn bot ->
+         if bot, do: {:ok, "Service"}, else: {:ok, "Person"}
+       end)
        |> Maps.put_if_present(:actor_type, params[:actor_type])
  
 -    changeset = User.update_changeset(user, user_params)
 -
 -    with {:ok, user} <- User.update_and_set_cache(changeset) do
 -      user
 -      |> build_update_activity_params()
 -      |> ActivityPub.update()
 -
 -      render(conn, "show.json", user: user, for: user, with_pleroma_settings: true)
 +    # What happens here:
 +    #
 +    # We want to update the user through the pipeline, but the ActivityPub
 +    # update information is not quite enough for this, because this also
 +    # contains local settings that don't federate and don't even appear
 +    # in the Update activity.
 +    #
 +    # So we first build the normal local changeset, then apply it to the
 +    # user data, but don't persist it. With this, we generate the object
 +    # data for our update activity. We feed this and the changeset as meta
 +    # inforation into the pipeline, where they will be properly updated and
 +    # federated.
 +    with changeset <- User.update_changeset(user, user_params),
 +         {:ok, unpersisted_user} <- Ecto.Changeset.apply_action(changeset, :update),
 +         updated_object <-
 +           Pleroma.Web.ActivityPub.UserView.render("user.json", user: user)
 +           |> Map.delete("@context"),
 +         {:ok, update_data, []} <- Builder.update(user, updated_object),
 +         {:ok, _update, _} <-
 +           Pipeline.common_pipeline(update_data,
 +             local: true,
 +             user_update_changeset: changeset
 +           ) do
 +      render(conn, "show.json",
 +        user: unpersisted_user,
 +        for: unpersisted_user,
 +        with_pleroma_settings: true
 +      )
      else
        _e -> render_error(conn, :forbidden, "Invalid request")
      end