FIX problème de gestion du profile, après ouverture d'une conversation puis enregistr...
authorGreg Burri <greg.burri@gmail.com>
Sat, 26 Jul 2008 18:21:26 +0000 (18:21 +0000)
committerGreg Burri <greg.burri@gmail.com>
Sat, 26 Jul 2008 18:21:26 +0000 (18:21 +0000)
FIX autres...

doc/protocole3.txt
js/client.js
js/pageMinichat/conversation.js
js/pageMinichat/message.js
js/pageProfile.js
js/pageRegister.js
modules/erl/euphorik_bd.erl
modules/erl/euphorik_protocole.erl
modules/include/euphorik_bd.hrl
styles/1/euphorik.css

index 55e2115..c8642ab 100644 (file)
@@ -55,9 +55,10 @@ Le mot de passe est hashé en md5.
 
 c -> s
    { 
-      "header" : {action : "authentification", version : 3},
+      "header" : {action : "register", version : 3},
       "login" : "paul",
-      "password" : "IJKJDHHSAD9081238"
+      "password" : "IJKJDHHSAD9081238",
+      "profile_infos" : { .. } // voir <profile_infos>
    }
 ou
    {
@@ -74,16 +75,7 @@ ou
 s -> c
    {
       "reply" : "register" | "authentification",
-      "status" : "auth_not_registered",
-      "cookie" : "LKJDLAKSJBFLKASN",
-      "id" : 193,
-      "css" : "css/1/euphorik.css",
-      "main_page" : 1
-   }
-ou
-   {
-      "reply" : "register" | "authentification",
-      "status" : "auth_registered",
+      "status" : "auth_registered" | "auth_not_registered",
       "cookie" : "LKJDLAKSJBFLKASN",
       "id" : 193,
       "nick" : "Paul",
@@ -109,12 +101,8 @@ c -> s
  
  
 === Profile ===
-c -> s
+<profile_infos>
    {
-      "header" : {action : "set_profile", version : 3},
-      "cookie" : "LKJDLAKSJBFLKASN",
-      "login" : "paul49",
-      "password" : "IJKJDHHSAD9081238",
       "nick" : "Paul",
       "email" : "paul@pierre.com",
       "css" : "css/3/euphorik.css",
@@ -125,6 +113,15 @@ c -> s
       "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_infos" : <profile_infos>
+   }
       
 s -> c
    <ok>
index d7240a6..73622a4 100644 (file)
@@ -180,13 +180,17 @@ euphorik.Client.prototype.getJSONLoginCookie = function() {
   * de s'autentifier avec (login, password).\r
   */\r
 euphorik.Client.prototype.getJSONEnregistrement = function(login, password) {\r
-   var mess = { "header" : { "action" : "register", "version" : euphorik.conf.versionProtocole } };\r
+   var mess = {\r
+      "header" : { "action" : "register","version" : euphorik.conf.versionProtocole }\r
+   };\r
    \r
    if (login && password) {\r
       mess.login = login;\r
       mess.password = password;\r
    }\r
    \r
+   mess.profile_infos = this.getJSONProfileInfos();\r
+   \r
    return mess;\r
 };\r
 \r
@@ -204,6 +208,12 @@ euphorik.Client.prototype.getJSONProfile = function() {
       "cookie" : this.cookie,\r
       "login" : this.login,\r
       "password" : this.password,\r
+      "profile_infos" : this.getJSONProfileInfos()\r
+   };\r
+};\r
+\r
+euphorik.Client.prototype.getJSONProfileInfos = function() {\r
+   return {\r
       "nick" : this.pseudo,\r
       "email" : this.email,\r
       "css" : this.css,\r
@@ -302,7 +312,7 @@ euphorik.Client.prototype.enregistrement = function(login, password) {
 };\r
 \r
 /**\r
-  * Connexion. Réalisé de manière synchrone.\r
+  * Connexion. Réalisée de manière synchrone.\r
   */\r
 euphorik.Client.prototype.connexion = function(messageJson) {\r
    var thisClient = this;\r
index 3948629..238976b 100644 (file)
@@ -238,7 +238,6 @@ euphorik.Conversation.prototype.flush = function() {
    var thisConversation = this;\r
    var reverse = this.client.chatOrder === "reverse";\r
 \r
-   // est-ce que le prochain message est pair ? (permet d'alterner le style des messages)\r
    var messagePair = (this.idDernierMessageAffiche === 0 ? true :\r
       ($("#" + this.getId() + " .messages div:" + (reverse ? "first" : "last")).attr("class").search("messagePair") === -1)\r
    );\r
index 67ba7e6..a3d4d32 100644 (file)
@@ -111,7 +111,9 @@ euphorik.Message.prototype.getConversation = function(messages) {
   * Aucun callback n'est affecté.\r
   */\r
 euphorik.Message.prototype.XHTML = function(messagePair, pre) {\r
-   messagePair = messagePair || true;\r
+   if (messagePair === undefined) {\r
+      messagePair =  true;\r
+   }\r
    pre = pre || "";\r
    \r
    thisMessage = this;\r
index fa7235b..b272400 100755 (executable)
@@ -113,6 +113,7 @@ euphorik.PageProfile.prototype.getHTML = function() {
       '  <tr>' +\r
       '   <td>login</td>' +\r
       '   <td><input class="login" type="text" size="20" maxlength="20" ' + (this.client.authentifie() ? 'readonly="readonly"' : '') + ' /></td>' +\r
+      (this.client.authentifie() ? '' : '   <td>(sensible à la <a href="http://fr.wikipedia.org/wiki/Casse_(informatique)">casse</a>)</td>') +\r
       '  </tr>' +\r
       '  <tr>' +\r
       '   <td>password</td>' +\r
index b422f5d..f1abd70 100755 (executable)
 // GNU General Public License for more details.\r
 //\r
 // You should have received a copy of the GNU General Public License\r
-// along with Euphorik.  If not, see <http://www.gnu.org/licenses/>.
-
-euphorik.PageRegister = function(client, formateur, util) {
-   this.nom = "register";
-   
-   this.client = client;
-   this.formateur = formateur;
-   this.util = util;
-};
-
-euphorik.PageRegister.prototype.contenu = function() {
-   return '<form action="" id="register" >' +
-      ' <table>' +
-      '  <tr>' +
-      '   <td>login</td>' +
-      '   <td><input class="login" type="text" size="20" maxlength="20"/><input class="captcha" name="captcha" type="text" size="12"></input></td>' +
-      '  </tr>' +
-      '  <tr>' +
-      '   <td>password</td>' +
-      '   <td><input class="password" type="password" size="20" maxlength="20"/></td>' +
-      '  </tr>' +
-      '  <tr>' +
-      '   <td>password re</td>' +
-      '   <td><input class="passwordRe" type="password" size="20" maxlength="20"/></td>' +
-      '  </tr>' +
-      '  <tr>' +
-      '  <td></td>' +
-      '  <td><button>valider</button>' +
-      '  </tr>' +
-      ' </table>' +
-      '</form>';
-};
-
-euphorik.PageRegister.prototype.charger = function() {      
-   $("#page form#register").submit(function(){ return false; });
-      
-   var thisPage = this;
-   
-   $("#page form#register button").click(
+// along with Euphorik.  If not, see <http://www.gnu.org/licenses/>.\r
+\r
+euphorik.PageRegister = function(client, formateur, util) {\r
+   this.nom = "register";\r
+   \r
+   this.client = client;\r
+   this.formateur = formateur;\r
+   this.util = util;\r
+};\r
+\r
+euphorik.PageRegister.prototype.contenu = function() {\r
+   return '<form action="" id="register" >' +\r
+      ' <table>' +\r
+      '  <tr>' +\r
+      '   <td>login</td>' +\r
+      '   <td><input class="login" type="text" size="20" maxlength="20"/><input class="captcha" name="captcha" type="text" size="12"></input></td>' +\r
+      '   <td>(sensible à la <a href="http://fr.wikipedia.org/wiki/Casse_(informatique)">casse</a>)</td>' +\r
+      '  </tr>' +\r
+      '  <tr>' +\r
+      '   <td>password</td>' +\r
+      '   <td><input class="password" type="password" size="20" maxlength="20"/></td>' +\r
+      '  </tr>' +\r
+      '  <tr>' +\r
+      '   <td>password re</td>' +\r
+      '   <td><input class="passwordRe" type="password" size="20" maxlength="20"/></td>' +\r
+      '  </tr>' +\r
+      '  <tr>' +\r
+      '  <td></td>' +\r
+      '  <td><button>valider</button>' +\r
+      '  </tr>' +\r
+      ' </table>' +\r
+      '</form>';\r
+};\r
+\r
+euphorik.PageRegister.prototype.charger = function() {      \r
+   $("#page form#register").submit(function(){ return false; });\r
+      \r
+   var thisPage = this;\r
+   \r
+   $("#page form#register button").click(\r
       function() {         \r
          if ($("#page form#register input.captcha").val() !== "") {\r
             return;\r
          }\r
-         
-         var login = $("#page form#register input.login").val().trim();
-         var password = $("#page form#register input.password").val();
-         var passwordRe = $("#page form#register input.passwordRe").val();
-         
-         if (login === "") {
-            thisPage.util.messageDialogue("Le login ne doit pas être vide");
-         } else if (password === "" && passwordRe === "") {
-            thisPage.util.messageDialogue("Un mot de passe est obligatoire");
-         } else if (password !== passwordRe) {
-            thisPage.util.messageDialogue("Les mots de passes ne correspondent pas");
-         } else if(thisPage.client.enregistrement(login, thisPage.util.md5(password))) {   
-            thisPage.util.messageDialogue("Enregistrement réussi");
-            thisPage.pages.afficherPage("minichat");
-         }
-      }
-   );
+         \r
+         var login = $("#page form#register input.login").val().trim();\r
+         var password = $("#page form#register input.password").val();\r
+         var passwordRe = $("#page form#register input.passwordRe").val();\r
+         \r
+         if (login === "") {\r
+            thisPage.util.messageDialogue("Le login ne doit pas être vide");\r
+         } else if (password === "" && passwordRe === "") {\r
+            thisPage.util.messageDialogue("Un mot de passe est obligatoire");\r
+         } else if (password !== passwordRe) {\r
+            thisPage.util.messageDialogue("Les mots de passes ne correspondent pas");\r
+         } else if(thisPage.client.enregistrement(login, thisPage.util.md5(password))) {   \r
+            thisPage.util.messageDialogue("Enregistrement réussi");\r
+            thisPage.pages.afficherPage("minichat");\r
+         }\r
+      }\r
+   );\r
 };\r
index 0539910..f5fa258 100755 (executable)
@@ -25,9 +25,9 @@
 -module(euphorik_bd).\r
 -export([   \r
    % users :\r
-   nouveau_user/2,\r
    nouveau_user/3,\r
-   set_profile/12,\r
+   nouveau_user/4,\r
+   set_profile/1,\r
    update_date_derniere_connexion/1,\r
    update_ip/2,\r
    update_pseudo_user/2,\r
 \r
 \r
 % Ajoute un nouveau user et le renvoie\r
-nouveau_user(Pseudo, Cookie) ->\r
+% User_infos représente le profile de l'utilisateur, il est possibe qu'il soit vide\r
+nouveau_user(Pseudo, Cookie, User_infos) ->\r
    F = fun() ->\r
       Id = nouvel_id(user),\r
-      User = #user{id = Id, cookie = Cookie, pseudo = Pseudo, date_creation = now(), date_derniere_connexion = now()},\r
+      User = User_infos#user{id = Id, cookie = Cookie, pseudo = Pseudo, date_creation = now(), date_derniere_connexion = now()},\r
       mnesia:write(User),\r
       User\r
    end,\r
@@ -101,55 +102,40 @@ nouveau_user(Pseudo, Cookie) ->
   \r
   \r
 % Ajoute un nouveau user et le renvoie\r
-nouveau_user(Login, Password, Cookie) ->\r
+% User_infos représente le profile de l'utilisateur, il est possibe qu'il soit vide\r
+nouveau_user(Login, Password, Cookie, User_infos) ->\r
    F = fun() ->\r
       Id = nouvel_id(user),\r
-      User = #user{id = Id, cookie = Cookie, pseudo = Login, login = Login, password = Password, date_creation = now(), date_derniere_connexion = now()},\r
+      User = User_infos#user{id = Id, cookie = Cookie, pseudo = Login, login = Login, password = Password, date_creation = now(), date_derniere_connexion = now()},\r
       mnesia:write(User),\r
       User\r
    end,\r
   resultat_transaction(mnesia:transaction(F)).\r
+  \r
 \r
-\r
-% Mise à par Cookie les autres peuvent être undefined ce qui veut dire qu'ils ne seront pas modifié.\r
-% Conversation est de type [{int(), bool()}] où l'entier est la racine, le booléen indique si la conversation est réduite ou non\r
-% Ostentatious_master peut valoir invisible, light ou heavy\r
-set_profile(Cookie, Login, Password, Pseudo, Email, Css, Chat_order, Nick_format, View_times, View_tooltips, Conversations, Ostentatious_master) ->\r
-   if Nick_format =:= nick; Nick_format =:= login; Nick_format =:= nick_login,\r
-      Ostentatious_master =:= invisible; Ostentatious_master =:= light; Ostentatious_master =:= heavy ->\r
-         resultat_transaction(mnesia:transaction(\r
-            fun() ->\r
-               case user_by_cookie(Cookie) of\r
-                  {ok, User} ->\r
-                     case user_by_login(Login) of\r
-                        {ok, U} when Login =/= [], U#user.id =/= User#user.id ->\r
-                           login_deja_pris;\r
-                        _ ->\r
-                           User_modifie = User#user{\r
-                              % TODO : pourquoi ne pas tester avec la valeur "undefined" plutôt qu'avec "is_list" ?\r
-                              % TODO : validation plus strict des données (pas de page négative dans les conv par exemple)\r
-                              login = if is_list(Login) -> Login; true -> User#user.login end,\r
-                              password = if is_list(Password) andalso Password =/= [] -> Password; true -> User#user.password end,\r
-                              pseudo = if is_list(Pseudo) -> Pseudo; true -> User#user.pseudo end,\r
-                              email = if is_list(Email) -> Email; true -> User#user.email end,\r
-                              css = if is_list(Css) -> Css; true -> User#user.css end,\r
-                              chat_order = Chat_order,\r
-                              nick_format = Nick_format,\r
-                              view_times = View_times,\r
-                              view_tooltips = View_tooltips,\r
-                              conversations = if is_list(Conversations) -> Conversations; true -> User#user.conversations end,\r
-                              ostentatious_master = Ostentatious_master\r
-                           },\r
-                           mnesia:write(User_modifie),\r
-                           ok\r
-                     end;\r
-                  _ -> erreur\r
-               end\r
-            end\r
-         ));\r
-      true ->\r
-         erreur\r
-   end.\r
+% Définit les données d'une utilisateur.\r
+set_profile(User) ->\r
+   resultat_transaction(mnesia:transaction(\r
+      fun() ->\r
+         case user_by_cookie(User#user.cookie) of\r
+            {ok, User_existant} ->\r
+               case user_by_login(User#user.login) of\r
+                  {ok, U} when User#user.login =/= [], U#user.id =/= User_existant#user.id ->\r
+                     login_deja_pris;\r
+                  _ ->\r
+                     mnesia:write(\r
+                        User#user{\r
+                           id = User_existant#user.id,\r
+                           login = if User_existant#user.login =:= [] -> User#user.login; true -> User_existant#user.login end, % on ne peut pas changer de login sauf si on en a pas !\r
+                           password = if User#user.password =:= [] -> User_existant#user.password; true -> User#user.password end\r
+                        }\r
+                     ),\r
+                     ok\r
+               end;\r
+            _ -> erreur\r
+         end\r
+      end\r
+   )).\r
 \r
 \r
 % Met à jour la date de la dernière connexion d'un utilisateur à maintenant\r
@@ -163,7 +149,7 @@ update_date_derniere_connexion(User_id) ->
                mnesia:abort("update_date_derniere_connexion: User inconnu")\r
           end\r
       end\r
-   ).   \r
+   ).\r
 \r
 \r
 % Met à jour l'ip d'un user\r
index d8bfa89..c3dfbbe 100755 (executable)
 \r
 \r
 % Une utilisateur s'enregistre avec un tuple {Login, Password}.\r
-register([{login, Login}, {password, Password}], IP) ->\r
+register([{login, Login}, {password, Password}, {profile_infos, Profile_infos}], IP) ->\r
    Can_register = euphorik_bd:can_register(IP),\r
    if Can_register ->\r
          case euphorik_bd:user_by_login(Login) of\r
             {ok, _} ->\r
                erreur("Login déjà existant");\r
             _ ->\r
-               User = euphorik_bd:nouveau_user(Login, Password, generer_cookie()),\r
+               User = euphorik_bd:nouveau_user(Login, Password, generer_cookie(), user_from_json(Profile_infos)),\r
                euphorik_bd:update_ip(User#user.id, IP),\r
                json_reponse_login_ok(User)\r
          end;\r
@@ -58,10 +58,10 @@ register([{login, Login}, {password, Password}], IP) ->
          erreur_register_flood()\r
    end;\r
 % Enregistrement sans {Login, Password}\r
-register([], IP) ->   \r
+register([{profile_infos, Profile_infos}], IP) ->   \r
    Can_register = euphorik_bd:can_register(IP),\r
    if Can_register ->\r
-         User = euphorik_bd:nouveau_user("<nick>", generer_cookie()),\r
+         User = euphorik_bd:nouveau_user("<nick>", generer_cookie(), user_from_json(Profile_infos)),\r
          euphorik_bd:update_ip(User#user.id, IP),\r
          json_reponse_login_ok(User);\r
       true ->\r
@@ -115,16 +115,44 @@ profile(
       {cookie, Cookie},\r
       {login, Login},\r
       {password, Password},\r
-      {nick, Pseudo},\r
-      {email, Email},\r
-      {css, Css},\r
-      {chat_order, Chat_order_str},\r
-      {nick_format, Nick_format_str},\r
-      {view_times, View_times},\r
-      {view_tooltips, View_tooltips},\r
-      {conversations, {array, Conversations_json}},\r
-      {ostentatious_master, Ostentatious_master}\r
+      {profile_infos, Profile_infos}\r
    ]\r
+) ->\r
+   case user_from_json(Profile_infos) of\r
+      {erreur, E} -> E;\r
+      UserInfos ->\r
+         User = UserInfos#user {\r
+            cookie = Cookie,\r
+            login = Login,\r
+            password = Password\r
+         },   \r
+         %  TODO : pas très beau, mieux vaut construire un #user\r
+         case euphorik_bd:set_profile(User) of\r
+            ok ->\r
+               json_reponse_ok();\r
+            login_deja_pris ->\r
+               erreur("Login déjà pris");\r
+            _ ->\r
+               erreur("Impossible de mettre à jour le profile")\r
+         end\r
+   end.\r
+\r
+\r
+% Construit un #user à partir des données JSON\r
+user_from_json(\r
+   {struct,\r
+      [\r
+         {nick, Pseudo},\r
+         {email, Email},\r
+         {css, Css},\r
+         {chat_order, Chat_order_str},\r
+         {nick_format, Nick_format_str},\r
+         {view_times, View_times},\r
+         {view_tooltips, View_tooltips},\r
+         {conversations, {array, Conversations_json}},\r
+         {ostentatious_master, Ostentatious_master_str}\r
+      ]\r
+   }\r
 ) ->\r
    % décomposition de la strucure JSON\r
    Conversations = lists:foldr(\r
@@ -140,26 +168,35 @@ profile(
       [],\r
       Conversations_json\r
    ),\r
-   %  TODO : pas très beau, mieux vaut construire un #user\r
-   case euphorik_bd:set_profile(\r
-         Cookie,\r
-         Login,\r
-         Password,\r
-         Pseudo,\r
-         Email,\r
-         Css,\r
-         list_to_atom(Chat_order_str),\r
-         list_to_atom(Nick_format_str),\r
-         View_times,\r
-         View_tooltips,\r
-         Conversations,\r
-         list_to_atom(Ostentatious_master)) of\r
-      ok ->\r
-         json_reponse_ok();\r
-      login_deja_pris ->\r
-         erreur("Login déjà pris");\r
-      _ ->\r
-         erreur("Impossible de mettre à jour le profile")\r
+   % vérification des données JSON\r
+   Chat_order = list_to_atom(Chat_order_str),\r
+   Chat_order_valide = lists:any(fun(E) -> E =:= Chat_order end, [reverse, chrono]),\r
+   if not Chat_order_valide ->\r
+         {erreur, Chat_order_str ++ " n'est pas une valeur acceptée pour 'chat_order'"};\r
+      true -> \r
+         Nick_format = list_to_atom(Nick_format_str),\r
+         Nick_format_valide = lists:any(fun(E) -> E =:= Nick_format end, [nick, login, nick_login]),\r
+         if not Nick_format_valide ->\r
+               {erreur, Nick_format_str ++ " n'est pas une valeur acceptée pour 'nick_format'"};\r
+            true -> \r
+               Ostentatious_master = list_to_atom(Ostentatious_master_str),\r
+               Ostentatious_master_valide = lists:any(fun(E) -> E =:= Ostentatious_master end, [invisible, light, heavy]),\r
+               if not Ostentatious_master_valide ->\r
+                     {erreur, Ostentatious_master_str ++ " n'est pas une valeur acceptée pour 'ostentatious_master'"};\r
+                  true ->\r
+                     #user{\r
+                        pseudo = Pseudo,\r
+                        email = Email,\r
+                        css = Css,\r
+                        chat_order = Chat_order,\r
+                        nick_format = Nick_format,\r
+                        view_times = View_times,\r
+                        view_tooltips = View_tooltips,\r
+                        conversations = Conversations,\r
+                        ostentatious_master = Ostentatious_master\r
+                     }\r
+               end\r
+         end      \r
    end.\r
 \r
 \r
index 053c046..038dae8 100755 (executable)
@@ -64,9 +64,9 @@
    {
       id,
       cookie, % string()
-      pseudo = [], % string()
       login = [], % string()
       password = [], % string() (md5)
+      pseudo = [], % string()
       email = [], % string()
       date_creation, % erlang:now()
       date_derniere_connexion, % erlang:now(), est mis à jour lors de n'importe quelle activitée (envoie de message par exemple)
index 0383346..76cce82 100755 (executable)
@@ -17,6 +17,10 @@ body {
        background-color: #f6dfc2;
 }
 
+td {
+   padding-right: 4px
+}
+
 #container {
        height: auto;
        margin: 0px;