From fd6637df4aeed721442bff6dfbce9bdd1b5ac7b8 Mon Sep 17 00:00:00 2001 From: kim <89579420+NyaaaWhatsUpDoc@users.noreply.github.com> Date: Mon, 10 Jun 2024 18:42:41 +0000 Subject: [bugfix] boost and account recursion (#2982) * fix possible infinite recursion if moved accounts are self-referential * adds a defensive check for a boost being a boost of a boost wrapper * add checks on input for a boost of a boost * remove unnecessary check * add protections on account move to prevent move recursion loops * separate status conversion without boost logic into separate function to remove risk of recursion * move boost check to boost function itself * formatting * use error 422 instead of 500 * use gtserror not standard errors package for error creation --- internal/processing/status/boost.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'internal/processing/status/boost.go') diff --git a/internal/processing/status/boost.go b/internal/processing/status/boost.go index 1c1da4ca7..1b410bb0a 100644 --- a/internal/processing/status/boost.go +++ b/internal/processing/status/boost.go @@ -49,6 +49,7 @@ func (p *Processor) BoostCreate( return nil, errWithCode } + // Unwrap target in case it is a boost. target, errWithCode = p.c.UnwrapIfBoost( ctx, requester, @@ -58,7 +59,13 @@ func (p *Processor) BoostCreate( return nil, errWithCode } - // Ensure valid boost target. + // Check is viable target. + if target.BoostOfID != "" { + err := gtserror.Newf("target status %s is boost wrapper", target.URI) + return nil, gtserror.NewErrorUnprocessableEntity(err) + } + + // Ensure valid boost target for requester. boostable, err := p.filter.StatusBoostable(ctx, requester, target, -- cgit v1.2.3