287
295
+ {uptime, integer}
298
+ #ejabberd_commands{name = connected_users_vhost,
300
+ desc = "Get the list of established sessions in a vhost",
301
+ module = ?MODULE, function = connected_users_vhost,
302
+ args = [{host, string}],
303
+ result = {connected_users_vhost, {list, {sessions, string}}}},
304
+ #ejabberd_commands{name = user_sessions_info,
306
+ desc = "Get information about all sessions of a user",
307
+ module = ?MODULE, function = user_sessions_info,
308
+ args = [{user, string}, {host, string}],
309
+ result = {sessions_info,
312
+ [{connection, string},
315
+ {priority, integer},
322
+ #ejabberd_commands{name = set_presence,
324
+ desc = "Set presence of a session",
325
+ module = ?MODULE, function = set_presence,
326
+ args = [{user, string}, {host, string},
327
+ {resource, string}, {type, string},
328
+ {show, string}, {status, string},
329
+ {priority, string}],
330
+ result = {res, rescode}},
291
332
+ #ejabberd_commands{name = set_nickname, tags = [vcard],
292
333
+ desc = "Set nickname in a user's vcard",
394
435
+ args = [{host, string}, {group, string}],
395
436
+ result = {res, rescode}},
438
+ #ejabberd_commands{name = private_get, tags = [private],
439
+ desc = "Get some information from a user private storage",
440
+ module = ?MODULE, function = private_get,
441
+ args = [{user, string}, {host, string}, {element, string}, {ns, string}],
442
+ result = {res, string}},
443
+ #ejabberd_commands{name = private_set, tags = [private],
444
+ desc = "Set to the user private storage",
445
+ module = ?MODULE, function = private_set,
446
+ args = [{user, string}, {host, string}, {element, string}],
447
+ result = {res, rescode}},
397
449
+ #ejabberd_commands{name = srg_create, tags = [shared_roster_group],
398
450
+ desc = "Create a Shared Roster Group",
399
451
+ longdesc = "If you want to specify several group "
449
501
+ args = [{from, string}, {to, string},
450
502
+ {subject, string}, {body, string}],
451
503
+ result = {res, rescode}},
504
+ #ejabberd_commands{name = send_stanza_c2s, tags = [stanza],
505
+ desc = "Send a stanza as if sent from a c2s session",
506
+ module = ?MODULE, function = send_stanza_c2s,
507
+ args = [{user, string}, {host, string}, {resource, string}, {stanza, string}],
508
+ result = {res, rescode}},
509
+ #ejabberd_commands{name = privacy_set, tags = [stanza],
510
+ desc = "Send a IQ set privacy stanza for a local account",
511
+ module = ?MODULE, function = privacy_set,
512
+ args = [{user, string}, {host, string}, {xmlquery, string}],
513
+ result = {res, rescode}},
453
515
+ #ejabberd_commands{name = stats, tags = [stats],
454
516
+ desc = "Get statistical value: registeredusers onlineusers onlineusersnode uptimeseconds",
801
867
+ %% Replace newline characters with other code
802
868
+ element(2, regexp:gsub(String, "\n", "\\n")).
870
+set_presence(User, Host, Resource, Type, Show, Status, Priority) ->
871
+ Pid = ejabberd_sm:get_session_pid(User, Host, Resource),
872
+ USR = User ++ "@" ++ Host ++ "/" ++ Resource,
873
+ US = User ++ "@" ++ Host,
874
+ Message = {route_xmlstreamelement,
875
+ {xmlelement, "presence",
876
+ [{"from", USR}, {"to", US}, {"type", Type}],
877
+ [{xmlelement, "show", [], [{xmlcdata, Show}]},
878
+ {xmlelement, "status", [], [{xmlcdata, Status}]},
879
+ {xmlelement, "priority", [], [{xmlcdata, Priority}]}]}},
882
+user_sessions_info(User, Host) ->
883
+ CurrentSec = calendar:datetime_to_gregorian_seconds({date(), time()}),
885
+ Sessions = case catch mnesia:dirty_index_read(session, US, #session.us) of
886
+ {'EXIT', _Reason} ->
893
+ {_U, _S, Resource} = Session#session.usr,
894
+ {Now, Pid} = Session#session.sid,
895
+ Info = Session#session.info,
896
+ Priority = Session#session.priority,
897
+ Conn = proplists:get_value(conn, Info),
898
+ {Ip, Port} = proplists:get_value(ip, Info),
899
+ IPS = inet_parse:ntoa(Ip),
900
+ NodeS = atom_to_list(node(Pid)),
901
+ Uptime = CurrentSec - calendar:datetime_to_gregorian_seconds(
902
+ calendar:now_to_local_time(Now)),
903
+ {Conn, IPS, Port, Priority, NodeS, Uptime, Resource}
960
1063
+%% -----------------------------
962
1065
+get_roster(User, Server) ->
963
+ {ok, Roster} = get_roster2(User, Server),
964
+ make_roster_xmlrpc(Roster).
966
+get_roster2(User, Server) ->
967
+ Modules = gen_mod:loaded_modules(Server),
968
+ Roster = case lists:member(mod_roster, Modules) of
970
+ mod_roster:get_user_roster([], {User, Server});
972
+ case lists:member(mod_roster_odbc, Modules) of
974
+ mod_roster_odbc:get_user_roster([], {User, Server});
976
+ {error, "Neither mod_roster or mod_roster_odbc are enabled"}
1066
+ Items = ejabberd_hooks:run_fold(roster_get, Server, [], [{User, Server}]),
1067
+ make_roster_xmlrpc(Items).
981
1069
+%% Note: if a contact is in several groups, the contact is returned
982
1070
+%% several times, each one in a different group.
1048
1136
+ end, ejabberd_sm:get_user_resources(LU, LS)).
1050
1138
+push_roster_item(LU, LS, R, U, S, Action) ->
1139
+ LJID = jlib:make_jid(LU, LS, R),
1140
+ BroadcastEl = build_broadcast(U, S, Action),
1141
+ ejabberd_router:route(LJID, LJID, BroadcastEl),
1051
1142
+ Item = build_roster_item(U, S, Action),
1052
1143
+ ResIQ = build_iq_roster_push(Item),
1053
+ LJID = jlib:make_jid(LU, LS, R),
1054
1144
+ ejabberd_router:route(LJID, LJID, ResIQ).
1056
1146
+build_roster_item(U, S, {add, Nick, Subs, Group}) ->
1170
+build_broadcast(U, S, {add, _Nick, Subs, _Group}) ->
1171
+ build_broadcast(U, S, list_to_atom(Subs));
1172
+build_broadcast(U, S, remove) ->
1173
+ build_broadcast(U, S, none);
1174
+%% @spec (U::string(), S::string(), Subs::atom()) -> any()
1175
+%% Subs = both | from | to | none
1176
+build_broadcast(U, S, SubsAtom) when is_atom(SubsAtom) ->
1177
+ {xmlelement, "broadcast", [],
1178
+ [{item, {U, S, ""}, SubsAtom}]
1182
+%%% Private Storage
1186
+%% $ ejabberdctl private_set badlop localhost "\<aa\ xmlns=\'bb\'\>Cluth\</aa\>"
1187
+%% $ ejabberdctl private_get badlop localhost aa bb
1188
+%% <aa xmlns='bb'>Cluth</aa>
1190
+private_get(Username, Host, Element, Ns) ->
1191
+ From = jlib:make_jid(Username, Host, ""),
1192
+ To = jlib:make_jid(Username, Host, ""),
1193
+ IQ = {iq, "", get, ?NS_PRIVATE, "",
1194
+ {xmlelement,"query",
1195
+ [{"xmlns",?NS_PRIVATE}],
1196
+ [{xmlelement, Element, [{"xmlns", Ns}], []}]}},
1197
+ ResIq = mod_private:process_sm_iq(From, To, IQ),
1198
+ [{xmlelement,"query",
1199
+ [{"xmlns","jabber:iq:private"}],
1200
+ [SubEl]}] = ResIq#iq.sub_el,
1201
+ xml:element_to_string(SubEl).
1203
+private_set(Username, Host, ElementString) ->
1204
+ case xml_stream:parse_element(ElementString) of
1206
+ io:format("Error found parsing the element:~n ~p~nError: ~p~n",
1207
+ [ElementString, Error]),
1210
+ private_set2(Username, Host, Xml)
1213
+private_set2(Username, Host, Xml) ->
1214
+ From = jlib:make_jid(Username, Host, ""),
1215
+ To = jlib:make_jid(Username, Host, ""),
1216
+ IQ = {iq, "", set, ?NS_PRIVATE, "",
1217
+ {xmlelement,"query",
1218
+ [{"xmlns",?NS_PRIVATE}],
1220
+ mod_private:process_sm_iq(From, To, IQ),
1082
1224
+%%% Shared Roster Groups
1176
1318
+build_packet(message_chat, [Body]) ->
1177
1319
+ {xmlelement, "message",
1178
+ [{"type", "chat"}],
1320
+ [{"type", "chat"}, {"id", randoms:get_string()}],
1179
1321
+ [{xmlelement, "body", [], [{xmlcdata, Body}]}]
1181
1323
+build_packet(message_headline, [Subject, Body]) ->
1182
1324
+ {xmlelement, "message",
1183
+ [{"type", "headline"}],
1325
+ [{"type", "headline"}, {"id", randoms:get_string()}],
1184
1326
+ [{xmlelement, "subject", [], [{xmlcdata, Subject}]},
1185
1327
+ {xmlelement, "body", [], [{xmlcdata, Body}]}
1331
+send_stanza_c2s(Username, Host, Resource, Stanza) ->
1332
+ C2sPid = ejabberd_sm:get_session_pid(Username, Host, Resource),
1333
+ XmlEl = xml_stream:parse_element(Stanza),
1334
+ p1_fsm:send_event(C2sPid, {xmlstreamelement, XmlEl}).
1336
+privacy_set(Username, Host, QueryS) ->
1337
+ From = jlib:string_to_jid(Username ++ "@" ++ Host),
1338
+ To = jlib:string_to_jid(Host),
1339
+ QueryEl = xml_stream:parse_element(QueryS),
1340
+ StanzaEl = {xmlelement, "iq", [{"type", "set"}], [QueryEl]},
1341
+ IQ = jlib:iq_query_info(StanzaEl),
1342
+ {result, []} = ejabberd_hooks:run_fold(
1345
+ {error, ?ERR_FEATURE_NOT_IMPLEMENTED},