From 28cbabecbfc2e05861779a19e5a75bddbc0ad416 Mon Sep 17 00:00:00 2001 From: Greg Burri Date: Sat, 17 May 2008 23:54:46 +0000 Subject: [PATCH] ADD affichage des ip bannies sur la page d'admin (pas fini, manque bouton "debannir") --- css/1/pageAdmin.css | 22 +++++++ doc/protocole3.txt | 42 ++++++++++++- js/euphorik.js | 2 +- js/pageAdmin.js | 70 +++++++++++++++++++-- modules/erl/euphorik_bd.erl | 26 ++++++-- modules/erl/euphorik_protocole.erl | 98 +++++++++++++++++++++++++----- modules/erl/euphorik_requests.erl | 6 +- modules/include/euphorik_bd.hrl | 2 +- 8 files changed, 240 insertions(+), 28 deletions(-) diff --git a/css/1/pageAdmin.css b/css/1/pageAdmin.css index 3723a63..5ab8031 100644 --- a/css/1/pageAdmin.css +++ b/css/1/pageAdmin.css @@ -49,3 +49,25 @@ cursor: pointer; } +#page.admin #ips .ip { + margin-left : 10px; +} + +#page.admin #ips .temps { + margin-left : 10px; + margin-right : 10px; +} + +#page.admin #ips .pseudo { + margin-left : 4px; + margin-right : 4px; +} + +#page.admin #ips .login { + margin-right : 4px; +} + + + + + diff --git a/doc/protocole3.txt b/doc/protocole3.txt index 2646a4b..f7fd6a5 100644 --- a/doc/protocole3.txt +++ b/doc/protocole3.txt @@ -324,7 +324,47 @@ c -> s s -> c ou - + + + +=== Liste des ip bannis === +c -> s + { + "action" : "list_banned_ips", + "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 + { + "action" : "unban", + "cookie" : "LKJDLAKSJBFLKASN" + "ip" : "192.168.1.2" + } + +s -> c + +ou + + === Ajout d'une correction d'un messages === Le client envoie un correctif sous la forme de texte supplémentaire à appondre au dernier messages. diff --git a/js/euphorik.js b/js/euphorik.js index 4210713..c9291a2 100755 --- a/js/euphorik.js +++ b/js/euphorik.js @@ -904,7 +904,7 @@ PageEvent.prototype.waitEvent = function(funSend, funReceive) error: function(XMLHttpRequest, textStatus, errorThrown) { - setTimeout(function(){ thisPageEvent.rafraichirMessages(funSend, funReceive) }, 1000); + setTimeout(function(){ thisPageEvent.waitEvent(funSend, funReceive) }, 1000); } }) diff --git a/js/pageAdmin.js b/js/pageAdmin.js index 6dc96de..d7a14be 100644 --- a/js/pageAdmin.js +++ b/js/pageAdmin.js @@ -13,10 +13,15 @@ PageAdmin.prototype.contenu = function() { return '

Trolls

\

Chaque semaine un troll est choisit au hasard parmis les trolls proposés et devient le troll de la semaine.

\ -

\ - \ - \ -

' +
\ +

\ + \ + \ +

\ +
\ +
\ +

IPs bannies

