2021-10-24 11:57:39 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								/ *  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								   GoToSocial 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-20 18:42:19 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								   Copyright  ( C )  2021 - 2022  GoToSocial  Authors  admin @ gotosocial . org 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-24 11:57:39 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								   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  federation  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  (  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"context" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"net/http" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"net/url" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									apimodel  "github.com/superseriousbusiness/gotosocial/internal/api/model" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"github.com/superseriousbusiness/gotosocial/internal/db" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"github.com/superseriousbusiness/gotosocial/internal/federation" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"github.com/superseriousbusiness/gotosocial/internal/gtserror" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"github.com/superseriousbusiness/gotosocial/internal/messages" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"github.com/superseriousbusiness/gotosocial/internal/typeutils" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"github.com/superseriousbusiness/gotosocial/internal/visibility" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								)  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// Processor wraps functions for processing federation API requests.  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								type  Processor  interface  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// GetUser handles the getting of a fedi/activitypub representation of a user/account, performing appropriate authentication 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// before returning a JSON serializable interface to the caller. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									GetUser ( ctx  context . Context ,  requestedUsername  string ,  requestURL  * url . URL )  ( interface { } ,  gtserror . WithCode ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// GetFollowers handles the getting of a fedi/activitypub representation of a user/account's followers, performing appropriate 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// authentication before returning a JSON serializable interface to the caller. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									GetFollowers ( ctx  context . Context ,  requestedUsername  string ,  requestURL  * url . URL )  ( interface { } ,  gtserror . WithCode ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// GetFollowing handles the getting of a fedi/activitypub representation of a user/account's following, performing appropriate 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// authentication before returning a JSON serializable interface to the caller. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									GetFollowing ( ctx  context . Context ,  requestedUsername  string ,  requestURL  * url . URL )  ( interface { } ,  gtserror . WithCode ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// GetStatus handles the getting of a fedi/activitypub representation of a particular status, performing appropriate 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// authentication before returning a JSON serializable interface to the caller. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									GetStatus ( ctx  context . Context ,  requestedUsername  string ,  requestedStatusID  string ,  requestURL  * url . URL )  ( interface { } ,  gtserror . WithCode ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// GetStatus handles the getting of a fedi/activitypub representation of replies to a status, performing appropriate 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// authentication before returning a JSON serializable interface to the caller. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									GetStatusReplies ( ctx  context . Context ,  requestedUsername  string ,  requestedStatusID  string ,  page  bool ,  onlyOtherAccounts  bool ,  minID  string ,  requestURL  * url . URL )  ( interface { } ,  gtserror . WithCode ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// GetWebfingerAccount handles the GET for a webfinger resource. Most commonly, it will be used for returning account lookups. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									GetWebfingerAccount ( ctx  context . Context ,  requestedUsername  string )  ( * apimodel . WellKnownResponse ,  gtserror . WithCode ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// GetNodeInfoRel returns a well known response giving the path to node info. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									GetNodeInfoRel ( ctx  context . Context ,  request  * http . Request )  ( * apimodel . WellKnownResponse ,  gtserror . WithCode ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// GetNodeInfo returns a node info struct in response to a node info request. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									GetNodeInfo ( ctx  context . Context ,  request  * http . Request )  ( * apimodel . Nodeinfo ,  gtserror . WithCode ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// GetOutbox returns the activitypub representation of a local user's outbox. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// This contains links to PUBLIC posts made by this user. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									GetOutbox ( ctx  context . Context ,  requestedUsername  string ,  page  bool ,  maxID  string ,  minID  string ,  requestURL  * url . URL )  ( interface { } ,  gtserror . WithCode ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// PostInbox handles POST requests to a user's inbox for new activitypub messages. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// PostInbox returns true if the request was handled as an ActivityPub POST to an actor's inbox. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// If false, the request was not an ActivityPub request and may still be handled by the caller in another way, such as serving a web page. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// If the error is nil, then the ResponseWriter's headers and response has already been written. If a non-nil error is returned, then no response has been written. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// If the Actor was constructed with the Federated Protocol enabled, side effects will occur. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// If the Federated Protocol is not enabled, writes the http.StatusMethodNotAllowed status code in the response. No side effects occur. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									PostInbox ( ctx  context . Context ,  w  http . ResponseWriter ,  r  * http . Request )  ( bool ,  error ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								type  processor  struct  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									db             db . DB 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									federator      federation . Federator 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									tc             typeutils . TypeConverter 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									filter         visibility . Filter 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									fromFederator  chan  messages . FromFederator 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// New returns a new federation processor.  
						 
					
						
							
								
									
										
										
										
											2021-12-07 13:31:39 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  New ( db  db . DB ,  tc  typeutils . TypeConverter ,  federator  federation . Federator ,  fromFederator  chan  messages . FromFederator )  Processor  {  
						 
					
						
							
								
									
										
										
										
											2021-10-24 11:57:39 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									return  & processor { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										db :             db , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										federator :      federator , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										tc :             tc , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										filter :         visibility . NewFilter ( db ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										fromFederator :  fromFederator , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}