diff options
Diffstat (limited to 'src/mod_admin_extra.erl')
-rw-r--r-- | src/mod_admin_extra.erl | 378 |
1 files changed, 204 insertions, 174 deletions
diff --git a/src/mod_admin_extra.erl b/src/mod_admin_extra.erl index 023c29dcd..f0e567199 100644 --- a/src/mod_admin_extra.erl +++ b/src/mod_admin_extra.erl @@ -30,90 +30,48 @@ -include("logger.hrl"). --export([start/2, stop/1, - %% Node - compile/1, - get_cookie/0, - remove_node/1, - export2odbc/2, - %% Accounts - set_password/3, - check_password_hash/4, - delete_old_users/1, - delete_old_users_vhost/2, - ban_account/3, - num_active_users/2, - %% Sessions - num_resources/2, - resource_num/3, - kick_session/4, - status_num/2, status_num/1, - status_list/2, status_list/1, - connected_users_info/0, - connected_users_vhost/1, - set_presence/7, - user_sessions_info/2, - %% Vcard - set_nickname/3, - get_vcard/3, - get_vcard/4, - get_vcard_multi/4, - set_vcard/4, - set_vcard/5, - %% Roster - add_rosteritem/7, - delete_rosteritem/4, - process_rosteritems/5, - get_roster/2, - push_roster/3, - push_roster_all/1, - push_alltoall/2, - %% mod_last - get_last/2, - %% mod_private - private_get/4, - private_set/3, - %% mod_shared_roster - srg_create/5, - srg_delete/2, - srg_list/1, - srg_get_info/2, - srg_get_members/2, - srg_user_add/4, - srg_user_del/4, - %% Stanza - send_message/5, - send_stanza_c2s/4, - privacy_set/3, - %% Stats - stats/1, stats/2 - ]). +-export([start/2, stop/1, compile/1, get_cookie/0, + remove_node/1, set_password/3, + check_password_hash/4, delete_old_users/1, + delete_old_users_vhost/2, ban_account/3, + num_active_users/2, num_resources/2, resource_num/3, + kick_session/4, status_num/2, status_num/1, + status_list/2, status_list/1, connected_users_info/0, + connected_users_vhost/1, set_presence/7, + user_sessions_info/2, set_nickname/3, get_vcard/3, + get_vcard/4, get_vcard_multi/4, set_vcard/4, + set_vcard/5, add_rosteritem/7, delete_rosteritem/4, + process_rosteritems/5, get_roster/2, push_roster/3, + push_roster_all/1, push_alltoall/2, get_last/2, + private_get/4, private_set/3, srg_create/5, + srg_delete/2, srg_list/1, srg_get_info/2, + srg_get_members/2, srg_user_add/4, srg_user_del/4, + send_message/5, send_stanza/3, send_stanza_c2s/4, privacy_set/3, + stats/1, stats/2, mod_opt_type/1, get_commands_spec/0]). + -include("ejabberd.hrl"). -include("ejabberd_commands.hrl"). -include("mod_roster.hrl"). +-include("ejabberd_sm.hrl"). -include("jlib.hrl"). -%% Copied from ejabberd_sm.erl --record(session, {sid, usr, us, priority, info}). - - %%% %%% gen_mod %%% start(_Host, _Opts) -> - ejabberd_commands:register_commands(commands()). + ejabberd_commands:register_commands(get_commands_spec()). stop(_Host) -> - ejabberd_commands:unregister_commands(commands()). + ejabberd_commands:unregister_commands(get_commands_spec()). %%% %%% Register commands %%% -commands() -> +get_commands_spec() -> Vcard1FieldsString = "Some vcard field names in get/set_vcard are:\n" " FN - Full Name\n" " NICKNAME - Nickname\n" @@ -143,91 +101,156 @@ commands() -> desc = "Recompile and reload Erlang source code file", module = ?MODULE, function = compile, args = [{file, string}], - result = {res, rescode}}, + args_example = ["/home/me/srcs/ejabberd/mod_example.erl"], + args_desc = ["Filename of erlang source file to compile"], + result = {res, rescode}, + result_example = ok, + result_desc = "Status code: 0 on success, 1 otherwise"}, #ejabberd_commands{name = get_cookie, tags = [erlang], desc = "Get the Erlang cookie of this node", module = ?MODULE, function = get_cookie, args = [], - result = {cookie, string}}, + result = {cookie, string}, + result_example = "MWTAVMODFELNLSMYXPPD", + result_desc = "Erlang cookie used for authentication by ejabberd"}, #ejabberd_commands{name = remove_node, tags = [erlang], desc = "Remove an ejabberd node from Mnesia clustering config", module = ?MODULE, function = remove_node, args = [{node, string}], - result = {res, rescode}}, - #ejabberd_commands{name = export2odbc, tags = [mnesia], %% Copied to ejabberd 2.1.x after 11 - desc = "Export Mnesia tables to files in directory", - module = ?MODULE, function = export2odbc, - args = [{host, string}, {path, string}], - result = {res, rescode}}, - + args_example = ["ejabberd@server2"], + args_desc = ["Name of erlang node to remove"], + result = {res, rescode}, + result_example = ok, + result_desc = "Status code: 0 on success, 1 otherwise"}, #ejabberd_commands{name = num_active_users, tags = [accounts, stats], desc = "Get number of users active in the last days", + policy = admin, module = ?MODULE, function = num_active_users, args = [{host, binary}, {days, integer}], - result = {users, integer}}, + args_example = [<<"myserver.com">>, 3], + args_desc = ["Name of host to check", "Number of days to calculate sum"], + result = {users, integer}, + result_example = 123, + result_desc = "Number of users active on given server in last n days"}, #ejabberd_commands{name = delete_old_users, tags = [accounts, purge], desc = "Delete users that didn't log in last days, or that never logged", module = ?MODULE, function = delete_old_users, args = [{days, integer}], - result = {res, restuple}}, + args_example = [30], + args_desc = ["Last login age in days of accounts that should be removed"], + result = {res, restuple}, + result_example = {ok, <<"Deleted 2 users: [\"oldman@myserver.com\", \"test@myserver.com\"]">>}, + result_desc = "Result tuple"}, #ejabberd_commands{name = delete_old_users_vhost, tags = [accounts, purge], desc = "Delete users that didn't log in last days in vhost, or that never logged", module = ?MODULE, function = delete_old_users_vhost, args = [{host, binary}, {days, integer}], - result = {res, restuple}}, - + args_example = [<<"myserver.com">>, 30], + args_desc = ["Server name", + "Last login age in days of accounts that should be removed"], + result = {res, restuple}, + result_example = {ok, <<"Deleted 2 users: [\"oldman@myserver.com\", \"test@myserver.com\"]">>}, + result_desc = "Result tuple"}, #ejabberd_commands{name = check_account, tags = [accounts], desc = "Check if an account exists or not", module = ejabberd_auth, function = is_user_exists, args = [{user, binary}, {host, binary}], - result = {res, rescode}}, + args_example = [<<"peter">>, <<"myserver.com">>], + args_desc = ["User name to check", "Server to check"], + result = {res, rescode}, + result_example = ok, + result_desc = "Status code: 0 on success, 1 otherwise"}, #ejabberd_commands{name = check_password, tags = [accounts], desc = "Check if a password is correct", module = ejabberd_auth, function = check_password, args = [{user, binary}, {host, binary}, {password, binary}], - result = {res, rescode}}, + args_example = [<<"peter">>, <<"myserver.com">>, <<"secret">>], + args_desc = ["User name to check", "Server to check", "Password to check"], + result = {res, rescode}, + result_example = ok, + result_desc = "Status code: 0 on success, 1 otherwise"}, #ejabberd_commands{name = check_password_hash, tags = [accounts], desc = "Check if the password hash is correct", longdesc = "Allowed hash methods: md5, sha.", module = ?MODULE, function = check_password_hash, - args = [{user, binary}, {host, binary}, {passwordhash, binary}, {hashmethod, binary}], - result = {res, rescode}}, + args = [{user, binary}, {host, binary}, {passwordhash, string}, + {hashmethod, string}], + args_example = [<<"peter">>, <<"myserver.com">>, + <<"5ebe2294ecd0e0f08eab7690d2a6ee69">>, <<"md5">>], + args_desc = ["User name to check", "Server to check", + "Password's hash value", "Name of hash method"], + result = {res, rescode}, + result_example = ok, + result_desc = "Status code: 0 on success, 1 otherwise"}, #ejabberd_commands{name = change_password, tags = [accounts], desc = "Change the password of an account", module = ?MODULE, function = set_password, args = [{user, binary}, {host, binary}, {newpass, binary}], - result = {res, rescode}}, + args_example = [<<"peter">>, <<"myserver.com">>, <<"blank">>], + args_desc = ["User name", "Server name", + "New password for user"], + result = {res, rescode}, + result_example = ok, + result_desc = "Status code: 0 on success, 1 otherwise"}, #ejabberd_commands{name = ban_account, tags = [accounts], desc = "Ban an account: kick sessions and set random password", module = ?MODULE, function = ban_account, args = [{user, binary}, {host, binary}, {reason, binary}], - result = {res, rescode}}, - + args_example = [<<"attacker">>, <<"myserver.com">>, <<"Spaming other users">>], + args_desc = ["User name to ban", "Server name", + "Reason for banning user"], + result = {res, rescode}, + result_example = ok, + result_desc = "Status code: 0 on success, 1 otherwise"}, #ejabberd_commands{name = num_resources, tags = [session], desc = "Get the number of resources of a user", module = ?MODULE, function = num_resources, args = [{user, binary}, {host, binary}], - result = {resources, integer}}, + args_example = [<<"peter">>, <<"myserver.com">>], + args_desc = ["User name", "Server name"], + result = {resources, integer}, + result_example = 5, + result_desc = "Number of active resources for a user"}, #ejabberd_commands{name = resource_num, tags = [session], desc = "Resource string of a session number", module = ?MODULE, function = resource_num, args = [{user, binary}, {host, binary}, {num, integer}], - result = {resource, string}}, + args_example = [<<"peter">>, <<"myserver.com">>, 2], + args_desc = ["User name", "Server name", "ID of resource to return"], + result = {resource, string}, + result_example = <<"Psi">>, + result_desc = "Name of user resource"}, #ejabberd_commands{name = kick_session, tags = [session], desc = "Kick a user session", module = ?MODULE, function = kick_session, args = [{user, binary}, {host, binary}, {resource, binary}, {reason, binary}], - result = {res, rescode}}, + args_example = [<<"peter">>, <<"myserver.com">>, <<"Psi">>, + <<"Stuck connection">>], + args_desc = ["User name", "Server name", "User's resource", + "Reason for closing session"], + result = {res, rescode}, + result_example = ok, + result_desc = "Status code: 0 on success, 1 otherwise"}, #ejabberd_commands{name = status_num_host, tags = [session, stats], desc = "Number of logged users with this status in host", + policy = admin, module = ?MODULE, function = status_num, args = [{host, binary}, {status, binary}], - result = {users, integer}}, + args_example = [<<"myserver.com">>, <<"dnd">>], + args_desc = ["Server name", "Status type to check"], + result = {users, integer}, + result_example = 23, + result_desc = "Number of connected sessions with given status type"}, #ejabberd_commands{name = status_num, tags = [session, stats], desc = "Number of logged users with this status", + policy = admin, module = ?MODULE, function = status_num, args = [{status, binary}], - result = {users, integer}}, + args_example = [<<"dnd">>], + args_desc = ["Status type to check"], + result = {users, integer}, + result_example = 23, + result_desc = "Number of connected sessions with given status type"}, #ejabberd_commands{name = status_list_host, tags = [session], desc = "List of users logged in host with their statuses", module = ?MODULE, function = status_list, @@ -275,7 +298,7 @@ commands() -> tags = [session], desc = "Get the list of established sessions in a vhost", module = ?MODULE, function = connected_users_vhost, - args = [{host, string}], + args = [{host, binary}], result = {connected_users_vhost, {list, {sessions, string}}}}, #ejabberd_commands{name = user_sessions_info, tags = [session], @@ -347,7 +370,7 @@ commands() -> desc = "Set multiple contents in a vCard subfield", longdesc = Vcard2FieldsString ++ "\n\n" ++ Vcard1FieldsString ++ "\n" ++ VcardXEP, module = ?MODULE, function = set_vcard, - args = [{user, binary}, {host, binary}, {name, binary}, {subname, binary}, {contents, {list, binary}}], + args = [{user, binary}, {host, binary}, {name, binary}, {subname, binary}, {contents, {list, {value, binary}}}], result = {res, rescode}}, #ejabberd_commands{name = add_rosteritem, tags = [roster], @@ -408,8 +431,9 @@ commands() -> }}}, #ejabberd_commands{name = get_roster, tags = [roster], desc = "Get roster of a local user", + policy = user, module = ?MODULE, function = get_roster, - args = [{user, binary}, {host, binary}], + args = [], result = {contacts, {list, {contact, {tuple, [ {jid, string}, {nick, string}, @@ -420,17 +444,17 @@ commands() -> #ejabberd_commands{name = push_roster, tags = [roster], desc = "Push template roster from file to a user", module = ?MODULE, function = push_roster, - args = [{file, string}, {user, string}, {host, string}], + args = [{file, binary}, {user, binary}, {host, binary}], result = {res, rescode}}, #ejabberd_commands{name = push_roster_all, tags = [roster], desc = "Push template roster from file to all those users", module = ?MODULE, function = push_roster_all, - args = [{file, string}], + args = [{file, binary}], result = {res, rescode}}, #ejabberd_commands{name = push_alltoall, tags = [roster], desc = "Add all the users to all the users of Host in Group", module = ?MODULE, function = push_alltoall, - args = [{host, string}, {group, string}], + args = [{host, binary}, {group, binary}], result = {res, rescode}}, #ejabberd_commands{name = get_last, tags = [last], @@ -503,6 +527,13 @@ commands() -> args = [{user, binary}, {host, binary}, {group, binary}, {grouphost, binary}], result = {res, rescode}}, + #ejabberd_commands{name = get_offline_count, + tags = [offline], + desc = "Get the number of unread offline messages", + policy = user, + module = mod_offline, function = count_offline_messages, + args = [], + result = {res, integer}}, #ejabberd_commands{name = send_message, tags = [stanza], desc = "Send a message to a local or remote bare of full JID", module = ?MODULE, function = send_message, @@ -514,6 +545,11 @@ commands() -> module = ?MODULE, function = send_stanza_c2s, args = [{user, binary}, {host, binary}, {resource, binary}, {stanza, binary}], result = {res, rescode}}, + #ejabberd_commands{name = send_stanza, tags = [stanza], + desc = "Send a stanza; provide From JID and valid To JID", + module = ?MODULE, function = send_stanza, + args = [{from, binary}, {to, binary}, {stanza, binary}], + result = {res, rescode}}, #ejabberd_commands{name = privacy_set, tags = [stanza], desc = "Send a IQ set privacy stanza for a local account", module = ?MODULE, function = privacy_set, @@ -521,12 +557,14 @@ commands() -> result = {res, rescode}}, #ejabberd_commands{name = stats, tags = [stats], - desc = "Get statistical value: registeredusers onlineusers onlineusersnode uptimeseconds", + desc = "Get statistical value: registeredusers onlineusers onlineusersnode uptimeseconds processes", + policy = admin, module = ?MODULE, function = stats, args = [{name, binary}], result = {stat, integer}}, #ejabberd_commands{name = stats_host, tags = [stats], desc = "Get statistical value for this host: registeredusers onlineusers", + policy = admin, module = ?MODULE, function = stats, args = [{name, binary}, {host, binary}], result = {stat, integer}} @@ -547,25 +585,6 @@ remove_node(Node) -> mnesia:del_table_copy(schema, list_to_atom(Node)), ok. -export2odbc(Host, Directory) -> - Tables = [ - {export_last, last}, - {export_offline, offline}, - {export_passwd, passwd}, - {export_private_storage, private_storage}, - {export_roster, roster}, - {export_vcard, vcard}, - {export_vcard_search, vcard_search}], - Export = fun({TableFun, Table}) -> - Filename = filename:join([Directory, atom_to_list(Table)++".txt"]), - io:format("Trying to export Mnesia table '~p' on Host '~s' to file '~s'~n", [Table, Host, Filename]), - Res = (catch ejd2odbc:TableFun(Host, Filename)), - io:format(" Result: ~p~n", [Res]) - end, - lists:foreach(Export, Tables), - ok. - - %%% %%% Accounts %%% @@ -581,12 +600,16 @@ set_password(User, Host, Password) -> %% Copied some code from ejabberd_commands.erl check_password_hash(User, Host, PasswordHash, HashMethod) -> AccountPass = ejabberd_auth:get_password_s(User, Host), - AccountPassHash = case HashMethod of - "md5" -> get_md5(AccountPass); - "sha" -> get_sha(AccountPass); + AccountPassHash = case {AccountPass, HashMethod} of + {A, _} when is_tuple(A) -> scrammed; + {_, "md5"} -> get_md5(AccountPass); + {_, "sha"} -> get_sha(AccountPass); _ -> undefined end, case AccountPassHash of + scrammed -> + ?ERROR_MSG("Passwords are scrammed, and check_password_hash can not work.", []), + throw(passwords_scrammed_command_cannot_work); undefined -> error; PasswordHash -> ok; _ -> error @@ -603,8 +626,7 @@ num_active_users(Host, Days) -> %% Code based on ejabberd/src/web/ejabberd_web_admin.erl list_last_activity(Host, Integral, Days) -> - {MegaSecs, Secs, _MicroSecs} = now(), - TimeStamp = MegaSecs * 1000000 + Secs, + TimeStamp = p1_time_compat:system_time(seconds), TS = TimeStamp - Days * 86400, case catch mnesia:dirty_select( last_activity, [{{last_activity, {'_', Host}, '$1', '_'}, @@ -669,8 +691,7 @@ delete_old_users(Days, Users) -> SecOlder = Days*24*60*60, %% Get current time - {MegaSecs, Secs, _MicroSecs} = now(), - TimeStamp_now = MegaSecs * 1000000 + Secs, + TimeStamp_now = p1_time_compat:system_time(seconds), %% For a user, remove if required and answer true F = fun({LUser, LServer}) -> @@ -727,28 +748,14 @@ kick_sessions(User, Server, Reason) -> fun(Resource) -> kick_this_session(User, Server, Resource, Reason) end, - get_resources(User, Server)). - -get_resources(User, Server) -> - lists:map( - fun(Session) -> - element(3, Session#session.usr) - end, - get_sessions(User, Server)). - -get_sessions(User, Server) -> - LUser = jlib:nodeprep(User), - LServer = jlib:nameprep(Server), - Sessions = mnesia:dirty_index_read(session, {LUser, LServer}, #session.us), - true = is_list(Sessions), - Sessions. + ejabberd_sm:get_user_resources(User, Server)). set_random_password(User, Server, Reason) -> NewPass = build_random_password(Reason), set_password_auth(User, Server, NewPass). build_random_password(Reason) -> - Date = jlib:timestamp_to_iso(calendar:universal_time()), + Date = jlib:timestamp_to_legacy(calendar:universal_time()), RandomString = randoms:get_string(), <<"BANNED_ACCOUNT--", Date/binary, "--", RandomString/binary, "--", Reason/binary>>. @@ -783,8 +790,8 @@ kick_session(User, Server, Resource, ReasonText) -> ok. kick_this_session(User, Server, Resource, Reason) -> - ejabberd_sm:route(jlib:make_jid(<<"">>, <<"">>, <<"">>), - jlib:make_jid(User, Server, Resource), + ejabberd_sm:route(jid:make(<<"">>, <<"">>, <<"">>), + jid:make(User, Server, Resource), {broadcast, {exit, Reason}}). status_num(Host, Status) -> @@ -840,7 +847,8 @@ connected_users_info() -> PI when is_integer(PI) -> PI; _ -> nil end, - {[U, $@, S, $/, R], atom_to_list(Conn), IPS, Port, PriorityI, NodeS, Uptime} + {binary_to_list(<<U/binary, $@, S/binary, $/, R/binary>>), + atom_to_list(Conn), IPS, Port, PriorityI, NodeS, Uptime} end, USRIs). @@ -863,8 +871,8 @@ stringize(String) -> set_presence(User, Host, Resource, Type, Show, Status, Priority) -> Pid = ejabberd_sm:get_session_pid(User, Host, Resource), - USR = jlib:jid_to_string(jlib:make_jid(User, Host, Resource)), - US = jlib:jid_to_string(jlib:make_jid(User, Host, <<>>)), + USR = jid:to_string(jid:make(User, Host, Resource)), + US = jid:to_string(jid:make(User, Host, <<>>)), Message = {route_xmlstreamelement, {xmlel, <<"presence">>, [{<<"from">>, USR}, {<<"to">>, US}, {<<"type">>, Type}], @@ -950,7 +958,7 @@ get_module_resource(Server) -> get_vcard_content(User, Server, Data) -> [{_, Module, Function, _Opts}] = ets:lookup(sm_iqtable, {?NS_VCARD, Server}), - JID = jlib:make_jid(User, Server, get_module_resource(Server)), + JID = jid:make(User, Server, get_module_resource(Server)), IQ = #iq{type = get, xmlns = ?NS_VCARD}, IQr = Module:Function(JID, JID, IQ), [A1] = IQr#iq.sub_el, @@ -958,7 +966,7 @@ get_vcard_content(User, Server, Data) -> [_|_] -> case get_vcard(Data, A1) of [false] -> throw(error_no_value_found_in_vcard); - ElemList -> ?DEBUG("ELS ~p", [ElemList]), [xml:get_tag_cdata(Elem) || Elem <- ElemList] + ElemList -> ?DEBUG("ELS ~p", [ElemList]), [fxml:get_tag_cdata(Elem) || Elem <- ElemList] end; [] -> throw(error_no_vcard_found) @@ -979,7 +987,7 @@ get_vcard([Data], A1) -> get_subtag(A1, Data). get_subtag(Xmlelement, Name) -> - [xml:get_subtag(Xmlelement, Name)]. + [fxml:get_subtag(Xmlelement, Name)]. set_vcard_content(User, Server, Data, SomeContent) -> ContentList = case SomeContent of @@ -987,7 +995,7 @@ set_vcard_content(User, Server, Data, SomeContent) -> Bin when is_binary(Bin) -> [SomeContent] end, [{_, Module, Function, _Opts}] = ets:lookup(sm_iqtable, {?NS_VCARD, Server}), - JID = jlib:make_jid(User, Server, get_module_resource(Server)), + JID = jid:make(User, Server, get_module_resource(Server)), IQ = #iq{type = get, xmlns = ?NS_VCARD}, IQr = Module:Function(JID, JID, IQ), @@ -1009,7 +1017,7 @@ set_vcard_content(User, Server, Data, SomeContent) -> take_vcard_tel(TelType, [{xmlel, <<"TEL">>, _, SubEls}=OldEl | OldEls], NewEls, Taken) -> {Taken2, NewEls2} = case lists:keymember(TelType, 2, SubEls) of - true -> {xml:get_subtag(OldEl, <<"NUMBER">>), NewEls}; + true -> {fxml:get_subtag(OldEl, <<"NUMBER">>), NewEls}; false -> {Taken, [OldEl | NewEls]} end, take_vcard_tel(TelType, OldEls, NewEls2, Taken2); @@ -1068,7 +1076,7 @@ subscribe(LU, LS, User, Server, Nick, Group, Subscription, _Xattrs) -> mod_roster:set_items( LU, LS, {xmlel, <<"query">>, - [{<<"xmlns">>, <<"jabber:iq:roster">>}], + [{<<"xmlns">>, ?NS_ROSTER}], [ItemEl]}). delete_rosteritem(LocalUser, LocalServer, User, Server) -> @@ -1085,7 +1093,7 @@ unsubscribe(LU, LS, User, Server) -> mod_roster:set_items( LU, LS, {xmlel, <<"query">>, - [{<<"xmlns">>, <<"jabber:iq:roster">>}], + [{<<"xmlns">>, ?NS_ROSTER}], [ItemEl]}). %% ----------------------------- @@ -1101,7 +1109,7 @@ get_roster(User, Server) -> make_roster_xmlrpc(Roster) -> lists:foldl( fun(Item, Res) -> - JIDS = jlib:jid_to_string(Item#roster.jid), + JIDS = jid:to_string(Item#roster.jid), Nick = Item#roster.name, Subs = atom_to_list(Item#roster.subscription), Ask = atom_to_list(Item#roster.ask), @@ -1167,23 +1175,23 @@ push_roster_item(LU, LS, U, S, Action) -> end, ejabberd_sm:get_user_resources(LU, LS)). push_roster_item(LU, LS, R, U, S, Action) -> - LJID = jlib:make_jid(LU, LS, R), + LJID = jid:make(LU, LS, R), BroadcastEl = build_broadcast(U, S, Action), ejabberd_sm:route(LJID, LJID, BroadcastEl), Item = build_roster_item(U, S, Action), ResIQ = build_iq_roster_push(Item), - ejabberd_router:route(LJID, LJID, ResIQ). + ejabberd_router:route(jid:remove_resource(LJID), LJID, ResIQ). build_roster_item(U, S, {add, Nick, Subs, Group}) -> {xmlel, <<"item">>, - [{<<"jid">>, jlib:jid_to_string(jlib:make_jid(U, S, <<>>))}, + [{<<"jid">>, jid:to_string(jid:make(U, S, <<>>))}, {<<"name">>, Nick}, {<<"subscription">>, Subs}], [{xmlel, <<"group">>, [], [{xmlcdata, Group}]}] }; build_roster_item(U, S, remove) -> {xmlel, <<"item">>, - [{<<"jid">>, jlib:jid_to_string(jlib:make_jid(U, S, <<>>))}, + [{<<"jid">>, jid:to_string(jid:make(U, S, <<>>))}, {<<"subscription">>, <<"remove">>}], [] }. @@ -1242,20 +1250,20 @@ get_last(User, Server) -> %% <aa xmlns='bb'>Cluth</aa> private_get(Username, Host, Element, Ns) -> - From = jlib:make_jid(Username, Host, <<>>), - To = jlib:make_jid(Username, Host, <<>>), + From = jid:make(Username, Host, <<>>), + To = jid:make(Username, Host, <<>>), IQ = {iq, <<>>, get, ?NS_PRIVATE, <<>>, {xmlel, <<"query">>, [{<<"xmlns">>,?NS_PRIVATE}], [{xmlel, Element, [{<<"xmlns">>, Ns}], []}]}}, ResIq = mod_private:process_sm_iq(From, To, IQ), [{xmlel, <<"query">>, - [{<<"xmlns">>, <<"jabber:iq:private">>}], + [{<<"xmlns">>, ?NS_PRIVATE}], [SubEl]}] = ResIq#iq.sub_el, - binary_to_list(xml:element_to_binary(SubEl)). + binary_to_list(fxml:element_to_binary(SubEl)). private_set(Username, Host, ElementString) -> - case xml_stream:parse_element(ElementString) of + case fxml_stream:parse_element(ElementString) of {error, Error} -> io:format("Error found parsing the element:~n ~p~nError: ~p~n", [ElementString, Error]), @@ -1265,8 +1273,8 @@ private_set(Username, Host, ElementString) -> end. private_set2(Username, Host, Xml) -> - From = jlib:make_jid(Username, Host, <<>>), - To = jlib:make_jid(Username, Host, <<>>), + From = jid:make(Username, Host, <<>>), + To = jid:make(Username, Host, <<>>), IQ = {iq, <<>>, set, ?NS_PRIVATE, <<>>, {xmlel, <<"query">>, [{<<"xmlns">>, ?NS_PRIVATE}], @@ -1310,7 +1318,7 @@ btl(B) -> binary_to_list(B). srg_get_members(Group, Host) -> Members = mod_shared_roster:get_group_explicit_users(Host,Group), - [jlib:jid_to_string(jlib:make_jid(MUser, MServer, <<>>)) + [jid:to_string(jid:make(MUser, MServer, <<>>)) || {MUser, MServer} <- Members]. srg_user_add(User, Host, Group, GroupHost) -> @@ -1341,8 +1349,8 @@ send_message(Type, From, To, Subject, Body) -> %% If the user is local and is online in several resources, %% the packet is sent to all its resources. send_packet_all_resources(FromJIDString, ToJIDString, Packet) -> - FromJID = jlib:string_to_jid(FromJIDString), - ToJID = jlib:string_to_jid(ToJIDString), + FromJID = jid:from_string(FromJIDString), + ToJID = jid:from_string(ToJIDString), ToUser = ToJID#jid.user, ToServer = ToJID#jid.server, case ToJID#jid.resource of @@ -1366,7 +1374,7 @@ send_packet_all_resources(FromJID, ToUser, ToServer, Packet) -> end. send_packet_all_resources(FromJID, ToU, ToS, ToR, Packet) -> - ToJID = jlib:make_jid(ToU, ToS, ToR), + ToJID = jid:make(ToU, ToS, ToR), ejabberd_router:route(FromJID, ToJID, Packet). build_packet(Type, Subject, Body) -> @@ -1378,15 +1386,33 @@ build_packet(Type, Subject, Body) -> [{xmlel, <<"body">>, [], [{xmlcdata, Body}]} | Tail] }. +send_stanza(FromString, ToString, Stanza) -> + case fxml_stream:parse_element(Stanza) of + {error, Error} -> + {error, Error}; + XmlEl -> + #xmlel{attrs = Attrs} = XmlEl, + From = jid:from_string(proplists:get_value(<<"from">>, Attrs, FromString)), + To = jid:from_string(proplists:get_value(<<"to">>, Attrs, ToString)), + ejabberd_router:route(From, To, XmlEl) + end. + send_stanza_c2s(Username, Host, Resource, Stanza) -> - C2sPid = ejabberd_sm:get_session_pid(Username, Host, Resource), - XmlEl = xml_stream:parse_element(Stanza), - p1_fsm:send_event(C2sPid, {xmlstreamelement, XmlEl}). + case {fxml_stream:parse_element(Stanza), + ejabberd_sm:get_session_pid(Username, Host, Resource)} + of + {{error, Error}, _} -> + {error, Error}; + {_, none} -> + {error, no_session}; + {XmlEl, C2sPid} -> + p1_fsm:send_event(C2sPid, {xmlstreamelement, XmlEl}) + end. privacy_set(Username, Host, QueryS) -> - From = jlib:make_jid(Username, Host, <<"">>), - To = jlib:make_jid(<<"">>, Host, <<"">>), - QueryEl = xml_stream:parse_element(QueryS), + From = jid:make(Username, Host, <<"">>), + To = jid:make(<<"">>, Host, <<"">>), + QueryEl = fxml_stream:parse_element(QueryS), StanzaEl = {xmlel, <<"iq">>, [{<<"type">>, <<"set">>}], [QueryEl]}, IQ = jlib:iq_query_info(StanzaEl), ejabberd_hooks:run_fold( @@ -1404,6 +1430,7 @@ privacy_set(Username, Host, QueryS) -> stats(Name) -> case Name of <<"uptimeseconds">> -> trunc(element(1, erlang:statistics(wall_clock))/1000); + <<"processes">> -> length(erlang:processes()); <<"registeredusers">> -> lists:foldl(fun(Host, Sum) -> ejabberd_auth:get_vh_registered_users_number(Host) + Sum end, 0, ?MYHOSTS); <<"onlineusersnode">> -> length(ejabberd_sm:dirty_get_my_sessions_list()); <<"onlineusers">> -> length(ejabberd_sm:dirty_get_sessions_list()) @@ -1526,7 +1553,7 @@ decide_rip_jid({UName, UServer, _UResource}, Match_list) -> decide_rip_jid({UName, UServer}, Match_list) -> lists:any( fun(Match_string) -> - MJID = jlib:string_to_jid(list_to_binary(Match_string)), + MJID = jid:from_string(list_to_binary(Match_string)), MName = MJID#jid.luser, MServer = MJID#jid.lserver, Is_server = is_glob_match(UServer, MServer), @@ -1559,3 +1586,6 @@ is_glob_match(String, <<"!", Glob/binary>>) -> not is_regexp_match(String, ejabberd_regexp:sh_to_awk(Glob)); is_glob_match(String, Glob) -> is_regexp_match(String, ejabberd_regexp:sh_to_awk(Glob)). + +mod_opt_type(module_resource) -> fun (A) -> A end; +mod_opt_type(_) -> [module_resource]. |