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.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  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. from werkzeug.wrappers import Response
  9. LodelContext.expose_modules(globals(), {
  10. 'lodel.settings': ['Settings'],
  11. 'lodel.auth.exceptions': ['ClientError', 'ClientAuthenticationFailure',
  12. 'ClientPermissionDenied', 'ClientAuthenticationError']})
  13. from .interface.router import get_controller
  14. from .interface.lodelrequest import LodelRequest
  15. from .exceptions import *
  16. from .client import WebUiClient
  17. try:
  18. SESSION_FILES_BASE_DIR = Settings.webui.sessions.directory
  19. SESSION_FILES_TEMPLATE = Settings.webui.sessions.file_template
  20. SESSION_EXPIRATION_LIMIT = Settings.webui.sessions.expiration
  21. COOKIE_SECRET_KEY = bytes(Settings.webui.cookie_secret_key, 'utf-8')
  22. COOKIE_SESSION_ID = Settings.webui.cookie_session_id
  23. except Exception as e:
  24. print("Fails to start : ", e, file=sys.stderr)
  25. exit(1)
  26. from werkzeug.contrib.securecookie import SecureCookie
  27. def load_cookie(request):
  28. datas = request.cookies.get(COOKIE_SESSION_ID)
  29. if not datas:
  30. return None
  31. cookie_content = SecureCookie.unserialize(datas, COOKIE_SECRET_KEY)
  32. if 'token' not in cookie_content:
  33. return None
  34. token = cookie_content['token']
  35. if token is None or len(token) == 0:
  36. return None
  37. return token
  38. def save_cookie(response, token):
  39. response.set_cookie(COOKIE_SESSION_ID, SecureCookie({'token': token}, COOKIE_SECRET_KEY).serialize())
  40. def empty_cookie(response):
  41. response.set_cookie(COOKIE_SESSION_ID, '')
  42. #Starting instance
  43. loader.start()
  44. #providing access to dyncode
  45. ##@todo Dirty & quick dyncode access providing. Replace it by a clean access
  46. #using LodelContext
  47. lodel = LodelContext.get()
  48. import leapi_dyncode as dyncode
  49. lodel.dyncode = 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