[spip-dev] connexion par cookie

Salut la compagnie,

je poste sur le cvs une version partielle et expérimentale d'un système
d'authentification par cookie de session. Pour l'activer il faut se rendre
sur ecrire/login.php3

Quelques remarques :

1) C'est EXPERIMENTAL, c'est probablement UN ENORME TROU DE SECURITE, plein
de BUGS et autres bestioles affreuses : ne pas utiliser en production (sauf
pour les amateurs !)

2) Histoire de ne pas creer de gros trou dans spip pour les innocents, je
bloque la fonctionnalite dans inc_auth.php3 par un gros machin temporaire
    $SUPPRIME_LA_SECURITE_POUR_JOUER_AUX_COOKIES = false;
il faudra la mettre à 'true' vous-mêmes (ligne 89).

3) Le cookie de session est calculé, pour l'instant, de façon banale et non
sécure : md5(id_auteur + md5(mot de passe)) : il faudra améliorer ça. Il
contient aussi le nom, l'email, l'id_auteur du connecté (mais pas son login,
un oubli).

4) Le cookie est posé au niveau du répertoire public, ce qui permettra
rapidement de valider des inscriptions dans l'espace public (en fait, c'est
déjà possible en qqs lignes de php à insérer dans le squelette :

    <?php if ($cookie = $GLOBALS[HTTP_COOKIE_VARS][spip_session]) {
           include_ecrire ("inc_connect.php3");
           include_ecrire ("inc_session.php3");
           $visiteur_authentifie = verifie_cookie_session ($cookie);
          } else $visiteur_authentifie = false;
    ?>

puis, pour exploiter les données,

    <?php
        if ($visiteur_identifie) {

.../... afficher tout le contenu réservé .../...

        // recuperer des donnees nominatives
        list(,$id_auteur,$email,$nom,$session) = decode_cookie_session ($cookie);

        // afficher des trucs sympas du genre
        echo "Bonjour $nom".

        } else {

.../... afficher le contenu pour les visiteurs non enregistres .../...

        }

    ?>

Fichiers :

Tout de suite deux modifs :

3) Le cookie de session est calculé, pour l'instant, de façon banale et non
sécure : md5(id_auteur + md5(mot de passe)) : il faudra améliorer ça. Il
contient aussi le nom, l'email, l'id_auteur du connecté (mais pas son login,
un oubli).

En fait, je change un peu la structure de la fonction
verifie_cookie_session($cookie), qui renvoit désormais soit 'false' (pas
identifié), soit toutes les données de l'auteur sous forme d'un objet
adressé de la manière suivante : $visiteur_authentifie->champ (tous les
champs de spip_auteurs, sauf pass et htpass).

Cette variable $visiteur_authentifie est calculee par inc-public.php3, si le
cookie de session existe (connexion base obligatoire). Elle est mise à false
s'il n'y a pas de cookie (pas de trou de secu de ce coté). Le squelette peut
donc la récupérer via un simple test

    <?php if ($v = $GLOBALS[visiteur_authentifie]) echo "Salut ".$v->nom;
        else echo "... petit formulaire de login ...";
    ?>

ou encore

    <?php if ($v = $GLOBALS[visiteur_authentifie]) {
        echo "Vous êtes... ";
        if ($v->statut == '0minirezo') echo "admin!";
        else if ($v->statut == '1comite') echo "rédacteur!";
        else echo "Effacé!! Arf !";
    } ?>

PS: Evidemment, le $GLOBALS fait désordre. Antoine pense que ce n'est pas
forcément nécessaire de garder l'include_local() du cache, et je suis sûr
que ça va casser uZine (entre autres)... donc je fais aussi cette modif,
jusqu'à preuve de nécessité de cette contrainte.

-- Fil

Nouveau nettoyage dans l'histoire des cookies de session. On pose en même
temps deux cookies :

* spip_session = une session "authentifiante" (à sécuriser avec des secrets,
    une modif de la base, etc : Nicolas, Antoine?? -- il y a deux fonctions
    pour ça dans inc_session.php3 : creer_cookie_session() et
    verifier_cookie_session() - le code est pas trop crado)

* spip_admin = un cookie admin ne comportant guère que id_auteur@login

spip_session meurt avec le navigateur, mais spip_admin ne meurt qu'au bout
de deux semaines.

Deux objets visiteur sont construits par inc-public :

* on construit l'objet $visiteur_authentifie uniquement si $spip_session est
  valide ; dans ce cas $visiteur = $visiteur_authentifie

* s'il n'y a pas de visiteur authentifie, on construit $visiteur à partir
  du cookie spip_admin (s'il existe).

Du coup, on peut par exemple faire

<?php
    if ($v = $visiteur_authentifie) {
        echo "salut $v->nom j'ai confiance";
    } else if ($v = $visiteur) {
        echo "Salut $v->nom va t'authentifier <formulaire de login,
                $v->login prérempli>";
    } else {
        echo "Hola inconnu";
    }
?>

etc...

Je passe les fonctionnalités de pose de cookie de session dans spip_cookie
(suppression de spip_session) ; ecrire/inc_cookie disparait aussi.

-- Fil