Commit 60912b5a authored by Bertrand Gauthier's avatar Bertrand Gauthier
Browse files

AJout des partials 'table' et 'add-button' ; calcul de l'URL de la page...

AJout des partials 'table' et 'add-button' ; calcul de l'URL de la page d'authentification avec un jeton
parent 678e258c
Loading
Loading
Loading
Loading
Loading
+34 −12
Original line number Diff line number Diff line
@@ -3,6 +3,7 @@
namespace UnicaenAuthToken\Controller;

use InvalidArgumentException;
use UnicaenApp\Mvc\RedirectResponse;
use UnicaenAuth\Controller\AuthController;
use UnicaenAuth\Entity\Db\UserInterface;
use UnicaenAuth\Service\Traits\UserServiceAwareTrait;
@@ -25,11 +26,27 @@ class TokenController extends AbstractActionController
    use TokenServiceAwareTrait;
    use UserServiceAwareTrait;

    const PROLONG_SPEC = '+1 week';
    const PROLONG_SPEC_TOSTRING = '1 semaine';

    /**
     * @var UserTokenForm
     */
    protected $form;

    /**
     * @var RedirectResponse
     */
    private $redirectResponse;

    /**
     * @param RedirectResponse $redirectResponse
     */
    public function setRedirectResponse(RedirectResponse $redirectResponse)
    {
        $this->redirectResponse = $redirectResponse;
    }

    /**
     * @param \UnicaenAuthToken\Form\UserTokenForm $form
     */
@@ -41,6 +58,7 @@ class TokenController extends AbstractActionController
    public function indexAction(): array
    {
        $userTokens = $this->tokenService->findAllUserToken();
        $this->tokenService->injectLogInUriInUserTokens($userTokens);

        return [
            'paginator' => $userTokens,
@@ -52,7 +70,6 @@ class TokenController extends AbstractActionController
     */
    public function creerAction()
    {
        $redirect = $this->params()->fromQuery('redirect', 'unicaen-auth-token/token');
        $userId = $this->params('user');

        try {
@@ -88,7 +105,9 @@ class TokenController extends AbstractActionController
                        $userToken->getExpiredOnToString()
                    ));

                    return $this->redirect()->toRoute($redirect);
                    $redirectCallback = $this->redirectResponse;

                    return $redirectCallback('unicaen-auth-token/token');

                } catch (TokenServiceException $e) {
                    $message = "La création du token a échoué. ";
@@ -113,7 +132,6 @@ class TokenController extends AbstractActionController

    public function modifierAction()
    {
        $redirect = $this->params()->fromQuery('redirect', 'unicaen-auth-token/token');
        $userToken = $this->getRequestedUserToken();

        $this->form->bind($userToken);
@@ -130,7 +148,9 @@ class TokenController extends AbstractActionController
                        $userToken->getUserId()
                    ));

                    return $this->redirect()->toRoute($redirect);
                    $redirectCallback = $this->redirectResponse;

                    return $redirectCallback('unicaen-auth-token/token');

                } catch (TokenServiceException $e) {
                    $message = "La modification du token a échoué. ";
@@ -155,8 +175,6 @@ class TokenController extends AbstractActionController

    public function supprimerAction(): Response
    {
        $redirect = $this->params()->fromQuery('redirect', 'unicaen-auth-token/token');

        $userToken = $this->getRequestedUserToken();
        try {
            $this->tokenService->deleteUserToken($userToken);
@@ -167,15 +185,15 @@ class TokenController extends AbstractActionController
            throw new InvalidArgumentException("Impossible de prolonger le jeton utilisateur spécifié.");
        }

        return $this->redirect()->toRoute($redirect);
        $redirectCallback = $this->redirectResponse;

        return $redirectCallback('unicaen-auth-token/token');
    }

    public function prolongerAction(): Response
    {
        $redirect = $this->params()->fromQuery('redirect', 'unicaen-auth-token/token');

        $userToken = $this->getRequestedUserToken();
        $userToken->modifyExpiredOn('+1 day');
        $userToken->prolongate();
        try {
            $this->tokenService->saveUserToken($userToken);

@@ -186,7 +204,9 @@ class TokenController extends AbstractActionController
            throw new InvalidArgumentException("Impossible de prolonger le jeton utilisateur spécifié.");
        }

        return $this->redirect()->toRoute($redirect);
        $redirectCallback = $this->redirectResponse;

        return $redirectCallback('unicaen-auth-token/token');
    }

    public function testerAction(): Response
@@ -194,7 +214,9 @@ class TokenController extends AbstractActionController
        $userToken = $this->getRequestedUserToken();
        $this->forward()->dispatch(AuthController::class, ['action' => 'logout']);

        return $this->redirect()->toRoute('zfcuser/login', ['type' => 'token'], ['query' => ['token' => $userToken->getToken()]]);
        $this->tokenService->injectLogInUriInUserTokens([$userToken]);

        return $this->redirect()->toUrl($userToken->getLogInUri()->toString());
    }

    /**
+5 −0
Original line number Diff line number Diff line
@@ -3,6 +3,7 @@
namespace UnicaenAuthToken\Controller;

use Interop\Container\ContainerInterface;
use UnicaenApp\Mvc\RedirectResponse;
use UnicaenAuth\Service\User as UserService;
use UnicaenAuthToken\Form\UserTokenForm;
use UnicaenAuthToken\Service\TokenService;
@@ -23,6 +24,10 @@ class TokenControllerFactory
        $form = $container->get('FormElementManager')->get(UserTokenForm::class);
        $controller->setForm($form);

        /* @var RedirectResponse $redirectResponse */
        $redirectResponse = $container->get(RedirectResponse::class);
        $controller->setRedirectResponse($redirectResponse);

        return $controller;
    }
}
 No newline at end of file
