11 |
11 |
12 module:add_feature(xmlns_push); |
12 module:add_feature(xmlns_push); |
13 |
13 |
14 local push_enabled = module:shared("push-enabled-users"); |
14 local push_enabled = module:shared("push-enabled-users"); |
15 |
15 |
|
16 -- http://xmpp.org/extensions/xep-0357.html#enabling |
16 module:hook("iq-set/self/"..xmlns_push..":enable", function (event) |
17 module:hook("iq-set/self/"..xmlns_push..":enable", function (event) |
17 local origin, stanza = event.origin, event.stanza; |
18 local origin, stanza = event.origin, event.stanza; |
18 local push_jid, push_node = stanza.tags[1].attr.jid, stanza.tags[1].attr.node; |
19 -- MUST contain a 'jid' attribute of the XMPP Push Service being enabled |
19 if not push_jid or not push_node then |
20 local push_jid = stanza.tags[1].attr.jid; |
20 origin.send(st.error_reply(stanza, "modify", "bad-request", "Missing jid or node")); |
21 -- SHOULD contain a 'node' attribute |
|
22 local push_node = stanza.tags[1].attr.node; |
|
23 if not push_jid then |
|
24 origin.send(st.error_reply(stanza, "modify", "bad-request", "Missing jid")); |
21 return true; |
25 return true; |
22 end |
26 end |
23 local publish_options = stanza.tags[1].tags[1]; |
27 local publish_options = stanza.tags[1].tags[1]; |
24 if publish_options and ( publish_options.name ~= "x" or publish_options.attr.xmlns ~= "jabber:x:data" ) then |
28 if publish_options and ( publish_options.name ~= "x" or publish_options.attr.xmlns ~= "jabber:x:data" ) then |
25 origin.send(st.error_reply(stanza, "modify", "bad-request", "Invalid publish options")); |
29 origin.send(st.error_reply(stanza, "modify", "bad-request", "Invalid publish options")); |
27 end |
31 end |
28 local user_push_services = push_enabled[origin.username]; |
32 local user_push_services = push_enabled[origin.username]; |
29 if not user_push_services then |
33 if not user_push_services then |
30 user_push_services = {}; |
34 user_push_services = {}; |
31 end |
35 end |
32 user_push_services[push_jid .. "<" .. push_node] = { |
36 user_push_services[push_jid .. "<" .. (push_node or "")] = { |
33 jid = push_jid; |
37 jid = push_jid; |
34 node = push_node; |
38 node = push_node; |
35 count = 0; |
39 count = 0; |
36 options = publish_options; |
40 options = publish_options; |
37 }; |
41 }; |
38 origin.send(st.reply(stanza)); |
42 origin.send(st.reply(stanza)); |
39 return true; |
43 return true; |
40 end); |
44 end); |
41 |
45 |
|
46 -- http://xmpp.org/extensions/xep-0357.html#disabling |
42 module:hook("iq-set/self/"..xmlns_push..":disable", function (event) |
47 module:hook("iq-set/self/"..xmlns_push..":disable", function (event) |
43 local origin, stanza = event.origin, event.stanza; |
48 local origin, stanza = event.origin, event.stanza; |
44 local push_jid, push_node = stanza.tags[1].attr.jid, stanza.tags[1].attr.node; |
49 local push_jid = stanza.tags[1].attr.jid; -- MUST include a 'jid' attribute |
45 if not push_jid or not push_node then |
50 local push_node = stanza.tags[1].attr.node; -- A 'node' attribute MAY be included |
46 origin.send(st.error_reply(stanza, "modify", "bad-request", "Missing jid or node")); |
51 if not push_jid then |
|
52 origin.send(st.error_reply(stanza, "modify", "bad-request", "Missing jid")); |
47 return true; |
53 return true; |
48 end |
54 end |
49 local user_push_services = push_enabled[origin.username]; |
55 local user_push_services = push_enabled[origin.username]; |
50 if user_push_services then |
56 for key, push_info in pairs(user_push_services) do |
51 user_push_services[push_jid .. "<" .. push_node] = nil; |
57 if push_info.jid == push_jid and (not push_node or push_info.node == push_node) then |
|
58 user_push_services[key] = nil; |
|
59 end |
52 end |
60 end |
53 origin.send(st.reply(stanza)); |
61 origin.send(st.reply(stanza)); |
54 return true; |
62 return true; |
55 end); |
63 end); |
56 |
64 |
60 { name = "pending-subscription-count"; type = "text-single"; }; |
68 { name = "pending-subscription-count"; type = "text-single"; }; |
61 { name = "last-message-sender"; type = "jid-single"; }; |
69 { name = "last-message-sender"; type = "jid-single"; }; |
62 { name = "last-message-body"; type = "text-single"; }; |
70 { name = "last-message-body"; type = "text-single"; }; |
63 }; |
71 }; |
64 |
72 |
|
73 -- http://xmpp.org/extensions/xep-0357.html#publishing |
65 module:hook("message/offline/handle", function(event) |
74 module:hook("message/offline/handle", function(event) |
66 local origin, stanza = event.origin, event.stanza; |
75 local origin, stanza = event.origin, event.stanza; |
67 local to = stanza.attr.to; |
76 local to = stanza.attr.to; |
68 local node = to and jid.split(to) or origin.username; |
77 local node = to and jid.split(to) or origin.username; |
69 local user_push_services = push_enabled[node]; |
78 local user_push_services = push_enabled[node]; |