Software /
code /
prosody
Comparison
util/dataforms.lua @ 4397:1378e3c79c34
util.dataforms: Add field verification logic
author | Florian Zeitz <florob@babelmonkeys.de> |
---|---|
date | Thu, 11 Aug 2011 23:58:26 +0200 |
parent | 3540:bc139431830b |
child | 4434:51a7c85751b9 |
comparison
equal
deleted
inserted
replaced
4396:03b59a511671 | 4397:1378e3c79c34 |
---|---|
6 -- COPYING file in the source package for more information. | 6 -- COPYING file in the source package for more information. |
7 -- | 7 -- |
8 | 8 |
9 local setmetatable = setmetatable; | 9 local setmetatable = setmetatable; |
10 local pairs, ipairs = pairs, ipairs; | 10 local pairs, ipairs = pairs, ipairs; |
11 local tostring, type = tostring, type; | 11 local tostring, type, next = tostring, type, next; |
12 local t_concat = table.concat; | 12 local t_concat = table.concat; |
13 local st = require "util.stanza"; | 13 local st = require "util.stanza"; |
14 local jid_prep = require "util.jid".prep; | |
14 | 15 |
15 module "dataforms" | 16 module "dataforms" |
16 | 17 |
17 local xmlns_forms = 'jabber:x:data'; | 18 local xmlns_forms = 'jabber:x:data'; |
18 | 19 |
102 end | 103 end |
103 return form; | 104 return form; |
104 end | 105 end |
105 | 106 |
106 local field_readers = {}; | 107 local field_readers = {}; |
108 local field_verifiers = {}; | |
107 | 109 |
108 function form_t.data(layout, stanza) | 110 function form_t.data(layout, stanza) |
109 local data = {}; | 111 local data = {}; |
110 | 112 local errors = {}; |
111 for field_tag in stanza:childtags() do | 113 |
112 local field_type; | 114 for _, field in ipairs(layout) do |
113 for n, field in ipairs(layout) do | 115 local tag; |
116 for field_tag in stanza:childtags() do | |
114 if field.name == field_tag.attr.var then | 117 if field.name == field_tag.attr.var then |
115 field_type = field.type; | 118 tag = field_tag; |
116 break; | 119 break; |
117 end | 120 end |
118 end | 121 end |
119 | 122 |
120 local reader = field_readers[field_type]; | 123 local reader = field_readers[field.type]; |
124 local verifier = field.verifier or field_verifiers[field.type]; | |
121 if reader then | 125 if reader then |
122 data[field_tag.attr.var] = reader(field_tag); | 126 data[field.name] = reader(tag); |
123 end | 127 if verifier then |
124 | 128 errors[field.name] = verifier(data[field.name], tag, field.required); |
129 end | |
130 end | |
131 end | |
132 if next(errors) then | |
133 return data, errors; | |
125 end | 134 end |
126 return data; | 135 return data; |
127 end | 136 end |
128 | 137 |
129 field_readers["text-single"] = | 138 field_readers["text-single"] = |
132 if value then | 141 if value then |
133 return value[1]; | 142 return value[1]; |
134 end | 143 end |
135 end | 144 end |
136 | 145 |
146 field_verifiers["text-single"] = | |
147 function (data, field_tag, required) | |
148 if ((not data) or (#data == 0)) and required then | |
149 return "Required value missing"; | |
150 end | |
151 end | |
152 | |
137 field_readers["text-private"] = | 153 field_readers["text-private"] = |
138 field_readers["text-single"]; | 154 field_readers["text-single"]; |
139 | 155 |
156 field_verifiers["text-private"] = | |
157 field_verifiers["text-single"]; | |
158 | |
140 field_readers["jid-single"] = | 159 field_readers["jid-single"] = |
141 field_readers["text-single"]; | 160 field_readers["text-single"]; |
161 | |
162 field_verifiers["jid-single"] = | |
163 function (data, field_tag, required) | |
164 if #data == 0 and required then | |
165 return "Required value missing"; | |
166 end | |
167 if not jid_prep(data) then | |
168 return "Invalid JID"; | |
169 end | |
170 end | |
142 | 171 |
143 field_readers["jid-multi"] = | 172 field_readers["jid-multi"] = |
144 function (field_tag) | 173 function (field_tag) |
145 local result = {}; | 174 local result = {}; |
146 for value_tag in field_tag:childtags() do | 175 for value_tag in field_tag:childtags() do |
149 end | 178 end |
150 end | 179 end |
151 return result; | 180 return result; |
152 end | 181 end |
153 | 182 |
183 field_verifiers["jid-multi"] = | |
184 function (data, field_tag, required) | |
185 if #data == 0 and required then | |
186 return "Required value missing"; | |
187 end | |
188 | |
189 for _, jid in ipairs(data) do | |
190 if not jid_prep(jid) then | |
191 return "Invalid JID"; | |
192 end | |
193 end | |
194 end | |
195 | |
154 field_readers["text-multi"] = | 196 field_readers["text-multi"] = |
155 function (field_tag) | 197 function (field_tag) |
156 local result = {}; | 198 local result = {}; |
157 for value_tag in field_tag:childtags() do | 199 for value_tag in field_tag:childtags() do |
158 if value_tag.name == "value" then | 200 if value_tag.name == "value" then |
160 end | 202 end |
161 end | 203 end |
162 return t_concat(result, "\n"); | 204 return t_concat(result, "\n"); |
163 end | 205 end |
164 | 206 |
207 field_verifiers["text-multi"] = | |
208 field_verifiers["text-single"]; | |
209 | |
165 field_readers["list-single"] = | 210 field_readers["list-single"] = |
166 field_readers["text-single"]; | 211 field_readers["text-single"]; |
212 | |
213 field_verifiers["list-single"] = | |
214 field_verifiers["text-single"]; | |
167 | 215 |
168 field_readers["list-multi"] = | 216 field_readers["list-multi"] = |
169 function (field_tag) | 217 function (field_tag) |
170 local result = {}; | 218 local result = {}; |
171 for value_tag in field_tag:childtags() do | 219 for value_tag in field_tag:childtags() do |
174 end | 222 end |
175 end | 223 end |
176 return result; | 224 return result; |
177 end | 225 end |
178 | 226 |
227 field_verifiers["list-multi"] = | |
228 function (data, field_tag, required) | |
229 if #data == 0 and required then | |
230 return "Required value missing"; | |
231 end | |
232 end | |
233 | |
179 field_readers["boolean"] = | 234 field_readers["boolean"] = |
180 function (field_tag) | 235 function (field_tag) |
181 local value = field_tag:child_with_name("value"); | 236 local value = field_tag:child_with_name("value"); |
182 if value then | 237 if value then |
183 if value[1] == "1" or value[1] == "true" then | 238 if value[1] == "1" or value[1] == "true" then |
186 return false; | 241 return false; |
187 end | 242 end |
188 end | 243 end |
189 end | 244 end |
190 | 245 |
246 field_verifiers["boolean"] = | |
247 function (data, field_tag, required) | |
248 data = field_readers["text-single"](field_tag); | |
249 if #data == 0 and required then | |
250 return "Required value missing"; | |
251 end | |
252 if data ~= "1" and data ~= "true" and data ~= "0" and data ~= "false" then | |
253 return "Invalid boolean representation"; | |
254 end | |
255 end | |
256 | |
191 field_readers["hidden"] = | 257 field_readers["hidden"] = |
192 function (field_tag) | 258 function (field_tag) |
193 local value = field_tag:child_with_name("value"); | 259 local value = field_tag:child_with_name("value"); |
194 if value then | 260 if value then |
195 return value[1]; | 261 return value[1]; |
196 end | 262 end |
263 end | |
264 | |
265 field_verifiers["hidden"] = | |
266 function (data, field_tag, required) | |
267 return nil; | |
197 end | 268 end |
198 | 269 |
199 return _M; | 270 return _M; |
200 | 271 |
201 | 272 |