+72 −0
Original line number Diff line number Diff line
@@ -5,8 +5,11 @@ namespace UnicaenAuthToken\Entity\Db;
use Application\Constants;
use DateTime;
use InvalidArgumentException;
use LogicException;
use UnicaenAuth\Entity\Db\UserInterface;
use UnicaenAuthToken\Service\TokenService;
use Zend\Permissions\Acl\Resource\ResourceInterface;
use Zend\Uri\Uri;

abstract class AbstractUserToken implements ResourceInterface
{
@@ -62,6 +65,11 @@ abstract class AbstractUserToken implements ResourceInterface
     */
    protected $user;

    /**
     * @var \Zend\Uri\Uri|null
     */
    protected $logInUri;

    /**
     * AbstractUserToken constructor.
     */
@@ -81,6 +89,46 @@ abstract class AbstractUserToken implements ResourceInterface
        return self::RESOURCE_ID;
    }

    /**
     * @return \Zend\Uri\Uri
     */
    public function getLogInUri(): Uri
    {
        if ($this->logInUri === null) {
            throw new LogicException(sprintf(
                "Impossible d'appeler la méthode %s si l'URI d'authentification n'est pas au préalable injectée dans l'entité (cf. %s).",
                __METHOD__,
                TokenService::class
            ));
        }

        return $this->logInUri;
    }

    /**
     * @param string $redirect
     * @return \Zend\Uri\Uri|null
     */
    public function getLogInUriWithRedirect(string $redirect): ?Uri
    {
        $uri = $this->getLogInUri();
        $uriQuery = $uri->getQueryAsArray();
        $uriQuery['redirect'] = $redirect;
        $uri->setQuery($uriQuery);

        return $uri;
    }

    /**
     * @param Uri $logInUri
     * @return self
     */
    public function setLogInUri(Uri $logInUri): self
    {
        $this->logInUri = $logInUri;
        return $this;
    }

    /**
     * @return int|null
     */
