util/dataforms.lua
author Kim Alvefur <zash@zash.se>
Sun, 16 Aug 2020 12:55:55 +0200
changeset 11030 a086825ed73a
parent 9249 397e8e5a2f1f
child 11074 f7f30a3464fe
permissions -rw-r--r--
util.dataforms: Convert media element sizes to avoid error on Lua 5.3 The stanza API does not accept number values and threw an error due to the height and width attributes of the media element (XEP-0221). This part had no test coverage previously, explaining why it was not discovered until now.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1522
569d58d21612 Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents: 957
diff changeset
     1
-- Prosody IM
2923
b7049746bd29 Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents: 2488
diff changeset
     2
-- Copyright (C) 2008-2010 Matthew Wild
b7049746bd29 Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents: 2488
diff changeset
     3
-- Copyright (C) 2008-2010 Waqas Hussain
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5693
diff changeset
     4
--
1522
569d58d21612 Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents: 957
diff changeset
     5
-- This project is MIT/X11 licensed. Please see the
569d58d21612 Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents: 957
diff changeset
     6
-- COPYING file in the source package for more information.
569d58d21612 Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents: 957
diff changeset
     7
--
569d58d21612 Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents: 957
diff changeset
     8
951
4b9207949735 util.dataforms: Fixed to actually work, mostly
Matthew Wild <mwild1@gmail.com>
parents: 851
diff changeset
     9
local setmetatable = setmetatable;
6671
f6f39c2f1b1f util.dataforms: Remove unused import of pairs() (thanks luacheck)
Matthew Wild <mwild1@gmail.com>
parents: 6471
diff changeset
    10
local ipairs = ipairs;
8866
64fa8d80c09f util.dataforms: Remove string conversion to let util.stanza validate types
Kim Alvefur <zash@zash.se>
parents: 8558
diff changeset
    11
local type, next = type, next;
9246
a4c52e304e6f util.dataforms: Add support for XEP-0122: Data Forms Validation
Kim Alvefur <zash@zash.se>
parents: 9245
diff changeset
    12
local tonumber = tonumber;
954
72e4639c9310 util.dataforms: Fixes for hidden field type
Matthew Wild <mwild1@gmail.com>
parents: 953
diff changeset
    13
local t_concat = table.concat;
951
4b9207949735 util.dataforms: Fixed to actually work, mostly
Matthew Wild <mwild1@gmail.com>
parents: 851
diff changeset
    14
local st = require "util.stanza";
4397
1378e3c79c34 util.dataforms: Add field verification logic
Florian Zeitz <florob@babelmonkeys.de>
parents: 3540
diff changeset
    15
local jid_prep = require "util.jid".prep;
845
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    16
6780
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6675
diff changeset
    17
local _ENV = nil;
8558
4f0f5b49bb03 vairious: Add annotation when an empty environment is set [luacheck]
Kim Alvefur <zash@zash.se>
parents: 8258
diff changeset
    18
-- luacheck: std none
845
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    19
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    20
local xmlns_forms = 'jabber:x:data';
9246
a4c52e304e6f util.dataforms: Add support for XEP-0122: Data Forms Validation
Kim Alvefur <zash@zash.se>
parents: 9245
diff changeset
    21
local xmlns_validate = 'http://jabber.org/protocol/xdata-validate';
845
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    22
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    23
local form_t = {};
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    24
local form_mt = { __index = form_t };
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    25
6780
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6675
diff changeset
    26
local function new(layout)
845
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    27
	return setmetatable(layout, form_mt);
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    28
end
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    29
2488
08bfd7c96531 util.dataforms: Add optional type parameters (defaults to 'form')
Matthew Wild <mwild1@gmail.com>
parents: 2219
diff changeset
    30
function form_t.form(layout, data, formtype)
9090
9e45e7adcebf util.dataforms: Set default value for form type argument
Kim Alvefur <zash@zash.se>
parents: 9087
diff changeset
    31
	if not formtype then formtype = "form" end
9e45e7adcebf util.dataforms: Set default value for form type argument
Kim Alvefur <zash@zash.se>
parents: 9087
diff changeset
    32
	local form = st.stanza("x", { xmlns = xmlns_forms, type = formtype });
9092
3a7a0b9f42f3 util.dataforms: Skip all fields for the 'cancel' form type
Kim Alvefur <zash@zash.se>
parents: 9091
diff changeset
    33
	if formtype == "cancel" then
3a7a0b9f42f3 util.dataforms: Skip all fields for the 'cancel' form type
Kim Alvefur <zash@zash.se>
parents: 9091
diff changeset
    34
		return form;
3a7a0b9f42f3 util.dataforms: Skip all fields for the 'cancel' form type
Kim Alvefur <zash@zash.se>
parents: 9091
diff changeset
    35
	end
9093
56c52cb4d44e util.dataforms: Exclude descriptive text fields from forms of type 'submit'
Kim Alvefur <zash@zash.se>
parents: 9092
diff changeset
    36
	if formtype ~= "submit" then
56c52cb4d44e util.dataforms: Exclude descriptive text fields from forms of type 'submit'
Kim Alvefur <zash@zash.se>
parents: 9092
diff changeset
    37
		if layout.title then
56c52cb4d44e util.dataforms: Exclude descriptive text fields from forms of type 'submit'
Kim Alvefur <zash@zash.se>
parents: 9092
diff changeset
    38
			form:tag("title"):text(layout.title):up();
56c52cb4d44e util.dataforms: Exclude descriptive text fields from forms of type 'submit'
Kim Alvefur <zash@zash.se>
parents: 9092
diff changeset
    39
		end
56c52cb4d44e util.dataforms: Exclude descriptive text fields from forms of type 'submit'
Kim Alvefur <zash@zash.se>
parents: 9092
diff changeset
    40
		if layout.instructions then
56c52cb4d44e util.dataforms: Exclude descriptive text fields from forms of type 'submit'
Kim Alvefur <zash@zash.se>
parents: 9092
diff changeset
    41
			form:tag("instructions"):text(layout.instructions):up();
56c52cb4d44e util.dataforms: Exclude descriptive text fields from forms of type 'submit'
Kim Alvefur <zash@zash.se>
parents: 9092
diff changeset
    42
		end
951
4b9207949735 util.dataforms: Fixed to actually work, mostly
Matthew Wild <mwild1@gmail.com>
parents: 851
diff changeset
    43
	end
