|
- # -*- coding: utf-8 -*-
-
- import base64
- from Cookie import CookieError, SimpleCookie
- from datetime import datetime, timedelta
-
- from flask import g
-
- __all__ = ["parse_cookies", "set_cookie", "delete_cookie"]
-
- class _CookieManager(SimpleCookie):
- MAGIC = "--cpv2"
-
- def __init__(self, path, cookies):
- self._path = path
- try:
- super(_CookieManager, self).__init__(cookies)
- except CookieError:
- super(_CookieManager, self).__init__()
- for cookie in self.keys():
- if self[cookie].value is False:
- del self[cookie]
-
- def value_decode(self, value):
- unquoted = super(_CookieManager, self).value_decode(value)[0]
- try:
- decoded = base64.b64decode(unquoted).decode("utf8")
- except (TypeError, UnicodeDecodeError):
- return False, "False"
- if decoded.startswith(self.MAGIC):
- return decoded[len(self.MAGIC):], value
- return False, "False"
-
- def value_encode(self, value):
- encoded = base64.b64encode(self.MAGIC + value.encode("utf8"))
- quoted = super(_CookieManager, self).value_encode(encoded)[1]
- return value, quoted
-
- @property
- def path(self):
- return self._path
-
-
- def parse_cookies(path, cookies):
- return _CookieManager(path, cookies)
-
- def set_cookie(key, value, days=0):
- g.cookies[key] = value
- if days:
- expire_dt = datetime.utcnow() + timedelta(days=days)
- expires = expire_dt.strftime("%a, %d %b %Y %H:%M:%S GMT")
- g.cookies[key]["expires"] = expires
- g.cookies[key]["path"] = g.cookies.path
- g.new_cookies.append(g.cookies[key].OutputString())
-
- def delete_cookie(key):
- set_cookie(key, u"", days=-1)
- del g.cookies[key]
|