Comparison

util/dataforms.lua @ 4884:b8d852aea3ad

util.dataforms: Do field validation and normalization in field readers.
author Kim Alvefur <zash@zash.se>
date Thu, 17 May 2012 21:01:44 +0200
parent 4435:ea69296afaef
child 4886:26d8e4665ce9
comparison
equal deleted inserted replaced
4883:b798d59919b1 4884:b8d852aea3ad
103 end 103 end
104 return form; 104 return form;
105 end 105 end
106 106
107 local field_readers = {}; 107 local field_readers = {};
108 local field_verifiers = {};
109 108
110 function form_t.data(layout, stanza) 109 function form_t.data(layout, stanza)
111 local data = {}; 110 local data = {};
112 local errors = {}; 111 local errors = {};
113 112
124 if field.required then 123 if field.required then
125 errors[field.name] = "Required value missing"; 124 errors[field.name] = "Required value missing";
126 end 125 end
127 else 126 else
128 local reader = field_readers[field.type]; 127 local reader = field_readers[field.type];
129 local verifier = field.verifier or field_verifiers[field.type];
130 if reader then 128 if reader then
131 data[field.name] = reader(tag); 129 data[field.name], errors[field.name] = reader(tag, field.required);
132 if verifier then
133 errors[field.name] = verifier(data[field.name], tag, field.required);
134 end
135 end 130 end
136 end 131 end
137 end 132 end
138 if next(errors) then 133 if next(errors) then
139 return data, errors; 134 return data, errors;
140 end 135 end
141 return data; 136 return data;
142 end 137 end
143 138
144 field_readers["text-single"] = 139 field_readers["text-single"] =
145 function (field_tag) 140 function (field_tag, required)
146 local value = field_tag:child_with_name("value"); 141 local data = field_tag:get_child_text("value");
147 if value then 142 if data and #data > 0 then
148 return value[1]; 143 return data
149 end 144 elseif required then
150 end 145 return nil, "Required value missing";
151
152 field_verifiers["text-single"] =
153 function (data, field_tag, required)
154 if ((not data) or (#data == 0)) and required then
155 return "Required value missing";
156 end 146 end
157 end 147 end
158 148
159 field_readers["text-private"] = 149 field_readers["text-private"] =
160 field_readers["text-single"]; 150 field_readers["text-single"];
161 151
162 field_verifiers["text-private"] =
163 field_verifiers["text-single"];
164
165 field_readers["jid-single"] = 152 field_readers["jid-single"] =
166 field_readers["text-single"]; 153 function (field_tag, required)
167 154 local raw_data = field_tag:get_child_text("value")
168 field_verifiers["jid-single"] = 155 local data = jid_prep(raw_data);
169 function (data, field_tag, required) 156 if data and #data > 0 then
170 if ((not data) or (#data == 0)) and required then 157 return data
171 return "Required value missing"; 158 elseif raw_data then
172 end 159 return raw_data, "Invalid JID";
173 if not jid_prep(data) then 160 elseif required then
174 return "Invalid JID"; 161 return nil, "Required value missing";
175 end 162 end
176 end 163 end
177 164
178 field_readers["jid-multi"] = 165 field_readers["jid-multi"] =
179 function (field_tag) 166 function (field_tag, required)
180 local result = {}; 167 local result = {};
181 for value_tag in field_tag:childtags() do 168 local err = {};
182 if value_tag.name == "value" then 169 for value_tag in field_tag:childtags("value") do
183 result[#result+1] = value_tag[1]; 170 local raw_value = value_tag:get_text();
184 end 171 local value = jid_prep(raw_value);
185 end 172 result[#result+1] = value;
186 return result; 173 if raw_value and not value then
187 end 174 err[#err+1] = ("Invalid JID: " .. raw_value);
188 175 end
189 field_verifiers["jid-multi"] = 176 end
190 function (data, field_tag, required) 177 if #result > 0 then
191 if #data == 0 and required then 178 return result, (#err > 0 and t_concat(err, "\n") or nil);
192 return "Required value missing"; 179 elseif required then
193 end 180 return nil, "Required value missing";
194 181 end
195 for _, jid in ipairs(data) do 182 end
196 if not jid_prep(jid) then 183
197 return "Invalid JID"; 184 field_readers["list-multi"] =
198 end 185 function (field_tag, required)
199 end 186 local result = {};
187 for value in field_tag:childtags("value") do
188 result[#result+1] = value;
189 end
190 return result, (required and #result == 0 and "Required value missing" or nil);
200 end 191 end
201 192
202 field_readers["text-multi"] = 193 field_readers["text-multi"] =
203 function (field_tag) 194 function (field_tag, required)
204 local result = {}; 195 local data, err = field_readers["list-multi"](field_tag, required);
205 for value_tag in field_tag:childtags() do 196 if data then
206 if value_tag.name == "value" then 197 data = t_concat(data, "\n");
207 result[#result+1] = value_tag[1]; 198 end
208 end 199 return data, err;
209 end 200 end
210 return t_concat(result, "\n");
211 end
212
213 field_verifiers["text-multi"] =
214 field_verifiers["text-single"];
215 201
216 field_readers["list-single"] = 202 field_readers["list-single"] =
217 field_readers["text-single"]; 203 field_readers["text-single"];
218 204
219 field_verifiers["list-single"] = 205 local boolean_values = {
220 field_verifiers["text-single"]; 206 ["1"] = true, ["true"] = true,
221 207 ["0"] = false, ["false"] = false,
222 field_readers["list-multi"] = 208 };
223 function (field_tag)
224 local result = {};
225 for value_tag in field_tag:childtags() do
226 if value_tag.name == "value" then
227 result[#result+1] = value_tag[1];
228 end
229 end
230 return result;
231 end
232
233 field_verifiers["list-multi"] =
234 function (data, field_tag, required)
235 if #data == 0 and required then
236 return "Required value missing";
237 end
238 end
239 209
240 field_readers["boolean"] = 210 field_readers["boolean"] =
241 function (field_tag) 211 function (field_tag, required)
242 local value = field_tag:child_with_name("value"); 212 local raw_value = field_tag:get_child_text("value");
243 if value then 213 local value = boolean_values[raw_value ~= nil and raw_value];
244 if value[1] == "1" or value[1] == "true" then 214 if value ~= nil then
245 return true; 215 return value;
246 else 216 elseif raw_value then
247 return false;
248 end
249 end
250 end
251
252 field_verifiers["boolean"] =
253 function (data, field_tag, required)
254 data = field_readers["text-single"](field_tag);
255 if ((not data) or (#data == 0)) and required then
256 return "Required value missing";
257 end
258 if data ~= "1" and data ~= "true" and data ~= "0" and data ~= "false" then
259 return "Invalid boolean representation"; 217 return "Invalid boolean representation";
218 elseif required then
219 return nil, "Required value missing";
260 end 220 end
261 end 221 end
262 222
263 field_readers["hidden"] = 223 field_readers["hidden"] =
264 function (field_tag) 224 function (field_tag)
265 local value = field_tag:child_with_name("value"); 225 return field_tag:get_child_text("value");
266 if value then 226 end
267 return value[1]; 227
268 end
269 end
270
271 field_verifiers["hidden"] =
272 function (data, field_tag, required)
273 return nil;
274 end
275
276 return _M; 228 return _M;
277 229
278 230
279 --[=[ 231 --[=[
280 232