A copyright violation detector running on Wikimedia Cloud Services https://tools.wmflabs.org/copyvios/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

59 lines
1.7 KiB

  1. # -*- coding: utf-8 -*-
  2. import base64
  3. from Cookie import CookieError, SimpleCookie
  4. from datetime import datetime, timedelta
  5. from flask import g
  6. __all__ = ["parse_cookies", "set_cookie", "delete_cookie"]
  7. class _CookieManager(SimpleCookie):
  8. MAGIC = "--cpv2"
  9. def __init__(self, path, cookies):
  10. self._path = path
  11. try:
  12. super(_CookieManager, self).__init__(cookies)
  13. except CookieError:
  14. super(_CookieManager, self).__init__()
  15. for cookie in self.keys():
  16. if self[cookie].value is False:
  17. del self[cookie]
  18. def value_decode(self, value):
  19. unquoted = super(_CookieManager, self).value_decode(value)[0]
  20. try:
  21. decoded = base64.b64decode(unquoted).decode("utf8")
  22. except (TypeError, UnicodeDecodeError):
  23. return False, "False"
  24. if decoded.startswith(self.MAGIC):
  25. return decoded[len(self.MAGIC):], value
  26. return False, "False"
  27. def value_encode(self, value):
  28. encoded = base64.b64encode(self.MAGIC + value.encode("utf8"))
  29. quoted = super(_CookieManager, self).value_encode(encoded)[1]
  30. return value, quoted
  31. @property
  32. def path(self):
  33. return self._path
  34. def parse_cookies(path, cookies):
  35. return _CookieManager(path, cookies)
  36. def set_cookie(key, value, days=0):
  37. g.cookies[key] = value
  38. if days:
  39. expire_dt = datetime.utcnow() + timedelta(days=days)
  40. expires = expire_dt.strftime("%a, %d %b %Y %H:%M:%S GMT")
  41. g.cookies[key]["expires"] = expires
  42. g.cookies[key]["path"] = g.cookies.path
  43. g.new_cookies.append(g.cookies[key].OutputString())
  44. def delete_cookie(key):
  45. set_cookie(key, u"", days=-1)
  46. del g.cookies[key]