Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code | Sign in
(1616)

Side by Side Diff: MoinMoin/storage/middleware/validation.py

Issue 11248043: Subscription validator (Closed)
Patch Set: Different splitting and test validation Created 11 years, 9 months ago
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments. Please Sign in to add in-line comments.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
OLDNEW

Powered by Google App Engine
RSS Feeds Recent Issues | This issue
This is Rietveld f62528b