util/dataforms.lua
author Matthew Wild <mwild1@gmail.com>
Wed, 27 Mar 2024 15:35:15 +0000
branch0.12
changeset 13469 54a936345aaa
parent 11885 2138fc13d53a
child 12979 d10957394a3c
permissions -rw-r--r--
prosodyctl check: Warn about invalid domain names in the config file This ensures that domain names of virtual hosts and components are valid in XMPP, and that they are encoded correctly.
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;
11074
f7f30a3464fe util.dataforms: Add support for validating (integer) ranges
Kim Alvefur <zash@zash.se>
parents: 11030
diff changeset
    13
local tostring = tostring;
954
72e4639c9310 util.dataforms: Fixes for hidden field type
Matthew Wild <mwild1@gmail.com>
parents: 953
diff changeset
    14
local t_concat = table.concat;
951
4b9207949735 util.dataforms: Fixed to actually work, mostly
Matthew Wild <mwild1@gmail.com>
parents: 851
diff changeset
    15
local st = require "util.stanza";
4397
1378e3c79c34 util.dataforms: Add field verification logic
Florian Zeitz <florob@babelmonkeys.de>
parents: 3540
diff changeset
    16
local jid_prep = require "util.jid".prep;
11878
84f4c6957d62 util.dataforms: Add support for datetime field types via XEP-0122
Kim Alvefur <zash@zash.se>
parents: 11634
diff changeset
    17
local datetime = require "util.datetime";
845
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    18
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
    19
local _ENV = nil;
8558
4f0f5b49bb03 vairious: Add annotation when an empty environment is set [luacheck]
Kim Alvefur <zash@zash.se>
parents: 8258
diff changeset
    20
-- luacheck: std none
845
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    21
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    22
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
    23
local xmlns_validate = 'http://jabber.org/protocol/xdata-validate';
845
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    24
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    25
local form_t = {};
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    26
local form_mt = { __index = form_t };
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    27
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
    28
local function new(layout)
845
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    29
	return setmetatable(layout, form_mt);
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    30
end
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    31
2488
08bfd7c96531 util.dataforms: Add optional type parameters (defaults to 'form')
Matthew Wild <mwild1@gmail.com>
parents: 2219
diff changeset
    32
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
    33
	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
    34
	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
    35
	if formtype == "cancel" then
3a7a0b9f42f3 util.dataforms: Skip all fields for the 'cancel' form type
Kim Alvefur <zash@zash.se>
parents: 9091
diff changeset
    36
		return form;
3a7a0b9f42f3 util.dataforms: Skip all fields for the 'cancel' form type
Kim Alvefur <zash@zash.se>
parents: 9091
diff changeset
    37
	end
9093
56c52cb4d44e util.dataforms: Exclude descriptive text fields from forms of type 'submit'
Kim Alvefur <zash@zash.se>
parents: 9092
diff changeset
    38
	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
    39
		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
    40
			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
    41
		end
56c52cb4d44e util.dataforms: Exclude descriptive text fields from forms of type 'submit'
Kim Alvefur <zash@zash.se>
parents: 9092
diff changeset
    42
		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
    43
			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
    44
		end
951
4b9207949735 util.dataforms: Fixed to actually work, mostly
Matthew Wild <mwild1@gmail.com>
parents: 851
diff changeset
    45
	end
