Utiliser phpMyChat avec les comptes auteurs de SPIP

Cet article présente les modifications apportées à phpMyChat afin que l’authentification des utilisateurs s’effectue sur la table des auteurs SPIP.

phpMyChat est un système de discussion temps-réel développé par Nicolas Hoizey et disponible sur SourceForge
Cette application open source est simple à mettre en œuvre, entièrement personnalisable et s’appuie sur une base de données. Un chat s’effectue par le biais d’une simple page HTML contenant des frames invisibles rafraîchies périodiquement, ce qui permet d’afficher les nouveaux messages. Le code développé permet un maximum de compatibilité et une utilisation derrière un firewall. Pour ces raisons, cette application rencontre un vif succès et de nombreux sites l’utilisent.

SPIP étant particulièrement adapté à des usages communautaires, l’idée d’y associer un système de discussion temps-réel entre membres d’une même communauté peut paraitre évidente. Dans le cas d’une association, il est intéressant de créer un espace membre pour mettre en commun des ressources entre les auteurs SPIP, c’est à dire entre les membres de l’association. L’ajout d’un chat entre membres peut s’avérer pratique pour organiser des réunions virtuelles.

Recherche des utilisateurs dans la table spip_auteurs

phpMyChat recherche les utilisateurs enregistrés dans la table c_reg_users qui contient un champs username et un champs password ; ce dernier étant crypté par un hachage MD5. Dans SPIP, les auteurs sont authentifiés à partir de la table spip_auteurs qui contient un champs login et un champ pass ; ce dernier étant également crypté en MD5 mais après l’avoir concaténé préalablement par le champs alea_actuel. Il suffit donc de modifier les fonctions de phpMyChat afin que les requêtes SQL pour l’authentification s’effectuent sur les champs de spip_auteurs au lieu de c_reg_users.

Il se pose également 2 problèmes :

  1. Il faut désactiver et/ou supprimer les fonctions phpMyChat permettant d’enregistrer ou modifier un nouvel utilisateur (sinon on prend le risque d’ajouter / modifier des auteurs spip depuis le chat).
  2. Certains champs présent dans la table c_reg_users de phpMyChat ne sont pas présents dans la table spip_auteurs.

Pour le premier point les fonctions de modification des utilisateurs ont été supprimées. Pour le second point, faute d’utiliser 2 tables séparées, il faut ajouter des champs dans la table spip_auteurs de spip.

Le fichier ci-après joint propose une version modifiée de phpMyChat 0.14.5 permettant d’authentifier les utilisateurs du chat en tant qu’auteur SPIP.

Installation de phpMyChat modifié pour SPIP

Télécharger le fichier ci-dessous puis décompresser le dans votre répertoire courant de SPIP (où n’importe où ailleurs). Renommez le répertoire crée chat.

phpMyChat-0.14.5 modif 0.1pour spip

Ensuite à partir de votre interface phpMyAdmin, exécutez les requêtes suivantes sur votre base SPIP :

ALTER TABLE spip_auteurs ADD rooms varchar(128) NOT NULL default '';
ALTER TABLE spip_auteurs ADD ip varchar(16) NOT NULL default '';
ALTER TABLE spip_auteurs ADD gender tinyint(1) NOT NULL default '0';
ALTER TABLE spip_auteurs ADD perms varchar(9) NOT NULL default 'user';
ALTER TABLE spip_auteurs ADD reg_time varchar(11) NOT NULL default '';


DROP TABLE IF EXISTS chat_messages;
CREATE TABLE chat_messages (
   type tinyint(1) DEFAULT '0' NOT NULL,
   room varchar(30) NOT NULL,
   username varchar(30) NOT NULL,
   latin1 tinyint(1) DEFAULT '0' NOT NULL,
   m_time int(11) DEFAULT '0' NOT NULL,
   address varchar(30) NOT NULL,
   message text NOT NULL
);

DROP TABLE IF EXISTS chat_users;
CREATE TABLE chat_users (
   room varchar(30) NOT NULL,
   username varchar(30) NOT NULL,
   latin1 tinyint(1) DEFAULT '0' NOT NULL,
   u_time int(11) DEFAULT '0' NOT NULL,
   status varchar(1) NOT NULL,
   ip varchar(16) NOT NULL,
   UNIQUE room (room, username)
);

DROP TABLE IF EXISTS chat_ban_users;
CREATE TABLE chat_ban_users (
   username varchar(30) NOT NULL,
   latin1 tinyint(1) DEFAULT '0' NOT NULL,
   ip varchar(16) NOT NULL,
   rooms varchar(100) NOT NULL,
   ban_until int(11) DEFAULT '0' NOT NULL
);

Modifiez ensuite le fichier config.lib.php3 contenu dans le répertoire config :

<?php
// Database settings
define("C_DB_TYPE", 'mysql');
define("C_DB_HOST", 'localhost');
define("C_DB_NAME", '*** MY SPIP DB NAME ****');
define("C_DB_USER", '*** MY DB USER ***');
define("C_DB_PASS", '*** MY DB PASSWORD ***');
define("C_MSG_TBL", 'chat_messages');
define("C_USR_TBL", 'chat_users');
define("C_REG_TBL", 'spip_auteurs');
define("C_BAN_TBL", 'chat_ban_users');

// SPIP settings
define("C_FIELD_USERNAME", 'login');
define("C_FIELD_PASSWORD", 'pass');
define("C_FIELD_ALEA", 'alea_actuel');

// Cleaning settings for messages and usernames
define("C_MSG_DEL", '96');
define("C_USR_DEL", '4');
define("C_REG_DEL", '0');

