utils.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. #-*- coding:utf-8 -*-
  2. import json
  3. import requests
  4. from flask import g, redirect, session
  5. from functools import wraps
  6. from rrd import config
  7. from rrd import corelib
  8. from rrd.utils import randbytes
  9. from rrd.model.user import User, UserToken
  10. def require_login(redir="/auth/login", json_msg="", html_msg=""):
  11. def _(f):
  12. @wraps(f)
  13. def __(*a, **kw):
  14. if not g.user:
  15. if redir:
  16. return redirect(redir)
  17. elif json_msg:
  18. return json.dumps({"msg": json_msg})
  19. elif html_msg:
  20. return abort(403, html_msg)
  21. else:
  22. return abort(403, "please login first")
  23. return f(*a, **kw)
  24. return __
  25. return _
  26. def set_user_cookie(user_token, session_):
  27. if not user_token:
  28. return None
  29. session_[config.SITE_COOKIE] = "%s:%s" % (user_token.name, user_token.sig)
  30. def clear_user_cookie(session_):
  31. session_[config.SITE_COOKIE] = ""
  32. def get_usertoken_from_session(session_):
  33. if config.SITE_COOKIE in session_:
  34. cookies = session_[config.SITE_COOKIE]
  35. if not cookies:
  36. return None
  37. name, sig = cookies.split(":")
  38. return UserToken(name, sig)
  39. def get_current_user_profile(user_token):
  40. if not user_token:
  41. return
  42. h = {"Content-type": "application/json"}
  43. r = corelib.auth_requests(user_token, "GET", "%s/user/current" %config.API_ADDR, headers=h)
  44. if r.status_code != 200:
  45. return
  46. j = r.json()
  47. return User(j["id"], j["name"], j["cnname"], j["email"], j["phone"], j["im"], j["qq"], j["role"])
  48. def logout_user(user_token):
  49. if not user_token:
  50. return
  51. r = corelib.auth_requests(user_token, "GET", "%s/user/logout" %config.API_ADDR)
  52. if r.status_code != 200:
  53. raise Exception("%s:%s" %(r.status_code, r.text))
  54. clear_user_cookie(session)
  55. def login_user(name, password):
  56. params = {
  57. "name": name,
  58. "password": password,
  59. }
  60. r = requests.post("%s/user/login" %config.API_ADDR, data=params)
  61. if r.status_code != 200:
  62. raise Exception("{} : {}".format(r.status_code, r.text))
  63. j = r.json()
  64. ut = UserToken(j["name"], j["sig"])
  65. set_user_cookie(ut, session)
  66. return ut