mod_saslauth: Make service_name configurable for CyrusSASL users.
[prosody.git] / util / dataforms.lua
index 46e22dc1516fbe75792efc8f2b4aed2935f70816..a3bde8caab1c8879965efef52a9b42a715b03a2c 100644 (file)
@@ -38,39 +38,41 @@ function form_t.form(layout, data)
 
                local value = (data and data[field.name]) or field.value;
                
-               -- Add value, depending on type
-               if field_type == "hidden" then
-                       if type(value) == "table" then
-                               -- Assume an XML snippet
-                               form:tag("value")
-                                       :add_child(value)
-                                       :up();
-                       elseif value then
-                               form:tag("value"):text(tostring(value)):up();
-                       end
-               elseif field_type == "boolean" then
-                       form:tag("value"):text((value and "1") or "0"):up();
-               elseif field_type == "fixed" then
-                       
-               elseif field_type == "jid-multi" then
-                       for _, jid in ipairs(value) do
-                               form:tag("value"):text(jid):up();
-                       end
-               elseif field_type == "jid-single" then
-                       form:tag("value"):text(value):up();
-               elseif field_type == "text-single" or field_type == "text-private" then
-                       form:tag("value"):text(value):up();
-               elseif field_type == "text-multi" then
-                       -- Split into multiple <value> tags, one for each line
-                       for line in value:gmatch("([^\r\n]+)\r?\n*") do
-                               form:tag("value"):text(line):up();
-                       end
-               elseif field_type == "list-single" then
-                       for _, val in ipairs(value) do
-                               if type(val) == "table" then
-                                       form:tag("option", { label = val.label }):tag("value"):text(val.value):up():up();
+               if value then
+                       -- Add value, depending on type
+                       if field_type == "hidden" then
+                               if type(value) == "table" then
+                                       -- Assume an XML snippet
+                                       form:tag("value")
+                                               :add_child(value)
+                                               :up();
                                else
-                                       form:tag("option", { label= val }):tag("value"):text(tostring(val)):up():up();
+                                       form:tag("value"):text(tostring(value)):up();
+                               end
+                       elseif field_type == "boolean" then
+                               form:tag("value"):text((value and "1") or "0"):up();
+                       elseif field_type == "fixed" then
+                               
+                       elseif field_type == "jid-multi" then
+                               for _, jid in ipairs(value) do
+                                       form:tag("value"):text(jid):up();
+                               end
+                       elseif field_type == "jid-single" then
+                               form:tag("value"):text(value):up();
+                       elseif field_type == "text-single" or field_type == "text-private" then
+                               form:tag("value"):text(value):up();
+                       elseif field_type == "text-multi" then
+                               -- Split into multiple <value> tags, one for each line
+                               for line in value:gmatch("([^\r\n]+)\r?\n*") do
+                                       form:tag("value"):text(line):up();
+                               end
+                       elseif field_type == "list-single" then
+                               for _, val in ipairs(value) do
+                                       if type(val) == "table" then
+                                               form:tag("option", { label = val.label }):tag("value"):text(val.value):up():up();
+                                       else
+                                               form:tag("option", { label= val }):tag("value"):text(tostring(val)):up():up();
+                                       end
                                end
                        end
                end
@@ -91,7 +93,13 @@ function form_t.data(layout, stanza)
        local data = {};
        
        for field_tag in stanza:childtags() do
-               local field_type = field_tag.attr.type;
+               local field_type;
+               for n, field in ipairs(layout) do
+                       if field.name == field_tag.attr.var then
+                               field_type = field.type;
+                               break;
+                       end
+               end
                
                local reader = field_readers[field_type];
                if reader then
@@ -116,6 +124,17 @@ field_readers["text-private"] =
 field_readers["jid-single"] =
        field_readers["text-single"];
 
+field_readers["jid-multi"] = 
+       function (field_tag)
+               local result = {};
+               for value_tag in field_tag:childtags() do
+                       if value_tag.name == "value" then
+                               result[#result+1] = value_tag[1];
+                       end
+               end
+               return result;
+       end
+
 field_readers["text-multi"] = 
        function (field_tag)
                local result = {};