|
# |
|
# Client-side cookie management utility. |
|
# |
|
from org.transcrypt.stubs.browser import __pragma__ |
|
|
|
__pragma__ ('kwargs') # We use **kwargs in this module. |
|
|
|
__pragma__('skip') # Avoid complaining about undefined global JavaScript symbols during static tests. |
|
|
|
# TODO: Mock these as appropriate and import the mocks instead. |
|
document = encodeURIComponent = decodeURIComponent = JSON = 0 |
|
|
|
__pragma__('noskip') |
|
|
|
|
|
# Primary Management Utility |
|
|
|
class CookieManager: |
|
def __init__(self): |
|
self._cache = None |
|
self.defaults = { |
|
'expires': 90, |
|
'path': '/', |
|
'domain': window.location.hostname, |
|
'secure': window.location.protocol == "https:", |
|
} |
|
|
|
def start(self, context=None): |
|
window.console.log("CookieManager starting.", self.values) |
|
|
|
def getValues(self): |
|
if self._cache is not None: |
|
return self._cache |
|
|
|
cookies = {} |
|
jar = document.cookie.split('; ') if document.cookie else [] |
|
|
|
for cookie in jar: |
|
name, _, value = cookie.partition('='); |
|
|
|
if value.indexOf('"') == 0: |
|
# RFC2068 quoted cookie, unescape it. |
|
value = value[1:-1].replace('\\"', '"').replace('\\\\', '\\') |
|
|
|
cookies[self._decode(name)] = value |
|
|
|
self._cache = cookies |
|
return cookies |
|
|
|
def setValues(self, value): |
|
pass |
|
|
|
values = property(getValues, setValues) |
|
|
|
# Public API |
|
|
|
def get(self, key): |
|
return self.values[key] |
|
|
|
def getJSON(self, key): |
|
value = self.values[key] |
|
return None if value is undefined else JSON.parse(value) |
|
|
|
def set(self, key, value, **kw): |
|
# Set any missing values. |
|
options = copy(self.defaults) |
|
options.update(kw) |
|
secure = options.pop('secure') |
|
|
|
if typeof(options['expires']) == 'number': |
|
expires = new(Date) |
|
expires.setMilliseconds(expires.getMilliseconds() + options['expires'] * 864e+5) |
|
options['expires'] = expires |
|
|
|
parts = [ |
|
self._encode(key), |
|
'=', |
|
self._encode(value), |
|
] |
|
|
|
for key in options.keys(): |
|
parts.append('; ') |
|
parts.append(key) |
|
parts.append('=') |
|
parts.append(options[key]) |
|
|
|
if secure: |
|
parts.append('; secure') |
|
|
|
document.cookie = "".join(parts) |
|
|
|
self.values[key] = value |
|
|
|
def setJSON(self, key, value, **options): |
|
value = JSON.stringify(value) |
|
self.set(key, value, **kw) |
|
|
|
# Protected API |
|
|
|
def _encode(self, value): |
|
# Handle percent-encoding of cookie keys and values. |
|
return encodeURIComponent(String(value)); |
|
|
|
def _decode(self, value): |
|
# Handle percent-decoding of cookie keys and values. |
|
return decodeURIComponent(String(value)); |