mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-11-03 18:42:25 -06:00 
			
		
		
		
	
		
			
	
	
		
			154 lines
		
	
	
	
		
			4.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			154 lines
		
	
	
	
		
			4.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| 
								 | 
							
								package federation
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import (
							 | 
						||
| 
								 | 
							
									"context"
							 | 
						||
| 
								 | 
							
									"encoding/json"
							 | 
						||
| 
								 | 
							
									"errors"
							 | 
						||
| 
								 | 
							
									"fmt"
							 | 
						||
| 
								 | 
							
									"net/url"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									"github.com/go-fed/activity/streams"
							 | 
						||
| 
								 | 
							
									"github.com/go-fed/activity/streams/vocab"
							 | 
						||
| 
								 | 
							
									"github.com/superseriousbusiness/gotosocial/internal/gtsmodel"
							 | 
						||
| 
								 | 
							
									"github.com/superseriousbusiness/gotosocial/internal/typeutils"
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func (f *federator) DereferenceRemoteAccount(username string, remoteAccountID *url.URL) (typeutils.Accountable, error) {
							 | 
						||
| 
								 | 
							
									f.startHandshake(username, remoteAccountID)
							 | 
						||
| 
								 | 
							
									defer f.stopHandshake(username, remoteAccountID)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									transport, err := f.GetTransportForUser(username)
							 | 
						||
| 
								 | 
							
									if err != nil {
							 | 
						||
| 
								 | 
							
										return nil, fmt.Errorf("transport err: %s", err)
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									b, err := transport.Dereference(context.Background(), remoteAccountID)
							 | 
						||
| 
								 | 
							
									if err != nil {
							 | 
						||
| 
								 | 
							
										return nil, fmt.Errorf("error deferencing %s: %s", remoteAccountID.String(), err)
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									m := make(map[string]interface{})
							 | 
						||
| 
								 | 
							
									if err := json.Unmarshal(b, &m); err != nil {
							 | 
						||
| 
								 | 
							
										return nil, fmt.Errorf("error unmarshalling bytes into json: %s", err)
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									t, err := streams.ToType(context.Background(), m)
							 | 
						||
| 
								 | 
							
									if err != nil {
							 | 
						||
| 
								 | 
							
										return nil, fmt.Errorf("error resolving json into ap vocab type: %s", err)
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									switch t.GetTypeName() {
							 | 
						||
| 
								 | 
							
									case string(gtsmodel.ActivityStreamsPerson):
							 | 
						||
| 
								 | 
							
										p, ok := t.(vocab.ActivityStreamsPerson)
							 | 
						||
| 
								 | 
							
										if !ok {
							 | 
						||
| 
								 | 
							
											return nil, errors.New("error resolving type as activitystreams person")
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										return p, nil
							 | 
						||
| 
								 | 
							
									case string(gtsmodel.ActivityStreamsApplication):
							 | 
						||
| 
								 | 
							
										p, ok := t.(vocab.ActivityStreamsApplication)
							 | 
						||
| 
								 | 
							
										if !ok {
							 | 
						||
| 
								 | 
							
											return nil, errors.New("error resolving type as activitystreams application")
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										return p, nil
							 | 
						||
| 
								 | 
							
									case string(gtsmodel.ActivityStreamsService):
							 | 
						||
| 
								 | 
							
										p, ok := t.(vocab.ActivityStreamsService)
							 | 
						||
| 
								 | 
							
										if !ok {
							 | 
						||
| 
								 | 
							
											return nil, errors.New("error resolving type as activitystreams service")
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										return p, nil
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									return nil, fmt.Errorf("type name %s not supported", t.GetTypeName())
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func (f *federator) DereferenceRemoteStatus(username string, remoteStatusID *url.URL) (typeutils.Statusable, error) {
							 | 
						||
| 
								 | 
							
									transport, err := f.GetTransportForUser(username)
							 | 
						||
| 
								 | 
							
									if err != nil {
							 | 
						||
| 
								 | 
							
										return nil, fmt.Errorf("transport err: %s", err)
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									b, err := transport.Dereference(context.Background(), remoteStatusID)
							 | 
						||
| 
								 | 
							
									if err != nil {
							 | 
						||
| 
								 | 
							
										return nil, fmt.Errorf("error deferencing %s: %s", remoteStatusID.String(), err)
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									m := make(map[string]interface{})
							 | 
						||
| 
								 | 
							
									if err := json.Unmarshal(b, &m); err != nil {
							 | 
						||
| 
								 | 
							
										return nil, fmt.Errorf("error unmarshalling bytes into json: %s", err)
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									t, err := streams.ToType(context.Background(), m)
							 | 
						||
| 
								 | 
							
									if err != nil {
							 | 
						||
| 
								 | 
							
										return nil, fmt.Errorf("error resolving json into ap vocab type: %s", err)
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// Article, Document, Image, Video, Note, Page, Event, Place, Mention, Profile
							 | 
						||
| 
								 | 
							
									switch t.GetTypeName() {
							 | 
						||
| 
								 | 
							
									case gtsmodel.ActivityStreamsArticle:
							 | 
						||
| 
								 | 
							
										p, ok := t.(vocab.ActivityStreamsArticle)
							 | 
						||
| 
								 | 
							
										if !ok {
							 | 
						||
| 
								 | 
							
											return nil, errors.New("error resolving type as ActivityStreamsArticle")
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										return p, nil
							 | 
						||
| 
								 | 
							
									case gtsmodel.ActivityStreamsDocument:
							 | 
						||
| 
								 | 
							
										p, ok := t.(vocab.ActivityStreamsDocument)
							 | 
						||
| 
								 | 
							
										if !ok {
							 | 
						||
| 
								 | 
							
											return nil, errors.New("error resolving type as ActivityStreamsDocument")
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										return p, nil
							 | 
						||
| 
								 | 
							
									case gtsmodel.ActivityStreamsImage:
							 | 
						||
| 
								 | 
							
										p, ok := t.(vocab.ActivityStreamsImage)
							 | 
						||
| 
								 | 
							
										if !ok {
							 | 
						||
| 
								 | 
							
											return nil, errors.New("error resolving type as ActivityStreamsImage")
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										return p, nil
							 | 
						||
| 
								 | 
							
									case gtsmodel.ActivityStreamsVideo:
							 | 
						||
| 
								 | 
							
										p, ok := t.(vocab.ActivityStreamsVideo)
							 | 
						||
| 
								 | 
							
										if !ok {
							 | 
						||
| 
								 | 
							
											return nil, errors.New("error resolving type as ActivityStreamsVideo")
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										return p, nil
							 | 
						||
| 
								 | 
							
									case gtsmodel.ActivityStreamsNote:
							 | 
						||
| 
								 | 
							
										p, ok := t.(vocab.ActivityStreamsNote)
							 | 
						||
| 
								 | 
							
										if !ok {
							 | 
						||
| 
								 | 
							
											return nil, errors.New("error resolving type as ActivityStreamsNote")
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										return p, nil
							 | 
						||
| 
								 | 
							
									case gtsmodel.ActivityStreamsPage:
							 | 
						||
| 
								 | 
							
										p, ok := t.(vocab.ActivityStreamsPage)
							 | 
						||
| 
								 | 
							
										if !ok {
							 | 
						||
| 
								 | 
							
											return nil, errors.New("error resolving type as ActivityStreamsPage")
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										return p, nil
							 | 
						||
| 
								 | 
							
									case gtsmodel.ActivityStreamsEvent:
							 | 
						||
| 
								 | 
							
										p, ok := t.(vocab.ActivityStreamsEvent)
							 | 
						||
| 
								 | 
							
										if !ok {
							 | 
						||
| 
								 | 
							
											return nil, errors.New("error resolving type as ActivityStreamsEvent")
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										return p, nil
							 | 
						||
| 
								 | 
							
									case gtsmodel.ActivityStreamsPlace:
							 | 
						||
| 
								 | 
							
										p, ok := t.(vocab.ActivityStreamsPlace)
							 | 
						||
| 
								 | 
							
										if !ok {
							 | 
						||
| 
								 | 
							
											return nil, errors.New("error resolving type as ActivityStreamsPlace")
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										return p, nil
							 | 
						||
| 
								 | 
							
									case gtsmodel.ActivityStreamsProfile:
							 | 
						||
| 
								 | 
							
										p, ok := t.(vocab.ActivityStreamsProfile)
							 | 
						||
| 
								 | 
							
										if !ok {
							 | 
						||
| 
								 | 
							
											return nil, errors.New("error resolving type as ActivityStreamsProfile")
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										return p, nil
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									return nil, fmt.Errorf("type name %s not supported", t.GetTypeName())
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func (f *federator) DereferenceRemoteInstance(username string, remoteInstanceURI *url.URL) (*gtsmodel.Instance, error) {
							 | 
						||
| 
								 | 
							
									transport, err := f.GetTransportForUser(username)
							 | 
						||
| 
								 | 
							
									if err != nil {
							 | 
						||
| 
								 | 
							
										return nil, fmt.Errorf("transport err: %s", err)
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									return transport.DereferenceInstance(context.Background(), remoteInstanceURI)
							 | 
						||
| 
								 | 
							
								}
							 |