utils.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. from datetime import timedelta
  2. from unidecode import unidecode
  3. from django.core.urlresolvers import resolve, reverse
  4. from django.http import Http404
  5. from django.template.defaultfilters import slugify as django_slugify
  6. from django.utils import html, timezone
  7. from django.utils.translation import ugettext_lazy as _
  8. from django.utils.translation import ungettext_lazy
  9. import six
  10. def slugify(string):
  11. string = six.text_type(string)
  12. string = unidecode(string)
  13. return django_slugify(string.replace('_', ' ').strip())
  14. def format_plaintext_for_html(string):
  15. return html.linebreaks(html.urlize(html.escape(string)))
  16. """
  17. Mark request as having sensitive parameters
  18. We can't use decorator because of DRF uses custom HttpRequest
  19. that is incompatibile with Django's decorator
  20. """
  21. def hide_post_parameters(request):
  22. request.sensitive_post_parameters = '__ALL__'
  23. """
  24. Return path utility
  25. """
  26. def clean_return_path(request):
  27. if request.method == 'POST' and 'return_path' in request.POST:
  28. return _get_return_path_from_post(request)
  29. else:
  30. return _get_return_path_from_referer(request)
  31. def _get_return_path_from_post(request):
  32. return_path = request.POST.get('return_path')
  33. try:
  34. if not return_path:
  35. raise ValueError()
  36. if not return_path.startswith('/'):
  37. raise ValueError()
  38. resolve(return_path)
  39. return return_path
  40. except (Http404, ValueError):
  41. return None
  42. def _get_return_path_from_referer(request):
  43. referer = request.META.get('HTTP_REFERER')
  44. try:
  45. if not referer:
  46. raise ValueError()
  47. if not referer.startswith(request.scheme):
  48. raise ValueError()
  49. referer = referer[len(request.scheme) + 3:]
  50. if not referer.startswith(request.META['HTTP_HOST']):
  51. raise ValueError()
  52. referer = referer[len(request.META['HTTP_HOST'].rstrip('/')):]
  53. if not referer.startswith('/'):
  54. raise ValueError()
  55. resolve(referer)
  56. return referer
  57. except (Http404, KeyError, ValueError):
  58. return None
  59. """
  60. Utils for resolving requests destination
  61. """
  62. def _is_request_path_under_misago(request):
  63. # We are assuming that forum_index link is root of all Misago links
  64. forum_index = reverse('misago:index')
  65. path_info = request.path_info
  66. if len(forum_index) > len(path_info):
  67. return False
  68. return path_info[:len(forum_index)] == forum_index
  69. def is_request_to_misago(request):
  70. try:
  71. return request._request_to_misago
  72. except AttributeError:
  73. request._request_to_misago = _is_request_path_under_misago(request)
  74. return request._request_to_misago
  75. def is_referer_local(request):
  76. referer = request.META.get('HTTP_REFERER')
  77. if not referer:
  78. return False
  79. if not referer.startswith(request.scheme):
  80. return False
  81. referer = referer[len(request.scheme) + 3:]
  82. if not referer.startswith(request.META['HTTP_HOST']):
  83. return False
  84. referer = referer[len(request.META['HTTP_HOST'].rstrip('/')):]
  85. if not referer.startswith('/'):
  86. return False
  87. return True