Mercurial > prosody-hg
comparison plugins/mod_disco.lua @ 5627:0439d1349dc1
mod_disco: Emit events for disco requests, which contain a node, on user accounts
| author | Florian Zeitz <florob@babelmonkeys.de> |
|---|---|
| date | Fri, 17 May 2013 18:35:50 +0200 |
| parents | c0c060e450be |
| children | 832ea1e9ac9e |
comparison
equal
deleted
inserted
replaced
| 5626:8416d4619d80 | 5627:0439d1349dc1 |
|---|---|
| 131 -- Handle disco requests to user accounts | 131 -- Handle disco requests to user accounts |
| 132 module:hook("iq/bare/http://jabber.org/protocol/disco#info:query", function(event) | 132 module:hook("iq/bare/http://jabber.org/protocol/disco#info:query", function(event) |
| 133 local origin, stanza = event.origin, event.stanza; | 133 local origin, stanza = event.origin, event.stanza; |
| 134 if stanza.attr.type ~= "get" then return; end | 134 if stanza.attr.type ~= "get" then return; end |
| 135 local node = stanza.tags[1].attr.node; | 135 local node = stanza.tags[1].attr.node; |
| 136 if node and node ~= "" then return; end -- TODO fire event? | |
| 137 local username = jid_split(stanza.attr.to) or origin.username; | 136 local username = jid_split(stanza.attr.to) or origin.username; |
| 138 if not stanza.attr.to or is_contact_subscribed(username, module.host, jid_bare(stanza.attr.from)) then | 137 if not stanza.attr.to or is_contact_subscribed(username, module.host, jid_bare(stanza.attr.from)) then |
| 138 if node and node ~= "" then | |
| 139 local reply = st.reply(stanza):tag('query', {xmlns='http://jabber.org/protocol/disco#info', node=node}); | |
| 140 if not reply.attr.from then reply.attr.from = origin.username.."@"..origin.host; end -- COMPAT To satisfy Psi when querying own account | |
| 141 local event = { origin = origin, stanza = stanza, reply = reply, node = node, exists = false} | |
| 142 module:fire_event("account-disco-info-node", event); | |
| 143 if event.exists then | |
| 144 origin.send(reply); | |
| 145 else | |
| 146 origin.send(st.error_reply(stanza, "cancel", "item-not-found", "Node does not exist")); | |
| 147 end | |
| 148 return true; | |
| 149 end | |
| 139 local reply = st.reply(stanza):tag('query', {xmlns='http://jabber.org/protocol/disco#info'}); | 150 local reply = st.reply(stanza):tag('query', {xmlns='http://jabber.org/protocol/disco#info'}); |
| 140 if not reply.attr.from then reply.attr.from = origin.username.."@"..origin.host; end -- COMPAT To satisfy Psi when querying own account | 151 if not reply.attr.from then reply.attr.from = origin.username.."@"..origin.host; end -- COMPAT To satisfy Psi when querying own account |
| 141 module:fire_event("account-disco-info", { origin = origin, stanza = reply }); | 152 module:fire_event("account-disco-info", { origin = origin, reply = reply }); |
| 142 origin.send(reply); | 153 origin.send(reply); |
| 143 return true; | 154 return true; |
| 144 end | 155 end |
| 145 end); | 156 end); |
| 146 module:hook("iq/bare/http://jabber.org/protocol/disco#items:query", function(event) | 157 module:hook("iq/bare/http://jabber.org/protocol/disco#items:query", function(event) |
| 147 local origin, stanza = event.origin, event.stanza; | 158 local origin, stanza = event.origin, event.stanza; |
| 148 if stanza.attr.type ~= "get" then return; end | 159 if stanza.attr.type ~= "get" then return; end |
| 149 local node = stanza.tags[1].attr.node; | 160 local node = stanza.tags[1].attr.node; |
| 150 if node and node ~= "" then return; end -- TODO fire event? | |
| 151 local username = jid_split(stanza.attr.to) or origin.username; | 161 local username = jid_split(stanza.attr.to) or origin.username; |
| 152 if not stanza.attr.to or is_contact_subscribed(username, module.host, jid_bare(stanza.attr.from)) then | 162 if not stanza.attr.to or is_contact_subscribed(username, module.host, jid_bare(stanza.attr.from)) then |
| 163 if node and node ~= "" then | |
| 164 local reply = st.reply(stanza):tag('query', {xmlns='http://jabber.org/protocol/disco#items', node=node}); | |
| 165 if not reply.attr.from then reply.attr.from = origin.username.."@"..origin.host; end -- COMPAT To satisfy Psi when querying own account | |
| 166 local event = { origin = origin, stanza = stanza, reply = reply, node = node, exists = false} | |
| 167 module:fire_event("account-disco-items-node", event); | |
| 168 if event.exists then | |
| 169 origin.send(reply); | |
| 170 else | |
| 171 origin.send(st.error_reply(stanza, "cancel", "item-not-found", "Node does not exist")); | |
| 172 end | |
| 173 return true; | |
| 174 end | |
| 153 local reply = st.reply(stanza):tag('query', {xmlns='http://jabber.org/protocol/disco#items'}); | 175 local reply = st.reply(stanza):tag('query', {xmlns='http://jabber.org/protocol/disco#items'}); |
| 154 if not reply.attr.from then reply.attr.from = origin.username.."@"..origin.host; end -- COMPAT To satisfy Psi when querying own account | 176 if not reply.attr.from then reply.attr.from = origin.username.."@"..origin.host; end -- COMPAT To satisfy Psi when querying own account |
| 155 module:fire_event("account-disco-items", { origin = origin, stanza = reply }); | 177 module:fire_event("account-disco-items", { origin = origin, stanza = stanza, reply = reply }); |
| 156 origin.send(reply); | 178 origin.send(reply); |
| 157 return true; | 179 return true; |
| 158 end | 180 end |
| 159 end); | 181 end); |
