aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ejabberd_c2s.erl4
-rw-r--r--src/ejabberd_sm.erl8
-rw-r--r--src/mod_carboncopy.erl37
-rw-r--r--src/mod_muc_log.erl31
-rw-r--r--src/mod_offline.erl39
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) ->
<<"\\&nbsp;\\&nbsp;">>),
S7 = ejabberd_regexp:greplace(S6, <<"\\t">>,
<<"\\&nbsp;\\&nbsp;\\&nbsp;\\&nbsp;">>),
- 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} =