\ +
' } PageAdmin.prototype.charger = function() @@ -28,6 +33,8 @@ PageAdmin.prototype.charger = function() this.trolls = new Trolls(this.client, this.util, this.formateur) this.trolls.rafraichirTrolls() + this.majIPs() + $("#page form#nouveauTroll input.troll").focus() $("#page form#nouveauTroll button.return").click( @@ -89,6 +96,61 @@ PageAdmin.prototype.posterTroll = function() } +/** + * Met à jour la liste des IP bannies. + */ +PageAdmin.prototype.majIPs = function() +{ + var thisPageAdmin = this + + var dataToSend = + { + "action" : "list_banned_ips", + "cookie" : this.client.cookie + } + + ;;; dumpObj(dataToSend) + jQuery.ajax( + { + type: "POST", + url: "request", + dataType: "json", + data: this.util.jsonVersAction(dataToSend), + success: + function(data) + { + ;;; dumpObj(data) + + if (data["reply"] == "list_banned_ips") + { + var XHTML = "" + for(var i = 0; i < data["list"].length; i++) + { + var ip = data["list"][i] + XHTML += '' + ip["ip"] + '' + + '' + + ip["remaining_time"] + + '[' + for(var j = 0; j < ip["users"].length; j++) + { + var user = ip["users"][j] + XHTML += (j > 0 ? ", " : "") + + '' + thisPageAdmin.formateur.traitementComplet(user["nick"]) + '' + + (user["login"] == "" ? "" : '') + } + XHTML += ']' + } + $("#ips").html(XHTML) + } + else if (data["reply"] == "error") + { + thisPageAdmin.util.messageDialogue(data["error_message"]) + } + } + } + ) +} + /////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/modules/erl/euphorik_bd.erl b/modules/erl/euphorik_bd.erl index 6efd76b..6fc651d 100755 --- a/modules/erl/euphorik_bd.erl +++ b/modules/erl/euphorik_bd.erl @@ -45,7 +45,7 @@ possede_message/2, % ip : - ip_table/0, + list_ban/0, ban/2, deban/1, est_banni/1, @@ -540,11 +540,23 @@ possede_message(Id_user, Id_mess) -> _ -> false end. - -ip_table() -> + +% renvoie la liste des ip bannies +% liste de {ip, temps_restant(en minutes), Users} ou Users est une liste de {pseudo, login} +% TODO : déterminer la complexité de cette fonction. (Il n'y a pas d'index sur #user.last_ip) +list_ban() -> resultat_transaction(mnesia:transaction( fun() -> - e(q([IP || IP <- mnesia:table(ip_table)])) + Now = now(), + e(q([ + { + IP#ip_table.ip, + delta_date_minute(date_plus_minutes(IP#ip_table.ban, IP#ip_table.ban_duration), Now), + e(q([{U#user.pseudo, U#user.login} || U <- mnesia:table(user), U#user.last_ip =:= IP#ip_table.ip])) + } || + IP <- qlc:keysort(2, mnesia:table(ip_table)), + date_plus_minutes(IP#ip_table.ban, IP#ip_table.ban_duration) > Now + ])) end )). @@ -586,7 +598,7 @@ est_banni(User_id) -> if Echeance < Now -> % l'échéance est passée false; true -> - {true, trunc(delta_date_ms(Echeance, Now) / 1000 / 60)} + {true, delta_date_minute(Echeance, Now)} end; _ -> false @@ -831,6 +843,10 @@ resultat_transaction({_, T}) -> delta_date_ms(D1, D2) -> 1000000000 * abs(element(1, D1) - element(1, D2)) + 1000 * abs(element(2, D1) - element(2, D2)) + trunc(abs(element(3, D1) - element(3, D2)) / 1000). +% Retourne la différence entre deux timestamp (erlang:now) en minutes +delta_date_minute(D1, D2) -> + trunc(delta_date_ms(D1, D2) / 1000 / 60). + % Bizarre, cette fonction n'existe pas dans la stdlib. % Pas utilisé mais bon ca me fait de la peine de l'enlever. diff --git a/modules/erl/euphorik_protocole.erl b/modules/erl/euphorik_protocole.erl index 08624ae..9536aae 100755 --- a/modules/erl/euphorik_protocole.erl +++ b/modules/erl/euphorik_protocole.erl @@ -16,6 +16,8 @@ put_troll/1, mod_troll/1, del_troll/1, + unban_ip/1, + list_banned_ips/1, erreur/1 ]). -include_lib("xmerl/include/xmerl.hrl"). @@ -312,21 +314,6 @@ put_message( _ -> erreur("Utilisateur inconnu") end. - - -% Formatage de minutes. -% par exemple : "1min", "45min", "1h23min", "1jour 2h34min" -format_minutes(Min) -> - Jours = Min div (60 * 24), - Heures = Min rem (60 * 24) div 60, - Minutes = Min rem (60), - if Jours =/= 0 -> integer_to_list(Jours) ++ "Jour" ++ if Jours > 1 -> "s"; true -> "" end ++ " "; true -> "" end ++ - if Heures =/= 0 -> integer_to_list(Heures) ++ "h"; true -> "" end ++ - if Minutes == 0 -> - ""; - true -> - lists:flatten(io_lib:format(if Jours =:= 0, Heures =:= 0 -> "~w"; true -> "~2.2.0w" end, [Minutes])) ++ "min" - end. % bannissement d'un utilisateur (son ip est bannie) @@ -469,6 +456,61 @@ del_troll( erreur("Seul les ekMaster peuvent proposer des trolls") end. + +unban_ip( + [ + {cookie, Cookie}, + {ip, IP} + ] +) -> + case euphorik_bd:user_by_cookie(Cookie) of + {ok, #user{ek_master = true}} -> + euphorik_bd:deban(unserialize_ip(IP)), + json_reponse_ok; + _ -> + erreur("Seul les ekMaster peuvent connaitre la liste des ips bannies") + end. + + +list_banned_ips( + [ + {cookie, Cookie} + ] +) -> + case euphorik_bd:user_by_cookie(Cookie) of + {ok, #user{ek_master = true}} -> + { + struct, + [ + {reply, "list_banned_ips"}, + {list, {array, lists:map( + fun({IP, T, Users}) -> + {struct, + [ + {ip, serialize_ip(IP)}, + {remaining_time, format_minutes(T)}, + {users, {array, lists:map( + fun({Pseudo, Login}) -> + {struct, + [ + {nick, Pseudo}, + {login, Login} + ] + } + end, + Users + )}} + ] + } + end, + euphorik_bd:list_ban() + )}} + ] + }; + _ -> + erreur("Seul les ekMaster peuvent connaitre la liste des ips bannies") + end. + % Construit une erreur erreur(Message) -> @@ -479,6 +521,32 @@ erreur(Message) -> ] }. + +serialize_ip(IP) -> + lists:flatten(io_lib:format("~w.~w.~w.~w", tuple_to_list(IP))). + + +unserialize_ip(IP) -> + case io_lib:fread("~d.~d.~d.~d", IP) of + {ok, [A, B, C, D], []} -> {A, B, C, D}; + _ -> erreur + end. + + +% Formatage de minutes. +% par exemple : "1min", "45min", "1h23min", "1jour 2h34min" +format_minutes(Min) -> + Jours = Min div (60 * 24), + Heures = Min rem (60 * 24) div 60, + Minutes = Min rem (60), + if Jours =/= 0 -> integer_to_list(Jours) ++ " Jour" ++ if Jours > 1 -> "s"; true -> "" end ++ " "; true -> "" end ++ + if Heures =/= 0 -> integer_to_list(Heures) ++ " heure" ++ if Heures > 1 -> "s"; true -> "" end; true -> "" end ++ + if Minutes == 0 -> + ""; + true -> + integer_to_list(Minutes) ++ " minute" ++ if Minutes > 1 -> "s"; true -> "" end; true -> "" end + end. + % Formatage d'une heure % local_time() -> string diff --git a/modules/erl/euphorik_requests.erl b/modules/erl/euphorik_requests.erl index f8dad51..79df04d 100755 --- a/modules/erl/euphorik_requests.erl +++ b/modules/erl/euphorik_requests.erl @@ -64,5 +64,9 @@ traiter_action("put_troll", JSON, _) -> traiter_action("mod_troll", JSON, _) -> euphorik_protocole:mod_troll(JSON); traiter_action("del_troll", JSON, _) -> - euphorik_protocole:del_troll(JSON). + euphorik_protocole:del_troll(JSON); +traiter_action("list_banned_ips", JSON, _) -> + euphorik_protocole:list_banned_ips(JSON); +traiter_action("unban", JSON, _) -> + euphorik_protocole:unban_ip(JSON). \ No newline at end of file diff --git a/modules/include/euphorik_bd.hrl b/modules/include/euphorik_bd.hrl index 55f76cd..edadbcc 100755 --- a/modules/include/euphorik_bd.hrl +++ b/modules/include/euphorik_bd.hrl @@ -52,7 +52,7 @@ % identificateur : (ip) -record(ip_table, { - ip, % integer() + ip, % {integer(), integer(), integer(), integer()} ban = undefined, % la date du dernier bannissement ban_duration = 0, % le temps de ban en minute nb_try_register = 0, -- 2.43.0