Project

General

Profile

Protocole

Introduction

Ce document a pour but de décrire la communication client-serveur du site euphorik.
Les messages échangés sont basés sur le format JSON.
Ce document remplace 'protocole2.txt'.

Principes

Enregistrement:

  • Permet de créer un compte, un cookie est donné en retour. Ce cookie doit être stocké par le client pour pouvoir s'authentifier par la suite.

Authentification:

  • L'authentification (login) se fait soit par un couple <login, mot de passe> soit à l'aide d'un cookie.
  • Permet de récupérer les données d'un profile

Rafraichissement:

  • Le client envoie une demande au serveur avec l'id du dernier message (via XMLHttpRequest ou un function de JQuery)
  • Le serveur maintient la connexion bloquée si le client est à jour.
  • Dès qu'un nouveau message arrive, le serveur débloque la connexion et envoie le ou les messages manquants.

Messages

c : client
s : server

Les messages client vers serveur sont envoyés par HTTP-POST.

A toutes les requêtes le serveur peut répondre une erreur :

<error>
   { 
      "reply" : "error",
      "no" : 12
      "error_message" : "blabla" 
   }

Message ok générique :

<ok>
   {
      "reply" : "ok" 
   }

Entête des messages clients :
Si la version du protocole n'est pas similaire du coté serveur la requête est refusée

<client_header>
   {
      "action" : <action>,
      "version" : 3
   }

Enregistrement et authentification

Permet de créer un nouvel utilisateur.
"login" et "password" peuvent ne pas être fournis avec un message de type "register", dans ce cas l'utilisateur ne pourra s'authentifier qu'a l'aide de son cookie.
Le mot de passe est hashé en md5.

c -> s

   { 
      "header" : {action : "register", version : 3},
      "login" : "paul",
      "password" : "IJKJDHHSAD9081238",
      "profile" : { .. } // voir <profile>
   }

ou
   {
      "header" : {action : "authentification", version : 3}
      "cookie" : "LKJDLAKSJBFLKASN" 
   }

ou
   {
      "header" : {action : "authentification", version : 3},
      "login" : "paul",
      "password" : "IJKJDHHSAD9081238" 
   }

s -> c

   {
      "reply" : "register" | "authentification",
      "status" : "auth_registered" | "auth_not_registered",
      "cookie" : "LKJDLAKSJBFLKASN",
      "id" : 193,
      "login" : "paul49",
      "ek_master" : true | false,
      "profile" : <profile>
   }

Logout

c -> s

   {
      "header" : {action : "logout", version : 3},
      "cookie" : "LKJDLAKSJBFLKASN" 
   }

Profile

