Left: | ||
Right: |
OLD | NEW |
---|---|
1 # Copyright: 2011,2012 MoinMoin:ThomasWaldmann | 1 # Copyright: 2011,2012 MoinMoin:ThomasWaldmann |
2 # License: GNU GPL v2 (or any later version), see LICENSE.txt for details. | 2 # License: GNU GPL v2 (or any later version), see LICENSE.txt for details. |
3 | 3 |
4 """ | 4 """ |
5 MoinMoin - validation for storage meta / data | 5 MoinMoin - validation for storage meta / data |
6 | 6 |
7 validation modes: | 7 validation modes: |
8 | 8 |
9 trusted == False: for metadata coming from user input (like from web form) - | 9 trusted == False: for metadata coming from user input (like from web form) - |
10 in this mode some values will be forced (e.g. mtime, | 10 in this mode some values will be forced (e.g. mtime, |
(...skipping 300 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
311 if not isinstance(v, unicode): | 311 if not isinstance(v, unicode): |
312 return False | 312 return False |
313 if len(v) != keys.HASH_LEN: | 313 if len(v) != keys.HASH_LEN: |
314 return False | 314 return False |
315 try: | 315 try: |
316 int(v, 16) # is this hex? | 316 int(v, 16) # is this hex? |
317 return True | 317 return True |
318 except ValueError: | 318 except ValueError: |
319 return False | 319 return False |
320 | 320 |
321 | |
322 def subscription_validator(element, state): | |
323 """ | |
324 a subscription | |
325 """ | |
326 try: | |
327 keyword, value = element.value.split(":", 1) | |
328 except ValueError: | |
ana.balica
2013/07/15 13:17:36
For cases when there is no colon at all.
| |
329 element.add_error("Subscription must contains colon delimiters.") | |
330 return False | |
331 if keyword in (keys.ITEMID, ): | |
332 pass | |
333 elif keyword in (keys.NAME, keys.TAGS, keys.NAMERE, keys.NAMEPREFIX, ): | |
waldi
2013/07/15 13:37:08
Please actually read PEP-8!
ana.balica
2013/07/15 14:07:07
I read http://www.python.org/dev/peps/pep-0008/ an
| |
334 try: | |
335 namespace, value = value.split(":", 1) | |
336 except ValueError: | |
ana.balica
2013/07/15 13:17:36
Use case when there is a single colon and the keyw
| |
337 element.add_error("Subscription must contain 2 colon delimiters.") | |
338 return False | |
339 namespace_element = String(namespace) | |
340 if not namespace_validator(namespace_element, state): | |
341 element.add_error("Not a valid namespace value.") | |
342 return False | |
343 else: | |
344 element.add_error( | |
345 "Subscription must start with one of the keywords: " | |
346 "'itemid', 'name', 'tags', 'namere' or 'nameprefix'.") | |
347 return False | |
348 value_element = String(value) | |
waldi
2013/07/15 13:37:08
Please add some empty lines.
| |
349 if keyword == keys.ITEMID: | |
350 value_is_valid = uuid_validator(value_element, state) | |
351 elif keyword == keys.TAGS: | |
352 value_is_valid = tag_validator(value_element, state) | |
353 elif keyword == keys.NAME: | |
354 value_is_valid = name_validator(value_element, state) | |
355 else: | |
356 value_is_valid = True | |
357 if not value_is_valid: | |
358 element.add_error("The value is not valid.") | |
359 return False | |
360 return True | |
361 | |
362 | |
321 common_meta = ( | 363 common_meta = ( |
322 String.named(keys.ITEMID).validated_by(itemid_validator), | 364 String.named(keys.ITEMID).validated_by(itemid_validator), |
323 String.named(keys.REVID).validated_by(revid_validator), | 365 String.named(keys.REVID).validated_by(revid_validator), |
324 String.named(keys.PARENTID).validated_by(uuid_validator).using(optional=True ), | 366 String.named(keys.PARENTID).validated_by(uuid_validator).using(optional=True ), |
325 String.named(keys.WIKINAME).using(strip=False).validated_by(wikiname_validat or), | 367 String.named(keys.WIKINAME).using(strip=False).validated_by(wikiname_validat or), |
326 String.named(keys.NAMESPACE).using(strip=False).validated_by(namespace_valid ator), | 368 String.named(keys.NAMESPACE).using(strip=False).validated_by(namespace_valid ator), |
327 List.named(keys.NAME).of(String.using(strip=False).validated_by(name_validat or)).using(optional=True), | 369 List.named(keys.NAME).of(String.using(strip=False).validated_by(name_validat or)).using(optional=True), |
328 List.named(keys.NAME_OLD).of(String.using(strip=False).validated_by(name_val idator)).using(optional=True), | 370 List.named(keys.NAME_OLD).of(String.using(strip=False).validated_by(name_val idator)).using(optional=True), |
329 Integer.named(keys.MTIME).validated_by(mtime_validator), | 371 Integer.named(keys.MTIME).validated_by(mtime_validator), |
330 String.named(keys.ACTION).validated_by(action_validator), | 372 String.named(keys.ACTION).validated_by(action_validator), |
(...skipping 30 matching lines...) Expand all Loading... | |
361 String.named(keys.CSS_URL).using(optional=True), | 403 String.named(keys.CSS_URL).using(optional=True), |
362 Integer.named(keys.RESULTS_PER_PAGE).using(optional=True), | 404 Integer.named(keys.RESULTS_PER_PAGE).using(optional=True), |
363 Integer.named(keys.EDIT_ROWS).using(optional=True), | 405 Integer.named(keys.EDIT_ROWS).using(optional=True), |
364 Boolean.named(keys.DISABLED).using(optional=True), | 406 Boolean.named(keys.DISABLED).using(optional=True), |
365 Boolean.named(keys.WANT_TRIVIAL).using(optional=True), | 407 Boolean.named(keys.WANT_TRIVIAL).using(optional=True), |
366 Boolean.named(keys.SHOW_COMMENTS).using(optional=True), | 408 Boolean.named(keys.SHOW_COMMENTS).using(optional=True), |
367 Boolean.named(keys.EDIT_ON_DOUBLECLICK).using(optional=True), | 409 Boolean.named(keys.EDIT_ON_DOUBLECLICK).using(optional=True), |
368 Boolean.named(keys.SCROLL_PAGE_AFTER_EDIT).using(optional=True), | 410 Boolean.named(keys.SCROLL_PAGE_AFTER_EDIT).using(optional=True), |
369 Boolean.named(keys.MAILTO_AUTHOR).using(optional=True), | 411 Boolean.named(keys.MAILTO_AUTHOR).using(optional=True), |
370 List.named(keys.QUICKLINKS).of(String.named('quicklinks')).using(optional=Tr ue), | 412 List.named(keys.QUICKLINKS).of(String.named('quicklinks')).using(optional=Tr ue), |
371 List.named(keys.SUBSCRIBED_ITEMS).of(String.named('subscribed_item')).using( optional=True), | 413 List.named(keys.SUBSCRIPTIONS).of(String.named('subscriptions').validated_by (subscription_validator)).using(optional=True), |
372 List.named(keys.SUBSCRIPTION_IDS).of(String.named('subscription_id')).using( optional=True), | |
373 List.named(keys.EMAIL_SUBSCRIBED_EVENTS).of(String.named('email_subscribed_e vent')).using(optional=True), | 414 List.named(keys.EMAIL_SUBSCRIBED_EVENTS).of(String.named('email_subscribed_e vent')).using(optional=True), |
374 #TODO: DuckDict.named('bookmarks').using(optional=True), | 415 #TODO: DuckDict.named('bookmarks').using(optional=True), |
375 *common_meta | 416 *common_meta |
376 ) | 417 ) |
377 | 418 |
378 | 419 |
379 def validate_data(meta, data): | 420 def validate_data(meta, data): |
380 """ | 421 """ |
381 validate the data contents, if possible | 422 validate the data contents, if possible |
382 | 423 |
383 :param meta: metadata dict | 424 :param meta: metadata dict |
384 :param data: data file | 425 :param data: data file |
385 :return: validation ok [bool] | 426 :return: validation ok [bool] |
386 """ | 427 """ |
387 ct = Type(meta[keys.CONTENTTYPE]) | 428 ct = Type(meta[keys.CONTENTTYPE]) |
388 if ct.type != 'text': | 429 if ct.type != 'text': |
389 return True # we can't validate non-text mimetypes, so assume it is ok | 430 return True # we can't validate non-text mimetypes, so assume it is ok |
390 coding = ct.parameters['charset'].lower() | 431 coding = ct.parameters['charset'].lower() |
391 if coding not in ['ascii', 'utf-8', ]: | 432 if coding not in ['ascii', 'utf-8', ]: |
392 return True # checking 8bit encodings this way is pointless, decoding n ever raises | 433 return True # checking 8bit encodings this way is pointless, decoding n ever raises |
393 text_bytes = data.read() | 434 text_bytes = data.read() |
394 data.seek(0) # rewind, so it can be read again | 435 data.seek(0) # rewind, so it can be read again |
395 try: | 436 try: |
396 text_bytes.decode(coding) | 437 text_bytes.decode(coding) |
397 return True | 438 return True |
398 except UnicodeDecodeError: | 439 except UnicodeDecodeError: |
399 return False | 440 return False |
OLD | NEW |