@@ -308,6 +356,30 @@ abstract class AbstractUserToken implements ResourceInterface
        return $this;
    }

    /**
     * @return string
     */
    public function getDefaultProlongationSpec(): string
    {
        return '+1 week';
    }

    /**
     * @return string
     */
    public function getDefaultProlongationSpecToString(): string
    {
        return '1 semaine';
    }

    /**
     * @return self
     */
    public function prolongate(): self
    {
        return $this->modifyExpiredOn($this->getDefaultProlongationSpec());
    }

    /**
     * @param string $spec Ex: '+1 day', '+1 hour'
     * @return self
+2 −0
Original line number Diff line number Diff line
@@ -27,6 +27,8 @@ class UserTokenForm extends Form implements InputFilterProviderInterface
        '+2 days' => '2 jours',
        '+1 week' => '1 semaine',
        '+2 weeks' => '2 semaines',
        '+1 month' => '1 mois',
        '+2 months' => '2 mois',
    ];

    /**
+53 −11
Original line number Diff line number Diff line
@@ -10,6 +10,8 @@ use Exception;
use Ramsey\Uuid\Uuid;
use UnicaenAuthToken\Entity\Db\AbstractUserToken;
use UnicaenAuthToken\Options\ModuleOptionsAwareTrait;
use Zend\Router\RouteInterface;
use Zend\Uri\Uri;

class TokenService
{
@@ -33,6 +35,19 @@ class TokenService
        $this->entityManager = $entityManager;
    }

    /**
     * @var \Zend\Router\RouteInterface
     */
    protected $router;

    /**
     * @param \Zend\Router\RouteInterface $router
     */
    public function setRouter(RouteInterface $router)
    {
        $this->router = $router;
    }

    protected function getRepository(): EntityRepository
    {
        return $this->entityManager->getRepository($this->moduleOptions->getUserTokenEntityClass());
@@ -100,7 +115,7 @@ class TokenService
    public function findUserTokenByUserId(int $userId): ?AbstractUserToken
    {
        /** @var AbstractUserToken $userToken */
        $userToken = $this->getRepository()->findOneBy(['userId' => $userId]);
        $userToken = $this->getRepository()->findOneBy(['userId' => $userId], ['createdOn' => 'ASC']);

        return $userToken;
    }
@@ -117,8 +132,7 @@ class TokenService
            ->orderBy('token.expiredOn', 'DESC')
        ;

        $result = $qb->getQuery()->getResult();
        return $result;
        return $qb->getQuery()->getResult();
    }

    /**
@@ -154,13 +168,41 @@ class TokenService
     */
    public function generateUuid(): string
    {
        $uuid = Uuid::uuid4();

        // NB: la date de fin de vie du token est concaténée à la fin.
        return
            $uuid->toString() .
            self::PASSWORD_RESET_TOKEN_SEP .
            date(self::PASSWORD_RESET_TOKEN_DATE_FORMAT, time() + 3600 * 24);
        // durée de vie = 24h
        return Uuid::uuid4()->toString();
    }

    /**
     * Calcule l'{@see Uri} de la page permettant de s'authentifier avec le jeton utilisateur spécifié.
     *
     * @param \UnicaenAuthToken\Entity\Db\AbstractUserToken $userToken
     * @return \Zend\Uri\Uri
     */
    private function computeLogInUriForUserToken(AbstractUserToken $userToken): Uri
    {
        $redirect = null;

        $query = array_filter([
            'token' => $userToken->getToken(),
            'redirect' => $redirect,
        ]);

        $redirectUrl = $this->router->assemble(['type' => 'token'], [
            'name' => 'zfcuser/login',
            'query' => $query,
            'force_canonical' => true,
        ]);

        return new Uri($redirectUrl);
    }

    /**
     * @param AbstractUserToken[] $userTokens
     */
    public function injectLogInUriInUserTokens(array $userTokens)
    {
        foreach ($userTokens as $userToken) {
            $uri = $this->computeLogInUriForUserToken($userToken);
            $userToken->setLogInUri($uri);
        }
    }
}
 No newline at end of file
Loading