mirror of
https://github.com/superseriousbusiness/gotosocial.git
synced 2025-10-29 14:52:26 -05:00
[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
This commit is contained in:
parent
ebdcb00d0a
commit
fd6637df4a
7 changed files with 244 additions and 127 deletions
|
|
@ -57,6 +57,9 @@ type Account interface {
|
|||
// GetAccountByFollowersURI returns one account with the given followers_uri, or an error if something goes wrong.
|
||||
GetAccountByFollowersURI(ctx context.Context, uri string) (*gtsmodel.Account, error)
|
||||
|
||||
// GetAccountByMovedToURI returns any accounts with given moved_to_uri set.
|
||||
GetAccountsByMovedToURI(ctx context.Context, uri string) ([]*gtsmodel.Account, error)
|
||||
|
||||
// GetAccounts returns accounts
|
||||
// with the given parameters.
|
||||
GetAccounts(
|
||||
|
|
|
|||
|
|
@ -252,6 +252,27 @@ func (a *accountDB) GetInstanceAccount(ctx context.Context, domain string) (*gts
|
|||
return a.GetAccountByUsernameDomain(ctx, username, domain)
|
||||
}
|
||||
|
||||
func (a *accountDB) GetAccountsByMovedToURI(ctx context.Context, uri string) ([]*gtsmodel.Account, error) {
|
||||
var accountIDs []string
|
||||
|
||||
// Find all account IDs with
|
||||
// given moved_to_uri column.
|
||||
if err := a.db.NewSelect().
|
||||
Table("accounts").
|
||||
Column("id").
|
||||
Where("? = ?", bun.Ident("moved_to_uri"), uri).
|
||||
Scan(ctx, &accountIDs); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if len(accountIDs) == 0 {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
// Return account models for all found IDs.
|
||||
return a.GetAccountsByIDs(ctx, accountIDs)
|
||||
}
|
||||
|
||||
// GetAccounts selects accounts using the given parameters.
|
||||
// Unlike with other functions, the paging for GetAccounts
|
||||
// is done not by ID, but by a concatenation of `[domain]/@[username]`,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue