mirror of
https://github.com/processone/ejabberd.git
synced 2024-11-22 16:20:52 +01:00
Fix management of disco_features and disco_extra_domains
This commit is contained in:
parent
d2104ba4e1
commit
bda56552eb
@ -67,13 +67,13 @@ start(Host, Opts) ->
|
|||||||
?MODULE, process_sm_iq_info, IQDisc),
|
?MODULE, process_sm_iq_info, IQDisc),
|
||||||
|
|
||||||
catch ets:new(disco_features, [named_table, ordered_set, public]),
|
catch ets:new(disco_features, [named_table, ordered_set, public]),
|
||||||
register_feature(Host, "iq"),
|
register_feature(HostB, "iq"),
|
||||||
register_feature(Host, "presence"),
|
register_feature(HostB, "presence"),
|
||||||
register_feature(Host, "presence-invisible"),
|
register_feature(HostB, "presence-invisible"),
|
||||||
|
|
||||||
catch ets:new(disco_extra_domains, [named_table, ordered_set, public]),
|
catch ets:new(disco_extra_domains, [named_table, ordered_set, public]),
|
||||||
ExtraDomains = gen_mod:get_opt(extra_domains, Opts, []),
|
ExtraDomains = gen_mod:get_opt(extra_domains, Opts, []),
|
||||||
lists:foreach(fun(Domain) -> register_extra_domain(Host, Domain) end,
|
lists:foreach(fun(Domain) -> register_extra_domain(list_to_binary(Host), Domain) end,
|
||||||
ExtraDomains),
|
ExtraDomains),
|
||||||
catch ets:new(disco_sm_features, [named_table, ordered_set, public]),
|
catch ets:new(disco_sm_features, [named_table, ordered_set, public]),
|
||||||
catch ets:new(disco_sm_nodes, [named_table, ordered_set, public]),
|
catch ets:new(disco_sm_nodes, [named_table, ordered_set, public]),
|
||||||
@ -99,26 +99,26 @@ stop(Host) ->
|
|||||||
gen_iq_handler:remove_iq_handler(ejabberd_local, HostB, ?NS_DISCO_INFO),
|
gen_iq_handler:remove_iq_handler(ejabberd_local, HostB, ?NS_DISCO_INFO),
|
||||||
gen_iq_handler:remove_iq_handler(ejabberd_sm, HostB, ?NS_DISCO_ITEMS),
|
gen_iq_handler:remove_iq_handler(ejabberd_sm, HostB, ?NS_DISCO_ITEMS),
|
||||||
gen_iq_handler:remove_iq_handler(ejabberd_sm, HostB, ?NS_DISCO_INFO),
|
gen_iq_handler:remove_iq_handler(ejabberd_sm, HostB, ?NS_DISCO_INFO),
|
||||||
catch ets:match_delete(disco_features, {{'_', Host}}),
|
catch ets:match_delete(disco_features, {{'_', HostB}}),
|
||||||
catch ets:match_delete(disco_extra_domains, {{'_', Host}}),
|
catch ets:match_delete(disco_extra_domains, {{'_', HostB}}),
|
||||||
ok.
|
ok.
|
||||||
|
|
||||||
|
|
||||||
register_feature(Host, Feature) ->
|
register_feature(HostB, Feature) when is_binary(HostB) ->
|
||||||
catch ets:new(disco_features, [named_table, ordered_set, public]),
|
catch ets:new(disco_features, [named_table, ordered_set, public]),
|
||||||
ets:insert(disco_features, {{Feature, Host}}).
|
ets:insert(disco_features, {{Feature, HostB}}).
|
||||||
|
|
||||||
unregister_feature(Host, Feature) ->
|
unregister_feature(HostB, Feature) ->
|
||||||
catch ets:new(disco_features, [named_table, ordered_set, public]),
|
catch ets:new(disco_features, [named_table, ordered_set, public]),
|
||||||
ets:delete(disco_features, {Feature, Host}).
|
ets:delete(disco_features, {Feature, HostB}).
|
||||||
|
|
||||||
register_extra_domain(Host, Domain) ->
|
register_extra_domain(HostB, Domain) when is_binary(HostB) ->
|
||||||
catch ets:new(disco_extra_domains, [named_table, ordered_set, public]),
|
catch ets:new(disco_extra_domains, [named_table, ordered_set, public]),
|
||||||
ets:insert(disco_extra_domains, {{Domain, Host}}).
|
ets:insert(disco_extra_domains, {{Domain, HostB}}).
|
||||||
|
|
||||||
unregister_extra_domain(Host, Domain) ->
|
unregister_extra_domain(HostB, Domain) when is_binary(HostB) ->
|
||||||
catch ets:new(disco_extra_domains, [named_table, ordered_set, public]),
|
catch ets:new(disco_extra_domains, [named_table, ordered_set, public]),
|
||||||
ets:delete(disco_extra_domains, {Domain, Host}).
|
ets:delete(disco_extra_domains, {Domain, HostB}).
|
||||||
|
|
||||||
process_local_iq_items(From, To, #iq{type = get, payload = SubEl,
|
process_local_iq_items(From, To, #iq{type = get, payload = SubEl,
|
||||||
lang = Lang} = IQ_Rec) ->
|
lang = Lang} = IQ_Rec) ->
|
||||||
@ -192,9 +192,9 @@ get_local_features(Acc, _From, To, <<>>, _Lang) ->
|
|||||||
{result, Features} -> Features;
|
{result, Features} -> Features;
|
||||||
empty -> []
|
empty -> []
|
||||||
end,
|
end,
|
||||||
Host = exmpp_jid:prep_domain_as_list(To),
|
HostB = exmpp_jid:prep_domain(To),
|
||||||
{result,
|
{result,
|
||||||
ets:select(disco_features, [{{{'_', Host}}, [], ['$_']}]) ++ Feats};
|
ets:select(disco_features, [{{{'_', HostB}}, [], ['$_']}]) ++ Feats};
|
||||||
|
|
||||||
get_local_features(Acc, _From, _To, _Node, _Lang) ->
|
get_local_features(Acc, _From, _To, _Node, _Lang) ->
|
||||||
case Acc of
|
case Acc of
|
||||||
@ -235,13 +235,14 @@ get_local_services(Acc, _From, To, <<>>, _Lang) ->
|
|||||||
{result, Its} -> Its;
|
{result, Its} -> Its;
|
||||||
empty -> []
|
empty -> []
|
||||||
end,
|
end,
|
||||||
Host = exmpp_jid:prep_domain_as_list(To),
|
HostB = exmpp_jid:prep_domain(To),
|
||||||
|
Host = binary_to_list(HostB),
|
||||||
{result,
|
{result,
|
||||||
lists:usort(
|
lists:usort(
|
||||||
lists:map(fun domain_to_xml/1,
|
lists:map(fun domain_to_xml/1,
|
||||||
get_vh_services(Host) ++
|
get_vh_services(Host) ++
|
||||||
ets:select(disco_extra_domains,
|
ets:select(disco_extra_domains,
|
||||||
[{{{'$1', Host}}, [], ['$1']}]))
|
[{{{'$1', HostB}}, [], ['$1']}]))
|
||||||
) ++ Items};
|
) ++ Items};
|
||||||
|
|
||||||
get_local_services({result, _} = Acc, _From, _To, _Node, _Lang) ->
|
get_local_services({result, _} = Acc, _From, _To, _Node, _Lang) ->
|
||||||
|
Loading…
Reference in New Issue
Block a user