LettreToken.php 2.41 KB
Newer Older
Mat's avatar
Mat committed
1 2 3 4 5 6 7 8 9
<?php

namespace PotageBundle\Services;


use PotageBundle\Entity\Lettre;
use PotageBundle\Entity\User;
use Symfony\Component\DependencyInjection\ContainerInterface;

Mat's avatar
hop  
Mat committed
10 11 12 13 14 15 16 17 18 19 20 21
/**
 * Class LettreToken
 *
 * La classe LettreToken a 2 fonctions principales, l'une d'encodage, l'autre de décodage.
 * encode: permet de générer un token à partir d'un utilisateur et d'une infolettre,
 * decode: permet à partir d'un token, de retrouver quel utilisateur et quelle infolettre.
 *
 * L'algorithme s'appuie soit sur un champs dans la table user,
 * soit sur une recette secrète qui permet de réaliser les 2 opérations.
 *
 * @package PotageBundle\Services
 */
Mat's avatar
Mat committed
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
class LettreToken
{

    private $container;
    
    /**
     * Newsletter constructor.
     *
     * @param ContainerInterface $container
     */
    public function __construct(ContainerInterface $container)
    {
        $this->container = $container;
    }
    
    
    /**
     * @param int $id_utilisateur
     * @param Lettre $lettre
     * @return mixed
     */
    public function encodePotageAccess($id_utilisateur, Lettre $lettre)
    {
        /**
         * Si l'utilisateur n'est pas associé à un user, token => null
         * il faudra alors l'inviter à se créer un compte user,
         * après quoi il accèdera à sa page today, qui lui affichera alors les offres liée à ses groupes.
         * Et cela même s'il n'avait pas encore de compte user quand la lettre a été envoyée !
         *
         * @var User $user
         */
        $user = $this->container->get('doctrine')
            ->getRepository('PotageBundle:User')
            ->findOneByUtilisateur($id_utilisateur); //dump($user);
        
        if ($user !== null) {
            
            // TODO ici une recette secrète, hors dépôt GIT !!!
Mat's avatar
Mat committed
60 61 62 63 64 65
            $token =  $user->getId()
                .'_'. $user->getTokenKey()
                .'_'. $lettre->getId()
                .'_'. $lettre->getReference();
    
            return base64_encode($token);
Mat's avatar
Mat committed
66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
            
        
        } else {
        
            return null;
        }
    }
    
    
    /**
     * @param $token
     * @return array
     */
    public function decodePotageAccess($token)
    {
Mat's avatar
Mat committed
81
        $data = explode('_', base64_decode($token));
Mat's avatar
Mat committed
82 83
 
        return array(
Mat's avatar
Mat committed
84
            'user_id' => $data[0],
85
            'token_key' => $data[1],
Mat's avatar
Mat committed
86 87
            'lettre_id' => $data[2],
            'lettre_ref' => $data[3],
Mat's avatar
Mat committed
88 89 90
        );
    }
}