diff --git a/.drone.yml b/.drone.yml index 945f522..2a41250 100644 --- a/.drone.yml +++ b/.drone.yml @@ -62,6 +62,10 @@ steps: CODEFIRST_CLIENTDRONE_ENV_SERVER_NAME: http://codefirst.iut.uca.fr CODEFIRST_CLIENTDRONE_ENV_CORS_ALLOW_ORIGIN: https://codefirst.iut.uca.fr CODEFIRST_CLIENTDRONE_ENV_TRUSTED_PROXIES: REMOTE_ADDR + CODEFIRST_CLIENTDRONE_ENV_API_USER_SIGHT_ENGINE: + from_secret: API_USER_SIGHT_ENGINE + CODEFIRST_CLIENTDRONE_ENV_API_KEY_SIGHT_ENGINE: + from_secret: API_KEY_SIGHT_ENGINE depends_on: - docker-image when: diff --git a/composer.json b/composer.json index a1ab52a..eddf999 100644 --- a/composer.json +++ b/composer.json @@ -47,8 +47,7 @@ "symfonycasts/verify-email-bundle": "^1.17", "twig/extra-bundle": "^2.12|^3.0", "twig/twig": "^2.12|^3.0", - "vich/uploader-bundle": "^2.3", - "ext-curl": "*" + "vich/uploader-bundle": "^2.3" }, "config": { "allow-plugins": { diff --git a/config/services.yaml b/config/services.yaml index 23571ef..f07d469 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -6,7 +6,6 @@ parameters: trusted_proxies: '%env(TRUSTED_PROXIES)%' env(TRUSTED_PROXIES): 127.0.0.1 - app.API_KEY_SIGHT_ENGINE: '%env(API_KEY_SIGHT_ENGINE)%' services: # default configuration for services in *this* file @@ -27,5 +26,11 @@ services: bind: $processor: '@api_platform.doctrine.orm.state.persist_processor' + App\Service\ImageSafetyServiceInterface: '@App\Service\DummyImageSafetyService' + # add more service definitions when explicit configuration is needed # please note that last definitions always *replace* previous ones + +when@prod: + services: + App\Service\ImageSafetyServiceInterface: '@App\Service\SightEngineImageSafetyService' diff --git a/src/Controller/PostController.php b/src/Controller/PostController.php index 07ff2aa..af3d395 100644 --- a/src/Controller/PostController.php +++ b/src/Controller/PostController.php @@ -8,11 +8,8 @@ use App\Entity\User; use App\Form\CommentType; use App\Form\PostType; use App\Repository\PostRepository; -use App\Security\Moderation\Moderation; -use CURLFile; use Doctrine\ORM\EntityManagerInterface; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; -use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Attribute\Route; @@ -48,19 +45,15 @@ class PostController extends AbstractController #[Route('/post/new', name: 'app_post_new', methods: ['GET', 'POST'])] #[IsGranted('ROLE_USER')] - public function new(Request $request, EntityManagerInterface $entityManager, ParameterBagInterface $env): Response + public function new(Request $request, EntityManagerInterface $entityManager): Response { $post = new Post(); $form = $this->createForm(PostType::class, $post); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { - $api_key = $this->getParameter('app.API_KEY_SIGHT_ENGINE'); - $moderation = new Moderation($api_key); - if($moderation->valide($post->getImageFile()->getRealPath())){ - $entityManager->persist($post); - $entityManager->flush(); - } + $entityManager->persist($post); + $entityManager->flush(); return $this->redirectToRoute('app_posts', [], Response::HTTP_SEE_OTHER); } diff --git a/src/Entity/Post.php b/src/Entity/Post.php index 1ec9f69..fa0217a 100644 --- a/src/Entity/Post.php +++ b/src/Entity/Post.php @@ -8,6 +8,7 @@ use ApiPlatform\Metadata\ApiProperty; use ApiPlatform\Metadata\ApiResource; use ApiPlatform\Metadata\GetCollection; use App\Repository\PostRepository; +use App\Validator\ImageSafety; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\Collection; use Doctrine\DBAL\Types\Types; @@ -64,6 +65,7 @@ class Post #[Vich\UploadableField(mapping: 'posts', fileNameProperty: 'image')] #[Assert\Image] + #[ImageSafety] private ?File $imageFile = null; #[ORM\Column(type: Types::TEXT)] @@ -184,6 +186,9 @@ class Post public function setImageFile(?File $imageFile): static { $this->imageFile = $imageFile; + if ($imageFile !== null) { + $this->updatedAt = new \DateTimeImmutable(); + } return $this; } diff --git a/src/Form/PostType.php b/src/Form/PostType.php index d384eb3..e32a849 100644 --- a/src/Form/PostType.php +++ b/src/Form/PostType.php @@ -21,7 +21,9 @@ class PostType extends AbstractType ->add('latitude') ->add('longitude') ->add('altitude') - ->add('imageFile', FileType::class) + ->add('imageFile', FileType::class, [ + 'required' => false, + ]) ->add('commentary') ->add('species', EntityType::class, [ 'class' => Species::class, diff --git a/src/Security/Moderation/Moderation.php b/src/Security/Moderation/Moderation.php deleted file mode 100644 index 751c15e..0000000 --- a/src/Security/Moderation/Moderation.php +++ /dev/null @@ -1,39 +0,0 @@ -api_key = $api_key; - } - - public function valide($file_image) - { - $params_api = array( - 'media' => new CurlFile($file_image), - 'models' => 'nudity-2.1', - 'api_user' => '26959338', - 'api_secret' => $this->api_key, - ); - - $ch = curl_init('https://api.sightengine.com/1.0/check.json'); - curl_setopt($ch, CURLOPT_POST, true); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - curl_setopt($ch, CURLOPT_POSTFIELDS, $params_api); - $response = curl_exec($ch); - curl_close($ch); - - $output = json_decode($response, true); - - $score_nudity = $output["nudity"]; - return $score_nudity["sexual_activity"] < 0.8 && - $score_nudity["sexual_display"] < 0.8 && - $score_nudity["erotica"] < 0.8; - } -} \ No newline at end of file diff --git a/src/Service/DummyImageSafetyService.php b/src/Service/DummyImageSafetyService.php new file mode 100644 index 0000000..56f7f25 --- /dev/null +++ b/src/Service/DummyImageSafetyService.php @@ -0,0 +1,13 @@ +getRealPath(), 'r'); + $response = $this->client->request('POST', 'https://api.sightengine.com/1.0/check.json', [ + 'body' => [ + 'media' => $handle, + 'models' => 'nudity-2.1', + 'api_user' => $this->apiUser, + 'api_secret' => $this->apiKey, + ], + ]); + fclose($handle); + + $output = $response->toArray(); + $scoreNudity = $output['nudity']; + + return $scoreNudity['sexual_activity'] < 0.8 && + $scoreNudity['sexual_display'] < 0.8 && + $scoreNudity['erotica'] < 0.8; + } +} diff --git a/src/Validator/ImageSafety.php b/src/Validator/ImageSafety.php new file mode 100644 index 0000000..0815de0 --- /dev/null +++ b/src/Validator/ImageSafety.php @@ -0,0 +1,15 @@ +imageSafetyService->isValid($value)) { + $this->context->buildViolation($constraint->message)->addViolation(); + } + } +}