diff options
author | Alexey Shchepin <alexey@process-one.net> | 2003-01-21 20:36:55 +0000 |
---|---|---|
committer | Alexey Shchepin <alexey@process-one.net> | 2003-01-21 20:36:55 +0000 |
commit | f0427ecab55b393cdc368c6f8b2bb0ae2d8cf07c (patch) | |
tree | bf151a7c8bd4b4964a6095dceda261dca48c29e5 /src/mod_configure.erl | |
parent | *** empty log message *** (diff) |
*** empty log message ***
SVN Revision: 46
Diffstat (limited to '')
-rw-r--r-- | src/mod_configure.erl | 144 |
1 files changed, 139 insertions, 5 deletions
diff --git a/src/mod_configure.erl b/src/mod_configure.erl index b72f180b..5ae67513 100644 --- a/src/mod_configure.erl +++ b/src/mod_configure.erl @@ -11,7 +11,8 @@ -vsn('$Revision$ '). -export([start/0, - process_local_iq/3]). + process_local_iq/3, + process_sm_iq/3]). -include("ejabberd.hrl"). -include("namespaces.hrl"). @@ -19,7 +20,10 @@ start() -> ejabberd_local:register_iq_handler(?NS_XDATA, - ?MODULE, process_local_iq). + ?MODULE, process_local_iq), + ejabberd_sm:register_iq_handler(?NS_XDATA, + ?MODULE, process_sm_iq), + ok. process_local_iq(From, To, {iq, ID, Type, XMLNS, SubEl}) -> @@ -92,6 +96,12 @@ process_local_iq(From, To, {iq, ID, Type, XMLNS, SubEl}) -> {"label", translate:translate(Lang, Label)}, {"var", Var}], []}). +-define(XFIELD(Type, Label, Var, Val), + {xmlelement, "field", [{"type", Type}, + {"label", translate:translate(Lang, Label)}, + {"var", Var}], + [{xmlelement, "value", [], [{xmlcdata, Val}]}]}). + -define(TABLEFIELD(Table, Val), {xmlelement, "field", [{"type", "list-single"}, {"label", atom_to_list(Table)}, @@ -105,7 +115,8 @@ process_local_iq(From, To, {iq, ID, Type, XMLNS, SubEl}) -> "RAM and disc copy")}], [{xmlelement, "value", [], [{xmlcdata, "disc_copies"}]}]}, {xmlelement, "option", [{"label", - translate:translate(Lang, "Disk copy")}], + translate:translate(Lang, + "Disc only copy")}], [{xmlelement, "value", [], [{xmlcdata, "disc_only_copies"}]}]}, {xmlelement, "option", [{"label", translate:translate(Lang, "Remote copy")}], @@ -123,6 +134,7 @@ get_form(["running nodes", ENode, "DB"], Lang) -> {badrpc, Reason} -> {error, "500", "Internal Server Error"}; Tables -> + STables = lists:sort(Tables), {result, [{xmlelement, "title", [], [{xmlcdata, translate:translate( @@ -142,11 +154,27 @@ get_form(["running nodes", ENode, "DB"], Lang) -> Type -> ?TABLEFIELD(Table, Type) end - end, Tables) + end, STables) ]} end end; +get_form(["config", "hostname"], Lang) -> + {result, [{xmlelement, "title", [], + [{xmlcdata, + translate:translate( + Lang, "DB Tables Configuration")}]}, + {xmlelement, "instructions", [], + [{xmlcdata, + translate:translate( + Lang, "Choose host name")}]}, + {xmlelement, "field", [{"type", "text-single"}, + {"label", + translate:translate(Lang, "Host name")}, + {"var", "hostname"}], + [{xmlelement, "value", [], [{xmlcdata, ?MYNAME}]}]} + ]}; + get_form(_, Lang) -> {error, "503", "Service Unavailable"}. @@ -159,7 +187,7 @@ set_form(["running nodes", ENode, "DB"], Lang, XData) -> Node -> lists:foreach( fun({SVar, SVals}) -> - % We believe that this allowed only for good peoples + % We believe that this is allowed only for good peoples Table = list_to_atom(SVar), Type = case SVals of ["unknown"] -> unknown; @@ -186,6 +214,19 @@ set_form(["running nodes", ENode, "DB"], Lang, XData) -> {result, []} end; +set_form(["config", "hostname"], Lang, XData) -> + case lists:keysearch("hostname", 1, XData) of + false -> + {error, "406", "Not Acceptable"}; + {value, {_, [""]}} -> + {error, "406", "Not Acceptable"}; + {value, {_, [NewName]}} -> + ejabberd_config:add_global_option(hostname, NewName), + {result, []}; + _ -> + {error, "406", "Not Acceptable"} + end; + set_form(_, Lang, XData) -> {error, "503", "Service Unavailable"}. @@ -204,4 +245,97 @@ search_running_node(SNode, [Node | Nodes]) -> search_running_node(SNode, Nodes) end. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +process_sm_iq(From, To, {iq, ID, Type, XMLNS, SubEl}) -> + case acl:match_rule(configure, From) of + deny -> + {iq, ID, error, XMLNS, [SubEl, {xmlelement, "error", + [{"code", "405"}], + [{xmlcdata, "Not Allowed"}]}]}; + allow -> + {User, _, _} = To, + Lang = xml:get_tag_attr_s("xml:lang", SubEl), + case Type of + set -> + case xml:get_tag_attr_s("type", SubEl) of + "cancel" -> + {iq, ID, result, XMLNS, + [{xmlelement, "query", [{"xmlns", XMLNS}], []}]}; + "submit" -> + XData = jlib:parse_xdata_submit(SubEl), + case XData of + invalid -> + {iq, ID, error, XMLNS, + [SubEl, {xmlelement, "error", + [{"code", "400"}], + [{xmlcdata, "Bad Request"}]}]}; + _ -> + Node = + string:tokens( + xml:get_tag_attr_s("node", SubEl), + "/"), + case set_sm_form( + User, Node, Lang, XData) of + {result, Res} -> + {iq, ID, result, XMLNS, + [{xmlelement, "query", + [{"xmlns", XMLNS}], + Res + }]}; + {error, Code, Desc} -> + {iq, ID, error, XMLNS, + [SubEl, {xmlelement, "error", + [{"code", Code}], + [{xmlcdata, Desc}]}]} + end + end; + _ -> + {iq, ID, error, XMLNS, + [SubEl, {xmlelement, "error", + [{"code", "405"}], + [{xmlcdata, "Not Allowed"}]}]} + end; + get -> + Node = + string:tokens(xml:get_tag_attr_s("node", SubEl), "/"), + case get_sm_form(User, Node, Lang) of + {result, Res} -> + {iq, ID, result, XMLNS, + [{xmlelement, "query", [{"xmlns", XMLNS}], + Res + }]}; + {error, Code, Desc} -> + {iq, ID, error, XMLNS, + [SubEl, {xmlelement, "error", + [{"code", Code}], + [{xmlcdata, Desc}]}]} + end + end + end. + + +get_sm_form(User, [], Lang) -> + {result, [{xmlelement, "title", [], + [{xmlcdata, + translate:translate( + Lang, "Administration of " ++ User)}]}, + %{xmlelement, "instructions", [], + % [{xmlcdata, + % translate:translate( + % Lang, "Choose host name")}]}, + ?XFIELD("text-private", "Password", "password", + ejabberd_auth:get_password_s(User)) + %{xmlelement, "field", [{"type", "text-single"}, + % {"label", + % translate:translate(Lang, "Host name")}, + % {"var", "hostname"}], + % [{xmlelement, "value", [], [{xmlcdata, ?MYNAME}]}]} + ]}; + +get_sm_form(_, _, Lang) -> + {error, "503", "Service Unavailable"}. + + +set_sm_form(_, _, Lang, XData) -> + {error, "503", "Service Unavailable"}. |