diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/ejabberd_c2s.erl | 4 | ||||
-rw-r--r-- | src/ejabberd_sm.erl | 8 | ||||
-rw-r--r-- | src/mod_carboncopy.erl | 37 | ||||
-rw-r--r-- | src/mod_muc_log.erl | 31 | ||||
-rw-r--r-- | src/mod_offline.erl | 39 |
5 files changed, 75 insertions, 44 deletions
diff --git a/src/ejabberd_c2s.erl b/src/ejabberd_c2s.erl index 9ce66d043..85a696c7f 100644 --- a/src/ejabberd_c2s.erl +++ b/src/ejabberd_c2s.erl @@ -1364,7 +1364,7 @@ handle_info(replaced, StateName, StateData) -> Lang = StateData#state.lang, Xmlelement = ?SERRT_CONFLICT(Lang, <<"Replaced by new connection">>), handle_info({kick, replaced, Xmlelement}, StateName, StateData); -handle_info(disconnect, StateName, StateData) -> +handle_info(kick, StateName, StateData) -> Lang = StateData#state.lang, Xmlelement = ?SERRT_POLICY_VIOLATION(Lang, <<"has been kicked">>), handle_info({kick, kicked_by_admin, Xmlelement}, StateName, StateData); @@ -1663,7 +1663,7 @@ handle_info({route, From, To, jlib:replace_from_to_attrs(jlib:jid_to_string(From), jlib:jid_to_string(To), NewAttrs), FixedPacket = #xmlel{name = Name, attrs = Attrs2, children = Els}, - SentStateData = send_stanza(StateData, FixedPacket), + SentStateData = send_stanza(NewState, FixedPacket), ejabberd_hooks:run(user_receive_packet, SentStateData#state.server, [SentStateData#state.jid, From, To, FixedPacket]), diff --git a/src/ejabberd_sm.erl b/src/ejabberd_sm.erl index 72aeda952..3e37f4692 100644 --- a/src/ejabberd_sm.erl +++ b/src/ejabberd_sm.erl @@ -54,7 +54,7 @@ connected_users/0, connected_users_number/0, user_resources/2, - disconnect_user/2, + kick_user/2, get_session_pid/3, get_user_info/3, get_user_ip/3, @@ -822,10 +822,10 @@ commands() -> module = ?MODULE, function = user_resources, args = [{user, binary}, {host, binary}], result = {resources, {list, {resource, string}}}}, - #ejabberd_commands{name = disconnect_user, + #ejabberd_commands{name = kick_user, tags = [session], desc = "Disconnect user's active sessions", - module = ?MODULE, function = disconnect_user, + module = ?MODULE, function = kick_user, args = [{user, binary}, {host, binary}], result = {num_resources, integer}}]. @@ -844,7 +844,7 @@ user_resources(User, Server) -> Resources = get_user_resources(User, Server), lists:sort(Resources). -disconnect_user(User, Server) -> +kick_user(User, Server) -> Resources = get_user_resources(User, Server), lists:foreach( fun(Resource) -> diff --git a/src/mod_carboncopy.erl b/src/mod_carboncopy.erl index 16f0c06fc..6f3101fcd 100644 --- a/src/mod_carboncopy.erl +++ b/src/mod_carboncopy.erl @@ -143,24 +143,29 @@ check_and_forward(JID, To, #xmlel{name = <<"message">>, attrs = Attrs} = Packet, <<"chat">> -> case xml:get_subtag(Packet, <<"private">>) of false -> - case xml:get_subtag(Packet,<<"received">>) of + case xml:get_subtag(Packet, <<"no-copy">>) of false -> - %% We must check if a packet contains "<sent><forwarded></sent></forwarded>" tags in order to avoid - %% receiving message back to original sender. - SubTag = xml:get_subtag(Packet,<<"sent">>), - if SubTag == false -> - send_copies(JID, To, Packet, Direction); - true -> - case xml:get_subtag(SubTag,<<"forwarded">>) of - false-> - send_copies(JID, To, Packet, Direction); - _ -> - stop - end - end; + case xml:get_subtag(Packet,<<"received">>) of + false -> + %% We must check if a packet contains "<sent><forwarded></sent></forwarded>" + %% tags in order to avoid receiving message back to original sender. + SubTag = xml:get_subtag(Packet,<<"sent">>), + if SubTag == false -> + send_copies(JID, To, Packet, Direction); + true -> + case xml:get_subtag(SubTag,<<"forwarded">>) of + false-> + send_copies(JID, To, Packet, Direction); + _ -> + stop + end + end; + _ -> + %% stop the hook chain, we don't want mod_logdb to register this message (duplicate) + stop + end; _ -> - %% stop the hook chain, we don't want mod_logdb to register this message (duplicate) - stop + ok end; _ -> ok diff --git a/src/mod_muc_log.erl b/src/mod_muc_log.erl index e8724483e..ac6bea4fa 100644 --- a/src/mod_muc_log.erl +++ b/src/mod_muc_log.erl @@ -233,16 +233,22 @@ code_change(_OldVsn, State, _Extra) -> {ok, State}. %%% Internal functions %%-------------------------------------------------------------------- add_to_log2(text, {Nick, Packet}, Room, Opts, State) -> - case {xml:get_subtag(Packet, <<"subject">>), - xml:get_subtag(Packet, <<"body">>)} + case {xml:get_subtag(Packet, <<"no-store">>), + xml:get_subtag(Packet, <<"no-permanent-store">>)} of - {false, false} -> ok; - {false, SubEl} -> - Message = {body, xml:get_tag_cdata(SubEl)}, - add_message_to_log(Nick, Message, Room, Opts, State); - {SubEl, _} -> - Message = {subject, xml:get_tag_cdata(SubEl)}, - add_message_to_log(Nick, Message, Room, Opts, State) + {false, false} -> + case {xml:get_subtag(Packet, <<"subject">>), + xml:get_subtag(Packet, <<"body">>)} + of + {false, false} -> ok; + {false, SubEl} -> + Message = {body, xml:get_tag_cdata(SubEl)}, + add_message_to_log(Nick, Message, Room, Opts, State); + {SubEl, _} -> + Message = {subject, xml:get_tag_cdata(SubEl)}, + add_message_to_log(Nick, Message, Room, Opts, State) + end; + {_, _} -> ok end; add_to_log2(roomconfig_change, _Occupants, Room, Opts, State) -> @@ -779,7 +785,7 @@ fw(F, S, O, FileFormat) -> S1y = ejabberd_regexp:greplace(S1x, ?PLAINTEXT_IN, <<"<">>), ejabberd_regexp:greplace(S1y, ?PLAINTEXT_OUT, <<">">>) end, - io:format(F, S2, []). + file:write(F, S2). put_header(_, _, _, _, _, _, _, _, _, plaintext) -> ok; put_header(F, Room, Date, CSSFile, Lang, Hour_offset, @@ -1016,7 +1022,9 @@ htmlize2(S1, NoFollow) -> <<"\\ \\ ">>), S7 = ejabberd_regexp:greplace(S6, <<"\\t">>, <<"\\ \\ \\ \\ ">>), - ejabberd_regexp:greplace(S7, <<226, 128, 174>>, + S8 = ejabberd_regexp:greplace(S7, <<"~">>, + <<"~~">>), + ejabberd_regexp:greplace(S8, <<226, 128, 174>>, <<"[RLO]">>). link_regexp(false) -> <<"<a href=\"&\">&</a>">>; @@ -1240,5 +1248,6 @@ calc_hour_offset(TimeHere) -> 3600, TimeHereHour - TimeZeroHour. +fjoin([]) -> <<"/">>; fjoin(FileList) -> list_to_binary(filename:join([binary_to_list(File) || File <- FileList])). diff --git a/src/mod_offline.erl b/src/mod_offline.erl index fca227d31..f27d35830 100644 --- a/src/mod_offline.erl +++ b/src/mod_offline.erl @@ -237,22 +237,39 @@ store_packet(From, To, Packet) -> Type = xml:get_tag_attr_s(<<"type">>, Packet), if (Type /= <<"error">>) and (Type /= <<"groupchat">>) and (Type /= <<"headline">>) -> - case check_event(From, To, Packet) of - true -> - #jid{luser = LUser, lserver = LServer} = To, - TimeStamp = now(), - #xmlel{children = Els} = Packet, - Expire = find_x_expire(TimeStamp, Els), - gen_mod:get_module_proc(To#jid.lserver, ?PROCNAME) ! - #offline_msg{us = {LUser, LServer}, - timestamp = TimeStamp, expire = Expire, - from = From, to = To, packet = Packet}, - stop; + case has_no_storage_hint(Packet) of + false -> + case check_event(From, To, Packet) of + true -> + #jid{luser = LUser, lserver = LServer} = To, + TimeStamp = now(), + #xmlel{children = Els} = Packet, + Expire = find_x_expire(TimeStamp, Els), + gen_mod:get_module_proc(To#jid.lserver, ?PROCNAME) ! + #offline_msg{us = {LUser, LServer}, + timestamp = TimeStamp, expire = Expire, + from = From, to = To, packet = Packet}, + stop; + _ -> ok + end; _ -> ok end; true -> ok end. +has_no_storage_hint(Packet) -> + case xml:get_subtag(Packet, <<"no-store">>) of + #xmlel{attrs = Attrs} -> + case xml:get_attr_s(<<"xmlns">>, Attrs) of + ?NS_HINTS -> + true; + _ -> + false + end; + _ -> + false + end. + %% Check if the packet has any content about XEP-0022 or XEP-0085 check_event(From, To, Packet) -> #xmlel{name = Name, attrs = Attrs, children = Els} = |