LettreToken.php 3.34 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
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) {
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
    
            /**
             *  Vérifie d'abord qu'aucun token pour cette offre n'existe pour cet utilisateur.
             *  Pour cela on va parcourir le tableau, récupérer l'offre, et la retourner si elle existe
             */
            $newOffre = $lettre->getOffre()->getId();
            
            $userTokenKeys = $user->getTokenKey();
            foreach ($userTokenKeys as $uTokenKey)
            {
                $uOffre = intval($this->decodePotageAccess($uTokenKey)['offre_id']);
                if ($uOffre === $newOffre)
                {
                    return $uTokenKey;
                }
            }
    
            /**
             *  Génère un nouveau tokenKey
             */
            $newKey = bin2hex(random_bytes(15));
Mat's avatar
Mat committed
79
            
80
            $token =  $newKey
81
82
                .'_'. $lettre->getOffre()->getId()
                .'_'. $lettre->getOffre()->getReference();
83
84

            $tokenKey = base64_encode($token);
Mat's avatar
Mat committed
85
    
86
87
88
89
90
91
92
            /**
             *  Persiste le nouveau token dans le tableau token_key du user
             */
            $em = $this->container->get('doctrine')->getManager();
            $user->addTokenKey($tokenKey);
            $em->persist($user);
            $em->flush();
Mat's avatar
Mat committed
93
            
94
            return $tokenKey;
Mat's avatar
Mat committed
95
96
97
98
99
100
101
102
103
104
105
106
107
108
        
        } else {
        
            return null;
        }
    }
    
    
    /**
     * @param $token
     * @return array
     */
    public function decodePotageAccess($token)
    {
Mat's avatar
Mat committed
109
        $data = explode('_', base64_decode($token));
Mat's avatar
Mat committed
110
111
 
        return array(
112
113
114
            'token_key' => $data[0],
            'offre_id' => $data[1],
            'offre_ref' => $data[2],
Mat's avatar
Mat committed
115
116
117
        );
    }
}