mirror of
https://github.com/owncast/owncast.git
synced 2024-12-18 15:23:55 +03:00
e46f8e2a66
Store the original follow request object and use it for approvals. Closes #1690
88 lines
2.7 KiB
Go
88 lines
2.7 KiB
Go
package inbox
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"time"
|
|
|
|
"github.com/go-fed/activity/streams/vocab"
|
|
"github.com/owncast/owncast/activitypub/persistence"
|
|
"github.com/owncast/owncast/activitypub/requests"
|
|
"github.com/owncast/owncast/activitypub/resolvers"
|
|
"github.com/owncast/owncast/core/chat/events"
|
|
"github.com/owncast/owncast/core/data"
|
|
"github.com/pkg/errors"
|
|
|
|
log "github.com/sirupsen/logrus"
|
|
)
|
|
|
|
func handleFollowInboxRequest(c context.Context, activity vocab.ActivityStreamsFollow) error {
|
|
follow, err := resolvers.MakeFollowRequest(c, activity)
|
|
if err != nil {
|
|
log.Errorln("unable to create follow inbox request", err)
|
|
return err
|
|
}
|
|
|
|
if follow == nil {
|
|
return fmt.Errorf("unable to handle request")
|
|
}
|
|
|
|
approved := !data.GetFederationIsPrivate()
|
|
|
|
followRequest := *follow
|
|
|
|
if err := persistence.AddFollow(followRequest, approved); err != nil {
|
|
log.Errorln("unable to save follow request", err)
|
|
return err
|
|
}
|
|
|
|
localAccountName := data.GetDefaultFederationUsername()
|
|
|
|
if approved {
|
|
if err := requests.SendFollowAccept(follow.Inbox, activity, localAccountName); err != nil {
|
|
log.Errorln("unable to send follow accept", err)
|
|
return err
|
|
}
|
|
}
|
|
|
|
// Save as an accepted activity
|
|
actorReference := activity.GetActivityStreamsActor()
|
|
object := activity.GetActivityStreamsObject()
|
|
objectIRI := object.At(0).GetIRI().String()
|
|
actorIRI := actorReference.At(0).GetIRI().String()
|
|
|
|
// If this request is approved and we have not previously sent an action to
|
|
// chat due to a previous follow request, then do so.
|
|
hasPreviouslyhandled := true // Default so we don't send anything if it fails.
|
|
if approved {
|
|
hasPreviouslyhandled, err = persistence.HasPreviouslyHandledInboundActivity(objectIRI, actorIRI, events.FediverseEngagementFollow)
|
|
if err != nil {
|
|
log.Errorln("error checking for previously handled follow activity", err)
|
|
}
|
|
}
|
|
|
|
// Save this follow action to our activities table.
|
|
if err := persistence.SaveInboundFediverseActivity(objectIRI, actorIRI, events.FediverseEngagementFollow, time.Now()); err != nil {
|
|
return errors.Wrap(err, "unable to save inbound share/re-post activity")
|
|
}
|
|
|
|
// Send action to chat if it has not been previously handled.
|
|
if !hasPreviouslyhandled {
|
|
return handleEngagementActivity(events.FediverseEngagementFollow, false, actorReference, events.FediverseEngagementFollow)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func handleUnfollowRequest(c context.Context, activity vocab.ActivityStreamsUndo) error {
|
|
request := resolvers.MakeUnFollowRequest(c, activity)
|
|
if request == nil {
|
|
log.Errorf("unable to handle unfollow request")
|
|
return errors.New("unable to handle unfollow request")
|
|
}
|
|
|
|
unfollowRequest := *request
|
|
log.Traceln("unfollow request:", unfollowRequest)
|
|
|
|
return persistence.RemoveFollow(unfollowRequest)
|
|
}
|