6675
d6a60e74f773 util.dataforms: Rename unused loop counter to '_' [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 6671
diff changeset
    46
	for _, field in ipairs(layout) do
951
4b9207949735 util.dataforms: Fixed to actually work, mostly
Matthew Wild <mwild1@gmail.com>
parents: 851
diff changeset
    47
		local field_type = field.type or "text-single";
845
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    48
		-- 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
    49
		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
    50
9093
56c52cb4d44e util.dataforms: Exclude descriptive text fields from forms of type 'submit'
Kim Alvefur <zash@zash.se>
parents: 9092
diff changeset
    51
		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
    52
			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
    53
				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
    54
			end
8948
cbeb1a045eb6 util.dataforms: Add support for field descriptions in <desc>
Kim Alvefur <zash@zash.se>
parents: 8867
diff changeset
    55
		end
cbeb1a045eb6 util.dataforms: Add support for field descriptions in <desc>
Kim Alvefur <zash@zash.se>
parents: 8867
diff changeset
    56
9246
a4c52e304e6f util.dataforms: Add support for XEP-0122: Data Forms Validation
Kim Alvefur <zash@zash.se>
parents: 9245
diff changeset
    57
		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
    58
			form:tag("validate", { xmlns = xmlns_validate, datatype = field.datatype });
11074
f7f30a3464fe util.dataforms: Add support for validating (integer) ranges
Kim Alvefur <zash@zash.se>
parents: 11030
diff changeset
    59
			if field.range_min or field.range_max then
f7f30a3464fe util.dataforms: Add support for validating (integer) ranges
Kim Alvefur <zash@zash.se>
parents: 11030
diff changeset
    60
				form:tag("range", {
f7f30a3464fe util.dataforms: Add support for validating (integer) ranges
Kim Alvefur <zash@zash.se>
parents: 11030
diff changeset
    61
						min = field.range_min and tostring(field.range_min),
f7f30a3464fe util.dataforms: Add support for validating (integer) ranges
Kim Alvefur <zash@zash.se>
parents: 11030
diff changeset
    62
						max = field.range_max and tostring(field.range_max),
f7f30a3464fe util.dataforms: Add support for validating (integer) ranges
Kim Alvefur <zash@zash.se>
parents: 11030
diff changeset
    63
					}):up();
f7f30a3464fe util.dataforms: Add support for validating (integer) ranges
Kim Alvefur <zash@zash.se>
parents: 11030
diff changeset
    64
			end
9246
a4c52e304e6f util.dataforms: Add support for XEP-0122: Data Forms Validation
Kim Alvefur <zash@zash.se>
parents: 9245
diff changeset
    65
			-- <basic/> assumed
a4c52e304e6f util.dataforms: Add support for XEP-0122: Data Forms Validation
Kim Alvefur <zash@zash.se>
parents: 9245
diff changeset
    66
			form:up();
a4c52e304e6f util.dataforms: Add support for XEP-0122: Data Forms Validation
Kim Alvefur <zash@zash.se>
parents: 9245
diff changeset
    67
		end
a4c52e304e6f util.dataforms: Add support for XEP-0122: Data Forms Validation
Kim Alvefur <zash@zash.se>
parents: 9245
diff changeset
    68
a4c52e304e6f util.dataforms: Add support for XEP-0122: Data Forms Validation
Kim Alvefur <zash@zash.se>
parents: 9245
diff changeset
    69
9097
05979ae1e38a util.dataforms: Only allow overriding of options when passed via the :form method
Kim Alvefur <zash@zash.se>
parents: 9095
diff changeset
    70
		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
    71
		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
    72
8987
fa80b3231a02 util.dataforms: More robust handling of field values, especially booleans
Matthew Wild <mwild1@gmail.com>
parents: 8948
diff changeset
    73
		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
    74
			value = data[field.name];
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5693
diff changeset
    75
9097
05979ae1e38a util.dataforms: Only allow overriding of options when passed via the :form method
Kim Alvefur <zash@zash.se>
parents: 9095
diff changeset
    76
			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
    77
				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
    78
				-- 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
    79
				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
    80
			end
9094
519dea077d20 util.dataforms: Allow passing dynamically generated options as values (fixes traceback)
Kim Alvefur <zash@zash.se>
parents: 9093
diff changeset
    81
		end
519dea077d20 util.dataforms: Allow passing dynamically generated options as values (fixes traceback)
Kim Alvefur <zash@zash.se>
parents: 9093
diff changeset
    82
519dea077d20 util.dataforms: Allow passing dynamically generated options as values (fixes traceback)
Kim Alvefur <zash@zash.se>
parents: 9093
diff changeset
    83
		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
    84
			local defaults = {};
9094
519dea077d20 util.dataforms: Allow passing dynamically generated options as values (fixes traceback)
Kim Alvefur <zash@zash.se>
parents: 9093
diff changeset
    85
			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
    86
				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
    87
					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
    88
					if val.default then
572b6858db03 util.dataforms: Detach generation of options from values (fixes #1177)
Kim Alvefur <zash@zash.se>
parents: 9050
diff changeset
    89
						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
    90
					end
572b6858db03 util.dataforms: Detach generation of options from values (fixes #1177)
Kim Alvefur <zash@zash.se>
parents: 9050
diff changeset
    91
				else
572b6858db03 util.dataforms: Detach generation of options from values (fixes #1177)
Kim Alvefur <zash@zash.se>
parents: 9050
diff changeset
    92
					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
    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
			if not value then
572b6858db03 util.dataforms: Detach generation of options from values (fixes #1177)
Kim Alvefur <zash@zash.se>
parents: 9050
diff changeset
    96
				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
    97
					value = defaults[1];
572b6858db03 util.dataforms: Detach generation of options from values (fixes #1177)
Kim Alvefur <zash@zash.se>
parents: 9050
diff changeset
    98
				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
    99
					value = defaults;
572b6858db03 util.dataforms: Detach generation of options from values (fixes #1177)
Kim Alvefur <zash@zash.se>
parents: 9050
diff changeset
   100
				end
572b6858db03 util.dataforms: Detach generation of options from values (fixes #1177)
Kim Alvefur <zash@zash.se>
parents: 9050
diff changeset
   101
			end
572b6858db03 util.dataforms: Detach generation of options from values (fixes #1177)
Kim Alvefur <zash@zash.se>
parents: 9050
diff changeset
   102
		end
572b6858db03 util.dataforms: Detach generation of options from values (fixes #1177)
Kim Alvefur <zash@zash.se>
parents: 9050
diff changeset
   103
8987
fa80b3231a02 util.dataforms: More robust handling of field values, especially booleans
Matthew Wild <mwild1@gmail.com>
parents: 8948
diff changeset
   104
		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
   105
			if type(value) == "number" then
11882
bf6706057283 util.dataforms: Turn number values into timestamps for datetime fields
Kim Alvefur <zash@zash.se>
parents: 11881
diff changeset
   106
				if field.datatype == "xs:dateTime" then
bf6706057283 util.dataforms: Turn number values into timestamps for datetime fields
Kim Alvefur <zash@zash.se>
parents: 11881
diff changeset
   107
					value = datetime.datetime(value);
bf6706057283 util.dataforms: Turn number values into timestamps for datetime fields
Kim Alvefur <zash@zash.se>
parents: 11881
diff changeset
   108
				elseif field_type == "boolean" then
11881
593b141ba01c util.dataforms: Coerce number values for boolean fields
Kim Alvefur <zash@zash.se>
parents: 11878
diff changeset
   109
					value = value ~= 0;
11884
d30c81b875f2 util.dataforms: Ensure larger integers are serialized as such
Kim Alvefur <zash@zash.se>
parents: 11882
diff changeset
   110
				elseif field.datatype == "xs:double" or field.datatype == "xs:decimal" then
d30c81b875f2 util.dataforms: Ensure larger integers are serialized as such
Kim Alvefur <zash@zash.se>
parents: 11882
diff changeset
   111
					value = ("%f"):format(value);
11881
593b141ba01c util.dataforms: Coerce number values for boolean fields
Kim Alvefur <zash@zash.se>
parents: 11878
diff changeset
   112
				else
11884
d30c81b875f2 util.dataforms: Ensure larger integers are serialized as such
Kim Alvefur <zash@zash.se>
parents: 11882
diff changeset
   113
					value = ("%d"):format(value);
11881
593b141ba01c util.dataforms: Coerce number values for boolean fields
Kim Alvefur <zash@zash.se>
parents: 11878
diff changeset
   114
				end
9246
a4c52e304e6f util.dataforms: Add support for XEP-0122: Data Forms Validation
Kim Alvefur <zash@zash.se>
parents: 9245
diff changeset
   115
			end
2061
e34fdca432a9 util.dataforms: Only add value to rendered form if supplied in the data
Florian Zeitz
parents: 1958
diff changeset
   116
			-- 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
   117
			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
   118
				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
   119
					-- Assume an XML snippet
e34fdca432a9 util.dataforms: Only add value to rendered form if supplied in the data
Florian Zeitz
parents: 1958
diff changeset
   120
					form:tag("value")
e34fdca432a9 util.dataforms: Only add value to rendered form if supplied in the data
Florian Zeitz
parents: 1958
diff changeset
   121
						:add_child(value)
e34fdca432a9 util.dataforms: Only add value to rendered form if supplied in the data
Florian Zeitz
parents: 1958
diff changeset
   122
						:up();
1958
e2b0026143c4 util.dataforms: Incorporate slightly modified patch for list-single type from Florob
Matthew Wild <mwild1@gmail.com>
parents: 1945
diff changeset
   123
				else
8866
64fa8d80c09f util.dataforms: Remove string conversion to let util.stanza validate types
Kim Alvefur <zash@zash.se>
parents: 8558
diff changeset
   124
					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
   125
				end
e34fdca432a9 util.dataforms: Only add value to rendered form if supplied in the data
Florian Zeitz
parents: 1958
diff changeset
   126
			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
   127
				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
   128
			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
   129
				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
   130
			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
   131
				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
   132
					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
   133
				end
e34fdca432a9 util.dataforms: Only add value to rendered form if supplied in the data
Florian Zeitz
parents: 1958
diff changeset
   134
			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
   135
				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
   136
			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
   137
				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
   138
			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
   139
				-- 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
   140
				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
   141
					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
   142
				end
e34fdca432a9 util.dataforms: Only add value to rendered form if supplied in the data
Florian Zeitz
parents: 1958
diff changeset
   143
			elseif field_type == "list-single" then
9114
bc7473fb7ad3 util.dataforms: Normalize indentation
Kim Alvefur <zash@zash.se>
parents: 9097
diff changeset
   144
				form:tag("value"):text(value):up();
3380
e74e80b454a1 util.dataforms: Add list-multi support
Florian Zeitz <florob@babelmonkeys.de>
parents: 3379
diff changeset
   145
			elseif field_type == "list-multi" then
9114
bc7473fb7ad3 util.dataforms: Normalize indentation
Kim Alvefur <zash@zash.se>
parents: 9097
diff changeset
   146
				for _, val in ipairs(value) do
bc7473fb7ad3 util.dataforms: Normalize indentation
Kim Alvefur <zash@zash.se>
parents: 9097
diff changeset
   147
					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
   148
				end
1958
e2b0026143c4 util.dataforms: Incorporate slightly modified patch for list-single type from Florob
Matthew Wild <mwild1@gmail.com>
parents: 1945
diff changeset
   149
			end
845
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   150
		end
6148
7dcd6f124c93 util.dataforms: Add support for XEP-0221: Data Forms Media Element
Kim Alvefur <zash@zash.se>
parents: 5693
diff changeset
   151
7dcd6f124c93 util.dataforms: Add support for XEP-0221: Data Forms Media Element
Kim Alvefur <zash@zash.se>
parents: 5693
diff changeset
   152
		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
   153
		if media then
11885
2138fc13d53a util.dataforms: Encode size attributes as integers in XEP-0221 media element
Kim Alvefur <zash@zash.se>
parents: 11884
diff changeset
   154
			form:tag("media", { xmlns = "urn:xmpp:media-element", height = ("%d"):format(media.height), width = ("%d"):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
   155
			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
   156
				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
   157
			end
7dcd6f124c93 util.dataforms: Add support for XEP-0221: Data Forms Media Element
Kim Alvefur <zash@zash.se>
parents: 5693
diff changeset
   158
			form:up();
7dcd6f124c93 util.dataforms: Add support for XEP-0221: Data Forms Media Element
Kim Alvefur <zash@zash.se>
parents: 5693
diff changeset
   159
		end
6149
2ae6e9063e88 Merge 0.9->0.10
Kim Alvefur <zash@zash.se>
parents: 5776 6148
diff changeset
   160
9093
56c52cb4d44e util.dataforms: Exclude descriptive text fields from forms of type 'submit'
Kim Alvefur <zash@zash.se>
parents: 9092
diff changeset
   161
		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
   162
			form:tag("required"):up();
ef648f49e734 util.dataforms: Add support for <required/> fields
Matthew Wild <mwild1@gmail.com>
parents: 951
diff changeset
   163
		end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5693
diff changeset
   164
845
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   165
		-- Jump back up to list of fields
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   166
		form:up();
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   167
	end
851
b48c7ed3f7f8 util.dataforms: Return the form
Matthew Wild <mwild1@gmail.com>
parents: 845
diff changeset
   168
	return form;
845
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   169
end
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   170
955
98ca5a753fee util.dataforms: Support for retriving the field value data from forms
Matthew Wild <mwild1@gmail.com>
parents: 954
diff changeset
   171
local field_readers = {};
9246
a4c52e304e6f util.dataforms: Add support for XEP-0122: Data Forms Validation
Kim Alvefur <zash@zash.se>
parents: 9245
diff changeset
   172
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
   173
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
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
   175
	local data = {};
4397
1378e3c79c34 util.dataforms: Add field verification logic
Florian Zeitz <florob@babelmonkeys.de>
parents: 3540
diff changeset
   176
	local errors = {};
6984
bcaa553de6e8 util.dataforms: Track which fields are included in a form
Kim Alvefur <zash@zash.se>
parents: 6833
diff changeset
   177
	local present = {};
4397
1378e3c79c34 util.dataforms: Add field verification logic
Florian Zeitz <florob@babelmonkeys.de>
parents: 3540
diff changeset
   178
1378e3c79c34 util.dataforms: Add field verification logic
Florian Zeitz <florob@babelmonkeys.de>
parents: 3540
diff changeset
   179
	for _, field in ipairs(layout) do
1378e3c79c34 util.dataforms: Add field verification logic
Florian Zeitz <florob@babelmonkeys.de>
parents: 3540
diff changeset
   180
		local tag;
6470
77d00a895bbd util/dataforms: Make sure we iterate over field tags
daurnimator <quae@daurnimator.com>
parents: 6148
diff changeset
   181
		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
   182
			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
   183
				tag = field_tag;
2219
9e1c6b6a2ee4 util.dataforms: Don't require type when parsing form XML
Florian Zeitz
parents: 2070
diff changeset
   184
				break;
9e1c6b6a2ee4 util.dataforms: Don't require type when parsing form XML
Florian Zeitz
parents: 2070
diff changeset
   185
			end
9e1c6b6a2ee4 util.dataforms: Don't require type when parsing form XML
Florian Zeitz
parents: 2070
diff changeset
   186
		end
4397
1378e3c79c34 util.dataforms: Add field verification logic
Florian Zeitz <florob@babelmonkeys.de>
parents: 3540
diff changeset
   187
4434
51a7c85751b9 util.dataforms: Fix form verification
Florian Zeitz <florob@babelmonkeys.de>
parents: 4397
diff changeset
   188
		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
   189
			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
   190
				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
   191
			elseif field.required then
4434
51a7c85751b9 util.dataforms: Fix form verification
Florian Zeitz <florob@babelmonkeys.de>
parents: 4397
diff changeset
   192
				errors[field.name] = "Required value missing";
51a7c85751b9 util.dataforms: Fix form verification
Florian Zeitz <florob@babelmonkeys.de>
parents: 4397
diff changeset
   193
			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
   194
		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
   195
			present[field.name] = true;
4434
51a7c85751b9 util.dataforms: Fix form verification
Florian Zeitz <florob@babelmonkeys.de>
parents: 4397
diff changeset
   196
			local reader = field_readers[field.type];
51a7c85751b9 util.dataforms: Fix form verification
Florian Zeitz <florob@babelmonkeys.de>
parents: 4397
diff changeset
   197
			if reader then
9246
a4c52e304e6f util.dataforms: Add support for XEP-0122: Data Forms Validation
Kim Alvefur <zash@zash.se>
parents: 9245
diff changeset
   198
				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
   199
				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
   200
				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
   201
					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
   202
					if valid then
a4c52e304e6f util.dataforms: Add support for XEP-0122: Data Forms Validation
Kim Alvefur <zash@zash.se>
parents: 9245
diff changeset
   203
						value = ret;
a4c52e304e6f util.dataforms: Add support for XEP-0122: Data Forms Validation
Kim Alvefur <zash@zash.se>
parents: 9245
diff changeset
   204
					else
9249
397e8e5a2f1f util.dataforms: Improve default error message for failed datatype validation
Kim Alvefur <zash@zash.se>
parents: 9246
diff changeset
   205
						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
   206
					end
a4c52e304e6f util.dataforms: Add support for XEP-0122: Data Forms Validation
Kim Alvefur <zash@zash.se>
parents: 9245
diff changeset
   207
				end
a4c52e304e6f util.dataforms: Add support for XEP-0122: Data Forms Validation
Kim Alvefur <zash@zash.se>
parents: 9245
diff changeset
   208
				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
   209
			end
955
98ca5a753fee util.dataforms: Support for retriving the field value data from forms
Matthew Wild <mwild1@gmail.com>
parents: 954
diff changeset
   210
		end
4397
1378e3c79c34 util.dataforms: Add field verification logic
Florian Zeitz <florob@babelmonkeys.de>
parents: 3540
diff changeset
   211
	end
1378e3c79c34 util.dataforms: Add field verification logic
Florian Zeitz <florob@babelmonkeys.de>
parents: 3540
diff changeset
   212
	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
   213
		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
   214
	end
6984
bcaa553de6e8 util.dataforms: Track which fields are included in a form
Kim Alvefur <zash@zash.se>
parents: 6833
diff changeset
   215
	return data, nil, present;
845
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   216
end
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   217
6832
22522443982f util.dataforms: Refactor parsing to reuse simple text parser instead of duplicate code
Kim Alvefur <zash@zash.se>
parents: 6780
diff changeset
   218
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
   219
	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
   220
	-- 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
   221
	-- 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
   222
	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
   223
		return nil, "Required value missing";
4397
1378e3c79c34 util.dataforms: Add field verification logic
Florian Zeitz <florob@babelmonkeys.de>
parents: 3540
diff changeset
   224
	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
   225
	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
   226
end
4397
1378e3c79c34 util.dataforms: Add field verification logic
Florian Zeitz <florob@babelmonkeys.de>
parents: 3540
diff changeset
   227
6832
22522443982f util.dataforms: Refactor parsing to reuse simple text parser instead of duplicate code
Kim Alvefur <zash@zash.se>
parents: 6780
diff changeset
   228
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
   229
22522443982f util.dataforms: Refactor parsing to reuse simple text parser instead of duplicate code
Kim Alvefur <zash@zash.se>
parents: 6780
diff changeset
   230
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
   231
1944
754eebd31538 util.dataforms: Support for jid-single field type especially for Florob :)
Matthew Wild <mwild1@gmail.com>
parents: 1522
diff changeset
   232
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
   233
	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
   234
		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
   235
		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
   236
		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
   237
		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
   238
			return nil, "Invalid JID: " .. raw_data;
4397
1378e3c79c34 util.dataforms: Add field verification logic
Florian Zeitz <florob@babelmonkeys.de>
parents: 3540
diff changeset
   239
		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
   240
		return data;
4397
1378e3c79c34 util.dataforms: Add field verification logic
Florian Zeitz <florob@babelmonkeys.de>
parents: 3540
diff changeset
   241
	end
1378e3c79c34 util.dataforms: Add field verification logic
Florian Zeitz <florob@babelmonkeys.de>
parents: 3540
diff changeset
   242
3540
bc139431830b Monster whitespace commit (beware the whitespace monster).
Waqas Hussain <waqas20@gmail.com>
parents: 3380
diff changeset
   243
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
   244
	function (field_tag, required)
2070
25dc4b9d06b1 util.dataforms: Support for jid-multi field type
Florian Zeitz
parents: 2061
diff changeset
   245
		local result = {};
4884
b8d852aea3ad util.dataforms: Do field validation and normalization in field readers.
Kim Alvefur <zash@zash.se>
parents: 4435
diff changeset
   246
		local err = {};
b8d852aea3ad util.dataforms: Do field validation and normalization in field readers.
Kim Alvefur <zash@zash.se>
parents: 4435
diff changeset
   247
		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
   248
			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
   249
			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
   250
			result[#result+1] = value;
b8d852aea3ad util.dataforms: Do field validation and normalization in field readers.
Kim Alvefur <zash@zash.se>
parents: 4435
diff changeset
   251
			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
   252
				err[#err+1] = ("Invalid JID: " .. raw_value);
2070
25dc4b9d06b1 util.dataforms: Support for jid-multi field type
Florian Zeitz
parents: 2061
diff changeset
   253
			end
25dc4b9d06b1 util.dataforms: Support for jid-multi field type
Florian Zeitz
parents: 2061
diff changeset
   254
		end
4884
b8d852aea3ad util.dataforms: Do field validation and normalization in field readers.
Kim Alvefur <zash@zash.se>
parents: 4435
diff changeset
   255
		if #result > 0 then
b8d852aea3ad util.dataforms: Do field validation and normalization in field readers.
Kim Alvefur <zash@zash.se>
parents: 4435
diff changeset
   256
			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
   257
		elseif required then
b8d852aea3ad util.dataforms: Do field validation and normalization in field readers.
Kim Alvefur <zash@zash.se>
parents: 4435
diff changeset
   258
			return nil, "Required value missing";
4397
1378e3c79c34 util.dataforms: Add field verification logic
Florian Zeitz <florob@babelmonkeys.de>
parents: 3540
diff changeset
   259
		end
1378e3c79c34 util.dataforms: Add field verification logic
Florian Zeitz <florob@babelmonkeys.de>
parents: 3540
diff changeset
   260
	end
1378e3c79c34 util.dataforms: Add field verification logic
Florian Zeitz <florob@babelmonkeys.de>
parents: 3540
diff changeset
   261
4884
b8d852aea3ad util.dataforms: Do field validation and normalization in field readers.
Kim Alvefur <zash@zash.se>
parents: 4435
diff changeset
   262
field_readers["list-multi"] =
b8d852aea3ad util.dataforms: Do field validation and normalization in field readers.
Kim Alvefur <zash@zash.se>
parents: 4435
diff changeset
   263
	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
   264
		local result = {};
4884
b8d852aea3ad util.dataforms: Do field validation and normalization in field readers.
Kim Alvefur <zash@zash.se>
parents: 4435
diff changeset
   265
		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
   266
			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
   267
		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
   268
		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
   269
			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
   270
		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
   271
			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
   272
		end
955
98ca5a753fee util.dataforms: Support for retriving the field value data from forms
Matthew Wild <mwild1@gmail.com>
parents: 954
diff changeset
   273
	end
98ca5a753fee util.dataforms: Support for retriving the field value data from forms
Matthew Wild <mwild1@gmail.com>
parents: 954
diff changeset
   274
4884
b8d852aea3ad util.dataforms: Do field validation and normalization in field readers.
Kim Alvefur <zash@zash.se>
parents: 4435
diff changeset
   275
field_readers["text-multi"] =
b8d852aea3ad util.dataforms: Do field validation and normalization in field readers.
Kim Alvefur <zash@zash.se>
parents: 4435
diff changeset
   276
	function (field_tag, required)
b8d852aea3ad util.dataforms: Do field validation and normalization in field readers.
Kim Alvefur <zash@zash.se>
parents: 4435
diff changeset
   277
		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
   278
		if data then
b8d852aea3ad util.dataforms: Do field validation and normalization in field readers.
Kim Alvefur <zash@zash.se>
parents: 4435
diff changeset
   279
			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
   280
		end
b8d852aea3ad util.dataforms: Do field validation and normalization in field readers.
Kim Alvefur <zash@zash.se>
parents: 4435
diff changeset
   281
		return data, err;
b8d852aea3ad util.dataforms: Do field validation and normalization in field readers.
Kim Alvefur <zash@zash.se>
parents: 4435
diff changeset
   282
	end
4397
1378e3c79c34 util.dataforms: Add field verification logic
Florian Zeitz <florob@babelmonkeys.de>
parents: 3540
diff changeset
   283
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
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
   285
4928
5211c11dd865 util.dataforms: Fix parsing of -multi fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4887
diff changeset
   286
local boolean_values = {
5211c11dd865 util.dataforms: Fix parsing of -multi fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4887
diff changeset
   287
	["1"] = true, ["true"] = true,
5211c11dd865 util.dataforms: Fix parsing of -multi fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4887
diff changeset
   288
	["0"] = false, ["false"] = false,
5211c11dd865 util.dataforms: Fix parsing of -multi fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4887
diff changeset
   289
};
4397
1378e3c79c34 util.dataforms: Add field verification logic
Florian Zeitz <florob@babelmonkeys.de>
parents: 3540
diff changeset
   290
3540
bc139431830b Monster whitespace commit (beware the whitespace monster).
Waqas Hussain <waqas20@gmail.com>
parents: 3380
diff changeset
   291
field_readers["boolean"] =
4884
b8d852aea3ad util.dataforms: Do field validation and normalization in field readers.
Kim Alvefur <zash@zash.se>
parents: 4435
diff changeset
   292
	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
   293
		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
   294
		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
   295
		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
   296
		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
   297
			return nil, "Invalid boolean representation:" .. raw_value;
4397
1378e3c79c34 util.dataforms: Add field verification logic
Florian Zeitz <florob@babelmonkeys.de>
parents: 3540
diff changeset
   298
		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
   299
		return value;
4397
1378e3c79c34 util.dataforms: Add field verification logic
Florian Zeitz <florob@babelmonkeys.de>
parents: 3540
diff changeset
   300
	end
1378e3c79c34 util.dataforms: Add field verification logic
Florian Zeitz <florob@babelmonkeys.de>
parents: 3540
diff changeset
   301
3540
bc139431830b Monster whitespace commit (beware the whitespace monster).
Waqas Hussain <waqas20@gmail.com>
parents: 3380
diff changeset
   302
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
   303
	function (field_tag)
4884
b8d852aea3ad util.dataforms: Do field validation and normalization in field readers.
Kim Alvefur <zash@zash.se>
parents: 4435
diff changeset
   304
		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
   305
	end
4397
1378e3c79c34 util.dataforms: Add field verification logic
Florian Zeitz <florob@babelmonkeys.de>
parents: 3540
diff changeset
   306
9246
a4c52e304e6f util.dataforms: Add support for XEP-0122: Data Forms Validation
Kim Alvefur <zash@zash.se>
parents: 9245
diff changeset
   307
data_validators["xs:integer"] =
11074
f7f30a3464fe util.dataforms: Add support for validating (integer) ranges
Kim Alvefur <zash@zash.se>
parents: 11030
diff changeset
   308
	function (data, field)
9246
a4c52e304e6f util.dataforms: Add support for XEP-0122: Data Forms Validation
Kim Alvefur <zash@zash.se>
parents: 9245
diff changeset
   309
		local n = tonumber(data);
a4c52e304e6f util.dataforms: Add support for XEP-0122: Data Forms Validation
Kim Alvefur <zash@zash.se>
parents: 9245
diff changeset
   310
		if not n then
a4c52e304e6f util.dataforms: Add support for XEP-0122: Data Forms Validation
Kim Alvefur <zash@zash.se>
parents: 9245
diff changeset
   311
			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
   312
		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
   313
			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
   314
		end
11074
f7f30a3464fe util.dataforms: Add support for validating (integer) ranges
Kim Alvefur <zash@zash.se>
parents: 11030
diff changeset
   315
		if field.range_max and n > field.range_max then
f7f30a3464fe util.dataforms: Add support for validating (integer) ranges
Kim Alvefur <zash@zash.se>
parents: 11030
diff changeset
   316
			return false, "out of bounds";
f7f30a3464fe util.dataforms: Add support for validating (integer) ranges
Kim Alvefur <zash@zash.se>
parents: 11030
diff changeset
   317
		elseif field.range_min and n < field.range_min then
f7f30a3464fe util.dataforms: Add support for validating (integer) ranges
Kim Alvefur <zash@zash.se>
parents: 11030
diff changeset
   318
			return false, "out of bounds";
f7f30a3464fe util.dataforms: Add support for validating (integer) ranges
Kim Alvefur <zash@zash.se>
parents: 11030
diff changeset
   319
		end
9246
a4c52e304e6f util.dataforms: Add support for XEP-0122: Data Forms Validation
Kim Alvefur <zash@zash.se>
parents: 9245
diff changeset
   320
		return true, n;
a4c52e304e6f util.dataforms: Add support for XEP-0122: Data Forms Validation
Kim Alvefur <zash@zash.se>
parents: 9245
diff changeset
   321
	end
a4c52e304e6f util.dataforms: Add support for XEP-0122: Data Forms Validation
Kim Alvefur <zash@zash.se>
parents: 9245
diff changeset
   322
11634
855b065d5fd6 util.dataforms: Define a integer + "max" datatype
Kim Alvefur <zash@zash.se>
parents: 11074
diff changeset
   323
data_validators["pubsub:integer-or-max"] =
855b065d5fd6 util.dataforms: Define a integer + "max" datatype
Kim Alvefur <zash@zash.se>
parents: 11074
diff changeset
   324
	function (data, field)
855b065d5fd6 util.dataforms: Define a integer + "max" datatype
Kim Alvefur <zash@zash.se>
parents: 11074
diff changeset
   325
		if data == "max" then
855b065d5fd6 util.dataforms: Define a integer + "max" datatype
Kim Alvefur <zash@zash.se>
parents: 11074
diff changeset
   326
			return true, data;
855b065d5fd6 util.dataforms: Define a integer + "max" datatype
Kim Alvefur <zash@zash.se>
parents: 11074
diff changeset
   327
		else
855b065d5fd6 util.dataforms: Define a integer + "max" datatype
Kim Alvefur <zash@zash.se>
parents: 11074
diff changeset
   328
			return data_validators["xs:integer"](data, field);
855b065d5fd6 util.dataforms: Define a integer + "max" datatype
Kim Alvefur <zash@zash.se>
parents: 11074
diff changeset
   329
		end
855b065d5fd6 util.dataforms: Define a integer + "max" datatype
Kim Alvefur <zash@zash.se>
parents: 11074
diff changeset
   330
	end
855b065d5fd6 util.dataforms: Define a integer + "max" datatype
Kim Alvefur <zash@zash.se>
parents: 11074
diff changeset
   331
11878
84f4c6957d62 util.dataforms: Add support for datetime field types via XEP-0122
Kim Alvefur <zash@zash.se>
parents: 11634
diff changeset
   332
data_validators["xs:dateTime"] =
84f4c6957d62 util.dataforms: Add support for datetime field types via XEP-0122
Kim Alvefur <zash@zash.se>
parents: 11634
diff changeset
   333
	function(data, field) -- luacheck: ignore 212/field
84f4c6957d62 util.dataforms: Add support for datetime field types via XEP-0122
Kim Alvefur <zash@zash.se>
parents: 11634
diff changeset
   334
		local n = datetime.parse(data);
84f4c6957d62 util.dataforms: Add support for datetime field types via XEP-0122
Kim Alvefur <zash@zash.se>
parents: 11634
diff changeset
   335
		if not n then return false, "invalid timestamp"; end
84f4c6957d62 util.dataforms: Add support for datetime field types via XEP-0122
Kim Alvefur <zash@zash.se>
parents: 11634
diff changeset
   336
		return true, n;
84f4c6957d62 util.dataforms: Add support for datetime field types via XEP-0122
Kim Alvefur <zash@zash.se>
parents: 11634
diff changeset
   337
	end
84f4c6957d62 util.dataforms: Add support for datetime field types via XEP-0122
Kim Alvefur <zash@zash.se>
parents: 11634
diff changeset
   338
8867
cf2f66b233d1 util.dataforms: Add a simple function for identifying form types
Kim Alvefur <zash@zash.se>
parents: 8866
diff changeset
   339
cf2f66b233d1 util.dataforms: Add a simple function for identifying form types
Kim Alvefur <zash@zash.se>
parents: 8866
diff changeset
   340
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
   341
	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
   342
		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
   343
	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
   344
		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
   345
	end
cf2f66b233d1 util.dataforms: Add a simple function for identifying form types
Kim Alvefur <zash@zash.se>
parents: 8866
diff changeset
   346
	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
   347
		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
   348
			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
   349
		end
cf2f66b233d1 util.dataforms: Add a simple function for identifying form types
Kim Alvefur <zash@zash.se>
parents: 8866
diff changeset
   350
	end
cf2f66b233d1 util.dataforms: Add a simple function for identifying form types
Kim Alvefur <zash@zash.se>
parents: 8866
diff changeset
   351
	return "";
cf2f66b233d1 util.dataforms: Add a simple function for identifying form types
Kim Alvefur <zash@zash.se>
parents: 8866
diff changeset
   352
end
cf2f66b233d1 util.dataforms: Add a simple function for identifying form types
Kim Alvefur <zash@zash.se>
parents: 8866
diff changeset
   353
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
   354
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
   355
	new = new;
8867
cf2f66b233d1 util.dataforms: Add a simple function for identifying form types
Kim Alvefur <zash@zash.se>
parents: 8866
diff changeset
   356
	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
   357
};
845
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   358
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   359
951
4b9207949735 util.dataforms: Fixed to actually work, mostly
Matthew Wild <mwild1@gmail.com>
parents: 851
diff changeset
   360
--[=[
845
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   361
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   362
Layout:
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   363
{
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   364
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   365
	title = "MUC Configuration",
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   366
	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
   367
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   368
	{ name = "FORM_TYPE", type = "hidden", required = true };
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   369
	{ name = "field-name", type = "field-type", required = false };
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   370
}
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   371
fc3dced9801e util.dataforms: First commit, incomplete
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   372
951
4b9207949735 util.dataforms: Fixed to actually work, mostly
Matthew Wild <mwild1@gmail.com>
parents: 851
diff changeset
   373
--]=]