FIX autres...
c -> s
{
- "header" : {action : "authentification", version : 3},
+ "header" : {action : "register", version : 3},
"login" : "paul",
- "password" : "IJKJDHHSAD9081238"
+ "password" : "IJKJDHHSAD9081238",
+ "profile_infos" : { .. } // voir <profile_infos>
}
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",
=== 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",
"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>
* 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
"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
};\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
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
* 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
' <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
// 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
-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
\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
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
\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
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
{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
[],\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
{
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)
background-color: #f6dfc2;
}
+td {
+ padding-right: 4px
+}
+
#container {
height: auto;
margin: 0px;