2009-10-02 17:23:48 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								< ? php  
						 
					
						
							
								
									
										
										
										
											2020-07-28 04:46:10 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// 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/>.
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2009-10-02 17:23:48 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								/**  
						 
					
						
							
								
									
										
										
										
											2020-07-28 04:46:10 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 *  Direct  messaging  implementation  for  GNU  social 
							 
						 
					
						
							
								
									
										
										
										
											2009-10-02 17:23:48 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
									
										
										
										
											2020-07-28 04:46:10 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 *  @ package    GNUsocial 
							 
						 
					
						
							
								
									
										
										
										
											2009-10-12 16:36:00 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 *  @ author     Adrian  Lang  < mail @ adrianlang . de > 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  @ author     Evan  Prodromou  < evan @ status . net > 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  @ author     Robin  Millette  < robin @ millette . info > 
							 
						 
					
						
							
								
									
										
										
										
											2009-10-02 17:23:48 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								 *  @ author     Zach  Copley  < zach @ status . net > 
							 
						 
					
						
							
								
									
										
										
										
											2020-07-28 04:46:10 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 *  @ copyright  2009 ,  2020  Free  Software  Foundation ,  Inc  http :// www . fsf . org 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  @ license    https :// www . gnu . org / licenses / agpl . html  GNU  AGPL  v3  or  later 
							 
						 
					
						
							
								
									
										
										
										
											2009-10-02 17:23:48 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-07-28 04:46:10 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								defined ( 'GNUSOCIAL' )  ||  die ();  
						 
					
						
							
								
									
										
										
										
											2009-10-02 17:23:48 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/**  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  Creates  a  new  direct  message  from  the  authenticating  user  to 
							 
						 
					
						
							
								
									
										
										
										
											2020-07-28 04:46:10 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 *  the  user  specified  by  id 
							 
						 
					
						
							
								
									
										
										
										
											2009-10-02 17:23:48 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
									
										
										
										
											2020-07-28 04:46:10 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 *  @ category  Plugin 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  @ package   GNUsocial 
							 
						 
					
						
							
								
									
										
										
										
											2009-10-12 16:36:00 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 *  @ author    Adrian  Lang  < mail @ adrianlang . de > 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  @ author    Evan  Prodromou  < evan @ status . net > 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  @ author    Robin  Millette  < robin @ millette . info > 
							 
						 
					
						
							
								
									
										
										
										
											2009-10-02 17:23:48 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								 *  @ author    Zach  Copley  < zach @ status . net > 
							 
						 
					
						
							
								
									
										
										
										
											2020-07-28 04:46:10 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 *  @ license   https :// www . gnu . org / licenses / agpl . html  GNU  AGPL  v3  or  later 
							 
						 
					
						
							
								
									
										
										
										
											2009-10-02 17:23:48 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								class  ApiDirectMessageNewAction  extends  ApiAuthAction  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2013-10-15 02:54:10 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    protected  $needPost  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-07-28 04:46:10 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    public  $other    =  null ;  // Profile we're sending to
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    public  $content  =  null ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-10-02 17:23:48 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /** 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  Take  arguments  for  running 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  @ param  array  $args  $_REQUEST  args 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  @ return  boolean  success  flag 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     */ 
							 
						 
					
						
							
								
									
										
										
										
											2020-07-28 04:46:10 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    protected  function  prepare ( array  $args  =  []) 
							 
						 
					
						
							
								
									
										
										
										
											2009-10-02 17:23:48 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        parent :: prepare ( $args ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-07-07 19:18:45 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( ! $this -> scoped  instanceof  Profile )  { 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-25 23:51:00 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            // TRANS: Client error when user not found for an API direct message action.
 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-15 02:54:10 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            $this -> clientError ( _ ( 'No such user.' ),  404 ); 
							 
						 
					
						
							
								
									
										
										
										
											2009-10-02 17:23:48 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        $this -> content  =  $this -> trimmed ( 'text' ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        $user_param   =  $this -> trimmed ( 'user' ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        $user_id      =  $this -> arg ( 'user_id' ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        $screen_name  =  $this -> trimmed ( 'screen_name' ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( isset ( $user_param )  ||  isset ( $user_id )  ||  isset ( $screen_name ))  { 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-29 20:37:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            $this -> other  =  $this -> getTargetProfile ( $user_param ); 
							 
						 
					
						
							
								
									
										
										
										
											2009-10-02 17:23:48 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /** 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  Handle  the  request 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  Save  the  new  message 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  @ return  void 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     */ 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-15 02:54:10 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    protected  function  handle () 
							 
						 
					
						
							
								
									
										
										
										
											2009-10-02 17:23:48 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-15 02:54:10 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        parent :: handle (); 
							 
						 
					
						
							
								
									
										
										
										
											2009-10-02 17:23:48 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( empty ( $this -> content ))  { 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-15 02:54:10 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            // TRANS: Client error displayed when no message text was submitted (406).
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            $this -> clientError ( _ ( 'No message text!' ),  406 ); 
							 
						 
					
						
							
								
									
										
										
										
											2009-10-02 17:23:48 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        }  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-02 10:56:44 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            $content_shortened  =  $this -> auth_user -> shortenLinks ( $this -> content ); 
							 
						 
					
						
							
								
									
										
										
										
											2020-07-29 17:50:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  ( MessageModel :: contentTooLong ( $content_shortened ))  { 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-15 02:54:10 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                // TRANS: Client error displayed when message content is too long.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                // TRANS: %d is the maximum number of characters for a message.
 
							 
						 
					
						
							
								
									
										
										
										
											2009-10-02 17:23:48 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                $this -> clientError ( 
							 
						 
					
						
							
								
									
										
										
										
											2020-07-29 17:50:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    sprintf ( _m ( 'That\'s too long. Maximum message size is %d character.' ,  'That\'s too long. Maximum message size is %d characters.' ,  MessageModel :: maxContent ()),  MessageModel :: maxContent ()), 
							 
						 
					
						
							
								
									
										
										
										
											2020-07-28 04:46:10 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    406 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ); 
							 
						 
					
						
							
								
									
										
										
										
											2009-10-02 17:23:48 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-04-29 20:37:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( ! $this -> other  instanceof  Profile )  { 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-16 14:38:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            // TRANS: Client error displayed if a recipient user could not be found (403).
 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-15 02:54:10 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            $this -> clientError ( _ ( 'Recipient user not found.' ),  403 ); 
							 
						 
					
						
							
								
									
										
										
										
											2020-07-29 17:50:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        }  elseif  ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            $this -> other -> isLocal () 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            &&  ! $this -> scoped -> mutuallySubscribed ( $this -> other ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        )  { 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-15 02:54:10 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            // TRANS: Client error displayed trying to direct message another user who's not a friend (403).
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            $this -> clientError ( _ ( 'Cannot send direct messages to users who aren\'t your friend.' ),  403 ); 
							 
						 
					
						
							
								
									
										
										
										
											2020-07-28 04:46:10 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        }  elseif  ( $this -> scoped -> getID ()  ===  $this -> other -> getID ())  { 
							 
						 
					
						
							
								
									
										
										
										
											2009-10-02 17:23:48 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            // Note: sending msgs to yourself is allowed by Twitter
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-10-16 14:38:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            // TRANS: Client error displayed trying to direct message self (403).
 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-15 02:54:10 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            $this -> clientError ( _ ( 'Do not send a message to yourself; just say it to yourself quietly instead.' ),  403 ); 
							 
						 
					
						
							
								
									
										
										
										
											2009-10-02 17:23:48 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-07-29 17:50:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        // push other profile to the content, it will be
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        // detected during Notice save
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( $this -> other -> isLocal ())  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            $this -> content  =  " @ { $this -> other -> getNickname () }   { $this -> content } " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        }  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            $this -> content  =  '@'  .  substr ( $this -> other -> getAcctUri (),  5 )  .  $this -> content ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        $message  =  MessageModel :: saveNew ( 
							 
						 
					
						
							
								
									
										
										
										
											2015-07-07 19:18:45 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            $this -> scoped -> getID (), 
							 
						 
					
						
							
								
									
										
										
										
											2020-07-29 17:50:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            $this -> content , 
							 
						 
					
						
							
								
									
										
										
										
											2009-10-02 17:23:48 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            $this -> source 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ); 
							 
						 
					
						
							
								
									
										
										
										
											2020-07-29 17:50:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        Event :: handle ( 'SendDirectMessage' ,  [ $message ]); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        mail_notify_message ( $message ); 
							 
						 
					
						
							
								
									
										
										
										
											2009-10-02 17:23:48 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( $this -> format  ==  'xml' )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            $this -> showSingleXmlDirectMessage ( $message ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        }  elseif  ( $this -> format  ==  'json' )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            $this -> showSingleJsondirectMessage ( $message ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}