II. Protocole▲
Nous allons ici détailler le protocole utilisé.
II-A. Introduction▲
On appelle serveur l'hôte fournissant le service, et client l'hôte l'utilisant. Le Protocole PCU fournit un service de discussion instantanée et de mise en relation entre clients, construit sur le protocole TCP/IP, il est volontairement écrit entièrement en français. Il s'organise autour de deux fonctionnalités principales :
- les discussions plusieurs-à-plusieurs, par canaux ;
- les discussions un-à-un, en connexion directe, qui prend également en charge les transferts de fichiers.
Un canal est un groupe nommé d'un ou plusieurs clients qui recevront tous les messages adressés à ce canal. On appelle connexion directe une connexion entre deux clients ne passant pas par le serveur.
II-B. Spécifications▲
II-B-1. Généralités▲
Pour être indépendant de tout langage, PCU est un protocole pur texte, et afin d'être compatible avec la majeure partie des caractères existants l'encodage utilisé est UTF-8.
II-B-2. Messages▲
Les messages échangés utilisent :
- SP (0x20) et CR (0x0D) comme séparateur ;
- CRLF (0x0D, 0x0A) comme séquence de terminaison ;
- LF (0x0A) comme caractère de fin de ligne.
Les réponses du serveur doivent permettre au client de savoir à quel message il répond. Si un client fait une demande du nombre de connectés, des réponses simples comme +OK_REQUETE ou -ERR_ERREUR seront renvoyées par le serveur.
II-B-3. Conventions▲
Le nom des commandes est volontairement long de façon à être le plus explicite possible. Le format des commandes est défini ci-dessous.
Convention des réponses :
-
+ préfixe une réponse n'étant pas une erreur et est suivi de :
- OK pour une réponse positive,
- KO pour une réponse négative ;
- - préfixe une erreur et est toujours suivi de ERR.
II-B-4. Format des messages en pseudoBNF▲
Format des messages émis par le client :
- REQUETE ::= <COMMANDE><sp> | <cr>[<PARAMS>]<crlf> ;
- COMMANDE ::= un message ;
- PARAMS ::= chaîne UTF-8 séparée par des SP.
Format des messages émis par le serveur :
- REPONSE ::= <PREFIXE> <TEXTE><crlf> ;
- PREFIXE ::= (+<SUCCES> | -<ERREUR> | ) ;
- SUCCES ::= (OK|KO)_<COMMANDE> ;
- ERREUR ::= chaîne alphabétique en majuscules, sans espace, préfixée par ERR_ ;
- TEXTE ::= chaîne alphabétique.
II-C. États▲
II-C-1. Non authentifié▲
État de la connexion client/serveur avant la réussite de l'authentification du client.
II-C-2. Authentifié▲
État de la connexion après la réussite de l'authentification.
II-C-3. Connecté à un canal▲
État de la connexion client/serveur après la connexion à un canal.
II-C-4. Connexion directe▲
État de la connexion client/client une fois la connexion directe acceptée par les deux parties.
II-D. Messages▲
Si un client envoie un message incorrect, c'est-à-dire que les arguments ne correspondent pas à la commande, le serveur lui répond par -ERR_SYNTAXE. Si la commande est inconnue : -ERR_CMDINCONNUE. Si la commande ne peut être invoquée avec l'état courant du client : -ERR_ETAT.
II-D-1. Enregistrement de la connexion▲
II-D-1-a. IDENTIFIER▲
-
Synopsis :
- IDENTIFIER <login> <mot de passe>
-
Contraintes :
- Ce message ne peut être émis que dans un état Non authentifié.
-
Description :
- Le client utilise cette commande pour s'identifier, il passe ainsi dans un état Authentifié. Si l'authentification a réussi, le serveur précise son login et ses droits (admin ou nonadmin).
-
Réponses possibles :
-
L'authentification a réussi :
- +OK_IDENTIFIER <login> <droits>
-
Le login ou le mot de passe est incorrect :
- -ERR_ECHECIDENT <login>
-
Le serveur ne peut pas répondre à cette requête à cause d'un problème interne :
- -ERR_INTERNE
-
II-D-1-b. QUITTER▲
-
Synopsis :
- QUITTER [<message de départ>]
-
Contraintes :
- Ce message ne peut être émis que dans un état Authentifié.
-
Description :
- Commande utilisée par le client pour fermer la connexion.
-
Réponses possibles :
- Aucune
II-D-1-c. FINCONNEXION▲
-
Synopsis :
- FINCONNEXION [« <message de départ> »]
-
Contraintes :
- Message envoyé par le serveur pour prévenir le client de la fin de la connexion lorsque le serveur est stoppé ou relancé, lorsque le nombre maximum de connexions est atteint et enfin lorsqu'un client est banni. Il est possible de préciser un message de fin.
-
Réponses possibles :
- Aucune
II-D-2. Opérations sur les canaux▲
II-D-2-a. REJOINDRE▲
-
Synopsis :
- REJOINDRE <nom-canal>
-
Contraintes :
- Ce message ne peut être émis que dans un état Authentifié.
-
Description :
- Commande utilisée pour rejoindre un canal.
-
Réponses possibles :
-
Le canal a bien été rejoint :
- +OK_REJOINDRE <nom-canal>
-
Le client est déjà connecté :
- -ERR_DEJACONNECTE <nom-canal>
-
Le canal n'existe pas :
- -ERR_CANALINTROUVABLE <nom-canal>
-
II-D-2-b. MESSAGE▲
-
Synopsis :
- MESSAGE <nom-canal> <texte>
-
Contraintes :
- Ce message ne peut être émis que dans un état Authentifié et Connecté à un canal.
-
Description :
- Commande utilisée pour envoyer un message sur un canal.
-
Réponses possibles :
-
Le message a bien été envoyé :
- +OK_MESSAGE <nom-canal>
-
L'utilisateur n'est pas connecté au canal précisé :
- -ERR_NONCONNECTE <nom-canal>
-
Le canal n'existe pas :
- -ERR_CANALINTROUVABLE <nom-canal>
-
II-D-2-c. MEMBRE▲
-
Synopsis :
- MEMBRE <nom-canal>
-
Contraintes :
- Ce message ne peut être émis que dans un état Authentifié.
-
Description :
- Commande utilisée pour connaître la liste des connectés au canal.
-
Réponses possibles :
-
Les utilisateurs ont été trouvés :
- +OK_MEMBRE <nom-canal><CR><login1 login2 … loginN>
-
Le canal n'existe pas :
- -ERR_CANALINTROUVABLE <nom-canal>
-
II-D-2-d. QUITTERCANAL▲
-
Synopsis :
- QUITTERCANAL <nom-canal>
-
Contraintes :
- Ce message ne peut être émis que dans un état Authentifié et Connecté à un canal.
-
Description :
- Commande utilisée pour quitter un canal.
-
Réponses possibles :
-
La déconnexion au canal s'est bien passée :
- +OK_QUITTERCANAL <nom-canal>
-
L'utilisateur n'est pas connecté au canal précisé :
- -ERR_NONCONNECTE <nom-canal>
-
Le canal n'exsite pas :
- -ERR_CANALINTROUVABLE <nom-canal>
-
II-D-2-e. NOTIFIER▲
-
Synopsis :
- NOTIFIER <nom-canal> <evenement> ([<login>] | [<login>] [« <texte> »] | [« <texte> »])
-
Contraintes :
- Aucunes, ce message est envoyé par le serveur.
-
Description :
- Ce message est envoyé par le serveur aux clients connectés à un canal pour les notifier d'un évènement affectant le canal.
-
Il y a six évènements possibles :
- REJOINT <login>
- PARLE <login> « <texte> »
- PARTI <login>
- EJECTE <login>
- SUJETCHANGE « <texte> »
- SUPPRIME
- BANNI <login>
II-D-3. Connexion directe▲
II-D-3-a. CONNEXIONDIRECTE▲
-
Synopsis :
- CONNEXIONDIRECTE <login> <IP>
-
Contraintes :
- Ce message ne peut être émis que dans un état Authentifié.
-
Description :
- Commande utilisée par un client A pour demander une connexion directe à un autre client B. Le serveur sert d'intermédiaire, et permet aux deux clients de s'échanger les informations nécessaires comme leurs adresses IP respectives, et le port sur lequel la connexion doit se faire. On distingue quatre étapes :
-
Réponses possibles de la part du serveur :
-
Le login est introuvable :
- -ERR_LOGININTROUVABLE <login>
-
-
Réponses possibles de la part de B :
-
Confirmation de la connexion directe. Avant l'envoi de cette réponse, il se met en écoute :
- +OK_CONNEXIONDIRECTE <IP> <port>
-
Refus de la connexion :
- +KO_CONNEXIONDIRECTE <login>
-
II-D-3-b. MESSAGEPRIVE▲
-
Synopsis :
- MESSAGEPRIVE <texte>
-
Contraintes :
- Ce message ne peut être émis que dans un état Connexion directe.
-
Description :
- Commande utilisée dans le cadre d'une connexion client/client pour envoyer un message.
II-D-3-c. TRANSFERTFICHIER▲
-
Synopsis :
- TRANSFERTFICHIER <nom-fichier>
-
Contraintes :
- Ce message ne peut être émis que dans un état Connexion directe.
-
Description :
- Cette commande est utilisée pour demander un transfert de fichier. Le client qui propose le transfert précise le nom du fichier. Le receveur lui, précise le port sur lequel il attend la connexion si le transfert est accepté.
-
Réponses possibles :
-
Transfert accepté :
- +OK_TRANSFERTFICHIER <port>
-
Transfert refusé :
- +KO_TRANFERTFICHIER
-
II-D-4. Informations▲
II-D-4-a. LISTER▲
-
Synopsis :
- LISTER [<nom-canal>]
-
Contraintes :
- Ce message ne peut être émis que dans un état Authentifié.
-
Description :
- Commande utilisée pour connaître la liste des canaux du serveur. Le serveur répond par une liste de triplés <nom-canal> <topic> <nombre d'utilisateurs> séparés par CR. Si le nom d'un canal est précisé celle-ci ne s'effectue que sur ce dernier c'est-à-dire que le serveur répond par le triplé <nom-canal> <topic> <nombre d'utilisateurs>
-
Réponses possibles :
-
La liste a été trouvée :
- +OK_LISTER<CR>triplet1<CR>triplet2<CR>…<CR>tripletN
-
Si le nom du canal a été précisé et que celui-ci n'existe pas :
- -ERR_CANALINTROUVABLE <nom-canal>
-
II-D-4-b. INFOMEMBRE▲
-
Synopsis :
- INFOMEMBRE <login>
-
Contraintes :
- Ce message ne peut être émis que dans un état Authentifié.
-
Description :
- Commande utilisée pour connaître les informations relatives à un utilisateur.
-
Réponses possibles :
-
L'utilisateur a été trouvé :
- +OK_INFOMEMBRE <login><CR>nom-canal1 … nom-canalN
-
L'utilisateur n'a pas été trouvé :
- -ERR_LOGININTROUVABLE <login>
-
II-D-4-c. MOTD▲
-
Synopsis :
- MOTD
-
Contraintes :
- Aucunes.
-
Description :
- Commande utilisée pour connaître le MOTD (Message Of The Day) du serveur.
-
Réponses possibles :
-
Le message est trouvé :
- +OK_MOTD « <motd> »
-
Une erreur interne est survenue :
- -ERR_INTERNE
-
II-D-5. Administration▲
Ces commandes sont réservées à l'administrateur. Tout utilisateur non privilégié qui tenterait d'utiliser ces commandes reçoit le message d'erreur -ERR_NONADMINISTRATEUR.
II-D-5-a. CNL_CREER▲
-
Synopsis :
- CNL_CREER <nom-canal> « <sujet-canal> »
-
Contraintes :
- Ce message ne peut être émis que dans un état Authentifié.
-
Description :
- Création d'un canal.
-
Réponses possibles :
-
Le canal a bien été créé :
- +OK_CNL_CREER <nom-canal> « <sujet-canal> »
-
Le canal existe déjà :
- -ERR_CANALEXISTANT <nom-canal>
-
Trop de canaux ont déjà été créés :
- -ERR_NBCANAUXMAX
-
II-D-5-b. CNL_SUPPRIMER▲
-
Synopsis :
- CNL_SUPPRIMER <nom-canal>
-
Contraintes :
- Ce message ne peut être émis que dans un état Authentifié.
-
Description :
- Suppression d'un canal.
-
Réponses possibles :
-
Le canal a bien été supprimé :
- +OK_CNL_SUPPRIMER <nom-canal>
-
Le canal passé en argument n'existe pas :
- -ERR_CANALINTROUVABLE <nom-canal>
-
II-D-5-c. CNL_CHANGERSUJET▲
-
Synopsis :
- CNL_CHANGERSUJET <nom-canal> « <nouveau-sujet> »
-
Contraintes :
- Ce message ne peut être émis que dans un état Authentifié.
-
Description :
- Commande utilisée pour changer le sujet d'un canal.
-
Réponses possibles :
-
Le sujet du canal a bien été changé :
- +OK_CNL_CHANGERSUJET <nom-canal> « <nouveau-sujet> »
-
Le canal passé en argument n'existe pas :
- -ERR_CANALINTROUVABLE <nom-canal>
-
Le sujet n'est pas valide :
- -ERR_SUJETINCORRECT « <nouveau sujet> »
-
II-D-5-d. UTL_EJECTER▲
-
Synopsis :
- UTL_EJECTER <login> <nom-canal>
-
Contraintes :
- Ce message ne peut être émis que dans un état Authentifié.
-
Description :
- Commande utilisée pour éjecter un utilisateur d'un canal.
-
Réponses possibles :
-
L'utilisateur a été éjecté :
- +OK_UTL_EJECTER <login> <nom-canal>
-
L'utilisateur n'a pas été trouvé sur le serveur :
- -ERR_LOGININTROUVABLE <login>
-
L'utilisateur n'est pas connecté au canal :
- -ERR_NONCONNECTE <login> <nom-canal>
-
Le canal n'existe pas :
- -ERR_CANALINTROUVABLE <nom-canal>
-
II-D-5-e. UTL_BANNIR▲
-
Synopsis :
- UTL_BANNIR <login>
-
Contraintes :
- Ce message ne peut être émis que dans un état Authentifié.
-
Description :
- Commande utilisée pour bannir un utilisateur du serveur.
-
Réponses possibles :
-
L'utilisateur a été banni :
- +OK_UTL_BANNIR <login>
-
L'utilisateur n'a pas été trouvé sur le serveur :
- -ERR_LOGININTROUVABLE <login>
-
II-D-5-f. SRV_RELANCER▲
-
Synopsis :
- SRV_RELANCER [<message>]
-
Contraintes :
- Ce message ne peut être émis que dans un état Authentifié.
-
Description :
- Relance le serveur. Il est possible de préciser un message de notification à l'attention des clients.
-
Réponses possibles :
-
Le serveur va se relancer :
- FINCONNEXION [<message>]
-
II-D-5-g. SRV_STOPPER▲
-
Synopsis :
- SRV_STOPPER [<message>]
-
Contraintes :
- Ce message ne peut être émis que dans un état Authentifié.
-
Description :
- Arrête le serveur. Il est possible de préciser un message de notification à l'attention des clients.
-
Réponses possibles :
-
Le serveur va s'arrêter :
- FINCONNEXION [<message>]
-
II-D-5-h. SRV_LISTER▲
-
Synopsis :
- SRV_LISTER
-
Contraintes :
- Ce message ne peut être émis que dans un état Authentifié.
-
Description :
- Liste toutes les connexions du serveur. Le serveur répond par une liste de couple <login> <IP> séparés par des CR.
-
Réponses possibles :
-
La liste a été trouvée :
- +OK_SRV_LISTER <CR>liste-connexion
-