Merge 0.10->trunk
[prosody.git] / util / dataforms.lua
index 9f2693b1fc2eae20db3898a00520394391b91281..05846ab3a5b58614df89ba1c779ecc848d096b36 100644 (file)
@@ -13,14 +13,14 @@ local t_concat = table.concat;
 local st = require "util.stanza";
 local jid_prep = require "util.jid".prep;
 
-module "dataforms"
+local _ENV = nil;
 
 local xmlns_forms = 'jabber:x:data';
 
 local form_t = {};
 local form_mt = { __index = form_t };
 
-function new(layout)
+local function new(layout)
        return setmetatable(layout, form_mt);
 end
 
@@ -145,30 +145,29 @@ function form_t.data(layout, stanza)
        return data;
 end
 
-field_readers["text-single"] =
-       function (field_tag, required)
-               local data = field_tag:get_child_text("value");
-               if data and #data > 0 then
-                       return data
-               elseif required then
-                       return nil, "Required value missing";
-               end
+local function simple_text(field_tag, required)
+       local data = field_tag:get_child_text("value");
+       -- XEP-0004 does not say if an empty string is acceptable for a required value
+       -- so we will follow HTML5 which says that empty string means missing
+       if required and (data == nil or data == "") then
+               return nil, "Required value missing";
        end
+       return data; -- Return whatever get_child_text returned, even if empty string
+end
+
+field_readers["text-single"] = simple_text;
 
-field_readers["text-private"] =
-       field_readers["text-single"];
+field_readers["text-private"] = simple_text;
 
 field_readers["jid-single"] =
        function (field_tag, required)
-               local raw_data = field_tag:get_child_text("value")
+               local raw_data, err = simple_text(field_tag, required);
+               if not raw_data then return raw_data, err; end
                local data = jid_prep(raw_data);
-               if data and #data > 0 then
-                       return data
-               elseif raw_data then
+               if not data then
                        return nil, "Invalid JID: " .. raw_data;
-               elseif required then
-                       return nil, "Required value missing";
                end
+               return data;
        end
 
 field_readers["jid-multi"] =
@@ -212,8 +211,7 @@ field_readers["text-multi"] =
                return data, err;
        end
 
-field_readers["list-single"] =
-       field_readers["text-single"];
+field_readers["list-single"] = simple_text;
 
 local boolean_values = {
        ["1"] = true, ["true"] = true,
@@ -222,15 +220,13 @@ local boolean_values = {
 
 field_readers["boolean"] =
        function (field_tag, required)
-               local raw_value = field_tag:get_child_text("value");
-               local value = boolean_values[raw_value ~= nil and raw_value];
-               if value ~= nil then
-                       return value;
-               elseif raw_value then
-                       return nil, "Invalid boolean representation";
-               elseif required then
-                       return nil, "Required value missing";
+               local raw_value, err = simple_text(field_tag, required);
+               if not raw_value then return raw_value, err; end
+               local value = boolean_values[raw_value];
+               if value == nil then
+                       return nil, "Invalid boolean representation:" .. raw_value;
                end
+               return value;
        end
 
 field_readers["hidden"] =
@@ -238,7 +234,9 @@ field_readers["hidden"] =
                return field_tag:get_child_text("value");
        end
 
-return _M;
+return {
+       new = new;
+};
 
 
 --[=[