[feature] Process outgoing Move from clientAPI (#2750)

* prevent moved accounts from taking create-type actions

* update move logic

* federate move out

* indicate on web profile when an account has moved

* [docs] Add migration docs section

* lock while checking + setting move state

* use redirectFollowers func for clientAPI as well

* comment typo

* linter? i barely know 'er!

* Update internal/uris/uri.go

Co-authored-by: Daenney <daenney@users.noreply.github.com>

* add a couple tests for move

* fix little mistake exposed by tests (thanks tests)

* ensure Move marked as successful

* attach shared util funcs to struct

* lock whole account when doing move

* move moving check to after error check

* replace repeated text with error func

* linterrrrrr!!!!

* catch self follow case

---------

Co-authored-by: Daenney <daenney@users.noreply.github.com>
This commit is contained in:
tobi
2024-03-13 13:53:29 +01:00
committed by GitHub
parent 13b9fd5f92
commit ab2d063fcb
60 changed files with 1124 additions and 309 deletions

View File

@@ -23,6 +23,7 @@ import (
"github.com/superseriousbusiness/activity/pub"
"github.com/superseriousbusiness/activity/streams"
"github.com/superseriousbusiness/gotosocial/internal/ap"
"github.com/superseriousbusiness/gotosocial/internal/federation"
"github.com/superseriousbusiness/gotosocial/internal/gtserror"
"github.com/superseriousbusiness/gotosocial/internal/gtsmodel"
@@ -954,3 +955,68 @@ func (f *federate) Flag(ctx context.Context, report *gtsmodel.Report) error {
return nil
}
func (f *federate) MoveAccount(ctx context.Context, account *gtsmodel.Account) error {
// Do nothing if it's not our
// account that's been moved.
if !account.IsLocal() {
return nil
}
// Parse relevant URI(s).
outboxIRI, err := parseURI(account.OutboxURI)
if err != nil {
return err
}
// Actor doing the Move.
actorIRI := account.Move.Origin
// Destination Actor of the Move.
targetIRI := account.Move.Target
followersIRI, err := parseURI(account.FollowersURI)
if err != nil {
return err
}
publicIRI, err := parseURI(pub.PublicActivityPubIRI)
if err != nil {
return err
}
// Create a new move.
move := streams.NewActivityStreamsMove()
// Set the Move ID.
if err := ap.SetJSONLDIdStr(move, account.Move.URI); err != nil {
return err
}
// Set the Actor for the Move.
ap.AppendActorIRIs(move, actorIRI)
// Set the account's IRI as the 'object' property.
ap.AppendObjectIRIs(move, actorIRI)
// Set the target's IRI as the 'target' property.
ap.AppendTargetIRIs(move, targetIRI)
// Address the move To followers.
ap.AppendTo(move, followersIRI)
// Address the move CC public.
ap.AppendCc(move, publicIRI)
// Send the Move via the Actor's outbox.
if _, err := f.FederatingActor().Send(
ctx, outboxIRI, move,
); err != nil {
return gtserror.Newf(
"error sending activity %T via outbox %s: %w",
move, outboxIRI, err,
)
}
return nil
}