2018-07-10 00:26:02 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								< ? php  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/**  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  GNU  social  -  a  federating  social  network 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  ActivityPubPlugin  implementation  for  GNU  Social 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  LICENCE :  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 />. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  @ category   Plugin 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  @ package    GNUsocial 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  @ author     Diogo  Cordeiro  < diogo @ fc . up . pt > 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  @ author     Daniel  Supernault  < danielsupernault @ gmail . com > 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  @ copyright  2018  Free  Software  Foundation  http :// fsf . org 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  @ license    http :// www . fsf . org / licensing / licenses / agpl - 3.0 . html  GNU  Affero  General  Public  License  version  3.0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  @ link       https :// www . gnu . org / software / social / 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-26 21:12:13 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								if  ( ! defined ( 'GNUSOCIAL' ))  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    exit ( 1 ); 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-10 00:26:02 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-07-13 00:20:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// Validate Object
  
						 
					
						
							
								
									
										
										
										
											2018-07-31 22:19:40 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								if  ( ! filter_var ( $data -> object ,  FILTER_VALIDATE_URL ))  {  
						 
					
						
							
								
									
										
										
										
											2018-07-31 23:28:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    ActivityPubReturn :: error ( 'Invalid Object Actor URL.' ); 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-13 00:20:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-07-31 23:51:39 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// Ensure valid Object profile
  
						 
					
						
							
								
									
										
										
										
											2018-07-10 00:26:02 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								try  {  
						 
					
						
							
								
									
										
										
										
											2018-07-31 23:51:39 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( ! isset  ( $profile ))  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        $object_profile  =  new  Activitypub_explorer ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        $object_profile  =  $object_profile -> lookup ( $data -> object )[ 0 ]; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    }  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        $object_profile  =  $profile ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        unset  ( $profile ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-26 21:12:13 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  catch  ( Exception  $e )  {  
						 
					
						
							
								
									
										
										
										
											2018-07-31 23:28:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    ActivityPubReturn :: error ( 'Invalid Object Actor URL.' ,  404 ); 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-10 00:26:02 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-07-31 23:51:39 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// Get Actor's Aprofile
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								$actor_aprofile  =  Activitypub_profile :: from_profile ( $actor_profile );  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-07-31 23:55:47 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								if  ( ! Subscription :: exists ( $actor_profile ,  $object_profile ))  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    Subscription :: start ( $actor_profile ,  $object_profile ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    common_debug ( 'ActivityPubPlugin: Accepted Follow request from ' . $data -> actor . ' to ' . $data -> object ); 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-31 23:35:15 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-08-01 00:03:15 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    // Notify remote instance that we have accepted their request
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    common_debug ( 'ActivityPubPlugin: Notifying remote instance that we have accepted their Follow request request from ' . $data -> actor . ' to ' . $data -> object ); 
							 
						 
					
						
							
								
									
										
										
										
											2018-08-01 17:38:39 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    $postman  =  new  Activitypub_postman ( $actor_profile ,  [ $actor_aprofile ]); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    $postman -> follow (); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ActivityPubReturn :: answer (); 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-31 23:55:47 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  else  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    common_debug ( 'ActivityPubPlugin: Received a repeated Follow request from ' . $data -> actor . ' to ' . $data -> object ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ActivityPubReturn :: error ( 'Already following.' ,  409 ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}