mirror of
https://github.com/processone/ejabberd.git
synced 2024-11-26 16:26:24 +01:00
HTML room logs: fix formatting of spaces; log config when disabling logging; display occupants (EJAB-986)
SVN Revision: 2379
This commit is contained in:
parent
97ee31e751
commit
97dfcb9fb0
@ -44,13 +44,17 @@
|
|||||||
-include_lib("exmpp/include/exmpp.hrl").
|
-include_lib("exmpp/include/exmpp.hrl").
|
||||||
|
|
||||||
-include("ejabberd.hrl").
|
-include("ejabberd.hrl").
|
||||||
|
-include("mod_muc_room.hrl").
|
||||||
|
|
||||||
|
%% Copied from mod_muc/mod_muc.erl
|
||||||
|
-record(muc_online_room, {name_host, pid}).
|
||||||
|
|
||||||
-define(T(Text), translate:translate(Lang, Text)).
|
-define(T(Text), translate:translate(Lang, Text)).
|
||||||
-define(PROCNAME, ejabberd_mod_muc_log).
|
-define(PROCNAME, ejabberd_mod_muc_log).
|
||||||
-record(room, {jid, title, subject, subject_author, config}).
|
-record(room, {jid, title, subject, subject_author, config}).
|
||||||
|
|
||||||
|
|
||||||
-record(state, {host,
|
-record(logstate, {host,
|
||||||
out_dir,
|
out_dir,
|
||||||
dir_type,
|
dir_type,
|
||||||
dir_name,
|
dir_name,
|
||||||
@ -131,7 +135,7 @@ init([Host, Opts]) ->
|
|||||||
end;
|
end;
|
||||||
L -> L
|
L -> L
|
||||||
end,
|
end,
|
||||||
{ok, #state{host = Host,
|
{ok, #logstate{host = Host,
|
||||||
out_dir = OutDir,
|
out_dir = OutDir,
|
||||||
dir_type = DirType,
|
dir_type = DirType,
|
||||||
dir_name = DirName,
|
dir_name = DirName,
|
||||||
@ -153,7 +157,7 @@ init([Host, Opts]) ->
|
|||||||
%% Description: Handling call messages
|
%% Description: Handling call messages
|
||||||
%%--------------------------------------------------------------------
|
%%--------------------------------------------------------------------
|
||||||
handle_call({check_access_log, ServerHost, FromJID}, _From, State) ->
|
handle_call({check_access_log, ServerHost, FromJID}, _From, State) ->
|
||||||
Reply = acl:match_rule(ServerHost, State#state.access, FromJID),
|
Reply = acl:match_rule(ServerHost, State#logstate.access, FromJID),
|
||||||
{reply, Reply, State};
|
{reply, Reply, State};
|
||||||
handle_call(stop, _From, State) ->
|
handle_call(stop, _From, State) ->
|
||||||
{stop, normal, ok, State}.
|
{stop, normal, ok, State}.
|
||||||
@ -217,9 +221,12 @@ add_to_log2(text, {Nick, Packet}, Room, Opts, State) ->
|
|||||||
add_message_to_log(binary_to_list(Nick), Message, Room, Opts, State)
|
add_message_to_log(binary_to_list(Nick), Message, Room, Opts, State)
|
||||||
end;
|
end;
|
||||||
|
|
||||||
add_to_log2(roomconfig_change, _, Room, Opts, State) ->
|
add_to_log2(roomconfig_change, _Occupants, Room, Opts, State) ->
|
||||||
add_message_to_log("", roomconfig_change, Room, Opts, State);
|
add_message_to_log("", roomconfig_change, Room, Opts, State);
|
||||||
|
|
||||||
|
add_to_log2(roomconfig_change_enabledlogging, Occupants, Room, Opts, State) ->
|
||||||
|
add_message_to_log("", {roomconfig_change, Occupants}, Room, Opts, State);
|
||||||
|
|
||||||
add_to_log2(nickchange, {OldNick, NewNick}, Room, Opts, State) ->
|
add_to_log2(nickchange, {OldNick, NewNick}, Room, Opts, State) ->
|
||||||
add_message_to_log(binary_to_list(NewNick), {nickchange, binary_to_list(OldNick)}, Room, Opts, State);
|
add_message_to_log(binary_to_list(NewNick), {nickchange, binary_to_list(OldNick)}, Room, Opts, State);
|
||||||
|
|
||||||
@ -304,7 +311,7 @@ write_last_lines(F, Images_dir, _FileFormat) ->
|
|||||||
fw(F, "</span></div></body></html>").
|
fw(F, "</span></div></body></html>").
|
||||||
|
|
||||||
add_message_to_log(Nick1, Message, RoomJID, Opts, State) ->
|
add_message_to_log(Nick1, Message, RoomJID, Opts, State) ->
|
||||||
#state{out_dir = OutDir,
|
#logstate{out_dir = OutDir,
|
||||||
dir_type = DirType,
|
dir_type = DirType,
|
||||||
dir_name = DirName,
|
dir_name = DirName,
|
||||||
file_format = FileFormat,
|
file_format = FileFormat,
|
||||||
@ -364,6 +371,13 @@ add_message_to_log(Nick1, Message, RoomJID, Opts, State) ->
|
|||||||
put_room_config(F, RoomConfig, Lang, FileFormat),
|
put_room_config(F, RoomConfig, Lang, FileFormat),
|
||||||
io_lib:format("<font class=\"mrcm\">~s</font><br/>",
|
io_lib:format("<font class=\"mrcm\">~s</font><br/>",
|
||||||
[?T("Chatroom configuration modified")]);
|
[?T("Chatroom configuration modified")]);
|
||||||
|
{roomconfig_change, Occupants} ->
|
||||||
|
RoomConfig = roomconfig_to_string(Room#room.config, Lang, FileFormat),
|
||||||
|
put_room_config(F, RoomConfig, Lang, FileFormat),
|
||||||
|
RoomOccupants = roomoccupants_to_string(Occupants, FileFormat),
|
||||||
|
put_room_occupants(F, RoomOccupants, Lang, FileFormat),
|
||||||
|
io_lib:format("<font class=\"mrcm\">~s</font><br/>",
|
||||||
|
[?T("Chatroom configuration modified")]);
|
||||||
join ->
|
join ->
|
||||||
io_lib:format("<font class=\"mj\">~s ~s</font><br/>",
|
io_lib:format("<font class=\"mj\">~s ~s</font><br/>",
|
||||||
[Nick, ?T("joins the room")]);
|
[Nick, ?T("joins the room")]);
|
||||||
@ -675,6 +689,9 @@ put_header(F, Room, Date, CSSFile, Lang, Hour_offset, Date_prev, Date_next, Top_
|
|||||||
end,
|
end,
|
||||||
RoomConfig = roomconfig_to_string(Room#room.config, Lang, FileFormat),
|
RoomConfig = roomconfig_to_string(Room#room.config, Lang, FileFormat),
|
||||||
put_room_config(F, RoomConfig, Lang, FileFormat),
|
put_room_config(F, RoomConfig, Lang, FileFormat),
|
||||||
|
Occupants = get_room_occupants(Room#room.jid),
|
||||||
|
RoomOccupants = roomoccupants_to_string(Occupants, FileFormat),
|
||||||
|
put_room_occupants(F, RoomOccupants, Lang, FileFormat),
|
||||||
Time_offset_str = case Hour_offset<0 of
|
Time_offset_str = case Hour_offset<0 of
|
||||||
true -> io_lib:format("~p", [Hour_offset]);
|
true -> io_lib:format("~p", [Hour_offset]);
|
||||||
false -> io_lib:format("+~p", [Hour_offset])
|
false -> io_lib:format("+~p", [Hour_offset])
|
||||||
@ -733,6 +750,15 @@ put_room_config(F, RoomConfig, Lang, _FileFormat) ->
|
|||||||
fw(F, "<div class=\"rcos\" id=\"a~p\" style=\"display: none;\" ><br/>~s</div>", [Now2, RoomConfig]),
|
fw(F, "<div class=\"rcos\" id=\"a~p\" style=\"display: none;\" ><br/>~s</div>", [Now2, RoomConfig]),
|
||||||
fw(F, "</div>").
|
fw(F, "</div>").
|
||||||
|
|
||||||
|
put_room_occupants(_F, _RoomOccupants, _Lang, plaintext) ->
|
||||||
|
ok;
|
||||||
|
put_room_occupants(F, RoomOccupants, Lang, _FileFormat) ->
|
||||||
|
{_, Now2, _} = now(),
|
||||||
|
fw(F, "<div class=\"rc\">"),
|
||||||
|
fw(F, "<div class=\"rct\" onclick=\"sh('o~p');return false;\">~s</div>", [Now2, ?T("Room Occupants")]),
|
||||||
|
fw(F, "<div class=\"rcos\" id=\"o~p\" style=\"display: none;\" ><br/>~s</div>", [Now2, RoomOccupants]),
|
||||||
|
fw(F, "</div>").
|
||||||
|
|
||||||
%% htmlize
|
%% htmlize
|
||||||
%% The default behaviour is to ignore the nofollow spam prevention on links
|
%% The default behaviour is to ignore the nofollow spam prevention on links
|
||||||
%% (NoFollow=false)
|
%% (NoFollow=false)
|
||||||
@ -770,7 +796,9 @@ htmlize2(S1, NoFollow) ->
|
|||||||
S5 = element(2, regexp:gsub(S4, "((http|https|ftp)://|(mailto|xmpp):)[^] )\'\"}]+",
|
S5 = element(2, regexp:gsub(S4, "((http|https|ftp)://|(mailto|xmpp):)[^] )\'\"}]+",
|
||||||
link_regexp(NoFollow))),
|
link_regexp(NoFollow))),
|
||||||
%% Remove 'right-to-left override' unicode character 0x202e
|
%% Remove 'right-to-left override' unicode character 0x202e
|
||||||
element(2, regexp:gsub(S5, [226,128,174], "[RLO]")).
|
S6 = element(2, regexp:gsub(S5, " ", "\\ \\ ")),
|
||||||
|
S7 = element(2, regexp:gsub(S6, "\\t", "\\ \\ \\ \\ ")),
|
||||||
|
element(2, regexp:gsub(S7, [226,128,174], "[RLO]")).
|
||||||
|
|
||||||
%% Regexp link
|
%% Regexp link
|
||||||
%% Add the nofollow rel attribute when required
|
%% Add the nofollow rel attribute when required
|
||||||
@ -859,6 +887,60 @@ get_roomconfig_text(allow_user_invites) -> "Allow users to send invites";
|
|||||||
get_roomconfig_text(logging) -> "Enable logging";
|
get_roomconfig_text(logging) -> "Enable logging";
|
||||||
get_roomconfig_text(_) -> undefined.
|
get_roomconfig_text(_) -> undefined.
|
||||||
|
|
||||||
|
%% Users = [{JID, Nick, Role}]
|
||||||
|
roomoccupants_to_string(Users, _FileFormat) ->
|
||||||
|
Res = [role_users_to_string(RoleS, Users1)
|
||||||
|
|| {RoleS, Users1} <- group_by_role(Users), Users1 /= []],
|
||||||
|
lists:flatten(["<div class=\"rcot\">", Res, "</div>"]).
|
||||||
|
|
||||||
|
%% Users = [{JID, Nick, Role}]
|
||||||
|
group_by_role(Users) ->
|
||||||
|
{Ms, Ps, Vs, Ns} =
|
||||||
|
lists:foldl(
|
||||||
|
fun({JID, Nick, moderator}, {Mod, Par, Vis, Non}) ->
|
||||||
|
{[{JID, Nick}]++Mod, Par, Vis, Non};
|
||||||
|
({JID, Nick, participant}, {Mod, Par, Vis, Non}) ->
|
||||||
|
{Mod, [{JID, Nick}]++Par, Vis, Non};
|
||||||
|
({JID, Nick, visitor}, {Mod, Par, Vis, Non}) ->
|
||||||
|
{Mod, Par, [{JID, Nick}]++Vis, Non};
|
||||||
|
({JID, Nick, none}, {Mod, Par, Vis, Non}) ->
|
||||||
|
{Mod, Par, Vis, [{JID, Nick}]++Non}
|
||||||
|
end,
|
||||||
|
{[], [], [], []},
|
||||||
|
Users),
|
||||||
|
case Ms of [] -> []; _ -> [{"Moderator", Ms}] end
|
||||||
|
++ case Ms of [] -> []; _ -> [{"Participant", Ps}] end
|
||||||
|
++ case Ms of [] -> []; _ -> [{"Visitor", Vs}] end
|
||||||
|
++ case Ms of [] -> []; _ -> [{"None", Ns}] end.
|
||||||
|
|
||||||
|
%% Role = atom()
|
||||||
|
%% Users = [{JID, Nick}]
|
||||||
|
role_users_to_string(RoleS, Users) ->
|
||||||
|
SortedUsers = lists:keysort(2, Users),
|
||||||
|
UsersString = [[Nick, "<br/>"] || {_JID, Nick} <- SortedUsers],
|
||||||
|
[RoleS, ": ", UsersString].
|
||||||
|
|
||||||
|
get_room_occupants(RoomJIDString) ->
|
||||||
|
RoomJID = exmpp_jid:parse(RoomJIDString),
|
||||||
|
RoomName = exmpp_jid:node(RoomJID),
|
||||||
|
MucService = exmpp_jid:domain(RoomJID),
|
||||||
|
StateData = get_room_state(RoomName, MucService),
|
||||||
|
[{U#user.jid, U#user.nick, U#user.role}
|
||||||
|
|| {_, U} <- ?DICT:to_list(StateData#state.users)].
|
||||||
|
|
||||||
|
get_room_state(RoomName, MucService) ->
|
||||||
|
case mnesia:dirty_read(muc_online_room, {RoomName, MucService}) of
|
||||||
|
[R] ->
|
||||||
|
RoomPid = R#muc_online_room.pid,
|
||||||
|
get_room_state(RoomPid);
|
||||||
|
[] ->
|
||||||
|
room_not_found
|
||||||
|
end.
|
||||||
|
|
||||||
|
get_room_state(RoomPid) ->
|
||||||
|
{ok, R} = gen_fsm:sync_send_all_state_event(RoomPid, get_state),
|
||||||
|
R.
|
||||||
|
|
||||||
get_proc_name(Host) -> gen_mod:get_module_proc(Host, ?PROCNAME).
|
get_proc_name(Host) -> gen_mod:get_module_proc(Host, ?PROCNAME).
|
||||||
|
|
||||||
calc_hour_offset(TimeHere) ->
|
calc_hour_offset(TimeHere) ->
|
||||||
|
@ -2981,7 +2981,18 @@ set_config(XEl, StateData) ->
|
|||||||
#config{} = Config ->
|
#config{} = Config ->
|
||||||
Res = change_config(Config, StateData),
|
Res = change_config(Config, StateData),
|
||||||
{result, _, NSD} = Res,
|
{result, _, NSD} = Res,
|
||||||
add_to_log(roomconfig_change, [], NSD),
|
Type = case {(StateData#state.config)#config.logging,
|
||||||
|
Config#config.logging} of
|
||||||
|
{true, false} ->
|
||||||
|
roomconfig_change_disabledlogging;
|
||||||
|
{false, true} ->
|
||||||
|
roomconfig_change_enabledlogging;
|
||||||
|
{_, _} ->
|
||||||
|
roomconfig_change
|
||||||
|
end,
|
||||||
|
Users = [{U#user.jid, U#user.nick, U#user.role} ||
|
||||||
|
{_, U} <- ?DICT:to_list(StateData#state.users)],
|
||||||
|
add_to_log(Type, Users, NSD),
|
||||||
Res;
|
Res;
|
||||||
Err ->
|
Err ->
|
||||||
Err
|
Err
|
||||||
@ -3492,6 +3503,12 @@ send_error_only_occupants(Packet, Lang, RoomJID, From) ->
|
|||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
% Logging
|
% Logging
|
||||||
|
|
||||||
|
add_to_log(Type, Data, StateData)
|
||||||
|
when Type == roomconfig_change_disabledlogging ->
|
||||||
|
%% When logging is disabled, the config change message must be logged:
|
||||||
|
mod_muc_log:add_to_log(
|
||||||
|
StateData#state.server_host, roomconfig_change, Data,
|
||||||
|
StateData#state.jid, make_opts(StateData));
|
||||||
add_to_log(Type, Data, StateData) ->
|
add_to_log(Type, Data, StateData) ->
|
||||||
case (StateData#state.config)#config.logging of
|
case (StateData#state.config)#config.logging of
|
||||||
true ->
|
true ->
|
||||||
|
Loading…
Reference in New Issue
Block a user