6675
d6a60e74f773 util.dataforms: Rename unused loop counter to '_' [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 6671
diff changeset
    44
	for _, field in ipairs(layout) do
951
4b9207949735 util.dataforms: Fixed to actually work, mostly
Matthew Wild <mwild1@gmail.com>
parents: 851
diff changeset
    45
		local field_type = field.type or "text-single";
845
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    46
		-- Add field tag
9245
68694c1bd960 util.dataforms: Allow field names to be different from the 'var' attribute
Kim Alvefur <zash@zash.se>
parents: 9124
diff changeset
    47
		form:tag("field", { type = field_type, var = field.var or field.name, label = formtype ~= "submit" and field.label or nil });
845
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    48
9093
56c52cb4d44e util.dataforms: Exclude descriptive text fields from forms of type 'submit'
Kim Alvefur <zash@zash.se>
parents: 9092
diff changeset
    49
		if formtype ~= "submit" then
56c52cb4d44e util.dataforms: Exclude descriptive text fields from forms of type 'submit'
Kim Alvefur <zash@zash.se>
parents: 9092
diff changeset
    50
			if field.desc then
56c52cb4d44e util.dataforms: Exclude descriptive text fields from forms of type 'submit'
Kim Alvefur <zash@zash.se>
parents: 9092
diff changeset
    51
				form:text_tag("desc", field.desc);
56c52cb4d44e util.dataforms: Exclude descriptive text fields from forms of type 'submit'
Kim Alvefur <zash@zash.se>
parents: 9092
diff changeset
    52
			end
8948
cbeb1a045eb6 util.dataforms: Add support for field descriptions in <desc>
Kim Alvefur <zash@zash.se>
parents: 8867
diff changeset
    53
		end
cbeb1a045eb6 util.dataforms: Add support for field descriptions in <desc>
Kim Alvefur <zash@zash.se>
parents: 8867
diff changeset
    54
9246
a4c52e304e6f util.dataforms: Add support for XEP-0122: Data Forms Validation
Kim Alvefur <zash@zash.se>
parents: 9245
diff changeset
    55
		if formtype == "form" and field.datatype then
a4c52e304e6f util.dataforms: Add support for XEP-0122: Data Forms Validation
Kim Alvefur <zash@zash.se>
parents: 9245
diff changeset
    56
			form:tag("validate", { xmlns = xmlns_validate, datatype = field.datatype });
a4c52e304e6f util.dataforms: Add support for XEP-0122: Data Forms Validation
Kim Alvefur <zash@zash.se>
parents: 9245
diff changeset
    57
			-- <basic/> assumed
a4c52e304e6f util.dataforms: Add support for XEP-0122: Data Forms Validation
Kim Alvefur <zash@zash.se>
parents: 9245
diff changeset
    58
			form:up();
a4c52e304e6f util.dataforms: Add support for XEP-0122: Data Forms Validation
Kim Alvefur <zash@zash.se>
parents: 9245
diff changeset
    59
		end
a4c52e304e6f util.dataforms: Add support for XEP-0122: Data Forms Validation
Kim Alvefur <zash@zash.se>
parents: 9245
diff changeset
    60
a4c52e304e6f util.dataforms: Add support for XEP-0122: Data Forms Validation
Kim Alvefur <zash@zash.se>
parents: 9245
diff changeset
    61
9097
05979ae1e38a util.dataforms: Only allow overriding of options when passed via the :form method
Kim Alvefur <zash@zash.se>
parents: 9095
diff changeset
    62
		local value = field.value;
05979ae1e38a util.dataforms: Only allow overriding of options when passed via the :form method
Kim Alvefur <zash@zash.se>
parents: 9095
diff changeset
    63
		local options = field.options;
05979ae1e38a util.dataforms: Only allow overriding of options when passed via the :form method
Kim Alvefur <zash@zash.se>
parents: 9095
diff changeset
    64
8987
fa80b3231a02 util.dataforms: More robust handling of field values, especially booleans
Matthew Wild <mwild1@gmail.com>
parents: 8948
diff changeset
    65
		if data and data[field.name] ~= nil then
fa80b3231a02 util.dataforms: More robust handling of field values, especially booleans
Matthew Wild <mwild1@gmail.com>
parents: 8948
diff changeset
    66
			value = data[field.name];
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5693
diff changeset
    67
9097
05979ae1e38a util.dataforms: Only allow overriding of options when passed via the :form method
Kim Alvefur <zash@zash.se>
parents: 9095
diff changeset
    68
			if formtype == "form" and type(value) == "table"
05979ae1e38a util.dataforms: Only allow overriding of options when passed via the :form method
Kim Alvefur <zash@zash.se>
parents: 9095
diff changeset
    69
				and (field_type == "list-single" or field_type == "list-multi") then
05979ae1e38a util.dataforms: Only allow overriding of options when passed via the :form method
Kim Alvefur <zash@zash.se>
parents: 9095
diff changeset
    70
				-- Allow passing dynamically generated options as values
05979ae1e38a util.dataforms: Only allow overriding of options when passed via the :form method
Kim Alvefur <zash@zash.se>
parents: 9095
diff changeset
    71
				options, value = value, nil;
05979ae1e38a util.dataforms: Only allow overriding of options when passed via the :form method
Kim Alvefur <zash@zash.se>
parents: 9095
diff changeset
    72
			end
9094
519dea077d20 util.dataforms: Allow passing dynamically generated options as values (fixes traceback)
Kim Alvefur <zash@zash.se>
parents: 9093
diff changeset
    73
		end
519dea077d20 util.dataforms: Allow passing dynamically generated options as values (fixes traceback)
Kim Alvefur <zash@zash.se>
parents: 9093
diff changeset
    74
519dea077d20 util.dataforms: Allow passing dynamically generated options as values (fixes traceback)
Kim Alvefur <zash@zash.se>
parents: 9093
diff changeset
    75
		if formtype == "form" and options then
9087
572b6858db03 util.dataforms: Detach generation of options from values (fixes #1177)
Kim Alvefur <zash@zash.se>
parents: 9050
diff changeset
    76
			local defaults = {};
9094
519dea077d20 util.dataforms: Allow passing dynamically generated options as values (fixes traceback)
Kim Alvefur <zash@zash.se>
parents: 9093
diff changeset
    77
			for _, val in ipairs(options) do
9087
572b6858db03 util.dataforms: Detach generation of options from values (fixes #1177)
Kim Alvefur <zash@zash.se>
parents: 9050
diff changeset
    78
				if type(val) == "table" then
572b6858db03 util.dataforms: Detach generation of options from values (fixes #1177)
Kim Alvefur <zash@zash.se>
parents: 9050
diff changeset
    79
					form:tag("option", { label = val.label }):tag("value"):text(val.value):up():up();
572b6858db03 util.dataforms: Detach generation of options from values (fixes #1177)
Kim Alvefur <zash@zash.se>
parents: 9050
diff changeset
    80
					if val.default then
572b6858db03 util.dataforms: Detach generation of options from values (fixes #1177)
Kim Alvefur <zash@zash.se>
parents: 9050
diff changeset
    81
						defaults[#defaults+1] = val.value;
572b6858db03 util.dataforms: Detach generation of options from values (fixes #1177)
Kim Alvefur <zash@zash.se>
parents: 9050
diff changeset
    82
					end
572b6858db03 util.dataforms: Detach generation of options from values (fixes #1177)
Kim Alvefur <zash@zash.se>
parents: 9050
diff changeset
    83
				else
572b6858db03 util.dataforms: Detach generation of options from values (fixes #1177)
Kim Alvefur <zash@zash.se>
parents: 9050
diff changeset
    84
					form:tag("option", { label= val }):tag("value"):text(val):up():up();
572b6858db03 util.dataforms: Detach generation of options from values (fixes #1177)
Kim Alvefur <zash@zash.se>
parents: 9050
diff changeset
    85
				end
572b6858db03 util.dataforms: Detach generation of options from values (fixes #1177)
Kim Alvefur <zash@zash.se>
parents: 9050
diff changeset
    86
			end
572b6858db03 util.dataforms: Detach generation of options from values (fixes #1177)
Kim Alvefur <zash@zash.se>
parents: 9050
diff changeset
    87
			if not value then
572b6858db03 util.dataforms: Detach generation of options from values (fixes #1177)
Kim Alvefur <zash@zash.se>
parents: 9050
diff changeset
    88
				if field_type == "list-single" then
572b6858db03 util.dataforms: Detach generation of options from values (fixes #1177)
Kim Alvefur <zash@zash.se>
parents: 9050
diff changeset
    89
					value = defaults[1];
572b6858db03 util.dataforms: Detach generation of options from values (fixes #1177)
Kim Alvefur <zash@zash.se>
parents: 9050
diff changeset
    90
				elseif field_type == "list-multi" then
572b6858db03 util.dataforms: Detach generation of options from values (fixes #1177)
Kim Alvefur <zash@zash.se>
parents: 9050
diff changeset
    91
					value = defaults;
572b6858db03 util.dataforms: Detach generation of options from values (fixes #1177)
Kim Alvefur <zash@zash.se>
parents: 9050
diff changeset
    92
				end
572b6858db03 util.dataforms: Detach generation of options from values (fixes #1177)
Kim Alvefur <zash@zash.se>
parents: 9050
diff changeset
    93
			end
572b6858db03 util.dataforms: Detach generation of options from values (fixes #1177)
Kim Alvefur <zash@zash.se>
parents: 9050
diff changeset
    94
		end
572b6858db03 util.dataforms: Detach generation of options from values (fixes #1177)
Kim Alvefur <zash@zash.se>
parents: 9050
diff changeset
    95
8987
fa80b3231a02 util.dataforms: More robust handling of field values, especially booleans
Matthew Wild <mwild1@gmail.com>
parents: 8948
diff changeset
    96
		if value ~= nil then
9246
a4c52e304e6f util.dataforms: Add support for XEP-0122: Data Forms Validation
Kim Alvefur <zash@zash.se>
parents: 9245
diff changeset
    97
			if type(value) == "number" then
a4c52e304e6f util.dataforms: Add support for XEP-0122: Data Forms Validation
Kim Alvefur <zash@zash.se>
parents: 9245
diff changeset
    98
				-- TODO validate that this is ok somehow, eg check field.datatype
a4c52e304e6f util.dataforms: Add support for XEP-0122: Data Forms Validation
Kim Alvefur <zash@zash.se>
parents: 9245
diff changeset
    99
				value = ("%g"):format(value);
a4c52e304e6f util.dataforms: Add support for XEP-0122: Data Forms Validation
Kim Alvefur <zash@zash.se>
parents: 9245
diff changeset
   100
			end
2061
e34fdca432a9 util.dataforms: Only add value to rendered form if supplied in the data
Florian Zeitz
parents: 1958
diff changeset
   101
			-- Add value, depending on type
e34fdca432a9 util.dataforms: Only add value to rendered form if supplied in the data
Florian Zeitz
parents: 1958
diff changeset
   102
			if field_type == "hidden" then
e34fdca432a9 util.dataforms: Only add value to rendered form if supplied in the data
Florian Zeitz
parents: 1958
diff changeset
   103
				if type(value) == "table" then
e34fdca432a9 util.dataforms: Only add value to rendered form if supplied in the data
Florian Zeitz
parents: 1958
diff changeset
   104
					-- Assume an XML snippet
e34fdca432a9 util.dataforms: Only add value to rendered form if supplied in the data
Florian Zeitz
parents: 1958
diff changeset
   105
					form:tag("value")
e34fdca432a9 util.dataforms: Only add value to rendered form if supplied in the data
Florian Zeitz
parents: 1958
diff changeset
   106
						:add_child(value)
e34fdca432a9 util.dataforms: Only add value to rendered form if supplied in the data
Florian Zeitz
parents: 1958
diff changeset
   107
						:up();
1958
e2b0026143c4 util.dataforms: Incorporate slightly modified patch for list-single type from Florob
Matthew Wild <mwild1@gmail.com>
parents: 1945
diff changeset
   108
				else
8866
64fa8d80c09f util.dataforms: Remove string conversion to let util.stanza validate types
Kim Alvefur <zash@zash.se>
parents: 8558
diff changeset
   109
					form:tag("value"):text(value):up();
2061
e34fdca432a9 util.dataforms: Only add value to rendered form if supplied in the data
Florian Zeitz
parents: 1958
diff changeset
   110
				end
e34fdca432a9 util.dataforms: Only add value to rendered form if supplied in the data
Florian Zeitz
parents: 1958
diff changeset
   111
			elseif field_type == "boolean" then
e34fdca432a9 util.dataforms: Only add value to rendered form if supplied in the data
Florian Zeitz
parents: 1958
diff changeset
   112
				form:tag("value"):text((value and "1") or "0"):up();
e34fdca432a9 util.dataforms: Only add value to rendered form if supplied in the data
Florian Zeitz
parents: 1958
diff changeset
   113
			elseif field_type == "fixed" then
5551
e1e06f1465be util.dataforms: Add support for generating type='fixed' fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4928
diff changeset
   114
				form:tag("value"):text(value):up();
2061
e34fdca432a9 util.dataforms: Only add value to rendered form if supplied in the data
Florian Zeitz
parents: 1958
diff changeset
   115
			elseif field_type == "jid-multi" then
e34fdca432a9 util.dataforms: Only add value to rendered form if supplied in the data
Florian Zeitz
parents: 1958
diff changeset
   116
				for _, jid in ipairs(value) do
e34fdca432a9 util.dataforms: Only add value to rendered form if supplied in the data
Florian Zeitz
parents: 1958
diff changeset
   117
					form:tag("value"):text(jid):up();
e34fdca432a9 util.dataforms: Only add value to rendered form if supplied in the data
Florian Zeitz
parents: 1958
diff changeset
   118
				end
e34fdca432a9 util.dataforms: Only add value to rendered form if supplied in the data
Florian Zeitz
parents: 1958
diff changeset
   119
			elseif field_type == "jid-single" then
e34fdca432a9 util.dataforms: Only add value to rendered form if supplied in the data
Florian Zeitz
parents: 1958
diff changeset
   120
				form:tag("value"):text(value):up();
e34fdca432a9 util.dataforms: Only add value to rendered form if supplied in the data
Florian Zeitz
parents: 1958
diff changeset
   121
			elseif field_type == "text-single" or field_type == "text-private" then
e34fdca432a9 util.dataforms: Only add value to rendered form if supplied in the data
Florian Zeitz
parents: 1958
diff changeset
   122
				form:tag("value"):text(value):up();
e34fdca432a9 util.dataforms: Only add value to rendered form if supplied in the data
Florian Zeitz
parents: 1958
diff changeset
   123
			elseif field_type == "text-multi" then
e34fdca432a9 util.dataforms: Only add value to rendered form if supplied in the data
Florian Zeitz
parents: 1958
diff changeset
   124
				-- Split into multiple <value> tags, one for each line
e34fdca432a9 util.dataforms: Only add value to rendered form if supplied in the data
Florian Zeitz
parents: 1958
diff changeset
   125
				for line in value:gmatch("([^\r\n]+)\r?\n*") do
e34fdca432a9 util.dataforms: Only add value to rendered form if supplied in the data
Florian Zeitz
parents: 1958
diff changeset
   126
					form:tag("value"):text(line):up();
e34fdca432a9 util.dataforms: Only add value to rendered form if supplied in the data
Florian Zeitz
parents: 1958
diff changeset
   127
				end
e34fdca432a9 util.dataforms: Only add value to rendered form if supplied in the data
Florian Zeitz
parents: 1958
diff changeset
   128
			elseif field_type == "list-single" then
9114
bc7473fb7ad3 util.dataforms: Normalize indentation
Kim Alvefur <zash@zash.se>
parents: 9097
diff changeset
   129
				form:tag("value"):text(value):up();
3380
e74e80b454a1 util.dataforms: Add list-multi support
Florian Zeitz <florob@babelmonkeys.de>
parents: 3379
diff changeset
   130
			elseif field_type == "list-multi" then
9114
bc7473fb7ad3 util.dataforms: Normalize indentation
Kim Alvefur <zash@zash.se>
parents: 9097
diff changeset
   131
				for _, val in ipairs(value) do
bc7473fb7ad3 util.dataforms: Normalize indentation
Kim Alvefur <zash@zash.se>
parents: 9097
diff changeset
   132
					form:tag("value"):text(val):up();
7445
156c95bfed0b util.dataforms: Allow separation of options from values in list fields
Kim Alvefur <zash@zash.se>
parents: 6984
diff changeset
   133
				end
1958
e2b0026143c4 util.dataforms: Incorporate slightly modified patch for list-single type from Florob
Matthew Wild <mwild1@gmail.com>
parents: 1945
diff changeset
   134
			end
845
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   135
		end
6148
7dcd6f124c93 util.dataforms: Add support for XEP-0221: Data Forms Media Element
Kim Alvefur <zash@zash.se>
parents: 5693
diff changeset
   136
7dcd6f124c93 util.dataforms: Add support for XEP-0221: Data Forms Media Element
Kim Alvefur <zash@zash.se>
parents: 5693
diff changeset
   137
		local media = field.media;
7dcd6f124c93 util.dataforms: Add support for XEP-0221: Data Forms Media Element
Kim Alvefur <zash@zash.se>
parents: 5693
diff changeset
   138
		if media then
11030
a086825ed73a util.dataforms: Convert media element sizes to avoid error on Lua 5.3
Kim Alvefur <zash@zash.se>
parents: 9249
diff changeset
   139
			form:tag("media", { xmlns = "urn:xmpp:media-element", height = ("%g"):format(media.height), width = ("%g"):format(media.width) });
6148
7dcd6f124c93 util.dataforms: Add support for XEP-0221: Data Forms Media Element
Kim Alvefur <zash@zash.se>
parents: 5693
diff changeset
   140
			for _, val in ipairs(media) do
7dcd6f124c93 util.dataforms: Add support for XEP-0221: Data Forms Media Element
Kim Alvefur <zash@zash.se>
parents: 5693
diff changeset
   141
				form:tag("uri", { type = val.type }):text(val.uri):up()
7dcd6f124c93 util.dataforms: Add support for XEP-0221: Data Forms Media Element
Kim Alvefur <zash@zash.se>
parents: 5693
diff changeset
   142
			end
7dcd6f124c93 util.dataforms: Add support for XEP-0221: Data Forms Media Element
Kim Alvefur <zash@zash.se>
parents: 5693
diff changeset
   143
			form:up();
7dcd6f124c93 util.dataforms: Add support for XEP-0221: Data Forms Media Element
Kim Alvefur <zash@zash.se>
parents: 5693
diff changeset
   144
		end
6149
2ae6e9063e88 Merge 0.9->0.10
Kim Alvefur <zash@zash.se>
parents: 5776 6148
diff changeset
   145
9093
56c52cb4d44e util.dataforms: Exclude descriptive text fields from forms of type 'submit'
Kim Alvefur <zash@zash.se>
parents: 9092
diff changeset
   146
		if formtype == "form" and field.required then
952
ef648f49e734 util.dataforms: Add support for <required/> fields
Matthew Wild <mwild1@gmail.com>
parents: 951
diff changeset
   147
			form:tag("required"):up();
ef648f49e734 util.dataforms: Add support for <required/> fields
Matthew Wild <mwild1@gmail.com>
parents: 951
diff changeset
   148
		end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5693
diff changeset
   149
845
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   150
		-- Jump back up to list of fields
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   151
		form:up();
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   152
	end
851
b48c7ed3f7f8 util.dataforms: Return the form
Matthew Wild <mwild1@gmail.com>
parents: 845
diff changeset
   153
	return form;
845
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   154
end
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   155
955
98ca5a753fee util.dataforms: Support for retriving the field value data from forms
Matthew Wild <mwild1@gmail.com>
parents: 954
diff changeset
   156
local field_readers = {};
9246
a4c52e304e6f util.dataforms: Add support for XEP-0122: Data Forms Validation
Kim Alvefur <zash@zash.se>
parents: 9245
diff changeset
   157
local data_validators = {};
955
98ca5a753fee util.dataforms: Support for retriving the field value data from forms
Matthew Wild <mwild1@gmail.com>
parents: 954
diff changeset
   158
9124
e5eb36ee07a2 util.dataforms: Allow passing the current values to be used in stead of omitted fields
Kim Alvefur <zash@zash.se>
parents: 9114
diff changeset
   159
function form_t.data(layout, stanza, current)
955
98ca5a753fee util.dataforms: Support for retriving the field value data from forms
Matthew Wild <mwild1@gmail.com>
parents: 954
diff changeset
   160
	local data = {};
4397
1378e3c79c34 util.dataforms: Add field verification logic
Florian Zeitz <florob@babelmonkeys.de>
parents: 3540
diff changeset
   161
	local errors = {};
6984
bcaa553de6e8 util.dataforms: Track which fields are included in a form
Kim Alvefur <zash@zash.se>
parents: 6833
diff changeset
   162
	local present = {};
4397
1378e3c79c34 util.dataforms: Add field verification logic
Florian Zeitz <florob@babelmonkeys.de>
parents: 3540
diff changeset
   163
1378e3c79c34 util.dataforms: Add field verification logic
Florian Zeitz <florob@babelmonkeys.de>
parents: 3540
diff changeset
   164
	for _, field in ipairs(layout) do
1378e3c79c34 util.dataforms: Add field verification logic
Florian Zeitz <florob@babelmonkeys.de>
parents: 3540
diff changeset
   165
		local tag;
6470
77d00a895bbd util/dataforms: Make sure we iterate over field tags
daurnimator <quae@daurnimator.com>
parents: 6148
diff changeset
   166
		for field_tag in stanza:childtags("field") do
9245
68694c1bd960 util.dataforms: Allow field names to be different from the 'var' attribute
Kim Alvefur <zash@zash.se>
parents: 9124
diff changeset
   167
			if (field.var or field.name) == field_tag.attr.var then
4397
1378e3c79c34 util.dataforms: Add field verification logic
Florian Zeitz <florob@babelmonkeys.de>
parents: 3540
diff changeset
   168
				tag = field_tag;
2219
9e1c6b6a2ee4 util.dataforms: Don't require type when parsing form XML
Florian Zeitz
parents: 2070
diff changeset
   169
				break;
9e1c6b6a2ee4 util.dataforms: Don't require type when parsing form XML
Florian Zeitz
parents: 2070
diff changeset
   170
			end
9e1c6b6a2ee4 util.dataforms: Don't require type when parsing form XML
Florian Zeitz
parents: 2070
diff changeset
   171
		end
4397
1378e3c79c34 util.dataforms: Add field verification logic
Florian Zeitz <florob@babelmonkeys.de>
parents: 3540
diff changeset
   172
4434
51a7c85751b9 util.dataforms: Fix form verification
Florian Zeitz <florob@babelmonkeys.de>
parents: 4397
diff changeset
   173
		if not tag then
9124
e5eb36ee07a2 util.dataforms: Allow passing the current values to be used in stead of omitted fields
Kim Alvefur <zash@zash.se>
parents: 9114
diff changeset
   174
			if current and current[field.name] ~= nil then
e5eb36ee07a2 util.dataforms: Allow passing the current values to be used in stead of omitted fields
Kim Alvefur <zash@zash.se>
parents: 9114
diff changeset
   175
				data[field.name] = current[field.name];
e5eb36ee07a2 util.dataforms: Allow passing the current values to be used in stead of omitted fields
Kim Alvefur <zash@zash.se>
parents: 9114
diff changeset
   176
			elseif field.required then
4434
51a7c85751b9 util.dataforms: Fix form verification
Florian Zeitz <florob@babelmonkeys.de>
parents: 4397
diff changeset
   177
				errors[field.name] = "Required value missing";
51a7c85751b9 util.dataforms: Fix form verification
Florian Zeitz <florob@babelmonkeys.de>
parents: 4397
diff changeset
   178
			end
9050
ab3488ee3ca5 util.dataforms: Ensure fields have names when collecting data (fixes traceback, thanks Martin)
Kim Alvefur <zash@zash.se>
parents: 8987
diff changeset
   179
		elseif field.name then
6984
bcaa553de6e8 util.dataforms: Track which fields are included in a form
Kim Alvefur <zash@zash.se>
parents: 6833
diff changeset
   180
			present[field.name] = true;
4434
51a7c85751b9 util.dataforms: Fix form verification
Florian Zeitz <florob@babelmonkeys.de>
parents: 4397
diff changeset
   181
			local reader = field_readers[field.type];
51a7c85751b9 util.dataforms: Fix form verification
Florian Zeitz <florob@babelmonkeys.de>
parents: 4397
diff changeset
   182
			if reader then
9246
a4c52e304e6f util.dataforms: Add support for XEP-0122: Data Forms Validation
Kim Alvefur <zash@zash.se>
parents: 9245
diff changeset
   183
				local value, err = reader(tag, field.required);
a4c52e304e6f util.dataforms: Add support for XEP-0122: Data Forms Validation
Kim Alvefur <zash@zash.se>
parents: 9245
diff changeset
   184
				local validator = field.datatype and data_validators[field.datatype];
a4c52e304e6f util.dataforms: Add support for XEP-0122: Data Forms Validation
Kim Alvefur <zash@zash.se>
parents: 9245
diff changeset
   185
				if value ~= nil and validator then
a4c52e304e6f util.dataforms: Add support for XEP-0122: Data Forms Validation
Kim Alvefur <zash@zash.se>
parents: 9245
diff changeset
   186
					local valid, ret = validator(value, field);
a4c52e304e6f util.dataforms: Add support for XEP-0122: Data Forms Validation
Kim Alvefur <zash@zash.se>
parents: 9245
diff changeset
   187
					if valid then
a4c52e304e6f util.dataforms: Add support for XEP-0122: Data Forms Validation
Kim Alvefur <zash@zash.se>
parents: 9245
diff changeset
   188
						value = ret;
a4c52e304e6f util.dataforms: Add support for XEP-0122: Data Forms Validation
Kim Alvefur <zash@zash.se>
parents: 9245
diff changeset
   189
					else
9249
397e8e5a2f1f util.dataforms: Improve default error message for failed datatype validation
Kim Alvefur <zash@zash.se>
parents: 9246
diff changeset
   190
						value, err = nil, ret or ("Invalid value for data of type " .. field.datatype);
9246
a4c52e304e6f util.dataforms: Add support for XEP-0122: Data Forms Validation
Kim Alvefur <zash@zash.se>
parents: 9245
diff changeset
   191
					end
a4c52e304e6f util.dataforms: Add support for XEP-0122: Data Forms Validation
Kim Alvefur <zash@zash.se>
parents: 9245
diff changeset
   192
				end
a4c52e304e6f util.dataforms: Add support for XEP-0122: Data Forms Validation
Kim Alvefur <zash@zash.se>
parents: 9245
diff changeset
   193
				data[field.name], errors[field.name] = value, err;
4397
1378e3c79c34 util.dataforms: Add field verification logic
Florian Zeitz <florob@babelmonkeys.de>
parents: 3540
diff changeset
   194
			end
955
98ca5a753fee util.dataforms: Support for retriving the field value data from forms
Matthew Wild <mwild1@gmail.com>
parents: 954
diff changeset
   195
		end
4397
1378e3c79c34 util.dataforms: Add field verification logic
Florian Zeitz <florob@babelmonkeys.de>
parents: 3540
diff changeset
   196
	end
1378e3c79c34 util.dataforms: Add field verification logic
Florian Zeitz <florob@babelmonkeys.de>
parents: 3540
diff changeset
   197
	if next(errors) then
6984
bcaa553de6e8 util.dataforms: Track which fields are included in a form
Kim Alvefur <zash@zash.se>
parents: 6833
diff changeset
   198
		return data, errors, present;
955
98ca5a753fee util.dataforms: Support for retriving the field value data from forms
Matthew Wild <mwild1@gmail.com>
parents: 954
diff changeset
   199
	end
6984
bcaa553de6e8 util.dataforms: Track which fields are included in a form
Kim Alvefur <zash@zash.se>
parents: 6833
diff changeset
   200
	return data, nil, present;
845
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   201
end
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   202
6832
22522443982f util.dataforms: Refactor parsing to reuse simple text parser instead of duplicate code
Kim Alvefur <zash@zash.se>
parents: 6780
diff changeset
   203
local function simple_text(field_tag, required)
22522443982f util.dataforms: Refactor parsing to reuse simple text parser instead of duplicate code
Kim Alvefur <zash@zash.se>
parents: 6780
diff changeset
   204
	local data = field_tag:get_child_text("value");
6833
e08f5d081a6c util.dataforms: Fix interaction of required fields and empty string values (fixes #521)
Kim Alvefur <zash@zash.se>
parents: 6832
diff changeset
   205
	-- XEP-0004 does not say if an empty string is acceptable for a required value
e08f5d081a6c util.dataforms: Fix interaction of required fields and empty string values (fixes #521)
Kim Alvefur <zash@zash.se>
parents: 6832
diff changeset
   206
	-- so we will follow HTML5 which says that empty string means missing
e08f5d081a6c util.dataforms: Fix interaction of required fields and empty string values (fixes #521)
Kim Alvefur <zash@zash.se>
parents: 6832
diff changeset
   207
	if required and (data == nil or data == "") then
6832
22522443982f util.dataforms: Refactor parsing to reuse simple text parser instead of duplicate code
Kim Alvefur <zash@zash.se>
parents: 6780
diff changeset
   208
		return nil, "Required value missing";
4397
1378e3c79c34 util.dataforms: Add field verification logic
Florian Zeitz <florob@babelmonkeys.de>
parents: 3540
diff changeset
   209
	end
6833
e08f5d081a6c util.dataforms: Fix interaction of required fields and empty string values (fixes #521)
Kim Alvefur <zash@zash.se>
parents: 6832
diff changeset
   210
	return data; -- Return whatever get_child_text returned, even if empty string
6832
22522443982f util.dataforms: Refactor parsing to reuse simple text parser instead of duplicate code
Kim Alvefur <zash@zash.se>
parents: 6780
diff changeset
   211
end
4397
1378e3c79c34 util.dataforms: Add field verification logic
Florian Zeitz <florob@babelmonkeys.de>
parents: 3540
diff changeset
   212
6832
22522443982f util.dataforms: Refactor parsing to reuse simple text parser instead of duplicate code
Kim Alvefur <zash@zash.se>
parents: 6780
diff changeset
   213
field_readers["text-single"] = simple_text;
22522443982f util.dataforms: Refactor parsing to reuse simple text parser instead of duplicate code
Kim Alvefur <zash@zash.se>
parents: 6780
diff changeset
   214
22522443982f util.dataforms: Refactor parsing to reuse simple text parser instead of duplicate code
Kim Alvefur <zash@zash.se>
parents: 6780
diff changeset
   215
field_readers["text-private"] = simple_text;
955
98ca5a753fee util.dataforms: Support for retriving the field value data from forms
Matthew Wild <mwild1@gmail.com>
parents: 954
diff changeset
   216
1944
754eebd31538 util.dataforms: Support for jid-single field type especially for Florob :)
Matthew Wild <mwild1@gmail.com>
parents: 1522
diff changeset
   217
field_readers["jid-single"] =
4884
b8d852aea3ad util.dataforms: Do field validation and normalization in field readers.
Kim Alvefur <zash@zash.se>
parents: 4435
diff changeset
   218
	function (field_tag, required)
6832
22522443982f util.dataforms: Refactor parsing to reuse simple text parser instead of duplicate code
Kim Alvefur <zash@zash.se>
parents: 6780
diff changeset
   219
		local raw_data, err = simple_text(field_tag, required);
22522443982f util.dataforms: Refactor parsing to reuse simple text parser instead of duplicate code
Kim Alvefur <zash@zash.se>
parents: 6780
diff changeset
   220
		if not raw_data then return raw_data, err; end
4884
b8d852aea3ad util.dataforms: Do field validation and normalization in field readers.
Kim Alvefur <zash@zash.se>
parents: 4435
diff changeset
   221
		local data = jid_prep(raw_data);
6832
22522443982f util.dataforms: Refactor parsing to reuse simple text parser instead of duplicate code
Kim Alvefur <zash@zash.se>
parents: 6780
diff changeset
   222
		if not data then
4887
4dd61fe04db4 util.dataforms: Don't return invalid JIDs in jid-single.
Kim Alvefur <zash@zash.se>
parents: 4886
diff changeset
   223
			return nil, "Invalid JID: " .. raw_data;
4397
1378e3c79c34 util.dataforms: Add field verification logic
Florian Zeitz <florob@babelmonkeys.de>
parents: 3540
diff changeset
   224
		end
6832
22522443982f util.dataforms: Refactor parsing to reuse simple text parser instead of duplicate code
Kim Alvefur <zash@zash.se>
parents: 6780
diff changeset
   225
		return data;
4397
1378e3c79c34 util.dataforms: Add field verification logic
Florian Zeitz <florob@babelmonkeys.de>
parents: 3540
diff changeset
   226
	end
1378e3c79c34 util.dataforms: Add field verification logic
Florian Zeitz <florob@babelmonkeys.de>
parents: 3540
diff changeset
   227
3540
bc139431830b Monster whitespace commit (beware the whitespace monster).
Waqas Hussain <waqas20@gmail.com>
parents: 3380
diff changeset
   228
field_readers["jid-multi"] =
4884
b8d852aea3ad util.dataforms: Do field validation and normalization in field readers.
Kim Alvefur <zash@zash.se>
parents: 4435
diff changeset
   229
	function (field_tag, required)
2070
25dc4b9d06b1 util.dataforms: Support for jid-multi field type
Florian Zeitz
parents: 2061
diff changeset
   230
		local result = {};
4884
b8d852aea3ad util.dataforms: Do field validation and normalization in field readers.
Kim Alvefur <zash@zash.se>
parents: 4435
diff changeset
   231
		local err = {};
b8d852aea3ad util.dataforms: Do field validation and normalization in field readers.
Kim Alvefur <zash@zash.se>
parents: 4435
diff changeset
   232
		for value_tag in field_tag:childtags("value") do
b8d852aea3ad util.dataforms: Do field validation and normalization in field readers.
Kim Alvefur <zash@zash.se>
parents: 4435
diff changeset
   233
			local raw_value = value_tag:get_text();
b8d852aea3ad util.dataforms: Do field validation and normalization in field readers.
Kim Alvefur <zash@zash.se>
parents: 4435
diff changeset
   234
			local value = jid_prep(raw_value);
b8d852aea3ad util.dataforms: Do field validation and normalization in field readers.
Kim Alvefur <zash@zash.se>
parents: 4435
diff changeset
   235
			result[#result+1] = value;
b8d852aea3ad util.dataforms: Do field validation and normalization in field readers.
Kim Alvefur <zash@zash.se>
parents: 4435
diff changeset
   236
			if raw_value and not value then
b8d852aea3ad util.dataforms: Do field validation and normalization in field readers.
Kim Alvefur <zash@zash.se>
parents: 4435
diff changeset
   237
				err[#err+1] = ("Invalid JID: " .. raw_value);
2070
25dc4b9d06b1 util.dataforms: Support for jid-multi field type
Florian Zeitz
parents: 2061
diff changeset
   238
			end
25dc4b9d06b1 util.dataforms: Support for jid-multi field type
Florian Zeitz
parents: 2061
diff changeset
   239
		end
4884
b8d852aea3ad util.dataforms: Do field validation and normalization in field readers.
Kim Alvefur <zash@zash.se>
parents: 4435
diff changeset
   240
		if #result > 0 then
b8d852aea3ad util.dataforms: Do field validation and normalization in field readers.
Kim Alvefur <zash@zash.se>
parents: 4435
diff changeset
   241
			return result, (#err > 0 and t_concat(err, "\n") or nil);
b8d852aea3ad util.dataforms: Do field validation and normalization in field readers.
Kim Alvefur <zash@zash.se>
parents: 4435
diff changeset
   242
		elseif required then
b8d852aea3ad util.dataforms: Do field validation and normalization in field readers.
Kim Alvefur <zash@zash.se>
parents: 4435
diff changeset
   243
			return nil, "Required value missing";
4397
1378e3c79c34 util.dataforms: Add field verification logic
Florian Zeitz <florob@babelmonkeys.de>
parents: 3540
diff changeset
   244
		end
1378e3c79c34 util.dataforms: Add field verification logic
Florian Zeitz <florob@babelmonkeys.de>
parents: 3540
diff changeset
   245
	end
1378e3c79c34 util.dataforms: Add field verification logic
Florian Zeitz <florob@babelmonkeys.de>
parents: 3540
diff changeset
   246
4884
b8d852aea3ad util.dataforms: Do field validation and normalization in field readers.
Kim Alvefur <zash@zash.se>
parents: 4435
diff changeset
   247
field_readers["list-multi"] =
b8d852aea3ad util.dataforms: Do field validation and normalization in field readers.
Kim Alvefur <zash@zash.se>
parents: 4435
diff changeset
   248
	function (field_tag, required)
955
98ca5a753fee util.dataforms: Support for retriving the field value data from forms
Matthew Wild <mwild1@gmail.com>
parents: 954
diff changeset
   249
		local result = {};
4884
b8d852aea3ad util.dataforms: Do field validation and normalization in field readers.
Kim Alvefur <zash@zash.se>
parents: 4435
diff changeset
   250
		for value in field_tag:childtags("value") do
4928
5211c11dd865 util.dataforms: Fix parsing of -multi fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4887
diff changeset
   251
			result[#result+1] = value:get_text();
955
98ca5a753fee util.dataforms: Support for retriving the field value data from forms
Matthew Wild <mwild1@gmail.com>
parents: 954
diff changeset
   252
		end
5693
ef490e9276df util.dataforms: Return nil for empty list-mutli responses, to be consistent with other readers
Florian Zeitz <florob@babelmonkeys.de>
parents: 5551
diff changeset
   253
		if #result > 0 then
ef490e9276df util.dataforms: Return nil for empty list-mutli responses, to be consistent with other readers
Florian Zeitz <florob@babelmonkeys.de>
parents: 5551
diff changeset
   254
			return result;
ef490e9276df util.dataforms: Return nil for empty list-mutli responses, to be consistent with other readers
Florian Zeitz <florob@babelmonkeys.de>
parents: 5551
diff changeset
   255
		elseif required then
ef490e9276df util.dataforms: Return nil for empty list-mutli responses, to be consistent with other readers
Florian Zeitz <florob@babelmonkeys.de>
parents: 5551
diff changeset
   256
			return nil, "Required value missing";
ef490e9276df util.dataforms: Return nil for empty list-mutli responses, to be consistent with other readers
Florian Zeitz <florob@babelmonkeys.de>
parents: 5551
diff changeset
   257
		end
955
98ca5a753fee util.dataforms: Support for retriving the field value data from forms
Matthew Wild <mwild1@gmail.com>
parents: 954
diff changeset
   258
	end
98ca5a753fee util.dataforms: Support for retriving the field value data from forms
Matthew Wild <mwild1@gmail.com>
parents: 954
diff changeset
   259
4884
b8d852aea3ad util.dataforms: Do field validation and normalization in field readers.
Kim Alvefur <zash@zash.se>
parents: 4435
diff changeset
   260
field_readers["text-multi"] =
b8d852aea3ad util.dataforms: Do field validation and normalization in field readers.
Kim Alvefur <zash@zash.se>
parents: 4435
diff changeset
   261
	function (field_tag, required)
b8d852aea3ad util.dataforms: Do field validation and normalization in field readers.
Kim Alvefur <zash@zash.se>
parents: 4435
diff changeset
   262
		local data, err = field_readers["list-multi"](field_tag, required);
b8d852aea3ad util.dataforms: Do field validation and normalization in field readers.
Kim Alvefur <zash@zash.se>
parents: 4435
diff changeset
   263
		if data then
b8d852aea3ad util.dataforms: Do field validation and normalization in field readers.
Kim Alvefur <zash@zash.se>
parents: 4435
diff changeset
   264
			data = t_concat(data, "\n");
b8d852aea3ad util.dataforms: Do field validation and normalization in field readers.
Kim Alvefur <zash@zash.se>
parents: 4435
diff changeset
   265
		end
b8d852aea3ad util.dataforms: Do field validation and normalization in field readers.
Kim Alvefur <zash@zash.se>
parents: 4435
diff changeset
   266
		return data, err;
b8d852aea3ad util.dataforms: Do field validation and normalization in field readers.
Kim Alvefur <zash@zash.se>
parents: 4435
diff changeset
   267
	end
4397
1378e3c79c34 util.dataforms: Add field verification logic
Florian Zeitz <florob@babelmonkeys.de>
parents: 3540
diff changeset
   268
6832
22522443982f util.dataforms: Refactor parsing to reuse simple text parser instead of duplicate code
Kim Alvefur <zash@zash.se>
parents: 6780
diff changeset
   269
field_readers["list-single"] = simple_text;
1958
e2b0026143c4 util.dataforms: Incorporate slightly modified patch for list-single type from Florob
Matthew Wild <mwild1@gmail.com>
parents: 1945
diff changeset
   270
4928
5211c11dd865 util.dataforms: Fix parsing of -multi fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4887
diff changeset
   271
local boolean_values = {
5211c11dd865 util.dataforms: Fix parsing of -multi fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4887
diff changeset
   272
	["1"] = true, ["true"] = true,
5211c11dd865 util.dataforms: Fix parsing of -multi fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4887
diff changeset
   273
	["0"] = false, ["false"] = false,
5211c11dd865 util.dataforms: Fix parsing of -multi fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4887
diff changeset
   274
};
4397
1378e3c79c34 util.dataforms: Add field verification logic
Florian Zeitz <florob@babelmonkeys.de>
parents: 3540
diff changeset
   275
3540
bc139431830b Monster whitespace commit (beware the whitespace monster).
Waqas Hussain <waqas20@gmail.com>
parents: 3380
diff changeset
   276
field_readers["boolean"] =
4884
b8d852aea3ad util.dataforms: Do field validation and normalization in field readers.
Kim Alvefur <zash@zash.se>
parents: 4435
diff changeset
   277
	function (field_tag, required)
6832
22522443982f util.dataforms: Refactor parsing to reuse simple text parser instead of duplicate code
Kim Alvefur <zash@zash.se>
parents: 6780
diff changeset
   278
		local raw_value, err = simple_text(field_tag, required);
22522443982f util.dataforms: Refactor parsing to reuse simple text parser instead of duplicate code
Kim Alvefur <zash@zash.se>
parents: 6780
diff changeset
   279
		if not raw_value then return raw_value, err; end
22522443982f util.dataforms: Refactor parsing to reuse simple text parser instead of duplicate code
Kim Alvefur <zash@zash.se>
parents: 6780
diff changeset
   280
		local value = boolean_values[raw_value];
22522443982f util.dataforms: Refactor parsing to reuse simple text parser instead of duplicate code
Kim Alvefur <zash@zash.se>
parents: 6780
diff changeset
   281
		if value == nil then
22522443982f util.dataforms: Refactor parsing to reuse simple text parser instead of duplicate code
Kim Alvefur <zash@zash.se>
parents: 6780
diff changeset
   282
			return nil, "Invalid boolean representation:" .. raw_value;
4397
1378e3c79c34 util.dataforms: Add field verification logic
Florian Zeitz <florob@babelmonkeys.de>
parents: 3540
diff changeset
   283
		end
6832
22522443982f util.dataforms: Refactor parsing to reuse simple text parser instead of duplicate code
Kim Alvefur <zash@zash.se>
parents: 6780
diff changeset
   284
		return value;
4397
1378e3c79c34 util.dataforms: Add field verification logic
Florian Zeitz <florob@babelmonkeys.de>
parents: 3540
diff changeset
   285
	end
1378e3c79c34 util.dataforms: Add field verification logic
Florian Zeitz <florob@babelmonkeys.de>
parents: 3540
diff changeset
   286
3540
bc139431830b Monster whitespace commit (beware the whitespace monster).
Waqas Hussain <waqas20@gmail.com>
parents: 3380
diff changeset
   287
field_readers["hidden"] =
955
98ca5a753fee util.dataforms: Support for retriving the field value data from forms
Matthew Wild <mwild1@gmail.com>
parents: 954
diff changeset
   288
	function (field_tag)
4884
b8d852aea3ad util.dataforms: Do field validation and normalization in field readers.
Kim Alvefur <zash@zash.se>
parents: 4435
diff changeset
   289
		return field_tag:get_child_text("value");
955
98ca5a753fee util.dataforms: Support for retriving the field value data from forms
Matthew Wild <mwild1@gmail.com>
parents: 954
diff changeset
   290
	end
4397
1378e3c79c34 util.dataforms: Add field verification logic
Florian Zeitz <florob@babelmonkeys.de>
parents: 3540
diff changeset
   291
9246
a4c52e304e6f util.dataforms: Add support for XEP-0122: Data Forms Validation
Kim Alvefur <zash@zash.se>
parents: 9245
diff changeset
   292
data_validators["xs:integer"] =
a4c52e304e6f util.dataforms: Add support for XEP-0122: Data Forms Validation
Kim Alvefur <zash@zash.se>
parents: 9245
diff changeset
   293
	function (data)
a4c52e304e6f util.dataforms: Add support for XEP-0122: Data Forms Validation
Kim Alvefur <zash@zash.se>
parents: 9245
diff changeset
   294
		local n = tonumber(data);
a4c52e304e6f util.dataforms: Add support for XEP-0122: Data Forms Validation
Kim Alvefur <zash@zash.se>
parents: 9245
diff changeset
   295
		if not n then
a4c52e304e6f util.dataforms: Add support for XEP-0122: Data Forms Validation
Kim Alvefur <zash@zash.se>
parents: 9245
diff changeset
   296
			return false, "not a number";
a4c52e304e6f util.dataforms: Add support for XEP-0122: Data Forms Validation
Kim Alvefur <zash@zash.se>
parents: 9245
diff changeset
   297
		elseif n % 1 ~= 0 then
a4c52e304e6f util.dataforms: Add support for XEP-0122: Data Forms Validation
Kim Alvefur <zash@zash.se>
parents: 9245
diff changeset
   298
			return false, "not an integer";
a4c52e304e6f util.dataforms: Add support for XEP-0122: Data Forms Validation
Kim Alvefur <zash@zash.se>
parents: 9245
diff changeset
   299
		end
a4c52e304e6f util.dataforms: Add support for XEP-0122: Data Forms Validation
Kim Alvefur <zash@zash.se>
parents: 9245
diff changeset
   300
		return true, n;
a4c52e304e6f util.dataforms: Add support for XEP-0122: Data Forms Validation
Kim Alvefur <zash@zash.se>
parents: 9245
diff changeset
   301
	end
a4c52e304e6f util.dataforms: Add support for XEP-0122: Data Forms Validation
Kim Alvefur <zash@zash.se>
parents: 9245
diff changeset
   302
8867
cf2f66b233d1 util.dataforms: Add a simple function for identifying form types
Kim Alvefur <zash@zash.se>
parents: 8866
diff changeset
   303
cf2f66b233d1 util.dataforms: Add a simple function for identifying form types
Kim Alvefur <zash@zash.se>
parents: 8866
diff changeset
   304
local function get_form_type(form)
cf2f66b233d1 util.dataforms: Add a simple function for identifying form types
Kim Alvefur <zash@zash.se>
parents: 8866
diff changeset
   305
	if not st.is_stanza(form) then
cf2f66b233d1 util.dataforms: Add a simple function for identifying form types
Kim Alvefur <zash@zash.se>
parents: 8866
diff changeset
   306
		return nil, "not a stanza object";
cf2f66b233d1 util.dataforms: Add a simple function for identifying form types
Kim Alvefur <zash@zash.se>
parents: 8866
diff changeset
   307
	elseif form.attr.xmlns ~= "jabber:x:data" or form.name ~= "x" then
cf2f66b233d1 util.dataforms: Add a simple function for identifying form types
Kim Alvefur <zash@zash.se>
parents: 8866
diff changeset
   308
		return nil, "not a dataform element";
cf2f66b233d1 util.dataforms: Add a simple function for identifying form types
Kim Alvefur <zash@zash.se>
parents: 8866
diff changeset
   309
	end
cf2f66b233d1 util.dataforms: Add a simple function for identifying form types
Kim Alvefur <zash@zash.se>
parents: 8866
diff changeset
   310
	for field in form:childtags("field") do
cf2f66b233d1 util.dataforms: Add a simple function for identifying form types
Kim Alvefur <zash@zash.se>
parents: 8866
diff changeset
   311
		if field.attr.var == "FORM_TYPE" then
cf2f66b233d1 util.dataforms: Add a simple function for identifying form types
Kim Alvefur <zash@zash.se>
parents: 8866
diff changeset
   312
			return field:get_child_text("value");
cf2f66b233d1 util.dataforms: Add a simple function for identifying form types
Kim Alvefur <zash@zash.se>
parents: 8866
diff changeset
   313
		end
cf2f66b233d1 util.dataforms: Add a simple function for identifying form types
Kim Alvefur <zash@zash.se>
parents: 8866
diff changeset
   314
	end
cf2f66b233d1 util.dataforms: Add a simple function for identifying form types
Kim Alvefur <zash@zash.se>
parents: 8866
diff changeset
   315
	return "";
cf2f66b233d1 util.dataforms: Add a simple function for identifying form types
Kim Alvefur <zash@zash.se>
parents: 8866
diff changeset
   316
end
cf2f66b233d1 util.dataforms: Add a simple function for identifying form types
Kim Alvefur <zash@zash.se>
parents: 8866
diff changeset
   317
6780
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6675
diff changeset
   318
return {
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6675
diff changeset
   319
	new = new;
8867
cf2f66b233d1 util.dataforms: Add a simple function for identifying form types
Kim Alvefur <zash@zash.se>
parents: 8866
diff changeset
   320
	get_type = get_form_type;
6780
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6675
diff changeset
   321
};
845
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   322
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   323
951
4b9207949735 util.dataforms: Fixed to actually work, mostly
Matthew Wild <mwild1@gmail.com>
parents: 851
diff changeset
   324
--[=[
845
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   325
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   326
Layout:
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   327
{
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   328
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   329
	title = "MUC Configuration",
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   330
	instructions = [[Use this form to configure options for this MUC room.]],
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   331
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   332
	{ name = "FORM_TYPE", type = "hidden", required = true };
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   333
	{ name = "field-name", type = "field-type", required = false };
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   334
}
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   335
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   336
951
4b9207949735 util.dataforms: Fixed to actually work, mostly
Matthew Wild <mwild1@gmail.com>
parents: 851
diff changeset
   337
--]=]