Merge 0.6.2/waqas with 0.6.2/MattJ
[prosody.git] / plugins / mod_iq.lua
index 10960684218910bf64d0207faf38f036ce5684bd..5be045335c478e256913228207d31fc76b6f3719 100644 (file)
@@ -1,3 +1,18 @@
+-- Prosody IM
+-- Copyright (C) 2008-2009 Matthew Wild
+-- Copyright (C) 2008-2009 Waqas Hussain
+-- 
+-- This project is MIT/X11 licensed. Please see the
+-- COPYING file in the source package for more information.
+--
+
+
+local st = require "util.stanza";
+local jid_split = require "util.jid".split;
+local user_exists = require "core.usermanager".user_exists;
+
+local full_sessions = full_sessions;
+local bare_sessions = bare_sessions;
 
 module:hook("iq/full", function(data)
        -- IQ to full JID recieved
@@ -7,24 +22,45 @@ module:hook("iq/full", function(data)
        if session then
                -- TODO fire post processing event
                session.send(stanza);
-               return true;
        else -- resource not online
-               -- TODO error reply
+               if stanza.attr.type == "get" or stanza.attr.type == "set" then
+                       origin.send(st.error_reply(stanza, "cancel", "service-unavailable"));
+               end
        end
+       return true;
 end);
 
 module:hook("iq/bare", function(data)
        -- IQ to bare JID recieved
        local origin, stanza = data.origin, data.stanza;
 
-       -- TODO if not user exists, return an error
+       local to = stanza.attr.to;
+       if to and not bare_sessions[to] then -- quick check for account existance
+               local node, host = jid_split(to);
+               if not user_exists(node, host) then -- full check for account existance
+                       if stanza.attr.type == "get" or stanza.attr.type == "set" then
+                               origin.send(st.error_reply(stanza, "cancel", "service-unavailable"));
+                       end
+                       return true;
+               end
+       end
        -- TODO fire post processing events
-       -- TODO fire event with the xmlns:tag of the child, or with the id of errors and results
+       if stanza.attr.type == "get" or stanza.attr.type == "set" then
+               return module:fire_event("iq/bare/"..stanza.tags[1].attr.xmlns..":"..stanza.tags[1].name, data);
+       else
+               module:fire_event("iq/bare/"..stanza.attr.id, data);
+               return true;
+       end
 end);
 
 module:hook("iq/host", function(data)
        -- IQ to a local host recieved
        local origin, stanza = data.origin, data.stanza;
 
-       -- TODO fire event with the xmlns:tag of the child, or with the id of errors and results
+       if stanza.attr.type == "get" or stanza.attr.type == "set" then
+               return module:fire_event("iq/host/"..stanza.tags[1].attr.xmlns..":"..stanza.tags[1].name, data);
+       else
+               module:fire_event("iq/host/"..stanza.attr.id, data);
+               return true;
+       end
 end);