~ubuntu-branches/ubuntu/trusty/ejabberd/trusty-proposed

« back to all changes in this revision

Viewing changes to debian/patches/mod_admin_extra.patch

  • Committer: Bazaar Package Importer
  • Author(s): Konstantin Khomoutov, Konstantin Khomoutov, Gerfried Fuchs
  • Date: 2010-04-06 13:00:03 UTC
  • mfrom: (1.1.14 upstream) (13.1.1 sid)
  • Revision ID: james.westby@ubuntu.com-20100406130003-ub626hx26kgazp79
Tags: 2.1.3-1
[ Konstantin Khomoutov ]
* New upstream release.
* Remove obsolete c2s-p1-fsm.patch
* Remove obsolete ejabberdctl-help-dashes.patch
* Update mod_admin_extra to revision 1078
* Refresh shared_roster_recent.patch
* Refresh shared_roster_online.patch
* Clarify how to do mixed IPv4/IPv6 setup of ejabberd listeners
  as suggested by Marc Dequènes in the discussion of #573801.

[ Gerfried Fuchs ]
* Remove Torsten Werner from maintainer field on his own wish - thanks for
  your work so far! (closes: #578722)
* Promote Konstantin to Maintainer to best fit reality. Enjoy. :)

Show diffs side-by-side

added added

removed removed

Lines of Context:
4
4
 
5
5
The code is taken from the ProcessOne repository:
6
6
https://forge.process-one.net/browse/ejabberd-modules/mod_admin_extra
7
 
(trunk, revision 1049).
 
7
(trunk, revision 1078).
8
8
 
9
9
Index: pkg-ejabberd/src/ejabberd.app
10
10
===================================================================
11
 
--- pkg-ejabberd.orig/src/ejabberd.app  2010-01-13 04:49:33.000000000 +0300
12
 
+++ pkg-ejabberd/src/ejabberd.app       2010-01-13 04:57:23.000000000 +0300
 
11
--- pkg-ejabberd.orig/src/ejabberd.app  2010-05-04 03:18:51.000000000 +0400
 
12
+++ pkg-ejabberd/src/ejabberd.app       2010-05-04 04:01:32.000000000 +0400
13
13
@@ -104,6 +104,7 @@
14
14
             mod_vcard_ldap,
15
15
             mod_vcard_odbc,
21
21
Index: pkg-ejabberd/src/mod_admin_extra.erl
22
22
===================================================================
23
23
--- /dev/null   1970-01-01 00:00:00.000000000 +0000
24
 
+++ pkg-ejabberd/src/mod_admin_extra.erl        2010-01-13 04:58:00.000000000 +0300
25
 
@@ -0,0 +1,1329 @@
 
24
+++ pkg-ejabberd/src/mod_admin_extra.erl        2010-05-04 04:01:41.000000000 +0400
 
25
@@ -0,0 +1,1490 @@
26
26
+%%%-------------------------------------------------------------------
27
27
+%%% File    : mod_admin_extra.erl
28
28
+%%% Author  : Badlop <badlop@process-one.net>
75
75
+        status_num/2, status_num/1,
76
76
+        status_list/2, status_list/1,
77
77
+        connected_users_info/0,
 
78
+        connected_users_vhost/1,
 
79
+        set_presence/7,
 
80
+        user_sessions_info/2,
78
81
+        %% Vcard
79
82
+        set_nickname/3,
80
83
+        get_vcard/3,
89
92
+        push_roster/3,
90
93
+        push_roster_all/1,
91
94
+        push_alltoall/2,
 
95
+        %% mod_private
 
96
+        private_get/4,
 
97
+        private_set/3,
92
98
+        %% mod_shared_roster
93
99
+        srg_create/5,
94
100
+        srg_delete/2,
100
106
+        %% Stanza
101
107
+        send_message_headline/4,
102
108
+        send_message_chat/3,
 
109
+        send_stanza_c2s/4,
 
110
+        privacy_set/3,
103
111
+        %% Stats
104
112
+        stats/1, stats/2
105
113
+       ]).
287
295
+                                               {uptime, integer}
288
296
+                                              ]}}
289
297
+                                 }}},
 
298
+     #ejabberd_commands{name = connected_users_vhost,
 
299
+                       tags = [session],
 
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,
 
305
+                       tags = [session],
 
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,
 
310
+                                 {list,
 
311
+                                  {session, {tuple,
 
312
+                                             [{connection, string},
 
313
+                                              {ip, string},
 
314
+                                              {port, integer},
 
315
+                                              {priority, integer},
 
316
+                                              {node, string},
 
317
+                                              {uptime, integer},
 
318
+                                              {resource, string}
 
319
+                                             ]}}
 
320
+                                 }}},
 