// Proposed rooms
$DefaultChatRooms = array('Default', 'MyRoom1', 'MyRoom2');
$DefaultPrivateRooms = array('Priv1', 'Priv2');

// Language settings
define("C_LANGUAGE", 'french');
define("C_MULTI_LANG", '0');

// Registration of users
define("C_REQUIRE_REGISTER", '0');
define("C_EMAIL_PASWD", '0');

// Security and restriction settings
define("C_SHOW_ADMIN", '0');
define("C_SHOW_DEL_PROF", '0');
define("C_VERSION", '0');
define("C_BANISH", '0');
define("C_NO_SWEAR", '0');
define("C_SAVE", '*');

// Messages enhancements
define("C_USE_SMILIES", '1');
define("C_HTML_TAGS_KEEP", 'simple');
define("C_HTML_TAGS_SHOW", '1');

// Default display seetings
define("C_TMZ_OFFSET", '0');
define("C_MSG_ORDER", '0');
define("C_MSG_NB", '20');
define("C_MSG_REFRESH", '10');
define("C_SHOW_TIMESTAMP", '1');
define("C_NOTIFY", '1');
define("C_WELCOME", '1');
?>

Vous devez simplement renseigner le nom de votre base SPIP et votre user/password MySQL dans le premier bloc du fichier de configuration.

Si vous ne souhaitez qu’une salle de discussion par défaut, remplacez $DefaultChatRooms = array('Default', 'MyRoom1', 'MyRoom2'); par $DefaultChatRooms = array('Default');

A noter que les noms des champs utilisés pour l’autentification sont définies dans le second bloc.

TODO

  • Il n’y a plus de distinction entre utilisateurs phpMyChat (user, admin, moderateur). On pourrait utiliser les statuts des auteurs de spip_auteurs pour distinguer les utilisateurs (par exemple 0minirezo = utilisateur du chat et 1comite = moderateur du chat.
  • Cette version modifiée représente une branche parallèle à la version officielle de phpMyChat et en outre ne bénéficie pas de l’assistant html d’installation. Pour fusionner les modifs dans la version courante, il faudrait rajouter un indicateur dans le fichier de config (spip et pas spip) et l’utiliser pour activer ou non les fonctions de modification/ajout d’utilisateurs + adapter la fonction setup.php3 pour la configuration interactive avec question intégré avec spip ou pas ?
  • Vérifier que les futures mises à jour de SPIP ne nécessitent pas d’ajouter à nouveau les champs maquants dans spip_auteurs (ou segmenter en 2 tables avec mise à jour à chaque execution du chat !!).

Discussion

14 discussions

  • Bonjour ta contrib à l’air super et j’aimerais savoir si je peut l’utiliser pour accéder à un espace membre avec une vérification des droits. Je m’explique : j’ai besoin, à partir d’un espace public, d’accéder à un espace membre tout en faisant une vérification des droits(en effet, certain sont utilisateur seulement, d’autres seront auteurs , et d’autres administrateur).
    Je te remercie d’avance de ta reponse

    Répondre à ce message

  • 2

    bravo pour cette contrib

    j’ai installé et ca marchait l’enfer
    et puis, tout à coup, dans la frame de droite sans avoir rien changé :

    Database error : Invalid SQL : SELECT usr.username, usr.latin1, usr.status, reg.gender FROM chat_users usr LEFT JOIN spip_auteurs reg ON usr.username = reg.username WHERE usr.room = ’Default’ ORDER BY username MySQL error : 1054 (Unknown column ’reg.username’ in ’on clause’) Session halted.

    merci de votre aide

    • Bonjour,

      Un bug apparait (requête SQL invalide - voir commentaires ci-dessous) avec Mozilla : une partie du code non interprété avec IE n’avait pas été modifié pour aller chercher les logins utilisateurs dans la table spip_auteurs.

      Pour corriger ce bug, ouvrez le fichier usersL.php3 avec un éditeur de texte et remplacez partout la chaîne reg.username par reg.login

      Cet article va être prochainement mis à jour afin d’intégrer cette correction : passage de « phpMyChat-0.14.5 modif 0.1pour spip » à « phpMyChat-0.14.5 modif 0.2pour spip ».

      Merci de faire des retours si vous rencontrez d’autres problèmes. ;-)

    • Eric Godbout

      Merci pour ta réponse rapide Philippe. La journée même où je t’ai signalé le bug tu trouvais déjà la solution au problème. Ça c’est de l’efficacité ! Merci !

    Répondre à ce message

  • Ca m’intéresse beaucoup... Mais je suis loin d’être calé comme vous ! (à dire vrai je débute, je n’ai appris que récemment comment faire une requête sur une base de données)...
    Est-ce qu’il serait possible d’appliquer votre méthode avec un forum : http://www.calligrafia.net/forumcalligraphie/upload/

    C’est un forum Invision Power Board. je ne peux le leur demander, car ils fournissent un chat... mais dans leur version payante !! Et on ne peut pas passer à un forum SPIP désormais.
    L’idéal serait qu’il garde l’identification des admins/modo/membres du forum (les invités n’y auraient pas accès)...
    Pouvez-vous m’aider ?

    Répondre à ce message

  • 1
    Nicolas Hoizey

    Très belle initiative ! ;)

    Attention, l’URL de phpHeaven au début de l’article est fausse, c’est http://www.phpheaven.net et non http://www.phpheaven.com/ ...

    • Pas mal !

      Un petit screenshot serait vraiment très apprécié :)

    Répondre à ce message

Ajouter un commentaire

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

Qui êtes-vous ?
[Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom