<?php
namespace Diplix\KMGBundle\Controller\Service;
use Cocur\Slugify\Slugify;
use Diplix\KMGBundle\Entity\User;
use Diplix\KMGBundle\Repository\UserRepository;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\Security\Core\Encoder\EncoderFactoryInterface;
use Symfony\Component\Security\Core\Exception\AuthenticationException;
class ServiceBaseController extends \Symfony\Bundle\FrameworkBundle\Controller\AbstractController
{
const DATE_FORMAT = "Y-m-d H:i O";
/**
* @var User
*/
protected $user = null;
/**
* @var UserRepository
*/
protected $userRepo;
public function __construct(
protected UserPasswordHasherInterface $hasher,
private readonly \Doctrine\Persistence\ManagerRegistry $managerRegistry
)
{
}
protected function loadUser($userName, $password,$checkMembership)
{
try
{
/** @var UserRepository $ur */
$this->userRepo = $this->managerRegistry->getRepository(User::class);
/** @var User $U */
$U = $this->userRepo->loadUserByUsername($userName,true);
if (!$this->hasher->isPasswordValid($U, $password))
{
throw new \RuntimeException("Ungültiges Passwort.");
}
if ($checkMembership)
{
if ($U->getMember()===null)
{
throw new \RuntimeException("Keine Mitgliedschaft zugeordnet.");
}
}
$this->user = $U;
}
catch (\Throwable $ex)
{
throw new AccessDeniedHttpException("Ungültige Zugangsdaten.".$ex->getMessage(),$ex);
}
}
protected function parseRequest(Request $request)
{
$data = [];
$contentType = $request->headers->get('Content-Type');
if ( (0 === strpos($contentType, 'application/json'))
||
(0 === strpos($contentType, 'text/json'))
)
{
$data = json_decode($request->getContent(), true);
if ($data === null) $data = [];
}
else if (0 === strpos($contentType,'multipart/form-data'))
{
$data = $request->request->all();
}
else
{
throw new AccessDeniedHttpException("Falscher Content-Type (".$contentType.")");
}
if ((!array_key_exists("login",$data))||(!array_key_exists("password",$data)))
{
throw new AccessDeniedHttpException("Fehlende Zugangsdaten.");
}
return $data;
}
protected function arrGet($arr, $key, $default=null)
{
if (array_key_exists($key,$arr)) return $arr[$key];
return $default;
}
// todo: remove duplicate code (BaseController)
protected function getDownloadResponse($fullPathToFile,$fileName)
{
// @see http://stackoverflow.com/questions/25680932/symfony2-file-download-and-the-filename-fallback-must-only-contain-ascii-char
// @see https://github.com/symfony/symfony/issues/9093
$sl = new Slugify();
// $fnFallback = $sl->slugify($fileName); // need to provide a ascii fallback for filename to be http conform
// need to provide a ascii fallback for filename to be http conform -> but keep extension dot
$fnFallback = $sl->slugify( substr($fileName,0,strrpos($fileName,'.')-1) )
.'.'
. $sl->slugify( substr($fileName,strrpos($fileName,'.')+1) );
$br = new BinaryFileResponse($fullPathToFile, 200, array(), true);
$br->setContentDisposition(
ResponseHeaderBag::DISPOSITION_ATTACHMENT,
$fileName, // or '' to guess the file name from $file
$fnFallback
);
return $br;
}
}