2021-09-06 02:25:53 +09:00
< ? php
2021-10-10 17:26:18 +09:00
declare ( strict_types = 1 );
2021-09-06 02:25:53 +09: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-17 04:36:17 +09:00
use App\Entity\Actor ;
2021-09-06 02:25:53 +09:00
use App\Entity\Note ;
use App\Util\Common ;
use App\Util\Exception\ClientException ;
use App\Util\Exception\InvalidFormException ;
2021-09-07 03:49:03 +09:00
use App\Util\Exception\NoSuchNoteException ;
2021-09-06 02:25:53 +09:00
use App\Util\Exception\RedirectException ;
2021-11-17 04:36:17 +09:00
use Component\Posting\Posting ;
use Plugin\Reply\Entity\NoteReply ;
2021-09-06 02:25:53 +09: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-17 04:36:17 +09:00
*
* @ throws \App\Util\Exception\NoLoggedInUser
* @ throws \App\Util\Exception\ServerException
* @ throws ClientException
* @ throws InvalidFormException
* @ throws NoSuchNoteException
* @ throws RedirectException
*
* @ return array
2021-09-06 02:25:53 +09:00
*/
2021-11-07 10:32:06 +09:00
public function replyAddNote ( Request $request , int $id )
2021-09-06 02:25:53 +09:00
{
$user = Common :: ensureLoggedIn ();
$actor_id = $user -> getId ();
2021-11-07 10:32:06 +09:00
$note = Note :: getWithPK ( $id );
2021-11-17 04:36:17 +09:00
if ( \is_null ( $note ) || ! $note -> isVisibleTo ( $user )) {
2021-09-06 02:25:53 +09:00
throw new NoSuchNoteException ();
}
$form = Form :: create ([
2021-11-17 04:36:17 +09:00
[ 'content' , TextareaType :: class , [
2021-09-09 11:46:30 +09:00
'label' => _m ( 'Reply' ),
'label_attr' => [ 'class' => 'section-form-label' ],
'help' => _m ( 'Please input your reply.' ),
],
2021-09-07 04:51:12 +09:00
],
2021-11-17 04:36:17 +09:00
[ 'attachments' , FileType :: class , [ 'label' => ' ' , 'multiple' => true , 'required' => false ]],
[ 'replyform' , SubmitType :: class , [ 'label' => _m ( 'Submit' )]],
2021-09-06 02:25:53 +09:00
]);
$form -> handleRequest ( $request );
if ( $form -> isSubmitted ()) {
$data = $form -> getData ();
if ( $form -> isValid ()) {
2021-11-07 10:32:06 +09:00
// Create a new note with the same content as the original
$reply = Posting :: storeLocalNote (
actor : Actor :: getWithPK ( $actor_id ),
2021-09-09 11:46:30 +09:00
content : $data [ 'content' ],
2021-09-14 21:40:50 +09:00
content_type : 'text/plain' , // TODO
2021-09-09 11:46:30 +09:00
attachments : $data [ 'attachments' ],
2021-09-06 02:25:53 +09:00
);
2021-11-07 10:32:06 +09:00
// Update DB
2021-11-17 04:36:17 +09:00
DB :: persist ( $reply );
2021-11-07 10:32:06 +09:00
DB :: flush ();
// Find the id of the note we just created
$reply_id = $reply -> getId ();
2021-11-17 04:36:17 +09:00
$og_id = $note -> getId ();
2021-11-07 10:32:06 +09:00
// Add it to note_repeat table
2021-11-17 04:36:17 +09:00
if ( ! \is_null ( $reply_id )) {
2021-11-07 10:32:06 +09:00
DB :: persist ( NoteReply :: create ([
2021-11-17 04:36:17 +09:00
'note_id' => $reply_id ,
2021-11-07 10:32:06 +09:00
'actor_id' => $actor_id ,
2021-11-17 04:36:17 +09:00
'reply_to' => $og_id ,
2021-11-07 10:32:06 +09:00
]));
}
// Update DB one last time
DB :: flush ();
2021-11-17 04:36:17 +09:00
// Redirect user to where they came from
// Prevent open redirect
if ( \array_key_exists ( 'from' , ( array ) $get_params = $this -> params ())) {
2021-11-07 10:32:06 +09: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-06 02:25:53 +09:00
throw new ClientException ( _m ( 'Can not redirect to outside the website from here' ), 400 ); // 400 Bad request (deceptive)
} else {
2021-11-17 04:36:17 +09:00
// TODO anchor on element id
2021-11-07 10:32:06 +09:00
throw new RedirectException ( $get_params [ 'from' ]);
2021-09-06 02:25:53 +09:00
}
} else {
2021-11-17 04:36:17 +09:00
// If we don't have a URL to return to, go to the instance root
throw new RedirectException ( 'root' );
2021-09-06 02:25:53 +09:00
}
} else {
throw new InvalidFormException ();
}
}
return [
2021-11-07 10:32:06 +09:00
'_template' => 'reply/add_reply.html.twig' ,
2021-09-06 02:25:53 +09:00
'note' => $note ,
2021-11-07 10:32:06 +09:00
'add_reply' => $form -> createView (),
2021-09-06 02:25:53 +09:00
];
}
}