Merge branch 'feature/move-activity' into 'develop'
authorlain <lain@soykaf.club>
Mon, 2 Dec 2019 16:26:19 +0000 (16:26 +0000)
committerlain <lain@soykaf.club>
Mon, 2 Dec 2019 16:26:19 +0000 (16:26 +0000)
Support "Move" activity

Closes #1316

See merge request pleroma/pleroma!1883

1  2 
CHANGELOG.md
lib/pleroma/activity.ex
lib/pleroma/following_relationship.ex
lib/pleroma/user.ex
lib/pleroma/web/activity_pub/activity_pub.ex
lib/pleroma/web/mastodon_api/controllers/account_controller.ex
lib/pleroma/web/mastodon_api/views/account_view.ex
lib/pleroma/web/push/impl.ex
test/web/activity_pub/activity_pub_test.exs
test/web/activity_pub/transmogrifier_test.exs
test/web/mastodon_api/views/account_view_test.exs

diff --cc CHANGELOG.md
index e44c892abd87d6c83fc06ccf2f2309b1ce564cba,3d48cd65ae27e2341bae03777f711ede0b4c5580..a06ea211eb9dcf6b401c799c5357d3b8d04a1093
@@@ -61,11 -56,10 +61,12 @@@ The format is based on [Keep a Changelo
  - Mix task to re-count statuses for all users (`mix pleroma.count_statuses`)
  - Mastodon API: Add `exclude_visibilities` parameter to the timeline and notification endpoints
  - Admin API: `/users/:nickname/toggle_activation` endpoint is now deprecated in favor of: `/users/activate`, `/users/deactivate`, both accept `nicknames` array
 -- Admin API: `POST/DELETE /api/pleroma/admin/users/:nickname/permission_group/:permission_group` are deprecated in favor of: `POST/DELETE /api/pleroma/admin/users/permission_group/:permission_group` (both accept `nicknames` array), `DELETE /api/pleroma/admin/users` (`nickname` query param or `nickname` sent in JSON body) is deprecated in favor of: `DELETE /api/pleroma/admin/users` (`nicknames` query array param or `nicknames` sent in JSON body).
 +- Admin API: Multiple endpoints now require `nicknames` array, instead of singe `nickname`:
 +  - `POST/DELETE /api/pleroma/admin/users/:nickname/permission_group/:permission_group` are deprecated in favor of: `POST/DELETE /api/pleroma/admin/users/permission_group/:permission_group`
 +  - `DELETE /api/pleroma/admin/users` (`nickname` query param or `nickname` sent in JSON body) is deprecated in favor of: `DELETE /api/pleroma/admin/users` (`nicknames` query array param or `nicknames` sent in JSON body)
  - Admin API: Add `GET /api/pleroma/admin/relay` endpoint - lists all followed relays
  - Pleroma API: `POST /api/v1/pleroma/conversations/read` to mark all conversations as read
+ - ActivityPub: Support `Move` activities
  - Mastodon API: Add `/api/v1/markers` for managing timeline read markers
  - Mastodon API: Add the `recipients` parameter to `GET /api/v1/conversations`
  - Configuration: `feed` option for user atom feed.
Simple merge
Simple merge
Simple merge
Simple merge
index 30f5dde0cb344830cd355b60edbd6d37d0165e50,71aab92c3b0f2afde4af4f2211b50841ae8b16c1..2677b9e36bbd48b1a700a2dc9f5811f997dc237a
@@@ -1553,21 -1556,66 +1556,81 @@@ defmodule Pleroma.Web.ActivityPub.Activ
        {:ok, follow_info} = ActivityPub.fetch_follow_information_for_user(user)
        assert follow_info.hide_followers == false
        assert follow_info.hide_follows == true
 +    end
 +
 +    test "detects hidden follows/followers for friendica" do
 +      user =
 +        insert(:user,
 +          local: false,
 +          follower_address: "http://localhost:8080/followers/fuser3",
 +          following_address: "http://localhost:8080/following/fuser3"
 +        )
 +
 +      {:ok, follow_info} = ActivityPub.fetch_follow_information_for_user(user)
 +      assert follow_info.hide_followers == true
 +      assert follow_info.follower_count == 296
 +      assert follow_info.following_count == 32
 +      assert follow_info.hide_follows == true
      end
    end
+   describe "Move activity" do
+     test "create" do
+       %{ap_id: old_ap_id} = old_user = insert(:user)
+       %{ap_id: new_ap_id} = new_user = insert(:user, also_known_as: [old_ap_id])
+       follower = insert(:user)
+       follower_move_opted_out = insert(:user, allow_following_move: false)
+       User.follow(follower, old_user)
+       User.follow(follower_move_opted_out, old_user)
+       assert User.following?(follower, old_user)
+       assert User.following?(follower_move_opted_out, old_user)
+       assert {:ok, activity} = ActivityPub.move(old_user, new_user)
+       assert %Activity{
+                actor: ^old_ap_id,
+                data: %{
+                  "actor" => ^old_ap_id,
+                  "object" => ^old_ap_id,
+                  "target" => ^new_ap_id,
+                  "type" => "Move"
+                },
+                local: true
+              } = activity
+       params = %{
+         "op" => "move_following",
+         "origin_id" => old_user.id,
+         "target_id" => new_user.id
+       }
+       assert_enqueued(worker: Pleroma.Workers.BackgroundWorker, args: params)
+       Pleroma.Workers.BackgroundWorker.perform(params, nil)
+       refute User.following?(follower, old_user)
+       assert User.following?(follower, new_user)
+       assert User.following?(follower_move_opted_out, old_user)
+       refute User.following?(follower_move_opted_out, new_user)
+       activity = %Activity{activity | object: nil}
+       assert [%Notification{activity: ^activity}] =
+                Notification.for_user_since(follower, ~N[2019-04-13 11:22:33])
+       assert [%Notification{activity: ^activity}] =
+                Notification.for_user_since(follower_move_opted_out, ~N[2019-04-13 11:22:33])
+     end
+     test "old user must be in the new user's `also_known_as` list" do
+       old_user = insert(:user)
+       new_user = insert(:user)
+       assert {:error, "Target account must have the origin in `alsoKnownAs`"} =
+                ActivityPub.move(old_user, new_user)
+     end
+   end
  end