2019-05-11 12:27:21 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								< ? php  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// This file is part of GNU social - https://www.gnu.org/software/social
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								//
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// GNU social 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.
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								//
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// GNU social 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 GNU social.  If not, see <http://www.gnu.org/licenses/>.
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/**  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  ActivityPub  implementation  for  GNU  social 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  @ package    GNUsocial 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  @ author     Diogo  Cordeiro  < diogo @ fc . up . pt > 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  @ copyright  2018 - 2019  Free  Software  Foundation ,  Inc  http :// www . fsf . org 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  @ license    https :// www . gnu . org / licenses / agpl . html  GNU  AGPL  v3  or  later 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  @ link       http :// www . gnu . org / software / social / 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								defined ( 'GNUSOCIAL' )  ||  die ();  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/**  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  ActivityPub  error  representation 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  @ category   Plugin 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  @ package    GNUsocial 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  @ author     Diogo  Cordeiro  < diogo @ fc . up . pt > 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  @ license    https :// www . gnu . org / licenses / agpl . html  GNU  AGPL  v3  or  later 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2019-08-13 02:54:38 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								class  Activitypub_follow  
						 
					
						
							
								
									
										
										
										
											2019-05-11 12:27:21 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /** 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  Generates  an  ActivityPub  representation  of  a  subscription 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  @ author  Diogo  Cordeiro  < diogo @ fc . up . pt > 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  @ param  string  $actor 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  @ param  string  $object 
							 
						 
					
						
							
								
									
										
										
										
											2019-08-05 23:22:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								     *  @ param  string | null  $id  Activity  id ,  to  be  used  when  generating  for  an  Accept  Activity 
							 
						 
					
						
							
								
									
										
										
										
											2019-05-11 12:27:21 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								     *  @ return  array  pretty  array  to  be  used  in  a  response 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     */ 
							 
						 
					
						
							
								
									
										
										
										
											2019-08-05 23:22:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    public  static  function  follow_to_array ( string  $actor ,  string  $object ,  ? string  $id  =  null ) :  array 
							 
						 
					
						
							
								
									
										
										
										
											2019-05-11 12:27:21 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
									
										
										
										
											2019-08-05 23:22:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( $id  ===  null )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            $id  =  common_root_url () . 'follow_from_' . urlencode ( $actor ) . '_to_' . urlencode ( $object ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-05-11 12:27:21 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        $res  =  [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            '@context'  =>  'https://www.w3.org/ns/activitystreams' , 
							 
						 
					
						
							
								
									
										
										
										
											2019-08-05 23:22:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            'id'      =>  $id , 
							 
						 
					
						
							
								
									
										
										
										
											2019-05-11 12:27:21 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            'type'    =>  'Follow' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            'actor'   =>  $actor , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            'object'  =>  $object 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								       ]; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  $res ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /** 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  Handles  a  Follow  Activity  received  by  our  inbox . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  @ param  Profile  $actor_profile  Remote  Actor 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  @ param  string  $object  Local  Actor 
							 
						 
					
						
							
								
									
										
										
										
											2019-08-05 23:22:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								     *  @ param  string  $id  Activity  id 
							 
						 
					
						
							
								
									
										
										
										
											2019-05-11 12:27:21 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								     *  @ throws  AlreadyFulfilledException 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  @ throws  HTTP_Request2_Exception 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  @ throws  NoProfileException 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  @ throws  ServerException 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  @ author  Diogo  Cordeiro  < diogo @ fc . up . pt > 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     */ 
							 
						 
					
						
							
								
									
										
										
										
											2019-08-05 23:22:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    public  static  function  follow ( Profile  $actor_profile ,  string  $object ,  string  $id ) 
							 
						 
					
						
							
								
									
										
										
										
											2019-05-11 12:27:21 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        // Get Actor's Aprofile
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        $actor_aprofile  =  Activitypub_profile :: from_profile ( $actor_profile ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        // Get Object profile
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        $object_profile  =  new  Activitypub_explorer ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        $object_profile  =  $object_profile -> lookup ( $object )[ 0 ]; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( ! Subscription :: exists ( $actor_profile ,  $object_profile ))  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            Subscription :: start ( $actor_profile ,  $object_profile ); 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-08 19:23:48 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            Activitypub_profile :: subscribeCacheUpdate ( $actor_profile ,  $object_profile ); 
							 
						 
					
						
							
								
									
										
										
										
											2019-12-10 22:27:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            common_debug ( 'ActivityPubPlugin: Accepted Follow request from ' . $actor_profile -> getUri () . ' to ' . $object ); 
							 
						 
					
						
							
								
									
										
										
										
											2019-05-11 12:27:21 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        }  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-12-10 22:27:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            common_debug ( 'ActivityPubPlugin: Received a repeated Follow request from ' . $actor_profile -> getUri () . ' to ' . $object ); 
							 
						 
					
						
							
								
									
										
										
										
											2019-05-11 12:27:21 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        // Notify remote instance that we have accepted their request
 
							 
						 
					
						
							
								
									
										
										
										
											2019-12-10 22:27:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        common_debug ( 'ActivityPubPlugin: Notifying remote instance that we have accepted their Follow request request from ' . $actor_profile -> getUri () . ' to ' . $object ); 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-08 19:23:48 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        $postman  =  new  Activitypub_postman ( $object_profile ,  [ $actor_aprofile ]); 
							 
						 
					
						
							
								
									
										
										
										
											2019-08-05 23:22:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        $postman -> accept_follow ( $id ); 
							 
						 
					
						
							
								
									
										
										
										
											2019-05-11 12:27:21 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}