mirror of
https://github.com/superseriousbusiness/gotosocial
synced 2025-06-05 21:59:39 +02:00
[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:
@@ -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
|
||||
}
|
||||
|
Reference in New Issue
Block a user