2021-09-05 18:25:53 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								< ? php 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-10 09:26:18 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								declare ( strict_types  =  1 ); 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-05 18:25:53 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								// {{{ License
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// 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/>.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// }}}
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								/** 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								 *  @ author     Hugo  Sales  < hugo @ hsal . es > 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								 *  @ copyright  2021  Free  Software  Foundation ,  Inc  http :// www . fsf . org 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								 *  @ license    https :// www . gnu . org / licenses / agpl . html  GNU  AGPL  v3  or  later 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								namespace  Plugin\Reply\Controller ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								use  App\Core\Controller ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								use  App\Core\DB\DB ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								use  App\Core\Form ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								use  function  App\Core\I18n\_m ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								use  App\Core\Log ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								use  App\Core\Router\Router ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-16 19:36:17 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								use  App\Entity\Actor ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-05 18:25:53 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								use  App\Entity\Note ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								use  App\Util\Common ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								use  App\Util\Exception\ClientException ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								use  App\Util\Exception\InvalidFormException ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-06 19:49:03 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								use  App\Util\Exception\NoSuchNoteException ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-05 18:25:53 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								use  App\Util\Exception\RedirectException ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-16 19:36:17 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								use  Component\Posting\Posting ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								use  Plugin\Reply\Entity\NoteReply ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-05 18:25:53 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								use  Symfony\Component\Form\Extension\Core\Type\FileType ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								use  Symfony\Component\Form\Extension\Core\Type\SubmitType ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								use  Symfony\Component\Form\Extension\Core\Type\TextareaType ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								use  Symfony\Component\HttpFoundation\Request ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								class  Reply  extends  Controller 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    /** 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								     *  Controller  for  the  note  reply  non - JS  page 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-16 19:36:17 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								     * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								     *  @ throws  \App\Util\Exception\NoLoggedInUser 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								     *  @ throws  \App\Util\Exception\ServerException 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								     *  @ throws  ClientException 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								     *  @ throws  InvalidFormException 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								     *  @ throws  NoSuchNoteException 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								     *  @ throws  RedirectException 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								     * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								     *  @ return  array 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-05 18:25:53 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								     */ 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-07 01:32:06 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    public  function  replyAddNote ( Request  $request ,  int  $id ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-05 18:25:53 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        $user      =  Common :: ensureLoggedIn (); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        $actor_id  =  $user -> getId (); 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-07 01:32:06 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        $note  =  Note :: getWithPK ( $id ); 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-16 19:36:17 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        if  ( \is_null ( $note )  ||  ! $note -> isVisibleTo ( $user ))  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-05 18:25:53 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								            throw  new  NoSuchNoteException (); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        $form  =  Form :: create ([ 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-16 19:36:17 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            [ 'content' ,  TextareaType :: class ,  [ 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-09 03:46:30 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                'label'       =>  _m ( 'Reply' ), 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                'label_attr'  =>  [ 'class'  =>  'section-form-label' ], 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                'help'        =>  _m ( 'Please input your reply.' ), 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            ], 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-06 20:51:12 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            ], 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-16 19:36:17 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            [ 'attachments' ,  FileType :: class ,  [ 'label'  =>  ' ' ,  'multiple'  =>  true ,  'required'  =>  false ]], 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            [ 'replyform' ,  SubmitType :: class ,  [ 'label'  =>  _m ( 'Submit' )]], 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-05 18:25:53 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								        ]); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        $form -> handleRequest ( $request ); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        if  ( $form -> isSubmitted ())  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            $data  =  $form -> getData (); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            if  ( $form -> isValid ())  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-07 01:32:06 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                // Create a new note with the same content as the original
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                $reply  =  Posting :: storeLocalNote ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                    actor :  Actor :: getWithPK ( $actor_id ), 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-09 03:46:30 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                    content :  $data [ 'content' ], 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-14 13:40:50 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                    content_type :  'text/plain' ,  // TODO
 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-09 03:46:30 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                    attachments :  $data [ 'attachments' ], 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-05 18:25:53 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								                ); 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-07 01:32:06 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                // Update DB
 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-16 19:36:17 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                DB :: persist ( $reply ); 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-07 01:32:06 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                DB :: flush (); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                // Find the id of the note we just created
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                $reply_id  =  $reply -> getId (); 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-16 19:36:17 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                $og_id     =  $note -> getId (); 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-07 01:32:06 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                // Add it to note_repeat table
 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-16 19:36:17 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                if  ( ! \is_null ( $reply_id ))  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-07 01:32:06 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                    DB :: persist ( NoteReply :: create ([ 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-16 19:36:17 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                        'note_id'   =>  $reply_id , 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-07 01:32:06 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                        'actor_id'  =>  $actor_id , 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-16 19:36:17 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                        'reply_to'  =>  $og_id , 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-07 01:32:06 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                    ])); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                // Update DB one last time
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                DB :: flush (); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-11-16 19:36:17 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                // Redirect user to where they came from
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                // Prevent open redirect
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                if  ( \array_key_exists ( 'from' ,  ( array )  $get_params  =  $this -> params ()))  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-07 01:32:06 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                    if  ( Router :: isAbsolute ( $get_params [ 'from' ]))  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                        Log :: warning ( " Actor  { $actor_id }  attempted to reply to a note and then get redirected to another host, or the URL was invalid ( { $get_params [ 'from' ] } ) " ); 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-05 18:25:53 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								                        throw  new  ClientException ( _m ( 'Can not redirect to outside the website from here' ),  400 );  // 400 Bad request (deceptive)
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                    }  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-16 19:36:17 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                        // TODO anchor on element id
 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-07 01:32:06 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                        throw  new  RedirectException ( $get_params [ 'from' ]); 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-05 18:25:53 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								                    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                }  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-16 19:36:17 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                    // If we don't have a URL to return to, go to the instance root
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                    throw  new  RedirectException ( 'root' ); 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-05 18:25:53 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            }  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                throw  new  InvalidFormException (); 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return  [ 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-07 01:32:06 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            '_template'  =>  'reply/add_reply.html.twig' , 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-05 18:25:53 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								            'note'       =>  $note , 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-07 01:32:06 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            'add_reply'  =>  $form -> createView (), 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-05 18:25:53 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								        ]; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								}