activate.py 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. import base64
  2. import datetime
  3. import secrets
  4. from flask_restful import Resource, reqparse
  5. from constants.languages import supported_language
  6. from controllers.console import api
  7. from controllers.console.error import AlreadyActivateError
  8. from extensions.ext_database import db
  9. from libs.helper import StrLen, email, timezone
  10. from libs.password import hash_password, valid_password
  11. from models.account import AccountStatus
  12. from services.account_service import RegisterService
  13. class ActivateCheckApi(Resource):
  14. def get(self):
  15. parser = reqparse.RequestParser()
  16. parser.add_argument("workspace_id", type=str, required=False, nullable=True, location="args")
  17. parser.add_argument("email", type=email, required=False, nullable=True, location="args")
  18. parser.add_argument("token", type=str, required=True, nullable=False, location="args")
  19. args = parser.parse_args()
  20. workspaceId = args["workspace_id"]
  21. reg_email = args["email"]
  22. token = args["token"]
  23. invitation = RegisterService.get_invitation_if_token_valid(workspaceId, reg_email, token)
  24. return {"is_valid": invitation is not None, "workspace_name": invitation["tenant"].name if invitation else None}
  25. class ActivateApi(Resource):
  26. def post(self):
  27. parser = reqparse.RequestParser()
  28. parser.add_argument("workspace_id", type=str, required=False, nullable=True, location="json")
  29. parser.add_argument("email", type=email, required=False, nullable=True, location="json")
  30. parser.add_argument("token", type=str, required=True, nullable=False, location="json")
  31. parser.add_argument("name", type=StrLen(30), required=True, nullable=False, location="json")
  32. parser.add_argument("password", type=valid_password, required=True, nullable=False, location="json")
  33. parser.add_argument(
  34. "interface_language", type=supported_language, required=True, nullable=False, location="json"
  35. )
  36. parser.add_argument("timezone", type=timezone, required=True, nullable=False, location="json")
  37. args = parser.parse_args()
  38. invitation = RegisterService.get_invitation_if_token_valid(args["workspace_id"], args["email"], args["token"])
  39. if invitation is None:
  40. raise AlreadyActivateError()
  41. RegisterService.revoke_token(args["workspace_id"], args["email"], args["token"])
  42. account = invitation["account"]
  43. account.name = args["name"]
  44. # generate password salt
  45. salt = secrets.token_bytes(16)
  46. base64_salt = base64.b64encode(salt).decode()
  47. # encrypt password with salt
  48. password_hashed = hash_password(args["password"], salt)
  49. base64_password_hashed = base64.b64encode(password_hashed).decode()
  50. account.password = base64_password_hashed
  51. account.password_salt = base64_salt
  52. account.interface_language = args["interface_language"]
  53. account.timezone = args["timezone"]
  54. account.interface_theme = "light"
  55. account.status = AccountStatus.ACTIVE.value
  56. account.initialized_at = datetime.datetime.now(datetime.timezone.utc).replace(tzinfo=None)
  57. db.session.commit()
  58. return {"result": "success"}
  59. api.add_resource(ActivateCheckApi, "/activate/check")
  60. api.add_resource(ActivateApi, "/activate")