mirror of
				https://github.com/owncast/owncast.git
				synced 2025-11-04 13:27:21 +08:00 
			
		
		
		
	Add support for resolving Application actors and fix error handling with failed resolution. Fixes #1710
This commit is contained in:
		@ -76,6 +76,7 @@ func ResolveIRI(c context.Context, iri string, callbacks ...interface{}) error {
 | 
			
		||||
func GetResolvedActorFromActorProperty(actor vocab.ActivityStreamsActorProperty) (apmodels.ActivityPubActor, error) {
 | 
			
		||||
	var err error
 | 
			
		||||
	var apActor apmodels.ActivityPubActor
 | 
			
		||||
	resolved := false
 | 
			
		||||
 | 
			
		||||
	personCallback := func(c context.Context, person vocab.ActivityStreamsPerson) error {
 | 
			
		||||
		apActor = apmodels.MakeActorFromPerson(person)
 | 
			
		||||
@ -87,39 +88,77 @@ func GetResolvedActorFromActorProperty(actor vocab.ActivityStreamsActorProperty)
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	applicationCallback := func(c context.Context, s vocab.ActivityStreamsApplication) error {
 | 
			
		||||
		apActor = apmodels.MakeActorFromApplication(s)
 | 
			
		||||
		resolved = true
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for iter := actor.Begin(); iter != actor.End(); iter = iter.Next() {
 | 
			
		||||
		if iter.IsIRI() {
 | 
			
		||||
			iri := iter.GetIRI()
 | 
			
		||||
			if e := ResolveIRI(context.Background(), iri.String(), personCallback, serviceCallback); e != nil {
 | 
			
		||||
			if e := ResolveIRI(context.Background(), iri.String(), personCallback, serviceCallback, applicationCallback); e != nil {
 | 
			
		||||
				err = e
 | 
			
		||||
			}
 | 
			
		||||
		} else if iter.IsActivityStreamsPerson() {
 | 
			
		||||
			person := iter.GetActivityStreamsPerson()
 | 
			
		||||
			apActor = apmodels.MakeActorFromPerson(person)
 | 
			
		||||
			resolved = true
 | 
			
		||||
		} else if iter.IsActivityStreamsService() {
 | 
			
		||||
			person := iter.GetActivityStreamsService()
 | 
			
		||||
			apActor = apmodels.MakeActorFromService(person)
 | 
			
		||||
			resolved = true
 | 
			
		||||
		} else if iter.IsActivityStreamsApplication() {
 | 
			
		||||
			person := iter.GetActivityStreamsApplication()
 | 
			
		||||
			apActor = apmodels.MakeActorFromApplication(person)
 | 
			
		||||
			resolved = true
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return apActor, errors.Wrap(err, "unable to resolve actor from actor property")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		err = errors.Wrap(err, "error resolving actor from property value")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if !resolved {
 | 
			
		||||
		err = errors.New("error resolving actor from property value")
 | 
			
		||||
	}
 | 
			
		||||
	return apActor, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetResolvedActorFromIRI will resolve an IRI string to a fully populated actor.
 | 
			
		||||
func GetResolvedActorFromIRI(personOrServiceIRI string) (apmodels.ActivityPubActor, error) {
 | 
			
		||||
	var err error
 | 
			
		||||
	var apActor apmodels.ActivityPubActor
 | 
			
		||||
 | 
			
		||||
	resolved := false
 | 
			
		||||
	personCallback := func(c context.Context, person vocab.ActivityStreamsPerson) error {
 | 
			
		||||
		apActor = apmodels.MakeActorFromPerson(person)
 | 
			
		||||
		resolved = true
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	serviceCallback := func(c context.Context, s vocab.ActivityStreamsService) error {
 | 
			
		||||
		apActor = apmodels.MakeActorFromService(s)
 | 
			
		||||
		resolved = true
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if e := ResolveIRI(context.Background(), personOrServiceIRI, personCallback, serviceCallback); e != nil {
 | 
			
		||||
	applicationCallback := func(c context.Context, s vocab.ActivityStreamsApplication) error {
 | 
			
		||||
		apActor = apmodels.MakeActorFromApplication(s)
 | 
			
		||||
		resolved = true
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if e := ResolveIRI(context.Background(), personOrServiceIRI, personCallback, serviceCallback, applicationCallback); e != nil {
 | 
			
		||||
		err = e
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return apActor, errors.Wrap(err, "unable to resolve actor from IRI string: "+personOrServiceIRI)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		err = errors.Wrap(err, "error resolving actor from property value")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if !resolved {
 | 
			
		||||
		err = errors.New("error resolving actor from property value")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return apActor, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user