321
+
 
322
+     #ejabberd_commands{name = set_presence,
 
323
+                       tags = [session],
 
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}},
290
331
+
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}},
396
437
+
 
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}},
 
448
+
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}},
452
514
+
453
515
+     #ejabberd_commands{name = stats, tags = [stats],
454
516
+                       desc = "Get statistical value: registeredusers onlineusers onlineusersnode uptimeseconds",
788
850
+      end,
789
851
+      USRIs).
790
852
+
 
853
+connected_users_vhost(Host) ->
 
854
+    USRs = ejabberd_sm:get_vh_session_list(Host),
 
855
+    [ [U, $@, S, $/, R] || {U, S, R} <- USRs].
 
856
+
791
857
+%% Code copied from ejabberd_sm.erl and customized
792
858
+dirty_get_sessions_list2() ->
793
859
+    mnesia:dirty_select(
801
867
+    %% Replace newline characters with other code
802
868
+    element(2, regexp:gsub(String, "\n", "\\n")).
803
869
+
 
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}]}]}},
 
880
+    Pid ! Message.
 
881
+
 
882
+user_sessions_info(User, Host) ->
 
883
+    CurrentSec = calendar:datetime_to_gregorian_seconds({date(), time()}),
 
884
+    US = {User, Host},
 
885
+    Sessions = case catch mnesia:dirty_index_read(session, US, #session.us) of
 
886
+                  {'EXIT', _Reason} ->
 
887
+                      [];
 
888
+                  Ss ->
 
889
+                      Ss
 
890
+              end,
 
891
+    lists:map(
 
892
+      fun(Session) ->
 
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}
 
904
+      end,
 
905
+      Sessions).
 
906
+
804
907
+
805
908
+%%%
806
909
+%%% Vcard
960
1063
+%% -----------------------------
961
1064
+
962
1065
+get_roster(User, Server) ->
963
 
+    {ok, Roster} = get_roster2(User, Server),
964
 
+    make_roster_xmlrpc(Roster).
965
 
+
966
 
+get_roster2(User, Server) ->
967
 
+    Modules = gen_mod:loaded_modules(Server),
968
 
+    Roster = case lists:member(mod_roster, Modules) of
969
 
+                true ->
970
 
+                    mod_roster:get_user_roster([], {User, Server});
971
 
+                false ->
972
 
+                    case lists:member(mod_roster_odbc, Modules) of
973
 
+                        true ->
974
 
+                            mod_roster_odbc:get_user_roster([], {User, Server});
975
 
+                        false ->
976
 
+                            {error, "Neither mod_roster or mod_roster_odbc are enabled"}
977
 
+                    end
978
 
+            end,
979
 
+    {ok, Roster}.
 
1066
+    Items = ejabberd_hooks:run_fold(roster_get, Server, [], [{User, Server}]),
 
1067
+    make_roster_xmlrpc(Items).
980
1068
+
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)).
1049
1137
+
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).
1055
1145
+
1056
1146
+build_roster_item(U, S, {add, Nick, Subs, Group}) ->
1077
1167
+     ]
1078
1168
+    }.
1079
1169
+
 
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}]
 
1179
+    }.
 
1180
+
 
1181
+%%%
 
1182
+%%% Private Storage
 
1183
+%%%
 
1184
+
 
1185
+%% Example usage:
 
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>
 
1189
+
 
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).
 
1202
+
 
1203
+private_set(Username, Host, ElementString) ->
 
1204
+    case xml_stream:parse_element(ElementString) of
 
1205
+       {error, Error} ->
 
1206
+           io:format("Error found parsing the element:~n  ~p~nError: ~p~n",
 
1207
+                     [ElementString, Error]),
 
1208
+           error;
 
1209
+       Xml ->
 
1210
+           private_set2(Username, Host, Xml)
 
1211
+    end.
 
1212
+
 
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}],
 
1219
+          [Xml]}},
 
1220
+    mod_private:process_sm_iq(From, To, IQ),
 
1221
+    ok.
1080
1222
+
1081
1223
+%%%
1082
1224
+%%% Shared Roster Groups
1175
1317
+
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}]}]
1180
1322
+    };
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}]}
1186
1328
+     ]
1187
1329
+    }.
1188
1330
+
 
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}).
 
1335
+
 
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(
 
1343
+                    privacy_iq_set,
 
1344
+                    "localhost",
 
1345
+                    {error, ?ERR_FEATURE_NOT_IMPLEMENTED},
 
1346
+                    [From, To, IQ]
 
1347
+                   ),
 
1348
+    ok.
 
1349
+
1189
1350
+%%%
1190
1351
+%%% Stats
1191
1352
+%%%