Skip to content

Commit

Permalink
Merge branch '2.1' of https://github.com/MasoniteFramework/core into 2.1
Browse files Browse the repository at this point in the history
  • Loading branch information
josephmancuso committed May 12, 2019
2 parents 4346cb5 + 592be43 commit 4b1093d
Show file tree
Hide file tree
Showing 5 changed files with 36 additions and 16 deletions.
18 changes: 13 additions & 5 deletions masonite/drivers/SessionCookieDriver.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,10 @@ def get(self, key):
if cookie:
return self._get_serialization_value(cookie)

cookie = self.request.get_cookie('f_{0}'.format(key))
if cookie:
return self._get_serialization_value(cookie)

return None

def set(self, key, value):
Expand Down Expand Up @@ -96,10 +100,10 @@ def __collect_data(self):
if 'HTTP_COOKIE' in self.environ and self.environ['HTTP_COOKIE']:
cookies_original = self.environ['HTTP_COOKIE'].split(';')
for cookie in cookies_original:
if cookie.startswith('s_'):
data = cookie.split("=")
cookie_value = self.request.get_cookie(data[0])
cookies[data[0][2:]] = cookie_value
if cookie.strip().startswith('s_') or cookie.strip().startswith('f_'):
data = cookie.split("=", 1)
cookie_name = data[0].replace('s_', '').replace('f_', '').strip()
cookies.update({cookie_name: self.get(cookie_name)})
return cookies

def flash(self, key, value):
Expand All @@ -112,7 +116,7 @@ def flash(self, key, value):
if isinstance(value, dict):
value = json.dumps(value)

self.request.cookie('s_{0}'.format(key), value, expires='2 seconds')
self.request.cookie('f_{0}'.format(key), value, expires='2 seconds')

def reset(self, flash_only=False):
"""Delete all session data.
Expand All @@ -122,6 +126,10 @@ def reset(self, flash_only=False):
"""
cookies = self.__collect_data()
for cookie in cookies:
if flash_only:
self.request.delete_cookie('f_{0}'.format(cookie))
continue

self.request.delete_cookie('s_{0}'.format(cookie))

def helper(self):
Expand Down
2 changes: 1 addition & 1 deletion masonite/middleware/ResponseMiddleware.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,4 @@ def after(self):
self.request.reset_redirections()

if self.app.has('Session') and self.request.is_status(200):
self.app.make('Session').reset(flash_only=True)
self.app.make('Session').driver('memory').reset(flash_only=True)
22 changes: 16 additions & 6 deletions masonite/request.py
Original file line number Diff line number Diff line change
Expand Up @@ -491,10 +491,10 @@ def cookie(self, key, value, encrypt=True,
if not http_only:
http_only = ""

self.append_cookie(key, '{0}={1};{2} {3}Path={4}'.format(key, value, expires, http_only, path))
self.cookies.append(
('Set-Cookie', '{0}={1};{2} {3}Path={4}'.format(
key, value, expires, http_only, path)))
self.append_cookie(key, value)
return self

def get_cookies(self):
Expand All @@ -505,6 +505,14 @@ def get_cookies(self):
"""
return self.cookies

def get_raw_cookie(self, provided_cookie):
if 'HTTP_COOKIE' in self.environ:
grab_cookie = cookies.SimpleCookie(self.environ['HTTP_COOKIE'])
if provided_cookie in grab_cookie:
return grab_cookie[provided_cookie]

return None

def get_cookie(self, provided_cookie, decrypt=True):
"""Retrieve a specific cookie from the browser.
Expand All @@ -530,8 +538,8 @@ def get_cookie(self, provided_cookie, decrypt=True):
except InvalidToken:
self.delete_cookie(provided_cookie)
return None
return grab_cookie[provided_cookie].value

return grab_cookie[provided_cookie].value
return None

def append_cookie(self, key, value):
Expand All @@ -546,11 +554,9 @@ def append_cookie(self, key, value):
value {string} -- Value of cookie to be stored
"""
if 'HTTP_COOKIE' in self.environ and self.environ['HTTP_COOKIE']:
self.environ['HTTP_COOKIE'] += ';{0}={1}'.format(
key, value)
self.environ['HTTP_COOKIE'] += ';{}'.format(value)
else:
self.environ['HTTP_COOKIE'] = '{0}={1}'.format(
key, value)
self.environ['HTTP_COOKIE'] = '{}'.format(value)

def delete_cookie(self, key):
"""Delete cookie.
Expand All @@ -561,6 +567,10 @@ def delete_cookie(self, key):
Returns:
bool -- Whether or not the cookie was successfully deleted.
"""
for index, cookie in enumerate(self.cookies):
if cookie[1].startswith(key + '='):
del self.cookies[index]

self.cookie(key, '', expires='expired')

if 'HTTP_COOKIE' in self.environ and self.environ['HTTP_COOKIE']:
Expand Down
8 changes: 5 additions & 3 deletions tests/test_cookie_signing.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,11 +40,13 @@ def test_set_and_get_cookie_with_http_only(self):
self.request.cookies = []
self.request.cookie('test', 'testvalue', encrypt=False)
assert self.request.get_cookie('test', decrypt=False) == 'testvalue'
assert 'HttpOnly' in self.request.cookies[0][1]
assert 'test=testvalue; HttpOnly;Path=/' in self.request.cookies[0][1]
assert self.request.get_raw_cookie('test')['httponly']
assert '/' in self.request.get_raw_cookie('test')['path']
assert 'testvalue' in self.request.get_raw_cookie('test').value

def test_set_and_get_cookie_without_http_only(self):
self.request.cookies = []
self.request.cookie('test', 'testvalue', http_only=False, encrypt=False)
assert self.request.get_cookie('test', decrypt=False) == 'testvalue'
assert 'test=testvalue; Path=/' in self.request.cookies[0][1]
assert 'testvalue' in self.request.get_raw_cookie('test').value
assert '/' in self.request.get_raw_cookie('test')['path']
2 changes: 1 addition & 1 deletion tests/test_requests.py
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ def test_request_sets_expiration_cookie_2_months(self):
time = cookie_expire_time('2 months')

assert self.request.get_cookie('setcookie_expiration') == 'value'
assert 'Expires={0}'.format(time) in self.request.cookies[0][1]
assert self.request.get_raw_cookie('setcookie_expiration')['expires'] == time

def test_delete_cookie(self):
self.request.cookies = []
Expand Down

0 comments on commit 4b1093d

Please sign in to comment.