Commit 81d5e165 authored by Bertrand Gauthier's avatar Bertrand Gauthier
Browse files

Modifications pour pouvoir fournir sa propre classe d'entité UserToken

parent c19f2988
Loading
Loading
Loading
Loading
Loading
+6 −4
Original line number Diff line number Diff line
@@ -4,12 +4,14 @@ namespace UnicaenAuthToken;

use Doctrine\Common\Persistence\Mapping\Driver\MappingDriverChain;
use Doctrine\ORM\Mapping\Driver\XmlDriver;
use UnicaenAuth\Entity\Db\User;
use UnicaenAuth\Guard\PrivilegeController;
use UnicaenAuth\Provider\Rule\PrivilegeRuleProvider;
use UnicaenAuthToken\Authentication\Adapter\TokenAdapter;
use UnicaenAuthToken\Authentication\Adapter\TokenAdapterFactory;
use UnicaenAuthToken\Controller\TokenController;
use UnicaenAuthToken\Controller\TokenControllerFactory;
use UnicaenAuthToken\Entity\Db\AbstractUserToken;
use UnicaenAuthToken\Entity\Db\UserToken;
use UnicaenAuthToken\Form\TokenLoginForm;
use UnicaenAuthToken\Form\TokenLoginFormFactory;
@@ -30,7 +32,7 @@ use Zend\Router\Http\Segment;
return [
    'unicaen-auth-token' => [
        /**
         * Classe d'entité Doctrine mappant un jeton utilistauer en base de données.
         * Classe d'entité Doctrine mappant un jeton utilisateur en base de données.
         */
        'user_token_entity_class' => UserToken::class,
    ],
@@ -80,7 +82,7 @@ return [
    'bjyauthorize' => [
        'resource_providers' => [
            'BjyAuthorize\Provider\Resource\Config' => [
                UserToken::RESOURCE_ID => [],
                AbstractUserToken::RESOURCE_ID => [],
            ],
        ],
        'rule_providers' => [
@@ -94,7 +96,7 @@ return [
                            TokenPrivilege::PROLONGER,
                            TokenPrivilege::TESTER,
                        ],
                        'resources' => UserToken::RESOURCE_ID,
                        'resources' => AbstractUserToken::RESOURCE_ID,
                    ],
                ],
            ],
@@ -204,7 +206,7 @@ return [
                            'creer' => [
                                'type' => Segment::class,
                                'options' => [
                                    'route' => '/creer[/:username]',
                                    'route' => '/creer[/:user]',
                                    'defaults' => [
                                        'action' => 'creer',
                                    ],
+1 −0
Original line number Diff line number Diff line
@@ -2,6 +2,7 @@

namespace UnicaenAuthToken;

use UnicaenAuth\Entity\Db\User;
use UnicaenAuthToken\Entity\Db\UserToken;

return [
+25 −23
Original line number Diff line number Diff line
@@ -6,7 +6,7 @@ use InvalidArgumentException;
use UnicaenAuth\Controller\AuthController;
use UnicaenAuth\Entity\Db\UserInterface;
use UnicaenAuth\Service\Traits\UserServiceAwareTrait;
use UnicaenAuthToken\Entity\Db\UserToken;
use UnicaenAuthToken\Entity\Db\AbstractUserToken;
use UnicaenAuthToken\Form\UserTokenForm;
use UnicaenAuthToken\Service\TokenServiceAwareTrait;
use UnicaenAuthToken\Service\TokenServiceException;
@@ -55,18 +55,24 @@ class TokenController extends AbstractActionController
        $redirect = $this->params()->fromQuery('redirect', 'unicaen-auth-token/token');
        $userId = $this->params('user');

        if ($userId !== null && $userToken = $this->tokenService->findUserTokenByUserId($userId)) {
        try {
            $userToken = $this->tokenService->createUserToken();
        } catch (TokenServiceException $e) {
            throw new \RuntimeException("Erreur rencontrée lors de la création du jeton", null, $e);
        }

        if ($userId !== null) {
            if ($existingUserToken = $this->tokenService->findUserTokenByUserId($userId)) {
                throw new InvalidArgumentException(sprintf(
                    "Il existe déjà un jeton pour l'utilisateur %d (date d'expiration : %s).",
                $userToken->getUserId(),
                $userToken->getExpiredOnToString()
                    $existingUserToken->getUserId(),
                    $existingUserToken->getExpiredOnToString()
                ));
            }

        $userToken = $this->tokenService->createUserToken();
        if ($userId !== null) {
            $userToken->setUserId($userId);
            $user = $this->fetchUserById($userId);
            $userToken->setUser($user);
        }

        $this->form->bind($userToken);

        if ($this->getRequest()->isPost()) {
@@ -192,9 +198,9 @@ class TokenController extends AbstractActionController
    }

    /**
     * @return UserToken
     * @return AbstractUserToken
     */
    private function getRequestedUserToken(): UserToken
    private function getRequestedUserToken(): AbstractUserToken
    {
        $id = $this->params('userToken');
        if ($id === null) {
@@ -209,25 +215,21 @@ class TokenController extends AbstractActionController
        return $userToken;
    }

    private function getRequestedUser(): ?UserInterface
    {
        $userId = $this->params('user');
        if ($userId === null) {
            return null;
        }

        return $this->fetchUserById($userId);
    }

    /**
     * @param int $id
     * @return \UnicaenAuth\Entity\Db\UserInterface
     */
    private function fetchUserById(int $id): UserInterface
    {
        /** @var UserInterface $user */
        $user = $this->userService->getUserMapper()->findById($id);
        if ($user === null) {
            throw new InvalidArgumentException(sprintf("Aucun utilisateur trouvé avec l'id %d.", $id));
        }
        if (! $user instanceof UserInterface) {
            throw new InvalidArgumentException("L'utilisateur spécifié dans la requête n'est pas de type " . UserInterface::class);
            throw new InvalidArgumentException(sprintf(
                "Le service de recherche d'utilisateur doit retourner des instances de type %s.",
                UserInterface::class
            ));
        }

        return $user;
+350 −0
Original line number Diff line number Diff line
<?php

namespace UnicaenAuthToken\Entity\Db;

use Application\Constants;
use DateTime;
use InvalidArgumentException;
use UnicaenAuth\Entity\Db\UserInterface;
use Zend\Permissions\Acl\Resource\ResourceInterface;

abstract class AbstractUserToken implements ResourceInterface
{
    const RESOURCE_ID = 'UserToken';

    /**
     * @var integer
     */
    protected $id;

    /**
     * @var string
     */
    protected $token;

    /**
     * @var string|null
     */
    protected $action;

    /**
     * @var int
     */
    protected $actionsCount;

    /**
     * @var int
     */
    protected $actionsMaxCount;

    /**
     * @var \DateTime
     */
    protected $createdOn;

    /**
     * @var \DateTime
     */
    protected $expiredOn;

    /**
     * @var \DateTime
     */
    protected $lastUsedOn;

    /**
     * @var int
     */
    protected $userId;

    /**
     * @var \UnicaenAuth\Entity\Db\UserInterface
     */
    protected $user;

    /**
     * AbstractUserToken constructor.
     */
    public function __construct()
    {
        $this->actionsCount = 0;
        $this->createdOn = new DateTime('now');
        $this->actionsMaxCount = 0; // pas de limite
        $this->expiredOn = new DateTime('+1 week');
    }

    /**
     * @inheritDoc
     */
    public function getResourceId(): string
    {
        return self::RESOURCE_ID;
    }

    /**
     * @return int|null
     */
    public function getId(): ?int
    {
        return $this->id;
    }

    /**
     * @return int|null
     */
    public function getUserId(): ?int
    {
        return $this->userId;
    }

    /**
     * @param int $userId
     * @return self
     */
    public function setUserId(int $userId): self
    {
        $this->userId = $userId;
        return $this;
    }

    /**
     * @param \UnicaenAuth\Entity\Db\UserInterface $user
     * @return self
     */
    public function setUser(UserInterface $user): self
    {
        $this->user = $user;
        $this->userId = $user->getId();

        return $this;
    }

    /**
     * @return \UnicaenAuth\Entity\Db\UserInterface|null
     */
    public function getUser(): ?UserInterface
    {
        return $this->user;
    }

    /**
     * @return string|null
     */
    public function getUserToString(): ?string
    {
        return (string) $this->user;
    }

    /**
     * @return string|null
     */
    public function getToken(): ?string
    {
        return $this->token;
    }

    /**
     * @param string $token
     * @return self
     */
    public function setToken(string $token): self
    {
        $this->token = $token;
        return $this;
    }

    /**
     * @return string|null
     */
    public function getAction(): ?string
    {
        return $this->action;
    }

    /**
     * @param string|null $action
     * @return self
     */
    public function setAction(string $action = null): self
    {
        $this->action = $action;
        return $this;
    }

    /**
     * @return int
     */
    public function getActionsCount(): int
    {
        return $this->actionsCount;
    }

    /**
     * @return string
     */
    public function getActionsCountToString(): string
    {
        return $this->actionsCount . ' fois';
    }

    /**
     * @param int $actionsCount
     * @return self
     */
    public function setActionsCount(int $actionsCount): self
    {
        $this->actionsCount = $actionsCount;
        return $this;
    }

    /**
     * @return self
     */
    public function incrementActionsCount(): self
    {
        $this->actionsCount++;
        return $this;
    }

    /**
     * @return int
     */
    public function getActionsMaxCount(): int
    {
        return $this->actionsMaxCount;
    }

    /**
     * @return string
     */
    public function getActionsMaxCountToString(): string
    {
        return $this->actionsMaxCount > 0 ? ($this->actionsMaxCount . ' fois') : "Illimité";
    }

    /**
     * @param int $actionsMaxCount
     * @return self
     */
    public function setActionsMaxCount(int $actionsMaxCount): self
    {
        $this->actionsMaxCount = $actionsMaxCount;
        return $this;
    }

    /**
     * @return bool
     */
    public function isActionsMaxCountReached(): bool
    {
        if ($this->actionsMaxCount <= 0) {
            return false;
        }

        return $this->actionsCount >= $this->actionsMaxCount;
    }

    /**
     * @return \DateTime
     */
    public function getCreatedOn(): DateTime
    {
        return $this->createdOn;
    }

    /**
     * @return string
     */
    public function getCreatedOnToString(): string
    {
        return $this->createdOn ? $this->createdOn->format(Constants::DATETIME_FORMAT) : '';
    }

    /**
     * @param \DateTime|null $createdOn null = now
     * @return self
     */
    public function setCreatedOn(DateTime $createdOn = null): self
    {
        $this->createdOn = $createdOn ?: new DateTime('now');
        return $this;
    }

    /**
     * @return \DateTime
     */
    public function getExpiredOn(): DateTime
    {
        return $this->expiredOn;
    }

    /**
     * @return string
     */
    public function getExpiredOnToString(): string
    {
        return $this->expiredOn ? $this->expiredOn->format(Constants::DATETIME_FORMAT) : '';
    }

    /**
     * @return bool
     */
    public function isExpired(): bool
    {
        if ($this->expiredOn === null) {
            return false;
        }

        return new DateTime('now') > $this->expiredOn;
    }

    /**
     * @param \DateTime $expiredOn
     * @return self
     */
    public function setExpiredOn(DateTime $expiredOn): self
    {
        $this->expiredOn = $expiredOn;
        return $this;
    }

    /**
     * @param string $spec Ex: '+1 day', '+1 hour'
     * @return self
     */
    public function modifyExpiredOn(string $spec): self
    {
        $result = $this->expiredOn->modify($spec);
        if ($result === false) {
            throw new InvalidArgumentException("Impossible de modifier la date avec ça : " . $spec);
        }
        $this->setExpiredOn(clone $result); // nouvelle référence obligatoire
        return $this;
    }

    /**
     * @return \DateTime|null
     */
    public function getLastUsedOn(): ?DateTime
    {
        return $this->lastUsedOn;
    }

    /**
     * @return string
     */
    public function getLastUsedOnToString(): string
    {
        return $this->lastUsedOn ? $this->lastUsedOn->format('d/m/Y H:i:s') : '';
    }

    /**
     * @param \DateTime|null $lastUsedOn null = now
     * @return self
     */
    public function setLastUsedOn(DateTime $lastUsedOn = null): self
    {
        $this->lastUsedOn = $lastUsedOn ?: new DateTime('now');
        return $this;
    }
}
 No newline at end of file
+34 −344
Original line number Diff line number Diff line
@@ -2,349 +2,39 @@

namespace UnicaenAuthToken\Entity\Db;

use Application\Constants;
use DateTime;
use InvalidArgumentException;
use UnicaenAuth\Entity\Db\UserInterface;
use Zend\Permissions\Acl\Resource\ResourceInterface;

class UserToken implements ResourceInterface
{
    const RESOURCE_ID = 'UserToken';

    /**
     * @var integer
     */
    protected $id;

    /**
     * @var string
     */
    protected $token;

    /**
     * @var string|null
     */
    protected $action;

    /**
     * @var int
     */
    protected $actionsCount;

    /**
     * @var int
     */
    protected $actionsMaxCount;

    /**
     * @var \DateTime
     */
    protected $createdOn;

    /**
     * @var \DateTime
     */
    protected $expiredOn;

    /**
     * @var \DateTime
     */
    protected $lastUsedOn;

    /**
     * @var int
     */
    protected $userId;

    /**
     * @var UserInterface
     */
    protected $user; // Attention, non mappé !

    /**
     * UserToken constructor.
     */
    public function __construct()
    {
        $this->actionsCount = 0;
        $this->createdOn = new DateTime('now');
        $this->actionsMaxCount = 0; // pas de limite
        $this->expiredOn = new DateTime('+1 week');
    }

    /**
     * @inheritDoc
     */
    public function getResourceId(): string
    {
        return self::RESOURCE_ID;
    }

    /**
     * @return int|null
     */
    public function getId(): ?int
    {
        return $this->id;
    }

    /**
     * @return int|null
     */
    public function getUserId(): ?int
    {
        return $this->userId;
    }

    /**
     * @param int $userId
     * @return self
     */
    public function setUserId(int $userId): self
    {
        $this->userId = $userId;
        return $this;
    }

    /**
     * @param \UnicaenAuth\Entity\Db\UserInterface $user
     * @return self
     */
    public function setUser(UserInterface $user): self
    {
        $this->user = $user;
        $this->setUserId($user->getId());

        return $this;
    }

    /**
     * @return \UnicaenAuth\Entity\Db\UserInterface
     */
    public function getUser(): ?UserInterface
    {
        return $this->user;
    }

    /**
     * @return string|null
     */
    public function getUserToString(): ?string
    {
        return (string) $this->user;
    }

    /**
     * @return string|null
     */
    public function getToken(): ?string
    {
        return $this->token;
    }

    /**
     * @param string $token
     * @return self
     */
    public function setToken(string $token): self
    {
        $this->token = $token;
        return $this;
    }

    /**
     * @return string|null
     */
    public function getAction(): ?string
    {
        return $this->action;
    }

    /**
     * @param string|null $action
     * @return self
     */
    public function setAction(string $action = null): self
    {
        $this->action = $action;
        return $this;
    }

    /**
     * @return int
     */
    public function getActionsCount(): int
    {
        return $this->actionsCount;
    }

    /**
     * @return string
     */
    public function getActionsCountToString(): string
    {
        return $this->actionsCount . ' fois';
    }

    /**
     * @param int $actionsCount
     * @return self
     */
    public function setActionsCount(int $actionsCount): self
    {
        $this->actionsCount = $actionsCount;
        return $this;
    }

    /**
     * @return self
     */
    public function incrementActionsCount(): self
    {
        $this->actionsCount++;
        return $this;
    }

    /**
     * @return int
     */
    public function getActionsMaxCount(): int
    {
        return $this->actionsMaxCount;
    }

    /**
     * @return string
     */
    public function getActionsMaxCountToString(): string
    {
        return $this->actionsMaxCount > 0 ? ($this->actionsMaxCount . ' fois') : "Illimité";
    }

    /**
     * @param int $actionsMaxCount
     * @return self
     */
    public function setActionsMaxCount(int $actionsMaxCount): self
    {
        $this->actionsMaxCount = $actionsMaxCount;
        return $this;
    }

    /**
     * @return bool
     */
    public function isActionsMaxCountReached(): bool
    {
        if ($this->actionsMaxCount <= 0) {
            return false;
        }

        return $this->actionsCount >= $this->actionsMaxCount;
    }

    /**
     * @return \DateTime
     */
    public function getCreatedOn(): DateTime
    {
        return $this->createdOn;
    }

    /**
     * @return string
     */
    public function getCreatedOnToString(): string
    {
        return $this->createdOn ? $this->createdOn->format(Constants::DATETIME_FORMAT) : '';
    }

    /**
     * @param \DateTime|null $createdOn null = now
     * @return self
     */
    public function setCreatedOn(DateTime $createdOn = null): self
    {
        $this->createdOn = $createdOn ?: new DateTime('now');
        return $this;
    }

    /**
     * @return \DateTime
     */
    public function getExpiredOn(): DateTime
    {
        return $this->expiredOn;
    }

    /**
     * @return string
     */
    public function getExpiredOnToString(): string
    {
        return $this->expiredOn ? $this->expiredOn->format(Constants::DATETIME_FORMAT) : '';
    }

    /**
     * @return bool
     */
    public function isExpired(): bool
    {
        if ($this->expiredOn === null) {
            return false;
        }

        return new DateTime('now') > $this->expiredOn;
    }

    /**
     * @param \DateTime $expiredOn
     * @return self
     */
    public function setExpiredOn(DateTime $expiredOn): self
    {
        $this->expiredOn = $expiredOn;
        return $this;
    }

    /**
     * @param string $spec Ex: '+1 day', '+1 hour'
     * @return self
     */
    public function modifyExpiredOn(string $spec): self
    {
        $result = $this->expiredOn->modify($spec);
        if ($result === false) {
            throw new InvalidArgumentException("Impossible de modifier la date avec ça : " . $spec);
        }
        $this->setExpiredOn(clone $result); // nouvelle référence obligatoire
        return $this;
    }

    /**
     * @return \DateTime|null
     */
    public function getLastUsedOn(): ?DateTime
    {
        return $this->lastUsedOn;
    }

    /**
     * @return string
     */
    public function getLastUsedOnToString(): string
    {
        return $this->lastUsedOn ? $this->lastUsedOn->format('d/m/Y H:i:s') : '';
    }

    /**
     * @param \DateTime|null $lastUsedOn null = now
     * @return self
     */
    public function setLastUsedOn(DateTime $lastUsedOn = null): self
    {
        $this->lastUsedOn = $lastUsedOn ?: new DateTime('now');
        return $this;
    }
class UserToken extends AbstractUserToken
{
//    /**
//     * @var int
//     */
//    protected $userId;
//
//    /**
//     * @return int|null
//     */
//    public function getUserId(): ?int
//    {
//        return $this->userId;
//    }
//
//    /**
//     * @param int $userId
//     * @return self
//     */
//    public function setUserId(int $userId): self
//    {
//        $this->userId = $userId;
//        return $this;
//    }
//
//    /**
//     * @inheritDoc
//     */
//    public function setUser($user): self
//    {
//        parent::setUser($user);
//        $this->userId = $user->getId();
//
//        return $this;
//    }
}
 No newline at end of file
Loading