init_validate.py 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import os
  2. from flask import session
  3. from flask_restful import Resource, reqparse # type: ignore
  4. from sqlalchemy import select
  5. from sqlalchemy.orm import Session
  6. from configs import dify_config
  7. from extensions.ext_database import db
  8. from libs.helper import StrLen
  9. from models.model import DifySetup
  10. from services.account_service import TenantService
  11. from . import api
  12. from .error import AlreadySetupError, InitValidateFailedError
  13. from .wraps import only_edition_self_hosted
  14. class InitValidateAPI(Resource):
  15. def get(self):
  16. init_status = get_init_validate_status()
  17. if init_status:
  18. return {"status": "finished"}
  19. return {"status": "not_started"}
  20. @only_edition_self_hosted
  21. def post(self):
  22. # is tenant created
  23. tenant_count = TenantService.get_tenant_count()
  24. if tenant_count > 0:
  25. raise AlreadySetupError()
  26. parser = reqparse.RequestParser()
  27. parser.add_argument("password", type=StrLen(30), required=True, location="json")
  28. input_password = parser.parse_args()["password"]
  29. if input_password != os.environ.get("INIT_PASSWORD"):
  30. session["is_init_validated"] = False
  31. raise InitValidateFailedError()
  32. session["is_init_validated"] = True
  33. return {"result": "success"}, 201
  34. def get_init_validate_status():
  35. if dify_config.EDITION == "SELF_HOSTED":
  36. if os.environ.get("INIT_PASSWORD"):
  37. if session.get("is_init_validated"):
  38. return True
  39. with Session(db.engine) as db_session:
  40. return db_session.execute(select(DifySetup)).scalar_one_or_none()
  41. return True
  42. api.add_resource(InitValidateAPI, "/init")