aboutsummaryrefslogtreecommitdiff
path: root/src/mod_configure2.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/mod_configure2.erl')
-rw-r--r--src/mod_configure2.erl269
1 files changed, 148 insertions, 121 deletions
diff --git a/src/mod_configure2.erl b/src/mod_configure2.erl
index 77bbca57c..366538632 100644
--- a/src/mod_configure2.erl
+++ b/src/mod_configure2.erl
@@ -25,146 +25,173 @@
%%%----------------------------------------------------------------------
-module(mod_configure2).
+
-author('alexey@process-one.net').
-behaviour(gen_mod).
--export([start/2,
- stop/1,
- process_local_iq/3]).
+-export([start/2, stop/1, process_local_iq/3]).
-include("ejabberd.hrl").
+
-include("jlib.hrl").
--define(NS_ECONFIGURE, "http://ejabberd.jabberstudio.org/protocol/configure").
+-define(NS_ECONFIGURE,
+ <<"http://ejabberd.jabberstudio.org/protocol/con"
+ "figure">>).
start(Host, Opts) ->
- IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue),
- gen_iq_handler:add_iq_handler(ejabberd_local, Host, ?NS_ECONFIGURE,
- ?MODULE, process_local_iq, IQDisc),
+ IQDisc = gen_mod:get_opt(iqdisc, Opts, fun gen_iq_handler:check_type/1,
+ one_queue),
+ gen_iq_handler:add_iq_handler(ejabberd_local, Host,
+ ?NS_ECONFIGURE, ?MODULE, process_local_iq,
+ IQDisc),
ok.
stop(Host) ->
- gen_iq_handler:remove_iq_handler(ejabberd_local, Host, ?NS_ECONFIGURE).
-
+ gen_iq_handler:remove_iq_handler(ejabberd_local, Host,
+ ?NS_ECONFIGURE).
-process_local_iq(From, To, #iq{type = Type, lang = _Lang, sub_el = SubEl} = IQ) ->
+process_local_iq(From, To,
+ #iq{type = Type, lang = _Lang, sub_el = SubEl} = IQ) ->
case acl:match_rule(To#jid.lserver, configure, From) of
- deny ->
- IQ#iq{type = error, sub_el = [SubEl, ?ERR_NOT_ALLOWED]};
- allow ->
- case Type of
- set ->
- IQ#iq{type = error,
- sub_el = [SubEl, ?ERR_FEATURE_NOT_IMPLEMENTED]};
- %%case xml:get_tag_attr_s("type", SubEl) of
- %% "cancel" ->
- %% IQ#iq{type = result,
- %% sub_el = [{xmlelement, "query",
- %% [{"xmlns", XMLNS}], []}]};
- %% "submit" ->
- %% XData = jlib:parse_xdata_submit(SubEl),
- %% case XData of
- %% invalid ->
- %% IQ#iq{type = error,
- %% sub_el = [SubEl, ?ERR_BAD_REQUEST]};
- %% _ ->
- %% Node =
- %% string:tokens(
- %% xml:get_tag_attr_s("node", SubEl),
- %% "/"),
- %% case set_form(Node, Lang, XData) of
- %% {result, Res} ->
- %% IQ#iq{type = result,
- %% sub_el = [{xmlelement, "query",
- %% [{"xmlns", XMLNS}],
- %% Res
- %% }]};
- %% {error, Error} ->
- %% IQ#iq{type = error,
- %% sub_el = [SubEl, Error]}
- %% end
- %% end;
- %% _ ->
- %% IQ#iq{type = error,
- %% sub_el = [SubEl, ?ERR_NOT_ALLOWED]}
- %%end;
- get ->
- case process_get(SubEl) of
- {result, Res} ->
- IQ#iq{type = result, sub_el = [Res]};
- {error, Error} ->
- IQ#iq{type = error, sub_el = [SubEl, Error]}
- end
- end
+ deny ->
+ IQ#iq{type = error, sub_el = [SubEl, ?ERR_NOT_ALLOWED]};
+ allow ->
+ case Type of
+ set ->
+ IQ#iq{type = error,
+ sub_el = [SubEl, ?ERR_FEATURE_NOT_IMPLEMENTED]};
+ %%case xml:get_tag_attr_s("type", SubEl) of
+ %% "cancel" ->
+ %% IQ#iq{type = result,
+ %% sub_el = [{xmlelement, "query",
+ %% [{"xmlns", XMLNS}], []}]};
+ %% "submit" ->
+ %% XData = jlib:parse_xdata_submit(SubEl),
+ %% case XData of
+ %% invalid ->
+ %% IQ#iq{type = error,
+ %% sub_el = [SubEl, ?ERR_BAD_REQUEST]};
+ %% _ ->
+ %% Node =
+ %% string:tokens(
+ %% xml:get_tag_attr_s("node", SubEl),
+ %% "/"),
+ %% case set_form(Node, Lang, XData) of
+ %% {result, Res} ->
+ %% IQ#iq{type = result,
+ %% sub_el = [{xmlelement, "query",
+ %% [{"xmlns", XMLNS}],
+ %% Res
+ %% }]};
+ %% {error, Error} ->
+ %% IQ#iq{type = error,
+ %% sub_el = [SubEl, Error]}
+ %% end
+ %% end;
+ %% _ ->
+ %% IQ#iq{type = error,
+ %% sub_el = [SubEl, ?ERR_NOT_ALLOWED]}
+ %%end;
+ get ->
+ case process_get(SubEl) of
+ {result, Res} -> IQ#iq{type = result, sub_el = [Res]};
+ {error, Error} ->
+ IQ#iq{type = error, sub_el = [SubEl, Error]}
+ end
+ end
end.
-
-process_get({xmlelement, "info", _Attrs, _SubEls}) ->
+process_get(#xmlel{name = <<"info">>}) ->
S2SConns = ejabberd_s2s:dirty_get_connections(),
TConns = lists:usort([element(2, C) || C <- S2SConns]),
- Attrs = [{"registered-users",
- integer_to_list(mnesia:table_info(passwd, size))},
- {"online-users",
- integer_to_list(mnesia:table_info(presence, size))},
- {"running-nodes",
- integer_to_list(length(mnesia:system_info(running_db_nodes)))},
- {"stopped-nodes",
- integer_to_list(
- length(lists:usort(mnesia:system_info(db_nodes) ++
- mnesia:system_info(extra_db_nodes)) --
- mnesia:system_info(running_db_nodes)))},
- {"outgoing-s2s-servers", integer_to_list(length(TConns))}],
- {result, {xmlelement, "info",
- [{"xmlns", ?NS_ECONFIGURE} | Attrs], []}};
-process_get({xmlelement, "welcome-message", Attrs, _SubEls}) ->
- {Subj, Body} = case ejabberd_config:get_local_option(welcome_message) of
- {_Subj, _Body} = SB -> SB;
- _ -> {"", ""}
- end,
- {result, {xmlelement, "welcome-message", Attrs,
- [{xmlelement, "subject", [], [{xmlcdata, Subj}]},
- {xmlelement, "body", [], [{xmlcdata, Body}]}]}};
-process_get({xmlelement, "registration-watchers", Attrs, _SubEls}) ->
- SubEls =
- case ejabberd_config:get_local_option(registration_watchers) of
- JIDs when is_list(JIDs) ->
- lists:map(fun(JID) ->
- {xmlelement, "jid", [], [{xmlcdata, JID}]}
- end, JIDs);
- _ ->
- []
- end,
- {result, {xmlelement, "registration_watchers", Attrs, SubEls}};
-process_get({xmlelement, "acls", Attrs, _SubEls}) ->
- Str = lists:flatten(io_lib:format("~p.", [ets:tab2list(acl)])),
- {result, {xmlelement, "acls", Attrs, [{xmlcdata, Str}]}};
-process_get({xmlelement, "access", Attrs, _SubEls}) ->
- Str =
- lists:flatten(
- io_lib:format(
- "~p.",
- [ets:select(config,
- [{{config, {access, '$1'}, '$2'},
- [],
- [{{access, '$1', '$2'}}]}])
- ])),
- {result, {xmlelement, "access", Attrs, [{xmlcdata, Str}]}};
-process_get({xmlelement, "last", Attrs, _SubEls}) ->
- case catch mnesia:dirty_select(
- last_activity, [{{last_activity, '_', '$1', '_'}, [], ['$1']}]) of
- {'EXIT', _Reason} ->
- {error, ?ERR_INTERNAL_SERVER_ERROR};
- Vals ->
- {MegaSecs, Secs, _MicroSecs} = now(),
- TimeStamp = MegaSecs * 1000000 + Secs,
- Str = lists:flatten(
- lists:append(
- [[integer_to_list(TimeStamp - V), " "] || V <- Vals])),
- {result, {xmlelement, "last", Attrs, [{xmlcdata, Str}]}}
+ Attrs = [{<<"registered-users">>,
+ iolist_to_binary(integer_to_list(mnesia:table_info(passwd,
+ size)))},
+ {<<"online-users">>,
+ iolist_to_binary(integer_to_list(mnesia:table_info(presence,
+ size)))},
+ {<<"running-nodes">>,
+ iolist_to_binary(integer_to_list(length(mnesia:system_info(running_db_nodes))))},
+ {<<"stopped-nodes">>,
+ iolist_to_binary(integer_to_list(length(lists:usort(mnesia:system_info(db_nodes)
+ ++
+ mnesia:system_info(extra_db_nodes))
+ --
+ mnesia:system_info(running_db_nodes))))},
+ {<<"outgoing-s2s-servers">>,
+ iolist_to_binary(integer_to_list(length(TConns)))}],
+ {result,
+ #xmlel{name = <<"info">>,
+ attrs = [{<<"xmlns">>, ?NS_ECONFIGURE} | Attrs],
+ children = []}};
+process_get(#xmlel{name = <<"welcome-message">>,
+ attrs = Attrs}) ->
+ {Subj, Body} = ejabberd_config:get_local_option(
+ welcome_message,
+ fun({Subj, Body}) ->
+ {iolist_to_binary(Subj),
+ iolist_to_binary(Body)}
+ end,
+ {<<"">>, <<"">>}),
+ {result,
+ #xmlel{name = <<"welcome-message">>, attrs = Attrs,
+ children =
+ [#xmlel{name = <<"subject">>, attrs = [],
+ children = [{xmlcdata, Subj}]},
+ #xmlel{name = <<"body">>, attrs = [],
+ children = [{xmlcdata, Body}]}]}};
+process_get(#xmlel{name = <<"registration-watchers">>,
+ attrs = Attrs}) ->
+ SubEls = ejabberd_config:get_local_option(
+ registration_watchers,
+ fun(JIDs) when is_list(JIDs) ->
+ lists:map(
+ fun(J) ->
+ #xmlel{name = <<"jid">>, attrs = [],
+ children = [{xmlcdata,
+ iolist_to_binary(J)}]}
+ end, JIDs)
+ end, []),
+ {result,
+ #xmlel{name = <<"registration_watchers">>,
+ attrs = Attrs, children = SubEls}};
+process_get(#xmlel{name = <<"acls">>, attrs = Attrs}) ->
+ Str = iolist_to_binary(io_lib:format("~p.",
+ [ets:tab2list(acl)])),
+ {result,
+ #xmlel{name = <<"acls">>, attrs = Attrs,
+ children = [{xmlcdata, Str}]}};
+process_get(#xmlel{name = <<"access">>,
+ attrs = Attrs}) ->
+ Str = iolist_to_binary(io_lib:format("~p.",
+ [ets:select(config,
+ [{{config, {access, '$1'},
+ '$2'},
+ [],
+ [{{access, '$1',
+ '$2'}}]}])])),
+ {result,
+ #xmlel{name = <<"access">>, attrs = Attrs,
+ children = [{xmlcdata, Str}]}};
+process_get(#xmlel{name = <<"last">>, attrs = Attrs}) ->
+ case catch mnesia:dirty_select(last_activity,
+ [{{last_activity, '_', '$1', '_'}, [],
+ ['$1']}])
+ of
+ {'EXIT', _Reason} ->
+ {error, ?ERR_INTERNAL_SERVER_ERROR};
+ Vals ->
+ {MegaSecs, Secs, _MicroSecs} = now(),
+ TimeStamp = MegaSecs * 1000000 + Secs,
+ Str = list_to_binary(
+ [[jlib:integer_to_binary(TimeStamp - V),
+ <<" ">>] || V <- Vals]),
+ {result,
+ #xmlel{name = <<"last">>, attrs = Attrs,
+ children = [{xmlcdata, Str}]}}
end;
%%process_get({xmlelement, Name, Attrs, SubEls}) ->
%% {result, };
-process_get(_) ->
- {error, ?ERR_BAD_REQUEST}.
-
+process_get(_) -> {error, ?ERR_BAD_REQUEST}.