aboutsummaryrefslogtreecommitdiff
path: root/src/mod_disco.erl
diff options
context:
space:
mode:
authorBadlop <badlop@process-one.net>2009-07-17 20:45:44 +0000
committerBadlop <badlop@process-one.net>2009-07-17 20:45:44 +0000
commit9df56399744becf808e45df39aff8c4b13ce7266 (patch)
tree779ba57b33c1b97fe39cc274435e70f7d68a6b6a /src/mod_disco.erl
parentFix updating pending subscriptions (EJAB-980) (diff)
Support XEP-0157: Contact Addresses for XMPP Services (EJAB-235)
SVN Revision: 2368
Diffstat (limited to 'src/mod_disco.erl')
-rw-r--r--src/mod_disco.erl65
1 files changed, 64 insertions, 1 deletions
diff --git a/src/mod_disco.erl b/src/mod_disco.erl
index b688427b6..ad9975b15 100644
--- a/src/mod_disco.erl
+++ b/src/mod_disco.erl
@@ -1,7 +1,7 @@
%%%----------------------------------------------------------------------
%%% File : mod_disco.erl
%%% Author : Alexey Shchepin <alexey@process-one.net>
-%%% Purpose : Service Discovery (JEP-0030) support
+%%% Purpose : Service Discovery (XEP-0030) support
%%% Created : 1 Jan 2003 by Alexey Shchepin <alexey@process-one.net>
%%%
%%%
@@ -41,6 +41,7 @@
get_sm_identity/5,
get_sm_features/5,
get_sm_items/5,
+ get_info/5,
register_feature/2,
unregister_feature/2,
register_extra_domain/2,
@@ -79,6 +80,7 @@ start(Host, Opts) ->
ejabberd_hooks:add(disco_sm_items, Host, ?MODULE, get_sm_items, 100),
ejabberd_hooks:add(disco_sm_features, Host, ?MODULE, get_sm_features, 100),
ejabberd_hooks:add(disco_sm_identity, Host, ?MODULE, get_sm_identity, 100),
+ ejabberd_hooks:add(disco_info, Host, ?MODULE, get_info, 100),
ok.
stop(Host) ->
@@ -88,6 +90,7 @@ stop(Host) ->
ejabberd_hooks:delete(disco_local_identity, Host, ?MODULE, get_local_identity, 100),
ejabberd_hooks:delete(disco_local_features, Host, ?MODULE, get_local_features, 100),
ejabberd_hooks:delete(disco_local_items, Host, ?MODULE, get_local_services, 100),
+ ejabberd_hooks:delete(disco_info, Host, ?MODULE, get_info, 100),
gen_iq_handler:remove_iq_handler(ejabberd_local, Host, ?NS_DISCO_ITEMS),
gen_iq_handler:remove_iq_handler(ejabberd_local, Host, ?NS_DISCO_INFO),
gen_iq_handler:remove_iq_handler(ejabberd_sm, Host, ?NS_DISCO_ITEMS),
@@ -153,6 +156,8 @@ process_local_iq_info(From, To, #iq{type = Type, lang = Lang,
Host,
[],
[From, To, Node, Lang]),
+ Info = ejabberd_hooks:run_fold(disco_info, Host, [],
+ [Host, ?MODULE, Node, Lang]),
case ejabberd_hooks:run_fold(disco_local_features,
Host,
empty,
@@ -166,6 +171,7 @@ process_local_iq_info(From, To, #iq{type = Type, lang = Lang,
sub_el = [{xmlelement, "query",
[{"xmlns", ?NS_DISCO_INFO} | ANode],
Identity ++
+ Info ++
lists:map(fun feature_to_xml/1, Features)
}]};
{error, Error} ->
@@ -362,3 +368,60 @@ get_user_resources(User, Server) ->
[{"jid", User ++ "@" ++ Server ++ "/" ++ R},
{"name", User}], []}
end, lists:sort(Rs)).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%% Support for: XEP-0157 Contact Addresses for XMPP Services
+
+get_info(_A, Host, Module, Node, _Lang) when Node == [] ->
+ Serverinfo_fields = get_fields_xml(Host, Module),
+ [{xmlelement, "x",
+ [{"xmlns", ?NS_XDATA}, {"type", "result"}],
+ [{xmlelement, "field",
+ [{"var", "FORM_TYPE"}, {"type", "hidden"}],
+ [{xmlelement, "value",
+ [],
+ [{xmlcdata, ?NS_SERVERINFO}]
+ }]
+ }]
+ ++ Serverinfo_fields
+ }];
+
+get_info(_, _, _, _Node, _) ->
+ [].
+
+get_fields_xml(Host, Module) ->
+ Fields = gen_mod:get_module_opt(Host, ?MODULE, server_info, []),
+
+ %% filter, and get only the ones allowed for this module
+ Fields_good = lists:filter(
+ fun({Modules, _, _}) ->
+ case Modules of
+ all -> true;
+ Modules -> lists:member(Module, Modules)
+ end
+ end,
+ Fields),
+
+ fields_to_xml(Fields_good).
+
+fields_to_xml(Fields) ->
+ [ field_to_xml(Field) || Field <- Fields].
+
+field_to_xml({_, Var, Values}) ->
+ Values_xml = values_to_xml(Values),
+ {xmlelement, "field",
+ [{"var", Var}],
+ Values_xml
+ }.
+
+values_to_xml(Values) ->
+ lists:map(
+ fun(Value) ->
+ {xmlelement, "value",
+ [],
+ [{xmlcdata, Value}]
+ }
+ end,
+ Values
+ ).