summaryrefslogtreecommitdiff
path: root/internal/visibility/account.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/visibility/account.go')
-rw-r--r--internal/visibility/account.go154
1 files changed, 0 insertions, 154 deletions
diff --git a/internal/visibility/account.go b/internal/visibility/account.go
deleted file mode 100644
index 410daa1ce..000000000
--- a/internal/visibility/account.go
+++ /dev/null
@@ -1,154 +0,0 @@
-// GoToSocial
-// Copyright (C) GoToSocial Authors admin@gotosocial.org
-// SPDX-License-Identifier: AGPL-3.0-or-later
-//
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU Affero General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU Affero General Public License for more details.
-//
-// You should have received a copy of the GNU Affero General Public License
-// along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-package visibility
-
-import (
- "context"
-
- "github.com/superseriousbusiness/gotosocial/internal/cache"
- "github.com/superseriousbusiness/gotosocial/internal/config"
- "github.com/superseriousbusiness/gotosocial/internal/gtserror"
- "github.com/superseriousbusiness/gotosocial/internal/gtsmodel"
- "github.com/superseriousbusiness/gotosocial/internal/log"
-)
-
-// AccountVisible will check if given account is visible to requester, accounting for requester with no auth (i.e is nil), suspensions, disabled local users and account blocks.
-func (f *Filter) AccountVisible(ctx context.Context, requester *gtsmodel.Account, account *gtsmodel.Account) (bool, error) {
- const vtype = cache.VisibilityTypeAccount
-
- // By default we assume no auth.
- requesterID := noauth
-
- if requester != nil {
- // Use provided account ID.
- requesterID = requester.ID
- }
-
- visibility, err := f.state.Caches.Visibility.LoadOne("Type,RequesterID,ItemID", func() (*cache.CachedVisibility, error) {
- // Visibility not yet cached, perform visibility lookup.
- visible, err := f.isAccountVisibleTo(ctx, requester, account)
- if err != nil {
- return nil, err
- }
-
- // Return visibility value.
- return &cache.CachedVisibility{
- ItemID: account.ID,
- RequesterID: requesterID,
- Type: vtype,
- Value: visible,
- }, nil
- }, vtype, requesterID, account.ID)
- if err != nil {
- return false, err
- }
-
- return visibility.Value, nil
-}
-
-// isAccountVisibleTo will check if account is visible to requester. It is the "meat" of the logic to Filter{}.AccountVisible() which is called within cache loader callback.
-func (f *Filter) isAccountVisibleTo(ctx context.Context, requester *gtsmodel.Account, account *gtsmodel.Account) (bool, error) {
- // Check whether target account is visible to anyone.
- visible, err := f.isAccountVisible(ctx, account)
- if err != nil {
- return false, gtserror.Newf("error checking account %s visibility: %w", account.ID, err)
- }
-
- if !visible {
- log.Trace(ctx, "target account is not visible to anyone")
- return false, nil
- }
-
- if requester == nil {
- // It seems stupid, but when un-authed all accounts are
- // visible to allow for federation to work correctly.
- return true, nil
- }
-
- // If requester is not visible, they cannot *see* either.
- visible, err = f.isAccountVisible(ctx, requester)
- if err != nil {
- return false, gtserror.Newf("error checking account %s visibility: %w", account.ID, err)
- }
-
- if !visible {
- log.Trace(ctx, "requesting account cannot see other accounts")
- return false, nil
- }
-
- // Check whether either blocks the other.
- blocked, err := f.state.DB.IsEitherBlocked(ctx,
- requester.ID,
- account.ID,
- )
- if err != nil {
- return false, gtserror.Newf("error checking account blocks: %w", err)
- }
-
- if blocked {
- log.Trace(ctx, "block exists between accounts")
- return false, nil
- }
-
- return true, nil
-}
-
-// isAccountVisible will check if given account should be visible at all, e.g. it may not be if suspended or disabled.
-func (f *Filter) isAccountVisible(ctx context.Context, account *gtsmodel.Account) (bool, error) {
- if account.IsLocal() {
- // This is a local account.
-
- if account.Username == config.GetHost() {
- // This is the instance actor account.
- return true, nil
- }
-
- // Fetch the local user model for this account.
- user, err := f.state.DB.GetUserByAccountID(ctx, account.ID)
- if err != nil {
- err := gtserror.Newf("db error getting user for account %s: %w", account.ID, err)
- return false, err
- }
-
- // Make sure that user is active (i.e. not disabled, not approved etc).
- if *user.Disabled || !*user.Approved || user.ConfirmedAt.IsZero() {
- log.Trace(ctx, "local account not active")
- return false, nil
- }
- } else {
- // This is a remote account.
-
- // Check whether remote account's domain is blocked.
- blocked, err := f.state.DB.IsDomainBlocked(ctx, account.Domain)
- if err != nil {
- return false, err
- }
-
- if blocked {
- log.Trace(ctx, "remote account domain blocked")
- return false, nil
- }
- }
-
- if !account.SuspendedAt.IsZero() {
- log.Trace(ctx, "account suspended")
- return false, nil
- }
-
- return true, nil
-}