import os from flask import session from flask_restx import Resource, fields, reqparse from sqlalchemy import select from sqlalchemy.orm import Session from configs import dify_config from extensions.ext_database import db from libs.helper import StrLen from models.model import DifySetup from services.account_service import TenantService from . import api, console_ns from .error import AlreadySetupError, InitValidateFailedError from .wraps import only_edition_self_hosted @console_ns.route("/init") class InitValidateAPI(Resource): @api.doc("get_init_status") @api.doc(description="Get initialization validation status") @api.response( 200, "Success", model=api.model( "InitStatusResponse", {"status": fields.String(description="Initialization status", enum=["finished", "not_started"])}, ), ) def get(self): """Get initialization validation status""" init_status = get_init_validate_status() if init_status: return {"status": "finished"} return {"status": "not_started"} @api.doc("validate_init_password") @api.doc(description="Validate initialization password for self-hosted edition") @api.expect( api.model( "InitValidateRequest", {"password": fields.String(required=True, description="Initialization password", max_length=30)}, ) ) @api.response( 201, "Success", model=api.model("InitValidateResponse", {"result": fields.String(description="Operation result")}), ) @api.response(400, "Already setup or validation failed") @only_edition_self_hosted def post(self): """Validate initialization password""" # is tenant created tenant_count = TenantService.get_tenant_count() if tenant_count > 0: raise AlreadySetupError() parser = reqparse.RequestParser() parser.add_argument("password", type=StrLen(30), required=True, location="json") input_password = parser.parse_args()["password"] if input_password != os.environ.get("INIT_PASSWORD"): session["is_init_validated"] = False raise InitValidateFailedError() session["is_init_validated"] = True return {"result": "success"}, 201 def get_init_validate_status(): if dify_config.EDITION == "SELF_HOSTED": if os.environ.get("INIT_PASSWORD"): if session.get("is_init_validated"): return True with Session(db.engine) as db_session: return db_session.execute(select(DifySetup)).scalar_one_or_none() return True