2010-02-09 15:37:37 -05:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								< ? php  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/*  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  StatusNet  -  the  distributed  open - source  microblogging  tool 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  Copyright  ( C )  2010 ,  StatusNet ,  Inc . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  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  OStatusPlugin 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  @ author  James  Walker  < james @ status . net > 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-05-05 19:06:22 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								if  ( ! defined ( 'GNUSOCIAL' ))  {  exit ( 1 );  }  
						 
					
						
							
								
									
										
										
										
											2010-02-09 15:37:37 -05:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								class  SalmonAction  extends  Action  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2014-05-31 11:29:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    protected  $needPost  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-06-28 20:33:09 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    protected  $oprofile  =  null ;  // Ostatus_profile of the actor
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    protected  $actor     =  null ;  // Profile object of the actor
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-02-12 00:43:16 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    var  $xml       =  null ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    var  $activity  =  null ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-27 10:51:59 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    var  $target    =  null ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-02-09 15:37:37 -05:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-05-05 19:06:22 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    protected  function  prepare ( array  $args = array ()) 
							 
						 
					
						
							
								
									
										
										
										
											2010-02-09 15:37:37 -05:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-27 12:44:15 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        GNUsocial :: setApi ( true );  // Send smaller error pages
 
							 
						 
					
						
							
								
									
										
										
										
											2010-02-19 16:21:17 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-02-18 18:20:48 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        parent :: prepare ( $args ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-06-06 17:14:01 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( ! isset ( $_SERVER [ 'CONTENT_TYPE' ]))  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            // TRANS: Client error. Do not translate "Content-type"
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            $this -> clientError ( _m ( 'Salmon requires a Content-type header.' )); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        $envxml  =  null ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        switch  ( $_SERVER [ 'CONTENT_TYPE' ])  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        case  'application/magic-envelope+xml' : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            $envxml  =  file_get_contents ( 'php://input' ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        case  'application/x-www-form-urlencoded' : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            $envxml  =  Magicsig :: base64_url_decode ( $this -> trimmed ( 'xml' )); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        default : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            // TRANS: Client error. Do not translate the quoted "application/[type]" strings.
 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-16 17:25:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            throw  new  ClientException ( _m ( 'Salmon requires "application/magic-envelope+xml". For Diaspora we also accept "application/x-www-form-urlencoded" with an "xml" parameter.' ,  415 )); 
							 
						 
					
						
							
								
									
										
										
										
											2010-02-12 00:43:16 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2010-02-09 15:37:37 -05:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-01-16 17:25:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( empty ( $envxml ))  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            throw  new  ClientException ( 'No magic envelope supplied in POST.' ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-31 12:51:51 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        try  { 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-02 14:20:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            $magic_env  =  new  MagicEnvelope ( $envxml );    // parse incoming XML as a MagicEnvelope
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            $entry  =  $magic_env -> getPayload ();   // Not cryptographically verified yet!
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            $this -> activity  =  new  Activity ( $entry -> documentElement ); 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-10 02:07:39 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  ( empty ( $this -> activity -> actor -> id ))  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                common_log ( LOG_ERR ,  " broken actor:  "  .  var_export ( $this -> activity -> actor -> id ,  true )); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                common_log ( LOG_ERR ,  " activity with no actor:  "  .  var_export ( $this -> activity ,  true )); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                // TRANS: Exception.
 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-16 17:25:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                throw  new  ClientException ( _m ( 'Activity in salmon slap has no actor id.' )); 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-10 02:07:39 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-13 13:43:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            // ensureProfiles sets $this->actor and $this->oprofile
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            $this -> ensureProfiles (); 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-02 14:20:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        }  catch  ( Exception  $e )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            common_debug ( 'Salmon envelope parsing failed with: ' . $e -> getMessage ()); 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-16 17:25:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            // convert exception to ClientException
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            throw  new  ClientException ( $e -> getMessage ()); 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-31 12:51:51 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-10-03 23:25:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        // Cryptographic verification test, throws exception on failure
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        $magic_env -> verify ( $this -> actor ); 
							 
						 
					
						
							
								
									
										
										
										
											2010-02-26 15:39:30 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-02-18 06:36:32 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-02-12 00:43:16 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-02-18 21:22:21 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    /** 
							 
						 
					
						
							
								
									
										
										
										
											2010-02-19 12:08:07 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								     *  Check  the  posted  activity  type  and  break  out  to  appropriate  processing . 
							 
						 
					
						
							
								
									
										
										
										
											2010-02-18 21:22:21 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								     */ 
							 
						 
					
						
							
								
									
										
										
										
											2010-02-18 22:18:14 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-05-05 19:06:22 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    protected  function  handle () 
							 
						 
					
						
							
								
									
										
										
										
											2010-02-12 00:43:16 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-05 19:06:22 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        parent :: handle (); 
							 
						 
					
						
							
								
									
										
										
										
											2010-02-12 00:43:16 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-01-16 17:25:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        assert ( $this -> activity  instanceof  Activity ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        assert ( $this -> target  instanceof  Profile ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-08-13 13:07:25 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        common_log ( LOG_DEBUG ,  " Got a  "  .  $this -> activity -> verb ); 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-16 17:25:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        try  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            $options  =  [  'source'  =>  'ostatus'  ]; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            common_debug ( 'Save salmon slap directly with Notice::saveActivity for actor==' . $this -> actor -> getID ()); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            $stored  =  Notice :: saveActivity ( $this -> activity ,  $this -> actor ,  $options ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            common_debug ( 'Save salmon slap finished, notice id==' . $stored -> getID ()); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        }  catch  ( AlreadyFulfilledException  $e )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            // The action's results are already fulfilled. Maybe it was a
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            // duplicate? Maybe someone's database is out of sync?
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            // Let's just accept it and move on.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            common_log ( LOG_INFO ,  'Salmon slap carried an event which had already been fulfilled.' ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-06-02 13:44:08 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        try  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( Event :: handle ( 'StartHandleSalmonTarget' ,  array ( $this -> activity ,  $this -> target ))  && 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    Event :: handle ( 'StartHandleSalmon' ,  array ( $this -> activity )))  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                switch  ( $this -> activity -> verb )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                case  ActivityVerb :: POST : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    $this -> handlePost (); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                case  ActivityVerb :: SHARE : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    $this -> handleShare (); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                case  ActivityVerb :: FOLLOW : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                case  ActivityVerb :: FRIEND : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    $this -> handleFollow (); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                case  ActivityVerb :: UNFOLLOW : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    $this -> handleUnfollow (); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                case  ActivityVerb :: JOIN : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    $this -> handleJoin (); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                case  ActivityVerb :: LEAVE : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    $this -> handleLeave (); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                case  ActivityVerb :: TAG : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    $this -> handleTag (); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                case  ActivityVerb :: UNTAG : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    $this -> handleUntag (); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                case  ActivityVerb :: UPDATE_PROFILE : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    $this -> handleUpdateProfile (); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                default : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    // TRANS: Client exception.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    throw  new  ClientException ( _m ( 'Unrecognized activity type.' )); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                Event :: handle ( 'EndHandleSalmon' ,  array ( $this -> activity )); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                Event :: handle ( 'EndHandleSalmonTarget' ,  array ( $this -> activity ,  $this -> target )); 
							 
						 
					
						
							
								
									
										
										
										
											2010-02-18 06:36:32 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-02 13:44:08 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        }  catch  ( AlreadyFulfilledException  $e )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            // The action's results are already fulfilled. Maybe it was a
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            // duplicate? Maybe someone's database is out of sync?
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            // Let's just accept it and move on.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            common_log ( LOG_INFO ,  'Salmon slap carried an event which had already been fulfilled.' ); 
							 
						 
					
						
							
								
									
										
										
										
											2010-02-18 06:36:32 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    function  handlePost () 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
									
										
										
										
											2010-09-19 15:17:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        // TRANS: Client exception.
 
							 
						 
					
						
							
								
									
										
										
										
											2011-04-11 00:39:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        throw  new  ClientException ( _m ( 'This target does not understand posts.' )); 
							 
						 
					
						
							
								
									
										
										
										
											2010-02-18 06:36:32 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    function  handleFollow () 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
									
										
										
										
											2010-09-19 15:17:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        // TRANS: Client exception.
 
							 
						 
					
						
							
								
									
										
										
										
											2011-04-11 00:39:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        throw  new  ClientException ( _m ( 'This target does not understand follows.' )); 
							 
						 
					
						
							
								
									
										
										
										
											2010-02-19 12:08:07 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2010-02-19 16:37:07 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-02-19 12:08:07 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    function  handleUnfollow () 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
									
										
										
										
											2010-09-19 15:17:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        // TRANS: Client exception.
 
							 
						 
					
						
							
								
									
										
										
										
											2011-04-11 00:39:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        throw  new  ClientException ( _m ( 'This target does not understand unfollows.' )); 
							 
						 
					
						
							
								
									
										
										
										
											2010-02-18 06:36:32 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    function  handleShare () 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
									
										
										
										
											2010-09-19 15:17:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        // TRANS: Client exception.
 
							 
						 
					
						
							
								
									
										
										
										
											2011-04-11 00:39:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        throw  new  ClientException ( _m ( 'This target does not understand share events.' )); 
							 
						 
					
						
							
								
									
										
										
										
											2010-02-20 11:12:43 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    function  handleJoin () 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
									
										
										
										
											2010-09-19 15:17:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        // TRANS: Client exception.
 
							 
						 
					
						
							
								
									
										
										
										
											2011-04-11 00:39:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        throw  new  ClientException ( _m ( 'This target does not understand joins.' )); 
							 
						 
					
						
							
								
									
										
										
										
											2010-02-24 23:28:01 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    function  handleLeave () 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
									
										
										
										
											2010-09-19 15:17:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        // TRANS: Client exception.
 
							 
						 
					
						
							
								
									
										
										
										
											2011-04-11 00:39:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        throw  new  ClientException ( _m ( 'This target does not understand leave events.' )); 
							 
						 
					
						
							
								
									
										
										
										
											2010-02-18 06:36:32 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-03-07 00:45:34 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    function  handleTag () 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
									
										
										
										
											2011-04-11 00:39:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        // TRANS: Client exception.
 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-20 20:30:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        throw  new  ClientException ( _m ( 'This target does not understand list events.' )); 
							 
						 
					
						
							
								
									
										
										
										
											2011-03-07 00:45:34 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    function  handleUntag () 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
									
										
										
										
											2011-04-11 00:39:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        // TRANS: Client exception.
 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-20 20:30:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        throw  new  ClientException ( _m ( 'This target does not understand unlist events.' )); 
							 
						 
					
						
							
								
									
										
										
										
											2011-03-07 00:45:34 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-02-22 09:43:27 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    /** 
							 
						 
					
						
							
								
									
										
										
										
											2010-02-24 23:28:01 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								     *  Remote  user  sent  us  an  update  to  their  profile . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  If  we  already  know  them ,  accept  the  updates . 
							 
						 
					
						
							
								
									
										
										
										
											2010-02-22 09:43:27 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								     */ 
							 
						 
					
						
							
								
									
										
										
										
											2010-02-24 23:28:01 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    function  handleUpdateProfile () 
							 
						 
					
						
							
								
									
										
										
										
											2010-02-22 09:43:27 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
									
										
										
										
											2010-08-13 13:07:25 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        $oprofile  =  Ostatus_profile :: getActorProfile ( $this -> activity ); 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-05 23:57:41 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( $oprofile  instanceof  Ostatus_profile )  { 
							 
						 
					
						
							
								
									
										
										
										
											2010-02-24 23:28:01 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            common_log ( LOG_INFO ,  " Got a profile-update ping from  $oprofile->uri " ); 
							 
						 
					
						
							
								
									
										
										
										
											2010-08-13 13:07:25 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            $oprofile -> updateFromActivityObject ( $this -> activity -> actor ); 
							 
						 
					
						
							
								
									
										
										
										
											2010-02-24 23:28:01 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        }  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2010-08-13 13:07:25 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            common_log ( LOG_INFO ,  " Ignoring profile-update ping from unknown  "  .  $this -> activity -> actor -> id ); 
							 
						 
					
						
							
								
									
										
										
										
											2010-02-24 23:28:01 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2010-02-22 09:43:27 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-01-13 13:43:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    function  ensureProfiles () 
							 
						 
					
						
							
								
									
										
										
										
											2010-02-18 06:36:32 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-10 02:07:39 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        try  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-13 13:43:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            $this -> oprofile  =  Ostatus_profile :: getActorProfile ( $this -> activity ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( ! $this -> oprofile  instanceof  Ostatus_profile )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                throw  new  UnknownUriException ( $this -> activity -> actor -> id ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-10 02:07:39 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        }  catch  ( UnknownUriException  $e )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            // Apparently we didn't find the Profile object based on our URI,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            // so OStatus doesn't have it with this URI in ostatus_profile.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            // Try to look it up again, remote side may have changed from http to https
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            // or maybe publish an acct: URI now instead of an http: URL.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            //
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            // Steps:
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            // 1. Check the newly received URI. Who does it say it is?
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            // 2. Compare these alleged identities to our local database.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            // 3. If we found any locally stored identities, ask it about its aliases.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            // 4. Do any of the aliases from our known identity match the recently introduced one?
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            //
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            // Example: We have stored http://example.com/user/1 but this URI says https://example.com/user/1
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            common_debug ( 'No local Profile object found for a magicsigned activity author URI: ' . $e -> object_uri ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            $disco  =  new  Discovery (); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            $xrd  =  $disco -> lookup ( $e -> object_uri ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            // Step 1: We got a bunch of discovery data for https://example.com/user/1 which includes
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            //         aliases https://example.com/user and hopefully our original http://example.com/user/1 too
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            $all_ids  =  array_merge ( array ( $xrd -> subject ),  $xrd -> aliases ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( ! in_array ( $e -> object_uri ,  $all_ids ))  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                common_debug ( 'The activity author URI we got was not listed itself when doing discovery on it.' ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                throw  $e ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
									
										
										
										
											2010-02-18 06:36:32 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-01-10 02:07:39 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            // Go through each reported alias from lookup to see if we know this already
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            foreach  ( $all_ids  as  $aliased_uri )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                $oprofile  =  Ostatus_profile :: getKV ( 'uri' ,  $aliased_uri ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  ( ! $oprofile  instanceof  Ostatus_profile )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    continue ;    // unknown locally, check the next alias
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                // Step 2: We found the alleged http://example.com/user/1 URI in our local database,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                //         but this can't be trusted yet because anyone can publish any alias.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                common_debug ( 'Found a local Ostatus_profile for "' . $e -> object_uri . '" with this URI: ' . $aliased_uri ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                // We found an existing OStatus profile, but is it really the same? Do a callback to the URI's origin
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                // Step 3: lookup our previously known http://example.com/user/1 webfinger etc.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                $xrd  =  $disco -> lookup ( $oprofile -> getUri ());  // getUri returns ->uri, which we filtered on earlier
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                $doublecheck_aliases  =  array_merge ( array ( $xrd -> subject ),  $xrd -> aliases ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                common_debug ( 'Trying to match known "' . $aliased_uri . '" against its returned aliases: ' . implode ( ' ' ,  $doublecheck_aliases )); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                // if we find our original URI here, it is a legitimate alias
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                // Step 4: Is the newly introduced https://example.com/user/1 URI in the list of aliases
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                //         presented by http://example.com/user/1 (i.e. do they both say they are the same identity?)
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  ( in_array ( $e -> object_uri ,  $doublecheck_aliases ))  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-11 19:46:01 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    $oprofile -> updateUriKeys ( $e -> object_uri ,  DiscoveryHints :: fromXRD ( $xrd )); 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-13 13:43:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    $this -> oprofile  =  $oprofile ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-10 02:07:39 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    break ;   // don't iterate through aliases anymore
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-13 13:43:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            // We might end up here after $all_ids is iterated through without a $this->oprofile value,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( ! $this -> oprofile  instanceof  Ostatus_profile )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                common_debug ( " We do not have a local profile to connect to this activity's author. Let's create one. " ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                // ensureActivityObjectProfile throws exception on failure
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                $this -> oprofile  =  Ostatus_profile :: ensureActivityObjectProfile ( $this -> activity -> actor ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-10 02:07:39 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-13 13:43:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        assert ( $this -> oprofile  instanceof  Ostatus_profile ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        $this -> actor  =  $this -> oprofile -> localProfile (); 
							 
						 
					
						
							
								
									
										
										
										
											2010-02-18 06:36:32 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-02-21 09:16:27 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    function  saveNotice () 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-13 13:43:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( ! $this -> oprofile  instanceof  Ostatus_profile )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-10-04 16:40:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            common_debug ( 'Ostatus_profile missing in '  .  get_class () .  ' profile: ' . var_export ( $this -> profile ,  true )); 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-13 13:43:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-12 02:01:26 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return  $this -> oprofile -> processPost ( $this -> activity ,  'salmon' ); 
							 
						 
					
						
							
								
									
										
										
										
											2010-02-21 09:16:27 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2010-02-09 15:37:37 -05:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}