<profile>
   {
      "nick" : "Paul",
      "email" : "paul@pierre.com",
      "css" : "css/3/euphorik.css",
      "chat_order" : "chrono" | "reverse",
      "nick_format" : "nick" | "login" | "nick_login",
      "view_times" : true | false,
      "view_tooltips" : true | false,
      "conversations" : [{"root" : 3, "minimized" : true},
      "ostentatious_master" : "invisible" | "light" | "heavy" 
   }

c -> s

   {
      "header" : {action : "set_profile", version : 3},
      "cookie" : "LKJDLAKSJBFLKASN",
      "login" : "paul49",
      "password" : "IJKJDHHSAD9081238",
      "profile" : <profile>
   }

s -> c

   <ok>
ou
   <error>

Wait event (page = chat)

Si "last_message_id" est absent alors le client ne possède pas de message.
Si "main_page" est absent alors est vaut 1.
"cookie" n'est pas obligatoire.

<message>
   {
      "id" : 54,
      "user_id" : 344,
      "date" : "Hier 17:26:54",
      "last_update" : "Hier 17:26:54",
      "system" : true | false,
      "owner" : true | false,
      "answered" : true | false,
      "is_a_reply" : true | false,
      "nick" : "Paul",
      "login" : "paul_22",
      "content" : "Salut",
      "root" : 453,
      "answer_to" : [
         { "id" : 123, "nick" : "Pierre", "login" : "pierre_45" }
      ],
      "ek_master" : true | false,
      "ostentatious_master" : "invisible" | "light" | "heavy",
      "last_modification" : "Hier 17:26:54" 
   }

c -> s

   {
      "header" : {action : "wait_event", version : 3},
      "page" : "chat" 
      "cookie" : "LKJDLAKSJBFLKASN",
      "message_count" : 10,
      "last_message_id" : 163,
      "main_page" : 1,
      "conversations" : [
         {
            "root" : 123,
            "page" : 1,
            "last_message_id" : 4 (pas obligatoire)
         }
      ]
   }

s -> c
La première conversation est la principale (main).
L'ordre des conversation est le même que celui des données de l'utilisateur.
Le format de la date n'est pas formel.
first correpond au premier message de la conversation, vaut 'null' pour la conversation principale ainsi que pour les conversations vides.

   {
      "reply" : "new_message",
      "conversations" : [
         {
            "last_page" : true | false,
            "first" : <message> | null,
            "messages" : [ <message>, .. ]
         }
      ]
   }

ou
   {
      "reply" : "message_updated",
      <message>
   }

ou
   <error>

Wait event (page = admin)

c -> s

   {
      "header" : {action : "wait_event", version : 3},
      "page" : "admin" 
   }

indique de mettre à jour la liste d'ips
s -> c

   {
      "reply" : "banned_ips_refresh" 
   }

Envoie message

Le client envoie un message, le message peut répondre à un certain nombre d'autres messages.
"answer_to" n'est pas obligatoire.

c -> s

   {
      "header" : {action : "put_message", version : 3},
      "cookie" : "LKJDLAKSJBFLKASN",
      "nick" : "Paul",
      "content" : "Bonjour",
      "answer_to" : [ 345, 532, ... ]
   }

s -> c

   <ok>

ou
   <error>

Slapage

c -> s

   {
      "header" : {action : "slap", version : 3},
      "cookie" :  "LKJDLAKSJBFLKASN",
      "user_id" : 67,
      "reason" : "blablabla" 
   }

s -> c

   <ok>

ou
   <error>

Bannissement

c -> s

   {
      "header" : {action : "ban", version : 3},
      "cookie" : "LKJDLAKSJBFLKASN",
      "duration" : 15, // en minute
      "user_id" : 67,
      "reason" : "blablabla" 
   }

s -> c

   <ok>

ou
   <error>

Liste des ip bannis

c -> s

   {
      "header" : {action : "list_banned_ips", version : 3},
      "cookie" : "LKJDLAKSJBFLKASN" 
   }

s -> c

   {
      "reply" : "list_banned_ips",
      "list" : [
         {
            ip : "192.168.1.2", 
            remaining_time : "1h23" 
            users : [
               {
                  nick : "Pierre" , 
                  login : "pierre" 
               }
            ]
         }
      ]
   }

Débannissement

c -> s

   {
      "header" : {action : "unban", version : 3},
      "cookie" : "LKJDLAKSJBFLKASN" 
      "ip" : "192.168.1.2" 
   }

s -> c

   <ok>

ou
   <error>

Ajout d'une correction d'un messages

(non implémenté, améliorer pour la modification complète d'un message)
Le client envoie un correctif sous la forme de texte supplémentaire à appondre au dernier messages.
Le message est appondu avec un " +++ " devant, par exemple :

Gnome c'est mieux que KDE +++ Euh non ok, c'est faux

c -> s

   {
      "header" : {action : "correction", version : 3},
      "cookie" : "LKJDLAKSJBFLKASN",
      "content" : "Euh non ok, c'est faux" 
   }

s -> c

   {
      "reply" : "correction",
      "status" : "ok" | "error",
      "message_error" : "blabla" 
   }