mirror of
https://github.com/superseriousbusiness/gotosocial.git
synced 2024-11-28 11:21:00 +00:00
ensure blocking calls to getRemoteAccount before showing stuff to client
This commit is contained in:
parent
5d9e9e0e7f
commit
c156602c66
2 changed files with 99 additions and 4 deletions
|
@ -89,7 +89,7 @@ func (d *deref) GetRemoteStatus(ctx context.Context, username string, remoteStat
|
||||||
}
|
}
|
||||||
|
|
||||||
// do this so we know we have the remote account of the status in the db
|
// do this so we know we have the remote account of the status in the db
|
||||||
_, err = d.GetRemoteAccount(ctx, username, accountURI, false, false)
|
_, err = d.GetRemoteAccount(ctx, username, accountURI, true, false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, statusable, new, fmt.Errorf("GetRemoteStatus: couldn't derive status author: %s", err)
|
return nil, statusable, new, fmt.Errorf("GetRemoteStatus: couldn't derive status author: %s", err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -115,6 +115,30 @@ func (p *processor) processCreateStatusFromFederator(ctx context.Context, federa
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// make sure the account is pinned
|
||||||
|
if status.Account == nil {
|
||||||
|
a, err := p.db.GetAccountByID(ctx, status.AccountID)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
status.Account = a
|
||||||
|
}
|
||||||
|
|
||||||
|
// do a BLOCKING get of the remote account to make sure the avi and header are cached
|
||||||
|
if status.Account.Domain != "" {
|
||||||
|
remoteAccountID, err := url.Parse(status.Account.URI)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
a, err := p.federator.GetRemoteAccount(ctx, federatorMsg.ReceivingAccount.Username, remoteAccountID, true, false)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
status.Account = a
|
||||||
|
}
|
||||||
|
|
||||||
if err := p.timelineStatus(ctx, status); err != nil {
|
if err := p.timelineStatus(ctx, status); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -133,6 +157,30 @@ func (p *processor) processCreateFaveFromFederator(ctx context.Context, federato
|
||||||
return errors.New("like was not parseable as *gtsmodel.StatusFave")
|
return errors.New("like was not parseable as *gtsmodel.StatusFave")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// make sure the account is pinned
|
||||||
|
if incomingFave.Account == nil {
|
||||||
|
a, err := p.db.GetAccountByID(ctx, incomingFave.AccountID)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
incomingFave.Account = a
|
||||||
|
}
|
||||||
|
|
||||||
|
// do a BLOCKING get of the remote account to make sure the avi and header are cached
|
||||||
|
if incomingFave.Account.Domain != "" {
|
||||||
|
remoteAccountID, err := url.Parse(incomingFave.Account.URI)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
a, err := p.federator.GetRemoteAccount(ctx, federatorMsg.ReceivingAccount.Username, remoteAccountID, true, false)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
incomingFave.Account = a
|
||||||
|
}
|
||||||
|
|
||||||
if err := p.notifyFave(ctx, incomingFave); err != nil {
|
if err := p.notifyFave(ctx, incomingFave); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -147,6 +195,30 @@ func (p *processor) processCreateFollowRequestFromFederator(ctx context.Context,
|
||||||
return errors.New("incomingFollowRequest was not parseable as *gtsmodel.FollowRequest")
|
return errors.New("incomingFollowRequest was not parseable as *gtsmodel.FollowRequest")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// make sure the account is pinned
|
||||||
|
if followRequest.Account == nil {
|
||||||
|
a, err := p.db.GetAccountByID(ctx, followRequest.AccountID)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
followRequest.Account = a
|
||||||
|
}
|
||||||
|
|
||||||
|
// do a BLOCKING get of the remote account to make sure the avi and header are cached
|
||||||
|
if followRequest.Account.Domain != "" {
|
||||||
|
remoteAccountID, err := url.Parse(followRequest.Account.URI)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
a, err := p.federator.GetRemoteAccount(ctx, federatorMsg.ReceivingAccount.Username, remoteAccountID, true, false)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
followRequest.Account = a
|
||||||
|
}
|
||||||
|
|
||||||
if followRequest.TargetAccount == nil {
|
if followRequest.TargetAccount == nil {
|
||||||
a, err := p.db.GetAccountByID(ctx, followRequest.TargetAccountID)
|
a, err := p.db.GetAccountByID(ctx, followRequest.TargetAccountID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -154,9 +226,8 @@ func (p *processor) processCreateFollowRequestFromFederator(ctx context.Context,
|
||||||
}
|
}
|
||||||
followRequest.TargetAccount = a
|
followRequest.TargetAccount = a
|
||||||
}
|
}
|
||||||
targetAccount := followRequest.TargetAccount
|
|
||||||
|
|
||||||
if targetAccount.Locked {
|
if followRequest.TargetAccount.Locked {
|
||||||
// if the account is locked just notify the follow request and nothing else
|
// if the account is locked just notify the follow request and nothing else
|
||||||
return p.notifyFollowRequest(ctx, followRequest)
|
return p.notifyFollowRequest(ctx, followRequest)
|
||||||
}
|
}
|
||||||
|
@ -171,7 +242,7 @@ func (p *processor) processCreateFollowRequestFromFederator(ctx context.Context,
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
return p.notifyFollow(ctx, follow, targetAccount)
|
return p.notifyFollow(ctx, follow, followRequest.TargetAccount)
|
||||||
}
|
}
|
||||||
|
|
||||||
// processCreateAnnounceFromFederator handles Activity Create and Object Announce
|
// processCreateAnnounceFromFederator handles Activity Create and Object Announce
|
||||||
|
@ -181,6 +252,30 @@ func (p *processor) processCreateAnnounceFromFederator(ctx context.Context, fede
|
||||||
return errors.New("announce was not parseable as *gtsmodel.Status")
|
return errors.New("announce was not parseable as *gtsmodel.Status")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// make sure the account is pinned
|
||||||
|
if incomingAnnounce.Account == nil {
|
||||||
|
a, err := p.db.GetAccountByID(ctx, incomingAnnounce.AccountID)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
incomingAnnounce.Account = a
|
||||||
|
}
|
||||||
|
|
||||||
|
// do a BLOCKING get of the remote account to make sure the avi and header are cached
|
||||||
|
if incomingAnnounce.Account.Domain != "" {
|
||||||
|
remoteAccountID, err := url.Parse(incomingAnnounce.Account.URI)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
a, err := p.federator.GetRemoteAccount(ctx, federatorMsg.ReceivingAccount.Username, remoteAccountID, true, false)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
incomingAnnounce.Account = a
|
||||||
|
}
|
||||||
|
|
||||||
if err := p.federator.DereferenceAnnounce(ctx, incomingAnnounce, federatorMsg.ReceivingAccount.Username); err != nil {
|
if err := p.federator.DereferenceAnnounce(ctx, incomingAnnounce, federatorMsg.ReceivingAccount.Username); err != nil {
|
||||||
return fmt.Errorf("error dereferencing announce from federator: %s", err)
|
return fmt.Errorf("error dereferencing announce from federator: %s", err)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue