mirror of
https://github.com/processone/ejabberd.git
synced 2024-11-20 16:15:59 +01:00
Fix submission-id and channel resource
This commit is contained in:
parent
c4858a7020
commit
6afefd7bbf
@ -24,7 +24,7 @@
|
||||
{fast_tls, ".*", {git, "https://github.com/processone/fast_tls", {tag, "1.0.26"}}},
|
||||
{stringprep, ".*", {git, "https://github.com/processone/stringprep", {tag, "1.0.14"}}},
|
||||
{fast_xml, ".*", {git, "https://github.com/processone/fast_xml", {tag, "1.1.34"}}},
|
||||
{xmpp, ".*", {git, "https://github.com/processone/xmpp", "4b74c17"}},
|
||||
{xmpp, ".*", {git, "https://github.com/processone/xmpp", "278ddf9"}},
|
||||
{fast_yaml, ".*", {git, "https://github.com/processone/fast_yaml", {tag, "1.0.17"}}},
|
||||
{jiffy, ".*", {git, "https://github.com/davisp/jiffy", {tag, "0.14.8"}}},
|
||||
{p1_oauth2, ".*", {git, "https://github.com/processone/p1_oauth2", {tag, "0.6.3"}}},
|
||||
|
@ -128,7 +128,8 @@ process_disco_info(#iq{type = get, to = #jid{luser = <<>>} = To,
|
||||
identities = [Identity],
|
||||
xdata = X});
|
||||
process_disco_info(#iq{type = get, to = #jid{luser = <<_, _/binary>>} = To,
|
||||
sub_els = [#disco_info{node = <<"mix">>}]} = IQ) ->
|
||||
sub_els = [#disco_info{node = Node}]} = IQ)
|
||||
when Node == <<"mix">>; Node == <<>> ->
|
||||
{Chan, Host, _} = jid:tolower(To),
|
||||
ServerHost = ejabberd_router:host_of_route(Host),
|
||||
Mod = gen_mod:db_mod(ServerHost, ?MODULE),
|
||||
@ -139,7 +140,7 @@ process_disco_info(#iq{type = get, to = #jid{luser = <<_, _/binary>>} = To,
|
||||
Features = [?NS_DISCO_INFO, ?NS_DISCO_ITEMS,
|
||||
?NS_MIX_CORE_0, ?NS_MAM_2],
|
||||
xmpp:make_iq_result(
|
||||
IQ, #disco_info{node = <<"mix">>,
|
||||
IQ, #disco_info{node = Node,
|
||||
features = Features,
|
||||
identities = [Identity]});
|
||||
{error, notfound} ->
|
||||
@ -170,15 +171,16 @@ process_disco_items(#iq{type = get, to = #jid{luser = <<>>} = To,
|
||||
xmpp:make_error(IQ, db_error(IQ))
|
||||
end;
|
||||
process_disco_items(#iq{type = get, to = #jid{luser = <<_, _/binary>>} = To,
|
||||
sub_els = [#disco_items{node = <<"mix">>}]} = IQ) ->
|
||||
sub_els = [#disco_items{node = Node}]} = IQ)
|
||||
when Node == <<"mix">>; Node == <<>> ->
|
||||
{Chan, Host, _} = jid:tolower(To),
|
||||
ServerHost = ejabberd_router:host_of_route(Host),
|
||||
Mod = gen_mod:db_mod(ServerHost, ?MODULE),
|
||||
case Mod:get_channel(ServerHost, Chan, Host) of
|
||||
{ok, _} ->
|
||||
BTo = jid:remove_resource(To),
|
||||
Items = [#disco_item{jid = BTo, node = Node} || Node <- known_nodes()],
|
||||
xmpp:make_iq_result(IQ, #disco_items{node = <<"mix">>, items = Items});
|
||||
Items = [#disco_item{jid = BTo, node = N} || N <- known_nodes()],
|
||||
xmpp:make_iq_result(IQ, #disco_items{node = Node, items = Items});
|
||||
{error, notfound} ->
|
||||
xmpp:make_error(IQ, no_channel_error(IQ));
|
||||
{error, db_failure} ->
|
||||
@ -438,29 +440,36 @@ process_mix_setnick(#iq{to = To, from = From,
|
||||
process_mix_message(#message{from = From, to = To,
|
||||
id = SubmissionID} = Msg) ->
|
||||
{Chan, Host, _} = jid:tolower(To),
|
||||
{FUser, FServer, _} = jid:tolower(From),
|
||||
ServerHost = ejabberd_router:host_of_route(Host),
|
||||
Mod = gen_mod:db_mod(ServerHost, ?MODULE),
|
||||
case Mod:get_channel(ServerHost, Chan, Host) of
|
||||
{ok, _} ->
|
||||
BFrom = jid:remove_resource(From),
|
||||
case Mod:get_participant(ServerHost, Chan, Host, BFrom) of
|
||||
{ok, {_ID, Nick}} ->
|
||||
{ok, {StableID, Nick}} ->
|
||||
MamID = mod_mam:make_id(),
|
||||
Msg1 = xmpp:put_meta(
|
||||
xmpp:set_subtag(
|
||||
Msg#message{from = jid:remove_resource(To),
|
||||
to = undefined,
|
||||
id = integer_to_binary(MamID)},
|
||||
#mix{jid = BFrom,
|
||||
nick = Nick,
|
||||
submission_id = SubmissionID}),
|
||||
stanza_id, MamID),
|
||||
Msg1 = xmpp:set_subtag(
|
||||
Msg#message{from = jid:replace_resource(To, StableID),
|
||||
to = undefined,
|
||||
id = integer_to_binary(MamID)},
|
||||
#mix{jid = BFrom, nick = Nick}),
|
||||
Msg2 = xmpp:put_meta(Msg1, stanza_id, MamID),
|
||||
case ejabberd_hooks:run_fold(
|
||||
store_mam_message, ServerHost, Msg1,
|
||||
store_mam_message, ServerHost, Msg2,
|
||||
[Chan, Host, BFrom, Nick, groupchat, recv]) of
|
||||
#message{} = Msg2 ->
|
||||
#message{} ->
|
||||
multicast(Mod, ServerHost, Chan, Host,
|
||||
?NS_MIX_NODES_MESSAGES, Msg2);
|
||||
?NS_MIX_NODES_MESSAGES,
|
||||
fun(#jid{luser = U, lserver = S})
|
||||
when U == FUser, S == FServer ->
|
||||
xmpp:set_subtag(
|
||||
Msg1, #mix{jid = BFrom,
|
||||
nick = Nick,
|
||||
submission_id = SubmissionID});
|
||||
(_) ->
|
||||
Msg1
|
||||
end);
|
||||
_ ->
|
||||
ok
|
||||
end;
|
||||
@ -529,13 +538,14 @@ filter_nodes(Nodes) ->
|
||||
end, known_nodes()).
|
||||
|
||||
-spec multicast(module(), binary(), binary(),
|
||||
binary(), binary(), message()) -> ok.
|
||||
multicast(Mod, LServer, Chan, Service, Node, Msg) ->
|
||||
binary(), binary(), fun((jid()) -> message())) -> ok.
|
||||
multicast(Mod, LServer, Chan, Service, Node, F) ->
|
||||
case Mod:get_subscribed(LServer, Chan, Service, Node) of
|
||||
{ok, Subscribers} ->
|
||||
lists:foreach(
|
||||
fun(To) ->
|
||||
ejabberd_router:route(Msg#message{to = To})
|
||||
Msg = xmpp:set_to(F(To), To),
|
||||
ejabberd_router:route(Msg)
|
||||
end, Subscribers);
|
||||
{error, db_failure} ->
|
||||
ok
|
||||
@ -555,7 +565,9 @@ notify_participant_joined(Mod, LServer, To, From, ID, Nick) ->
|
||||
Msg = #message{from = jid:remove_resource(To),
|
||||
id = p1_rand:get_string(),
|
||||
sub_els = [Event]},
|
||||
multicast(Mod, LServer, Chan, Host, ?NS_MIX_NODES_PARTICIPANTS, Msg).
|
||||
multicast(Mod, LServer, Chan, Host,
|
||||
?NS_MIX_NODES_PARTICIPANTS,
|
||||
fun(_) -> Msg end).
|
||||
|
||||
-spec notify_participant_left(module(), binary(), jid(), binary()) -> ok.
|
||||
notify_participant_left(Mod, LServer, To, ID) ->
|
||||
|
Loading…
Reference in New Issue
Block a user