Merge 0.6.2/waqas with 0.6.2/MattJ
[prosody.git] / plugins / mod_iq.lua
index 8ccd820faa0c76daee0e585825e91d60228132ff..5be045335c478e256913228207d31fc76b6f3719 100644 (file)
@@ -1,5 +1,15 @@
+-- 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;
@@ -24,12 +34,22 @@ 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
-       if #stanza.tags == 1 then
-               return module:fire_event("iq/bare/"..stanza.tags[1].attr.xmlns..":"..stanza.tags[1].name);
+       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
-               return true; -- TODO do something with results and errors
+               module:fire_event("iq/bare/"..stanza.attr.id, data);
+               return true;
        end
 end);
 
@@ -37,9 +57,10 @@ module:hook("iq/host", function(data)
        -- IQ to a local host recieved
        local origin, stanza = data.origin, data.stanza;
 
-       if #stanza.tags == 1 then
-               return module:fire_event("iq/host/"..stanza.tags[1].attr.xmlns..":"..stanza.tags[1].name);
+       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
-               return true; -- TODO do something with results and errors
+               module:fire_event("iq/host/"..stanza.attr.id, data);
+               return true;
        end
 end);