/python/webapp/vexweb/handlers.py

https://github.com/Sidnicious/0xfe-experiments
Python | 107 lines | 78 code | 27 blank | 2 comment | 7 complexity | bdd5ab9fab2725219fd126fe25b87e04 MD5 | raw file
  1. #!/usr/bin/env python2.7
  2. # Built for tornado 1.2
  3. import json
  4. import os
  5. from tornado import auth, ioloop, web
  6. def GET(f):
  7. f.GET = True
  8. return f
  9. def POST(f):
  10. f.POST = True
  11. return f
  12. class BaseHandlerException(Exception):
  13. pass
  14. class BaseHandler(web.RequestHandler):
  15. errors = []
  16. flash = []
  17. def get_config(self):
  18. return self.application.vexconfig
  19. def prepare(self):
  20. self.errors = []
  21. self.flash = []
  22. def add_error(self, error):
  23. self.errors.append(error)
  24. def add_flash(self, flash):
  25. self.flash.append(flash)
  26. def get_model_api(self):
  27. return self.application.model_api
  28. def get_current_user(self):
  29. return self.get_secure_cookie("user")
  30. def set_current_user(self, user):
  31. self.set_secure_cookie("user", user)
  32. def render_ajax(self, success, data=None):
  33. self.set_header("Content-Type", "text/json")
  34. self.write(json.dumps({
  35. "success": success,
  36. "data": data,
  37. "errors": self.errors,
  38. "flash": self.flash
  39. }))
  40. def process_fail(self, message="__unset"):
  41. raise BaseHandlerException(
  42. "Error processing 'action' parameter: %s" % message)
  43. def process_request(self, request_type):
  44. action = self.get_argument("action", None)
  45. if not action:
  46. self.process_fail("Missing parameter: 'action'")
  47. return
  48. try:
  49. action_func = self.__getattribute__(action)
  50. has_handler = action_func.__getattribute__(request_type)
  51. except Exception, e:
  52. self.process_fail(e)
  53. return
  54. if (has_handler):
  55. action_func()
  56. else:
  57. self.process_fail("Missing handler for: " + action)
  58. def get(self):
  59. return self.process_request("GET")
  60. def post(self):
  61. return self.process_request("POST")
  62. def render_template(self, path, **kwargs):
  63. return self.render(path,
  64. errors=self.errors,
  65. flash=self.flash,
  66. **kwargs)
  67. class GoogleLoginHandler(BaseHandler, auth.GoogleMixin):
  68. @web.asynchronous
  69. def get(self):
  70. if self.get_argument("openid.mode", None):
  71. self.get_authenticated_user(self.async_callback(self._on_auth))
  72. return
  73. self.authenticate_redirect()
  74. def _on_auth(self, user):
  75. if not user:
  76. logging.error("Login failed")
  77. self.authenticate_redirect()
  78. return
  79. self.set_current_user(user["email"])
  80. self.redirect("/")