Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

init_validate.py 2.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import os
  2. from flask import session
  3. from flask_restx import Resource, fields, reqparse
  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, console_ns
  12. from .error import AlreadySetupError, InitValidateFailedError
  13. from .wraps import only_edition_self_hosted
  14. @console_ns.route("/init")
  15. class InitValidateAPI(Resource):
  16. @api.doc("get_init_status")
  17. @api.doc(description="Get initialization validation status")
  18. @api.response(
  19. 200,
  20. "Success",
  21. model=api.model(
  22. "InitStatusResponse",
  23. {"status": fields.String(description="Initialization status", enum=["finished", "not_started"])},
  24. ),
  25. )
  26. def get(self):
  27. """Get initialization validation status"""
  28. init_status = get_init_validate_status()
  29. if init_status:
  30. return {"status": "finished"}
  31. return {"status": "not_started"}
  32. @api.doc("validate_init_password")
  33. @api.doc(description="Validate initialization password for self-hosted edition")
  34. @api.expect(
  35. api.model(
  36. "InitValidateRequest",
  37. {"password": fields.String(required=True, description="Initialization password", max_length=30)},
  38. )
  39. )
  40. @api.response(
  41. 201,
  42. "Success",
  43. model=api.model("InitValidateResponse", {"result": fields.String(description="Operation result")}),
  44. )
  45. @api.response(400, "Already setup or validation failed")
  46. @only_edition_self_hosted
  47. def post(self):
  48. """Validate initialization password"""
  49. # is tenant created
  50. tenant_count = TenantService.get_tenant_count()
  51. if tenant_count > 0:
  52. raise AlreadySetupError()
  53. parser = reqparse.RequestParser()
  54. parser.add_argument("password", type=StrLen(30), required=True, location="json")
  55. input_password = parser.parse_args()["password"]
  56. if input_password != os.environ.get("INIT_PASSWORD"):
  57. session["is_init_validated"] = False
  58. raise InitValidateFailedError()
  59. session["is_init_validated"] = True
  60. return {"result": "success"}, 201
  61. def get_init_validate_status():
  62. if dify_config.EDITION == "SELF_HOSTED":
  63. if os.environ.get("INIT_PASSWORD"):
  64. if session.get("is_init_validated"):
  65. return True
  66. with Session(db.engine) as db_session:
  67. return db_session.execute(select(DifySetup)).scalar_one_or_none()
  68. return True