From ab2d063fcb04f241a3147c843a021491f5fc0a55 Mon Sep 17 00:00:00 2001 From: tobi <31960611+tsmethurst@users.noreply.github.com> Date: Wed, 13 Mar 2024 13:53:29 +0100 Subject: [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 * 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 --- internal/processing/workers/fromclientapi.go | 53 ++++++++++++++++++++++++---- 1 file changed, 46 insertions(+), 7 deletions(-) (limited to 'internal/processing/workers/fromclientapi.go') diff --git a/internal/processing/workers/fromclientapi.go b/internal/processing/workers/fromclientapi.go index 05b9acc1f..c7e78fee2 100644 --- a/internal/processing/workers/fromclientapi.go +++ b/internal/processing/workers/fromclientapi.go @@ -39,12 +39,12 @@ import ( // specifically for messages originating // from the client/REST API. type clientAPI struct { - state *state.State - converter *typeutils.Converter - surface *surface - federate *federate - wipeStatus wipeStatus - account *account.Processor + state *state.State + converter *typeutils.Converter + surface *surface + federate *federate + account *account.Processor + utilF *utilF } func (p *Processor) EnqueueClientAPI(cctx context.Context, msgs ...messages.FromClientAPI) { @@ -194,6 +194,15 @@ func (p *Processor) ProcessFromClientAPI(ctx context.Context, cMsg messages.From case ap.ObjectProfile: return p.clientAPI.ReportAccount(ctx, cMsg) } + + // MOVE SOMETHING + case ap.ActivityMove: + switch cMsg.APObjectType { //nolint:gocritic + + // MOVE PROFILE/ACCOUNT + case ap.ObjectProfile, ap.ActorPerson: + return p.clientAPI.MoveAccount(ctx, cMsg) + } } return gtserror.Newf("unhandled: %s %s", cMsg.APActivityType, cMsg.APObjectType) @@ -576,7 +585,7 @@ func (p *clientAPI) DeleteStatus(ctx context.Context, cMsg messages.FromClientAP return gtserror.Newf("db error populating status: %w", err) } - if err := p.wipeStatus(ctx, status, deleteAttachments); err != nil { + if err := p.utilF.wipeStatus(ctx, status, deleteAttachments); err != nil { log.Errorf(ctx, "error wiping status: %v", err) } @@ -641,3 +650,33 @@ func (p *clientAPI) ReportAccount(ctx context.Context, cMsg messages.FromClientA return nil } + +func (p *clientAPI) MoveAccount(ctx context.Context, cMsg messages.FromClientAPI) error { + // Redirect each local follower of + // OriginAccount to follow move target. + p.utilF.redirectFollowers(ctx, cMsg.OriginAccount, cMsg.TargetAccount) + + // At this point, we know OriginAccount has the + // Move set on it. Just make sure it's populated. + if err := p.state.DB.PopulateMove(ctx, cMsg.OriginAccount.Move); err != nil { + return gtserror.Newf("error populating Move: %w", err) + } + + // Now send the Move message out to + // OriginAccount's (remote) followers. + if err := p.federate.MoveAccount(ctx, cMsg.OriginAccount); err != nil { + return gtserror.Newf("error federating account move: %w", err) + } + + // Mark the move attempt as successful. + cMsg.OriginAccount.Move.SucceededAt = cMsg.OriginAccount.Move.AttemptedAt + if err := p.state.DB.UpdateMove( + ctx, + cMsg.OriginAccount.Move, + "succeeded_at", + ); err != nil { + return gtserror.Newf("error marking move as successful: %w", err) + } + + return nil +} -- cgit v1.2.3