PageRenderTime 33ms CodeModel.GetById 18ms RepoModel.GetById 1ms app.codeStats 0ms

/tests/test_cookie_only.py

https://gitlab.com/e0/beaker
Python | 277 lines | 220 code | 46 blank | 11 comment | 6 complexity | 8547a5fd5392c5e1ee18f679f6d79c3c MD5 | raw file
  1. import datetime, time
  2. import re
  3. import os
  4. import beaker.session
  5. import beaker.util
  6. from beaker.session import SignedCookie
  7. from beaker._compat import b64decode
  8. from beaker.middleware import SessionMiddleware
  9. from nose import SkipTest
  10. try:
  11. from webtest import TestApp
  12. except ImportError:
  13. raise SkipTest("webtest not installed")
  14. from beaker import crypto
  15. if not crypto.has_aes:
  16. raise SkipTest("No AES library is installed, can't test cookie-only "
  17. "Sessions")
  18. def simple_app(environ, start_response):
  19. session = environ['beaker.session']
  20. if not session.has_key('value'):
  21. session['value'] = 0
  22. session['value'] += 1
  23. if not environ['PATH_INFO'].startswith('/nosave'):
  24. session.save()
  25. start_response('200 OK', [('Content-type', 'text/plain')])
  26. msg = 'The current value is: %d and cookie is %s' % (session['value'], session)
  27. return [msg.encode('UTF-8')]
  28. def test_increment():
  29. options = {'session.validate_key':'hoobermas', 'session.type':'cookie'}
  30. app = TestApp(SessionMiddleware(simple_app, **options))
  31. res = app.get('/')
  32. assert 'current value is: 1' in res
  33. res = app.get('/')
  34. assert 'current value is: 2' in res
  35. res = app.get('/')
  36. assert 'current value is: 3' in res
  37. def test_invalid_cookie():
  38. # This is not actually a cookie only session, but we still test the cookie part.
  39. options = {'session.validate_key':'hoobermas'}
  40. app = TestApp(SessionMiddleware(simple_app, **options))
  41. res = app.get('/')
  42. assert 'current value is: 1' in res
  43. # Set an invalid cookie.
  44. app.set_cookie('cb_/zabbix/actionconf.php_parts', 'HI')
  45. res = app.get('/')
  46. assert 'current value is: 2' in res, res
  47. res = app.get('/')
  48. assert 'current value is: 3' in res, res
  49. def test_invalid_cookie_cookietype():
  50. # This is not actually a cookie only session, but we still test the cookie part.
  51. options = {'session.validate_key':'hoobermas', 'session.type':'cookie'}
  52. app = TestApp(SessionMiddleware(simple_app, **options))
  53. res = app.get('/')
  54. assert 'current value is: 1' in res
  55. # Set an invalid cookie.
  56. app.set_cookie('cb_/zabbix/actionconf.php_parts', 'HI')
  57. res = app.get('/')
  58. assert 'current value is: 2' in res, res
  59. res = app.get('/')
  60. assert 'current value is: 3' in res, res
  61. def test_json_serializer():
  62. options = {'session.validate_key':'hoobermas', 'session.type':'cookie', 'data_serializer': 'json'}
  63. app = TestApp(SessionMiddleware(simple_app, **options))
  64. res = app.get('/')
  65. assert 'current value is: 1' in res
  66. res = app.get('/')
  67. cookie = SignedCookie('hoobermas')
  68. session_data = cookie.value_decode(app.cookies['beaker.session.id'])[0]
  69. session_data = b64decode(session_data)
  70. data = beaker.util.deserialize(session_data, 'json')
  71. assert data['value'] == 2
  72. res = app.get('/')
  73. assert 'current value is: 3' in res
  74. def test_pickle_serializer():
  75. options = {'session.validate_key':'hoobermas', 'session.type':'cookie', 'data_serializer': 'pickle'}
  76. app = TestApp(SessionMiddleware(simple_app, **options))
  77. res = app.get('/')
  78. assert 'current value is: 1' in res
  79. res = app.get('/')
  80. cookie = SignedCookie('hoobermas')
  81. session_data = cookie.value_decode(app.cookies['beaker.session.id'])[0]
  82. session_data = b64decode(session_data)
  83. data = beaker.util.deserialize(session_data, 'pickle')
  84. assert data['value'] == 2
  85. res = app.get('/')
  86. assert 'current value is: 3' in res
  87. def test_expires():
  88. options = {'session.validate_key':'hoobermas', 'session.type':'cookie',
  89. 'session.cookie_expires': datetime.timedelta(days=1)}
  90. app = TestApp(SessionMiddleware(simple_app, **options))
  91. res = app.get('/')
  92. assert 'expires=' in res.headers.getall('Set-Cookie')[0]
  93. assert 'current value is: 1' in res
  94. def test_different_sessions():
  95. options = {'session.validate_key':'hoobermas', 'session.type':'cookie'}
  96. app = TestApp(SessionMiddleware(simple_app, **options))
  97. app2 = TestApp(SessionMiddleware(simple_app, **options))
  98. res = app.get('/')
  99. assert 'current value is: 1' in res
  100. res = app2.get('/')
  101. assert 'current value is: 1' in res
  102. res = app2.get('/')
  103. res = app2.get('/')
  104. res = app2.get('/')
  105. res2 = app.get('/')
  106. assert 'current value is: 2' in res2
  107. assert 'current value is: 4' in res
  108. def test_nosave():
  109. options = {'session.validate_key':'hoobermas', 'session.type':'cookie'}
  110. app = TestApp(SessionMiddleware(simple_app, **options))
  111. res = app.get('/nosave')
  112. assert 'current value is: 1' in res
  113. assert [] == res.headers.getall('Set-Cookie')
  114. res = app.get('/nosave')
  115. assert 'current value is: 1' in res
  116. res = app.get('/')
  117. assert 'current value is: 1' in res
  118. assert len(res.headers.getall('Set-Cookie')) > 0
  119. res = app.get('/')
  120. assert 'current value is: 2' in res
  121. def test_increment_with_encryption():
  122. options = {'session.encrypt_key':'666a19cf7f61c64c', 'session.validate_key':'hoobermas',
  123. 'session.type':'cookie'}
  124. app = TestApp(SessionMiddleware(simple_app, **options))
  125. res = app.get('/')
  126. assert 'current value is: 1' in res
  127. res = app.get('/')
  128. assert 'current value is: 2' in res
  129. res = app.get('/')
  130. assert 'current value is: 3' in res
  131. def test_different_sessions_with_encryption():
  132. options = {'session.encrypt_key':'666a19cf7f61c64c', 'session.validate_key':'hoobermas',
  133. 'session.type':'cookie'}
  134. app = TestApp(SessionMiddleware(simple_app, **options))
  135. app2 = TestApp(SessionMiddleware(simple_app, **options))
  136. res = app.get('/')
  137. assert 'current value is: 1' in res
  138. res = app2.get('/')
  139. assert 'current value is: 1' in res
  140. res = app2.get('/')
  141. res = app2.get('/')
  142. res = app2.get('/')
  143. res2 = app.get('/')
  144. assert 'current value is: 2' in res2
  145. assert 'current value is: 4' in res
  146. def test_nosave_with_encryption():
  147. options = {'session.encrypt_key':'666a19cf7f61c64c', 'session.validate_key':'hoobermas',
  148. 'session.type':'cookie'}
  149. app = TestApp(SessionMiddleware(simple_app, **options))
  150. res = app.get('/nosave')
  151. assert 'current value is: 1' in res
  152. assert [] == res.headers.getall('Set-Cookie')
  153. res = app.get('/nosave')
  154. assert 'current value is: 1' in res
  155. res = app.get('/')
  156. assert 'current value is: 1' in res
  157. assert len(res.headers.getall('Set-Cookie')) > 0
  158. res = app.get('/')
  159. assert 'current value is: 2' in res
  160. def test_cookie_id():
  161. options = {'session.encrypt_key':'666a19cf7f61c64c', 'session.validate_key':'hoobermas',
  162. 'session.type':'cookie'}
  163. app = TestApp(SessionMiddleware(simple_app, **options))
  164. res = app.get('/')
  165. assert "_id':" in res
  166. sess_id = re.sub(r".*'_id': '(.*?)'.*", r'\1', res.body.decode('utf-8'))
  167. res = app.get('/')
  168. new_id = re.sub(r".*'_id': '(.*?)'.*", r'\1', res.body.decode('utf-8'))
  169. assert new_id == sess_id
  170. def test_invalidate_with_save_does_not_delete_session():
  171. def invalidate_session_app(environ, start_response):
  172. session = environ['beaker.session']
  173. session.invalidate()
  174. session.save()
  175. start_response('200 OK', [('Content-type', 'text/plain')])
  176. return [('Cookie is %s' % session).encode('UTF-8')]
  177. options = {'session.encrypt_key':'666a19cf7f61c64c', 'session.validate_key':'hoobermas',
  178. 'session.type':'cookie'}
  179. app = TestApp(SessionMiddleware(invalidate_session_app, **options))
  180. res = app.get('/')
  181. assert 'expires=' not in res.headers.getall('Set-Cookie')[0]
  182. def test_changing_encrypt_key_with_timeout():
  183. COMMON_ENCRYPT_KEY = '666a19cf7f61c64c'
  184. DIFFERENT_ENCRYPT_KEY = 'hello-world'
  185. options = {'session.encrypt_key': COMMON_ENCRYPT_KEY,
  186. 'session.timeout': 300,
  187. 'session.validate_key': 'hoobermas',
  188. 'session.type': 'cookie'}
  189. app = TestApp(SessionMiddleware(simple_app, **options))
  190. res = app.get('/')
  191. assert 'The current value is: 1' in res, res
  192. # Get the session cookie, so we can reuse it.
  193. cookies = res.headers['Set-Cookie']
  194. # Check that we get the same session with the same cookie
  195. options = {'session.encrypt_key': COMMON_ENCRYPT_KEY,
  196. 'session.timeout': 300,
  197. 'session.validate_key': 'hoobermas',
  198. 'session.type': 'cookie'}
  199. app = TestApp(SessionMiddleware(simple_app, **options))
  200. res = app.get('/', headers={'Cookie': cookies})
  201. assert 'The current value is: 2' in res, res
  202. # Now that we are sure that it reuses the same session,
  203. # change the encrypt_key so that it is unable to understand the cookie.
  204. options = {'session.encrypt_key': DIFFERENT_ENCRYPT_KEY,
  205. 'session.timeout': 300,
  206. 'session.validate_key': 'hoobermas',
  207. 'session.type': 'cookie'}
  208. app = TestApp(SessionMiddleware(simple_app, **options))
  209. res = app.get('/', headers={'Cookie': cookies})
  210. # Let's check it created a new session as the old one is invalid
  211. # in the past it just crashed.
  212. assert 'The current value is: 1' in res, res
  213. def test_cookie_properly_expires():
  214. COMMON_ENCRYPT_KEY = '666a19cf7f61c64c'
  215. options = {'session.encrypt_key': COMMON_ENCRYPT_KEY,
  216. 'session.timeout': 1,
  217. 'session.validate_key': 'hoobermas',
  218. 'session.type': 'cookie'}
  219. app = TestApp(SessionMiddleware(simple_app, **options))
  220. res = app.get('/')
  221. assert 'The current value is: 1' in res, res
  222. res = app.get('/')
  223. assert 'The current value is: 2' in res, res
  224. # Wait session to expire and check it starts with a clean one
  225. time.sleep(1)
  226. res = app.get('/')
  227. assert 'The current value is: 1' in res, res
  228. if __name__ == '__main__':
  229. from paste import httpserver
  230. wsgi_app = SessionMiddleware(simple_app, {})
  231. httpserver.serve(wsgi_app, host='127.0.0.1', port=8080)