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 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-16 01:07:01 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
									
										
										
										
											2019-05-11 12:27:21 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								 *  @ 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 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-16 01:07:01 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  @ see       http :// www . gnu . org / software / social / 
							 
						 
					
						
							
								
									
										
										
										
											2019-05-11 12:27:21 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								defined ( 'GNUSOCIAL' )  ||  die ();  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/**  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  ActivityPub  error  representation 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  @ category   Plugin 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  @ package    GNUsocial 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-16 01:07:01 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
									
										
										
										
											2019-05-11 12:27:21 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								 *  @ 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 > 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-16 01:07:01 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								     * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  @ param  string       $actor 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  @ param  string       $object 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  @ param  null | string  $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 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-16 01:07:01 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            $id  =  common_root_url ()  .  'follow_from_'  .  urlencode ( $actor )  .  '_to_'  .  urlencode ( $object ); 
							 
						 
					
						
							
								
									
										
										
										
											2019-08-05 23:22:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-05-11 12:27:21 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        $res  =  [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            '@context'  =>  'https://www.w3.org/ns/activitystreams' , 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-16 01:07:01 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            'id'        =>  $id , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            'type'      =>  'Follow' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            'actor'     =>  $actor , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            'object'    =>  $object , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ]; 
							 
						 
					
						
							
								
									
										
										
										
											2019-05-11 12:27:21 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        return  $res ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /** 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  Handles  a  Follow  Activity  received  by  our  inbox . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  @ param  Profile  $actor_profile  Remote  Actor 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-16 01:07:01 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								     *  @ param  string   $object         Local  Actor 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  @ param  string   $id             Activity  id 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     * 
							 
						 
					
						
							
								
									
										
										
										
											2019-05-11 12:27:21 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								     *  @ throws  AlreadyFulfilledException 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  @ throws  HTTP_Request2_Exception 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  @ throws  NoProfileException 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  @ throws  ServerException 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-16 01:07:01 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								     * 
							 
						 
					
						
							
								
									
										
										
										
											2019-05-11 12:27:21 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								     *  @ 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 ); 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-16 01:07:01 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            common_debug ( 'ActivityPubPlugin: Accepted Follow request from '  .  $actor_profile -> getUri ()  .  ' to '  .  $object ); 
							 
						 
					
						
							
								
									
										
										
										
											2019-05-11 12:27:21 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        }  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-16 01:07:01 +01: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
 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-16 01:07:01 +01: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 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}