IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Zend Framework PHP Discussion :

Problème de gestion des sessions


Sujet :

Zend Framework PHP

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 10
    Par défaut Problème de gestion des sessions
    Bonjours,

    J'ai actuellement un léger problème de gestion de session avec Zend (1).
    J'ai un application avec un controller qui permet de paramétrer des préférences utilisateurs.

    Voila comment je stock en session mes préférences utilisateur une fois le formulaire valider :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    /*--- J'ai aussi essayer : new Zend_Session_Namespace('Zend_Auth', true) ---*/	
    $authNamespace = new Zend_Session_Namespace('Zend_Auth');
    /*--- $preferences  est un tableau contenant mes preferences utilisateur ---*/
    $authNamespace->preferences = $preferences ;
    Si je fait un var_dump() de ma session les préférences sont bien mise à jour.

    Ensuite dans les autres controllers je veux accéder à mes préférences stockée
    en session comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    	$auth = Zend_Auth::getInstance();
    	if ($auth->hasIdentity()) {
    		$authNamespace = new Zend_Session_Namespace('Zend_Auth');
                   $authNamespace->preferences
    	}
    Seulement pour une raison qui m’échappe complètement préférences n'est pas à jour.
    Il ne contient pas les nouvelles valeurs mais celles valables lorsque l'utilisateur s'est loggé.

    Pour que les préférences soit mise à jour je dois me delogger et me relogger.
    C'est comme si à la validation de mon formulaire de paramétrage des préférences je passais sur une seconde session.
    Quelqu'un voie où j'ai merdoyé ?
    Merci d'avance pour vos pistes.

  2. #2
    Membre chevronné

    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2003
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2003
    Messages : 253
    Par défaut
    Bonsoir,

    Le namespace de session Zend_Auth est utilisé en interne par le Zend_Auth_Storage_Session (la classe de stockage des données authentifiées qui est utilisée par défaut par Zend_Auth), du coup l'utiliser pour des données de l'application c'est aussi prendre le risque de certains effets de bord, même si en regardant le code source du ZF j'ai du mal à voir d'où ça vient.

    A tout hasard, tu as essayé d'utiliser un namespace spécifique pour tes préférences, voir si le problème persiste ?

    Idéalement, je ne suis pas contre voir comment et à quel moment l'authenticate() est appelé, pour bien comprendre l'enchaînement de ton code.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 10
    Par défaut
    Bon j'ai pas mal retourné le problème.

    Voila en gros ce qui se passe lors de la connexion d'un utilisateurs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    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
    60
     
    		//Dans LoginController.php
    		indexAction() {
     
                            //Si je comprends ma session débute Ici
    			$authNamespace = new Zend_Session_Namespace('Zend_Auth');
     
    			//Je passe les details
    			//J'affiche le formulaire
    			//Si isPost je test le Mdp
     
    			if ($authAuthenticate->isValid()) {
    				$storage = Zend_Auth::getInstance()->getStorage();
    				//Je commence à renseigner les données de ma session
    				$storage->write ( $authAdapter->getResultRowObject ( null, array('UTILISATEUR_password') ) );
     
    				$id_utilisateur = $authAdapter->getResultRowObject (null)->UTILISATEUR_id_utilisateur;
     
    				Utilisateurs::initParam($id_utilisateur) ;
     
    				/*Puis je redirige l'utilisateur vers sa page*/
     
    			}
    		}	
    		//Dans UtilisateurController.php		
    		static function initParam($id_utilisateur) {
     
                            //CECI donne les anciennes valeurs des préférences Utilisateurs 
                            var_dump($_SESSION['Zend_Auth']['storage']);
     
    			$utilisateur = new Utilisateurs();
    			$roles = $utilisateur->getRole($id_utilisateur);//On récupére les roles de l'utilsateur
    			$prefs = $utilisateur->getPreferences($id_utilisateur);//On récupére les preferences de l'utilsateur
     
    			//On recupére les info de session
    			$storage = Zend_Auth::getInstance()->getStorage();
    			$infos_session = $storage->read();
     
    			//On ajoute aux info utilisateur un tableau contenant les roles de cette utilisateur
    			$infos_session->{'UTILISATEUR_roles'} = null;
    			$infos_session->{'UTILISATEUR_roles'} = $roles;// Les roles sont gérer avec ACL
     
    			$preferences = array();
    			if(count($prefs)>0) {
    				foreach ($prefs as $pref) {
    					$preferences[$pref['PREFERENCE_libelle']] = $pref['PREFERENCE_valeur'] ;
    				}
    			}
     
    			//On ajoute aux info utilisateur un tableau contenant les preferences
    			$infos_session->{'UTILISATEUR_preferences'} = null;
    			$infos_session->{'UTILISATEUR_preferences'} = $preferences;
     
    			$storage->clear() ;
    	    	        $storage->write ( $infos_session );	
     
                            //CECI donne bien les nouvelle valeurs de prefrerences donc j'en conclus
                            //que ma session a bien été mise à jour ???
                            var_dump($_SESSION['Zend_Auth']['storage']);
    		}
    Alors j'ai cru comprendre en regardant le constructeur de Zend_Session_Namespace que c'était lui qui initialisé la Session avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Zend_Session::start(true);
    .Est ce normal de démarrer ainsi une session avec Zend ? Ne dois-je pas utiliser Zend_Session::start(); ?

    A la validation de mon formulaire de paramétrage j'appel initParam() pour mettre à jour mes paramètres en session.
    Le var_dump au début de initParam() m'affiche les anciennes valeur et le var_dump à la fin de initParam() m'afiche les nouvelle valeurs que j'ai saisie donc ma session a bien du se mettre à jour. Cependant si je réaffiche la page et que j'affiche ma session je peux voir que les paramétres sont revenu à leurs anciennes valeurs.

    Dans mon formulaire d’édition des paramètres je fait directement appel à initParam() pour mettre à jour ma les infos de ma session. Est ce qu'il ne faudrait pas que je tue et que je recréé ma session ?

    Je sais plus trop comment aborder le problème...

  4. #4
    Membre expérimenté Avatar de Njörd
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 190
    Par défaut
    Bonjour Eljildius,

    Zend, via les noms de session, offre la possibilité de verrouiller la modification d'un espace de nom (Documentation Zend Session Namespace). Vu l'importance de ce namespace, je ne serai pas étonné que zend bloque automatiquement l'écriture (vol de session, etc).

    Du coup, puisqu'il s'agit d'informations liées à un utilisateur qui s'authentifie et que tu souhaite utiliser le namespace 'Zend_Auth' plutôt que celui de ton choix, tu peux utiliser un stockage personnalisé qui dérivera de la classe zend_auth (Documentation Zend Stockage personnalisé).

    Pour répondre à ta question sur l'initialisation de la session, tu trouveras sur le premier lien, en début de page, 4 façons d'instancier la session : 2 sont mauvaises et 2 sont correctes. Personnellement, je privilégie la 4ème.

    Enjoy

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 10
    Par défaut
    Ah oui j'ai oublié de préciser, pour répondre à Nighty j'ai essayé de prendre un namespace spécifique autre que Zend_auth et ça n'a rien donné j'ai le même problème.

  6. #6
    Membre expérimenté Avatar de Njörd
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 190
    Par défaut
    Rebonjour,

    Dans le cas où tu utilises un autre namespace comment le récupère tu d'un controller à un autre ?

    Personnellement je l'enregistre dans le registre.

    Initialisation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $taSession = new Zend_Session_Namespace('tonNomDeSession');
    Enregistrement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $this->lesInfosDeTaSession = CE QUE TU VEUX // array, string, ...
    $taSession->lesInfosDeTaSession = $this->lesInfosDeTaSession;
    Zend_Registry::set('tonNomDeSession', $taSession);
    Lecture
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $taSession = Zend_Registry::get('tonNomDeSession');
    $taSession->getIterator();
    Je me suis fais une factory de session me permettant de créer autant de zend_Session_Namespace dont j'ai besoin avec des fonctions CRUD pour manipuler les données de chaque namespace.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 10
    Par défaut
    Njord j'ai respecté scrupuleusement ton code j'ai même été jusqu’à choisir le NameSpace 'tonNomDeSession' mais j'ai toujours exactement le même comportement.

    à la fin de l’exécution de mon contrôleur en faisant un var_dump j'ai ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    array (size=2)
      'Zend_Auth' => 
        array (size=1)
          'storage' => 
            array //Les données de storage
      'tonNomDeSession' => 
        array (size=1)
          'lesInfosDeTaSession' => 
            array (size=3)//mes données mis à jour
    Donc tous va bien. Sauf qu'au rechargement de ma page j'ai ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    array (size=2)
      'Zend_Auth' => 
        array (size=1)
          'storage' => 
            array //Les données de storage
      'tonNomDeSession' => 
        array (size=1)
          'lesInfosDeTaSession' => 
            array (size=3)//mes vieilles données périmés
    Ma santé mental commence à faiblir.

  8. #8
    Membre expérimenté Avatar de Njörd
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 190
    Par défaut
    Bonjour Eljildius,

    J'étais partis pour te demander de nous montrer l'ensemble de ton code quand j'ai vu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    static function initParam($id_utilisateur) {
    Essai voir en remplaçant static par public ou rien du tout.

    ça donne quoi ?

  9. #9
    Membre chevronné

    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2003
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2003
    Messages : 253
    Par défaut
    Citation Envoyé par Njörd Voir le message
    Rebonjour,

    Dans le cas où tu utilises un autre namespace comment le récupère tu d'un controller à un autre ?

    Personnellement je l'enregistre dans le registre.
    Bonjour,

    Réponse rapide suite à cette remarque : a priori ce n'est pas forcément utile, Zend_Session_Namespace écrit directement dans la superglobale $_SESSION, donc deux objets Zend_Session_Namespace pointant vers le même namespace manipulent forcément les même données.

    Sur le problème principal j'essaye d'y jeter un oeil ASAP.

  10. #10
    Membre expérimenté Avatar de Njörd
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 190
    Par défaut
    Bonjour Nighty,

    On est d'accord, je lui demandai cela du fait qu'il a dit avoir utilisé un namespace différent. Je voulais savoir comment il faisait son instanciation et récupération derrière.

    Voir le code quoi

    Ah moins que tu faisais allusion à la question du registre ?

  11. #11
    Membre chevronné

    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2003
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2003
    Messages : 253
    Par défaut
    Oui c'est ça, je faisais allusion à la question du registre

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 10
    Par défaut
    J'ai essayé d'enlever le static mais aucune différence. J'ai aussi essayé de supprimer tonNomDeSession avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Zend_Session::namespaceUnset('tonNomDeSession');
    avant de le recréer et aucun changement.

  13. #13
    Membre expérimenté Avatar de Njörd
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 190
    Par défaut
    Citation Envoyé par Nighty Voir le message
    Oui c'est ça, je faisais allusion à la question du registre
    Effectivement, ça passe sans souci. Merci pour la remarque

    Eljildius,

    Au lieu de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    var_dump($_SESSION['Zend_Auth']['storage']);
    essai de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    var_dump($authNamespace->getIterator());
    ça t'affichera l'objet zend plutôt que la session elle même.

  14. #14
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 10
    Par défaut
    J'ai testé le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var_dump($authNamespace->getIterator());
    Toujours la même chose.

  15. #15
    Membre expérimenté Avatar de Njörd
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 190
    Par défaut
    Bon ça m'intrigue là

    Django => "Messieurs, jusqu'alors vous aviez retenu mon attention mais là, vous venez de piquer ma curiosité"

  16. #16
    Membre expérimenté Avatar de Njörd
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 190
    Par défaut
    Chez moi ça fonctionne ...

    Controller 1 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
            $storage = $this->_auth->getStorage();
            var_dump($storage);
            $infos_session = $storage->read();
            var_dump($infos_session);
            $preferences = array("couleur" => "rouge", "materiel" => "PC", "template" => "base");
            $infos_session['UTILISATEUR_preferences'] = $preferences;
            $storage->clear() ;
            $storage->write ( $infos_session );
            $infos_session2 = $storage->read();
            var_dump($infos_session2);
    Controller 2 suite à un lien dans ma vue
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            $storage = $this->_auth->getStorage();
            var_dump($storage);
            $infos_session = $storage->read();
            var_dump($infos_session);
    Note au passage comment j'ajoute les préférences dans ma session
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $infos_session['UTILISATEUR_preferences'] = $preferences;
    Du coup je te montre comment j'instancie mon zend_auth :

    Bootstrap
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    protected function _initAuth() {
            $storage = new Zend_Auth_Storage_Session('CEQUETUVEUX');
            $sessionNamespace = new Zend_Session_Namespace($storage->getNamespace());
            $sessionNamespace->setExpirationSeconds(600); // 600/60 = 10 min
            $auth = Zend_Auth::getInstance();
            $auth->setStorage($storage);
     
            return $auth;
        }
    Classe d'authentification
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $identity = array(
                        'ID' => $id,
                        ...... 
                    );
     
                    return new Zend_Auth_Result(Zend_Auth_Result::SUCCESS, $identity);
    Fais voir ton boostratp stp.

    Y a quelque chose qui fait que ta session est locked.
    essai de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        $userProfileNamespace = new Zend_Session_Namespace('userProfileNamespace');
         
        // vérrouillons une session en lecture seule
        $userProfileNamespace->lock();
         
        // dévérrouillage si déjà vérrouillé
        if ($userProfileNamespace->isLocked()) {
            $userProfileNamespace->unLock();
        }
    De mon côté, si je lock moi-même mon namespace j'ai bien une levée d'exception comme l'indique la doc.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
           $storage = $this->_auth->getStorage();
            var_dump($storage);
            $infos_session = $storage->read();
            var_dump($infos_session);
            
            $nameNamespace = new Zend_Session_Namespace('CEQUETUVEUX');
            // marking session as read only locked
            $nameNamespace->lock();
            
            $preferences = array("couleur" => "rouge", "materiel" => "PC", "template" => "base");
            $infos_session['UTILISATEUR_preferences'] = $preferences;
            $storage->clear() ;
            $storage->write ( $infos_session );
            $infos_session2 = $storage->read();
            var_dump($infos_session2);
    L'exception
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    This session/namespace has been marked as read-only.
    Par contre, je lock le namespace que j'ai créé dans mon bootstrap, et non pas le namespace 'Zend_Auth'.

    Du coup, y a un truc sous-jacent lié à 'Zend_Auth'.

    Essai voir en initialisant ton Authentification dans le bootstrap comme je fais.
    Histoire de voir si c'est bien ça ou si y a autre chose.

    A+

  17. #17
    Membre chevronné

    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2003
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2003
    Messages : 253
    Par défaut
    Bonsoir,

    J'ai beau regarder, je ne vois pas un problème dans le code qui a été posté ici, j'en conclus que le problème provient plus probablement soit du code que l'on ne voit pas, soit d'une question de configuration.

    Ce que je peux déjà dire, c'est que le code est beaucoup trop compliqué pour ce qu'il fait : la session est écrite dans deux endroits, lue et vidée dans un même appel... rien que ça c'est déjà une source d'ennui potentiel.

    Pour déterminer d'où ça vient :
    * Use du debugger et de trace, ligne à ligne si il faut, pour voir où l'information se perds.
    * Elle se perds réellement entre 2 appels du script ? Va scruter tes fichiers de session après l'appel du premier script, désérialise leur contenu, et vérifie si les données ont bien été enregistrée. Si ce n'est pas le cas, tu as probablement un problème de configuration et / ou d'écriture sur les fichiers de session.
    * Essaye de refactoriser, repenser la logique de ton contrôleur, et réduire le problème à quelque chose de simple à tester, et surtout essaye d'éviter le "yoyo" sur l'objet de storage comme c'est le cas actuellement (write, read, clear, write dans un même appel).

    Rien que du très générique, mais si tu l'appliques je pense que tu découvriras ton soucis.

  18. #18
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 10
    Par défaut
    Bon j'ai déjà passer trop de temps sur ce problème je doit absolument avancer sur d'autre truc. Je vais essayer de faire ça dans la semaine. Ce qui est sur c'est que dés que j'aurais de nouvelles idées voir même une solution je vous tiens au courant.
    De toutes façon je peux pas laisser ce bug comme ça.
    merci pour vos conseils.

Discussions similaires

  1. [Tomcat] Problème de gestion des session
    Par superzest dans le forum Tomcat et TomEE
    Réponses: 0
    Dernier message: 06/08/2010, 21h26
  2. [PERL]Problème sur la gestion des sessions
    Par LostRailler dans le forum Web
    Réponses: 5
    Dernier message: 03/02/2010, 10h57
  3. [MySQL] problème de gestion des variables de sessions (même navigateur)
    Par alaska750 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 24/08/2009, 16h59
  4. [FLASH 8] Problème de gestion des clips.
    Par glingo dans le forum Flash
    Réponses: 4
    Dernier message: 09/03/2006, 16h17
  5. [tomcat] gestion des sessions
    Par sebos63 dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 12/10/2004, 14h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo