summaryrefslogtreecommitdiff
path: root/internal/processing/account
diff options
context:
space:
mode:
Diffstat (limited to 'internal/processing/account')
-rw-r--r--internal/processing/account/relationships.go32
-rw-r--r--internal/processing/account/update.go4
2 files changed, 34 insertions, 2 deletions
diff --git a/internal/processing/account/relationships.go b/internal/processing/account/relationships.go
index b9e9086c9..53d2ee3c7 100644
--- a/internal/processing/account/relationships.go
+++ b/internal/processing/account/relationships.go
@@ -31,11 +31,25 @@ import (
// FollowersGet fetches a list of the target account's followers.
func (p *Processor) FollowersGet(ctx context.Context, requestingAccount *gtsmodel.Account, targetAccountID string, page *paging.Page) (*apimodel.PageableResponse, gtserror.WithCode) {
// Fetch target account to check it exists, and visibility of requester->target.
- _, errWithCode := p.c.GetVisibleTargetAccount(ctx, requestingAccount, targetAccountID)
+ targetAccount, errWithCode := p.c.GetVisibleTargetAccount(ctx, requestingAccount, targetAccountID)
if errWithCode != nil {
return nil, errWithCode
}
+ if targetAccount.IsInstance() {
+ // Instance accounts can't follow/be followed.
+ return paging.EmptyResponse(), nil
+ }
+
+ // If account isn't requesting its own followers list,
+ // but instead the list for a local account that has
+ // hide_followers set, just return an empty array.
+ if targetAccountID != requestingAccount.ID &&
+ targetAccount.IsLocal() &&
+ *targetAccount.Settings.HideCollections {
+ return paging.EmptyResponse(), nil
+ }
+
follows, err := p.state.DB.GetAccountFollowers(ctx, targetAccountID, page)
if err != nil && !errors.Is(err, db.ErrNoEntries) {
err = gtserror.Newf("db error getting followers: %w", err)
@@ -76,11 +90,25 @@ func (p *Processor) FollowersGet(ctx context.Context, requestingAccount *gtsmode
// FollowingGet fetches a list of the accounts that target account is following.
func (p *Processor) FollowingGet(ctx context.Context, requestingAccount *gtsmodel.Account, targetAccountID string, page *paging.Page) (*apimodel.PageableResponse, gtserror.WithCode) {
// Fetch target account to check it exists, and visibility of requester->target.
- _, errWithCode := p.c.GetVisibleTargetAccount(ctx, requestingAccount, targetAccountID)
+ targetAccount, errWithCode := p.c.GetVisibleTargetAccount(ctx, requestingAccount, targetAccountID)
if errWithCode != nil {
return nil, errWithCode
}
+ if targetAccount.IsInstance() {
+ // Instance accounts can't follow/be followed.
+ return paging.EmptyResponse(), nil
+ }
+
+ // If account isn't requesting its own following list,
+ // but instead the list for a local account that has
+ // hide_followers set, just return an empty array.
+ if targetAccountID != requestingAccount.ID &&
+ targetAccount.IsLocal() &&
+ *targetAccount.Settings.HideCollections {
+ return paging.EmptyResponse(), nil
+ }
+
// Fetch known accounts that follow given target account ID.
follows, err := p.state.DB.GetAccountFollows(ctx, targetAccountID, page)
if err != nil && !errors.Is(err, db.ErrNoEntries) {
diff --git a/internal/processing/account/update.go b/internal/processing/account/update.go
index 076b6d7f4..670620e19 100644
--- a/internal/processing/account/update.go
+++ b/internal/processing/account/update.go
@@ -284,6 +284,10 @@ func (p *Processor) Update(ctx context.Context, account *gtsmodel.Account, form
account.Settings.EnableRSS = form.EnableRSS
}
+ if form.HideCollections != nil {
+ account.Settings.HideCollections = form.HideCollections
+ }
+
if err := p.state.DB.UpdateAccount(ctx, account); err != nil {
return nil, gtserror.NewErrorInternalError(fmt.Errorf("could not update account %s: %s", account.ID, err))
}