diff options
author | Kim Alvefur <zash@zash.se> | 2012-05-17 21:01:44 +0200 |
---|---|---|
committer | Kim Alvefur <zash@zash.se> | 2012-05-17 21:01:44 +0200 |
commit | a4cc21bca1841ffcadc7d26137bd5c564b9b4ae2 (patch) | |
tree | c5c496ab99ff03fca111b5bdc5aa252ca8a14f2a | |
parent | 289e7b406d9f9abb3466154cfd8ec76d605a4cf6 (diff) | |
download | prosody-a4cc21bca1841ffcadc7d26137bd5c564b9b4ae2.tar.gz prosody-a4cc21bca1841ffcadc7d26137bd5c564b9b4ae2.zip |
util.dataforms: Do field validation and normalization in field readers.
-rw-r--r-- | util/dataforms.lua | 154 |
1 files changed, 53 insertions, 101 deletions
diff --git a/util/dataforms.lua b/util/dataforms.lua index d4a1865c..85bb39c1 100644 --- a/util/dataforms.lua +++ b/util/dataforms.lua @@ -105,7 +105,6 @@ function form_t.form(layout, data, formtype) end local field_readers = {}; -local field_verifiers = {}; function form_t.data(layout, stanza) local data = {}; @@ -126,12 +125,8 @@ function form_t.data(layout, stanza) end else local reader = field_readers[field.type]; - local verifier = field.verifier or field_verifiers[field.type]; if reader then - data[field.name] = reader(tag); - if verifier then - errors[field.name] = verifier(data[field.name], tag, field.required); - end + data[field.name], errors[field.name] = reader(tag, field.required); end end end @@ -142,137 +137,94 @@ function form_t.data(layout, stanza) end field_readers["text-single"] = - function (field_tag) - local value = field_tag:child_with_name("value"); - if value then - return value[1]; - end - end - -field_verifiers["text-single"] = - function (data, field_tag, required) - if ((not data) or (#data == 0)) and required then - return "Required value missing"; + 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 end field_readers["text-private"] = field_readers["text-single"]; -field_verifiers["text-private"] = - field_verifiers["text-single"]; - field_readers["jid-single"] = - field_readers["text-single"]; - -field_verifiers["jid-single"] = - function (data, field_tag, required) - if ((not data) or (#data == 0)) and required then - return "Required value missing"; - end - if not jid_prep(data) then - return "Invalid JID"; + function (field_tag, required) + local raw_data = field_tag:get_child_text("value") + local data = jid_prep(raw_data); + if data and #data > 0 then + return data + elseif raw_data then + return raw_data, "Invalid JID"; + elseif required then + return nil, "Required value missing"; end end field_readers["jid-multi"] = - function (field_tag) + function (field_tag, required) local result = {}; - for value_tag in field_tag:childtags() do - if value_tag.name == "value" then - result[#result+1] = value_tag[1]; + local err = {}; + for value_tag in field_tag:childtags("value") do + local raw_value = value_tag:get_text(); + local value = jid_prep(raw_value); + result[#result+1] = value; + if raw_value and not value then + err[#err+1] = ("Invalid JID: " .. raw_value); end end - return result; - end - -field_verifiers["jid-multi"] = - function (data, field_tag, required) - if #data == 0 and required then - return "Required value missing"; + if #result > 0 then + return result, (#err > 0 and t_concat(err, "\n") or nil); + elseif required then + return nil, "Required value missing"; end + end - for _, jid in ipairs(data) do - if not jid_prep(jid) then - return "Invalid JID"; - end +field_readers["list-multi"] = + function (field_tag, required) + local result = {}; + for value in field_tag:childtags("value") do + result[#result+1] = value; end + return result, (required and #result == 0 and "Required value missing" or nil); end field_readers["text-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 + function (field_tag, required) + local data, err = field_readers["list-multi"](field_tag, required); + if data then + data = t_concat(data, "\n"); end - return t_concat(result, "\n"); + return data, err; end -field_verifiers["text-multi"] = - field_verifiers["text-single"]; - field_readers["list-single"] = field_readers["text-single"]; -field_verifiers["list-single"] = - field_verifiers["text-single"]; - -field_readers["list-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_verifiers["list-multi"] = - function (data, field_tag, required) - if #data == 0 and required then - return "Required value missing"; - end - end + local boolean_values = { + ["1"] = true, ["true"] = true, + ["0"] = false, ["false"] = false, + }; field_readers["boolean"] = - function (field_tag) - local value = field_tag:child_with_name("value"); - if value then - if value[1] == "1" or value[1] == "true" then - return true; - else - return false; - end - end - end - -field_verifiers["boolean"] = - function (data, field_tag, required) - data = field_readers["text-single"](field_tag); - if ((not data) or (#data == 0)) and required then - return "Required value missing"; - end - if data ~= "1" and data ~= "true" and data ~= "0" and data ~= "false" then + 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 "Invalid boolean representation"; + elseif required then + return nil, "Required value missing"; end end field_readers["hidden"] = function (field_tag) - local value = field_tag:child_with_name("value"); - if value then - return value[1]; - end + return field_tag:get_child_text("value"); end -field_verifiers["hidden"] = - function (data, field_tag, required) - return nil; - end - return _M; |