diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/ejabberd_c2s.erl | 125 | ||||
-rw-r--r-- | src/mod_carboncopy.erl | 37 | ||||
-rw-r--r-- | src/mod_muc_log.erl | 24 | ||||
-rw-r--r-- | src/mod_offline.erl | 39 |
4 files changed, 115 insertions, 110 deletions
diff --git a/src/ejabberd_c2s.erl b/src/ejabberd_c2s.erl index 85a696c7f..f3201ed0e 100644 --- a/src/ejabberd_c2s.erl +++ b/src/ejabberd_c2s.erl @@ -788,18 +788,11 @@ wait_for_feature_request({xmlstreamelement, El}, StateData#state.tls_options)] end, Socket = StateData#state.socket, + BProceed = xml:element_to_binary(#xmlel{name = <<"proceed">>, + attrs = [{<<"xmlns">>, ?NS_TLS}]}), TLSSocket = (StateData#state.sockmod):starttls(Socket, TLSOpts, - xml:element_to_binary(#xmlel{name - = - <<"proceed">>, - attrs - = - [{<<"xmlns">>, - ?NS_TLS}], - children - = - []})), + BProceed), fsm_next_state(wait_for_stream, StateData#state{socket = TLSSocket, streamid = new_id(), @@ -820,17 +813,10 @@ wait_for_feature_request({xmlstreamelement, El}, case xml:get_tag_cdata(Method) of <<"zlib">> -> Socket = StateData#state.socket, + BCompressed = xml:element_to_binary(#xmlel{name = <<"compressed">>, + attrs = [{<<"xmlns">>, ?NS_COMPRESS}]}), ZlibSocket = (StateData#state.sockmod):compress(Socket, - xml:element_to_binary(#xmlel{name - = - <<"compressed">>, - attrs - = - [{<<"xmlns">>, - ?NS_COMPRESS}], - children - = - []})), + BCompressed), fsm_next_state(wait_for_stream, StateData#state{socket = ZlibSocket, streamid = new_id()}); @@ -973,9 +959,7 @@ wait_for_sasl_response(closed, StateData) -> {stop, normal, StateData}. resource_conflict_action(U, S, R) -> - OptionRaw = case ejabberd_sm:is_existing_resource(U, S, - R) - of + OptionRaw = case ejabberd_sm:is_existing_resource(U, S, R) of true -> ejabberd_config:get_option( {resource_conflict, S}, @@ -1096,7 +1080,7 @@ wait_for_session({xmlstreamelement, El}, StateData) -> ?INFO_MSG("(~w) Opened session for ~s", [NewStateData#state.socket, jlib:jid_to_string(JID)]), - Res = jlib:make_result_iq_reply(El#xmlel{children = []}), + Res = jlib:make_result_iq_reply(El#xmlel{children = []}), NewState = send_stanza(NewStateData, Res), change_shaper(NewState, JID), {Fs, Ts} = ejabberd_hooks:run_fold( @@ -1902,12 +1886,11 @@ new_id() -> randoms:get_string(). is_auth_packet(El) -> case jlib:iq_query_info(El) of - #iq{id = ID, type = Type, xmlns = ?NS_AUTH, - sub_el = SubEl} -> - #xmlel{children = Els} = SubEl, - {auth, ID, Type, - get_auth_tags(Els, <<"">>, <<"">>, <<"">>, <<"">>)}; - _ -> false + #iq{id = ID, type = Type, xmlns = ?NS_AUTH, sub_el = SubEl} -> + #xmlel{children = Els} = SubEl, + {auth, ID, Type, + get_auth_tags(Els, <<"">>, <<"">>, <<"">>, <<"">>)}; + _ -> false end. is_stanza(#xmlel{name = Name, attrs = Attrs}) when Name == <<"message">>; @@ -2230,18 +2213,16 @@ remove_element(E, Set) -> roster_change(IJID, ISubscription, StateData) -> LIJID = jlib:jid_tolower(IJID), - IsFrom = (ISubscription == both) or - (ISubscription == from), + IsFrom = (ISubscription == both) or (ISubscription == from), IsTo = (ISubscription == both) or (ISubscription == to), - OldIsFrom = (?SETS):is_element(LIJID, - StateData#state.pres_f), - FSet = if IsFrom -> - (?SETS):add_element(LIJID, StateData#state.pres_f); - true -> remove_element(LIJID, StateData#state.pres_f) + OldIsFrom = (?SETS):is_element(LIJID, StateData#state.pres_f), + FSet = if + IsFrom -> (?SETS):add_element(LIJID, StateData#state.pres_f); + not IsFrom -> remove_element(LIJID, StateData#state.pres_f) end, - TSet = if IsTo -> - (?SETS):add_element(LIJID, StateData#state.pres_t); - true -> remove_element(LIJID, StateData#state.pres_t) + TSet = if + IsTo -> (?SETS):add_element(LIJID, StateData#state.pres_t); + not IsTo -> remove_element(LIJID, StateData#state.pres_t) end, case StateData#state.pres_last of undefined -> @@ -2335,11 +2316,10 @@ process_privacy_iq(From, To, NewStateData. resend_offline_messages(StateData) -> - case - ejabberd_hooks:run_fold(resend_offline_messages_hook, - StateData#state.server, [], - [StateData#state.user, StateData#state.server]) - of + case ejabberd_hooks:run_fold(resend_offline_messages_hook, + StateData#state.server, [], + [StateData#state.user, StateData#state.server]) + of Rs -> %%when is_list(Rs) -> lists:foreach(fun ({route, From, To, #xmlel{} = Packet}) -> @@ -2359,8 +2339,7 @@ resend_offline_messages(StateData) -> end. resend_subscription_requests(#state{user = User, - server = Server} = - StateData) -> + server = Server} = StateData) -> PendingSubscriptions = ejabberd_hooks:run_fold(resend_subscription_requests_hook, Server, [], [User, Server]), @@ -2372,20 +2351,14 @@ resend_subscription_requests(#state{user = User, get_showtag(undefined) -> <<"unavailable">>; get_showtag(Presence) -> - case xml:get_path_s(Presence, - [{elem, <<"show">>}, cdata]) - of - <<"">> -> <<"available">>; - ShowTag -> ShowTag + case xml:get_path_s(Presence, [{elem, <<"show">>}, cdata]) of + <<"">> -> <<"available">>; + ShowTag -> ShowTag end. get_statustag(undefined) -> <<"">>; get_statustag(Presence) -> - case xml:get_path_s(Presence, - [{elem, <<"status">>}, cdata]) - of - ShowTag -> ShowTag - end. + xml:get_path_s(Presence, [{elem, <<"status">>}, cdata]). process_unauthenticated_stanza(StateData, El) -> NewEl = case xml:get_tag_attr_s(<<"xml:lang">>, El) of @@ -2485,23 +2458,27 @@ is_ip_blacklisted({IP, _Port}) -> %% returns invalid-from|NewElement check_from(El, FromJID) -> case xml:get_tag_attr(<<"from">>, El) of - false -> El; - {value, SJID} -> - JID = jlib:string_to_jid(SJID), - case JID of - error -> 'invalid-from'; - #jid{} -> - if (JID#jid.luser == FromJID#jid.luser) and - (JID#jid.lserver == FromJID#jid.lserver) - and (JID#jid.lresource == FromJID#jid.lresource) -> - El; - (JID#jid.luser == FromJID#jid.luser) and - (JID#jid.lserver == FromJID#jid.lserver) - and (JID#jid.lresource == <<"">>) -> - El; - true -> 'invalid-from' - end - end + false -> + El; + {value, SJID} -> + JID = jlib:string_to_jid(SJID), + case JID of + error -> + 'invalid-from'; + #jid{} -> + if + (JID#jid.luser == FromJID#jid.luser) and + (JID#jid.lserver == FromJID#jid.lserver) and + (JID#jid.lresource == FromJID#jid.lresource) -> + El; + (JID#jid.luser == FromJID#jid.luser) and + (JID#jid.lserver == FromJID#jid.lserver) and + (JID#jid.lresource == <<"">>) -> + El; + true -> + 'invalid-from' + end + end end. fsm_limit_opts(Opts) -> 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 b4db67b3d..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) -> 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} = |