Merge 0.9->0.10
[prosody.git] / plugins / mod_private.lua
index 446a80b2a6a229a7328fada05e6b625169425093..8bca515402c71b9b15a0c53793932fb7e45ce569 100644 (file)
@@ -15,38 +15,34 @@ module:add_feature("jabber:iq:private");
 
 module:hook("iq/self/jabber:iq:private:query", function(event)
        local origin, stanza = event.origin, event.stanza;
-       local type = stanza.attr.type;
        local query = stanza.tags[1];
-       if #query.tags == 1 then
-               local tag = query.tags[1];
-               local key = tag.name..":"..tag.attr.xmlns;
-               local data, err = private_storage:get(origin.username);
-               if err then
-                       origin.send(st.error_reply(stanza, "wait", "internal-server-error"));
-                       return true;
+       if #query.tags ~= 1 then
+               return origin.send(st.error_reply(stanza, "modify", "bad-format"));
+       end
+       local tag = query.tags[1];
+       local key = tag.name..":"..tag.attr.xmlns;
+       local data, err = private_storage:get(origin.username);
+       if err then
+               return origin.send(st.error_reply(stanza, "wait", "internal-server-error", err));
+       end
+       if stanza.attr.type == "get" then
+               if data and data[key] then
+                       return origin.send(st.reply(stanza):query("jabber:iq:private"):add_child(st.deserialize(data[key])));
+               else
+                       return origin.send(st.reply(stanza):add_child(query));
+               end
+       else -- type == set
+               if not data then data = {}; end;
+               if #tag == 0 then
+                       data[key] = nil;
+               else
+                       data[key] = st.preserialize(tag);
                end
-               if stanza.attr.type == "get" then
-                       if data and data[key] then
-                               origin.send(st.reply(stanza):tag("query", {xmlns = "jabber:iq:private"}):add_child(st.deserialize(data[key])));
-                       else
-                               origin.send(st.reply(stanza):add_child(stanza.tags[1]));
-                       end
-               else -- set
-                       if not data then data = {}; end;
-                       if #tag == 0 then
-                               data[key] = nil;
-                       else
-                               data[key] = st.preserialize(tag);
-                       end
-                       -- TODO delete datastore if empty
-                       if private_storage:set(origin.username, data) then
-                               origin.send(st.reply(stanza));
-                       else
-                               origin.send(st.error_reply(stanza, "wait", "internal-server-error"));
-                       end
+               -- TODO delete datastore if empty
+               local ok, err = private_storage:set(origin.username, data);
+               if not ok then
+                       return origin.send(st.error_reply(stanza, "wait", "internal-server-error", err));
                end
-       else
-               origin.send(st.error_reply(stanza, "modify", "bad-format"));
+               return origin.send(st.reply(stanza));
        end
-       return true;
 end);