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;
+}
+
+
+
+
+
s -> c
<ok>
ou
- <error>\r
+ <error>
+
+
+=== 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
+ <ok>
+ou
+ <error>
+\r
\r
=== Ajout d'une correction d'un messages ===\r
Le client envoie un correctif sous la forme de texte supplémentaire à appondre au dernier messages.\r
error:
function(XMLHttpRequest, textStatus, errorThrown)
{
- setTimeout(function(){ thisPageEvent.rafraichirMessages(funSend, funReceive) }, 1000);
+ setTimeout(function(){ thisPageEvent.waitEvent(funSend, funReceive) }, 1000);
}
})
{
return '<h1>Trolls</h1>\
<p>Chaque semaine un troll est choisit au hasard parmis les trolls proposés et devient le troll de la semaine.</p>\
- <form action="" id="nouveauTroll"><p>\
- <input class="troll" name="troll" type="text" maxlength="500" value=""></input>\
- <button class="return" value="return">poster</button>\
- </p></form><div id="trolls"></div>'
+ <form action="" id="nouveauTroll">\
+ <p>\
+ <input class="troll" name="troll" type="text" maxlength="500" value=""></input>\
+ <button class="return" value="return">poster</button>\
+ </p>\
+ </form>\
+ <div id="trolls"></div>\
+ <h1>IPs bannies</h1>\
+ <div id="ips"></div>'
}
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(
}
+/**
+ * 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 += '<span class="ip">' + ip["ip"] + '</span>' +
+ '<span class="temps">' +
+ ip["remaining_time"] +
+ '</span>['
+ for(var j = 0; j < ip["users"].length; j++)
+ {
+ var user = ip["users"][j]
+ XHTML += (j > 0 ? ", " : "") +
+ '<span class="pseudo">' + thisPageAdmin.formateur.traitementComplet(user["nick"]) + '</span>' +
+ (user["login"] == "" ? "" : '<span class="login">(' + thisPageAdmin.formateur.traitementComplet(user["login"]) + ')</span>')
+ }
+ XHTML += ']'
+ }
+ $("#ips").html(XHTML)
+ }
+ else if (data["reply"] == "error")
+ {
+ thisPageAdmin.util.messageDialogue(data["error_message"])
+ }
+ }
+ }
+ )
+}
+
///////////////////////////////////////////////////////////////////////////////////////////////////
possede_message/2,
% ip :
- ip_table/0,
+ list_ban/0,
ban/2,
deban/1,
est_banni/1,
_ -> 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
)).
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
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.
put_troll/1,
mod_troll/1,
del_troll/1,
+ unban_ip/1,
+ list_banned_ips/1,
erreur/1
]).
-include_lib("xmerl/include/xmerl.hrl").
_ ->
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)
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) ->
]
}.
+
+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.
+
\r
% Formatage d'une heure\r
% local_time() -> string\r
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
% 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,