No Description
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.

run.py 3.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. # -*- coding: utf-8 -*-
  2. from lodel.context import LodelContext
  3. if not LodelContext.is_initialized():
  4. import loader # Lodel2 loader
  5. import os
  6. import hashlib
  7. import time
  8. import sys
  9. from werkzeug.wrappers import Response
  10. LodelContext.expose_modules(globals(), {
  11. 'lodel.settings': ['Settings'],
  12. 'lodel.logger': 'logger',
  13. 'lodel.auth.exceptions': ['ClientError', 'ClientAuthenticationFailure',
  14. 'ClientPermissionDenied', 'ClientAuthenticationError']})
  15. from .interface.router import get_controller
  16. from .interface.lodelrequest import LodelRequest
  17. from .exceptions import *
  18. from .client import WebUiClient
  19. try:
  20. SESSION_FILES_BASE_DIR = Settings.webui.sessions.directory
  21. SESSION_FILES_TEMPLATE = Settings.webui.sessions.file_template
  22. SESSION_EXPIRATION_LIMIT = Settings.webui.sessions.expiration
  23. COOKIE_SECRET_KEY = bytes(Settings.webui.cookie_secret_key, 'utf-8')
  24. COOKIE_SESSION_ID = Settings.webui.cookie_session_id
  25. except Exception as e:
  26. print("Fails to start : ", e, file=sys.stderr)
  27. exit(1)
  28. from werkzeug.contrib.securecookie import SecureCookie
  29. def load_cookie(request):
  30. datas = request.cookies.get(COOKIE_SESSION_ID)
  31. if not datas:
  32. return None
  33. cookie_content = SecureCookie.unserialize(datas, COOKIE_SECRET_KEY)
  34. if 'token' not in cookie_content:
  35. return None
  36. token = cookie_content['token']
  37. if token is None or len(token) == 0:
  38. return None
  39. return token
  40. def save_cookie(response, token):
  41. response.set_cookie(COOKIE_SESSION_ID, SecureCookie({'token': token}, COOKIE_SECRET_KEY).serialize())
  42. def empty_cookie(response):
  43. response.set_cookie(COOKIE_SESSION_ID, '')
  44. #Starting instance
  45. try:
  46. loader.start() #Works only in MONOSITE mode
  47. except NameError:
  48. pass
  49. #providing access to dyncode
  50. # WSGI Application
  51. def application(env, start_response):
  52. request = LodelRequest(env)
  53. session_token = None
  54. try:
  55. #We have to create the client before restoring cookie in order to be able
  56. #to log messages with client infos
  57. client = WebUiClient(env['REMOTE_ADDR'], env['HTTP_USER_AGENT'], None)
  58. session_token = load_cookie(request)
  59. if session_token is not None and len(session_token) > 0:
  60. WebUiClient.restore_session(session_token)
  61. session_token = None
  62. try:
  63. controller = get_controller(request)
  64. logger.debug(controller)
  65. response = controller(request)
  66. except HttpException as e:
  67. try:
  68. response = e.render(request)
  69. except Exception as eb:
  70. raise eb
  71. res = Response()
  72. res.status_code = 500
  73. return res
  74. session_token = WebUiClient.session_token()
  75. if session_token is not None:
  76. save_cookie(response, session_token)
  77. session_token = None
  78. except (ClientError, ClientAuthenticationError):
  79. response = HttpException(200).render(request)
  80. empty_cookie(response)
  81. except ClientAuthenticationFailure:
  82. response = HttpException(200).render(request)
  83. empty_cookie(response)
  84. except Exception as e:
  85. raise e
  86. res = response(env, start_response)
  87. WebUiClient.clean()
  88. return res