Files
dify/api/controllers/console/init_validate.py
+51
qiuqiuaGitHubQuantumGhost盐粒 YanliwangxiaoleiStephen Zhougemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>Cursxautofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>lif非法操作Asuka Minatofenglinqiaofenglin-LAN-TomoOkuyamaTomo Okuyamadependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>zyssyz123hj24Coding On StarCodingOnStaryyhXiangxuan QufghpdfcoopercoderzhaiguangpengJunyan QinE.GGlobalStar117Claude Haiku 4.5CodingOnStarcrazywoolaheysztNeatGuyCodingYeuolyzxhlyhmoonpandawarlocgaogithub-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>claude[bot] <41898282+claude[bot]@users.noreply.github.com>KVOJJJineuxbangjiehanFFXNJyongNie RonghuaJQSevenMiaojiasiqiSeokrin Taron SungCrabSAMACopilotyihongJoelWu TianweiyesseniaJaxniveshdandyanOSS ContributorniveshdandyanSean Kenneth Doherty
9ef6b90843 feat: sync main branch (#31938)
Signed-off-by: majiayu000 <[email protected]>
Signed-off-by: dependabot[bot] <[email protected]>
Signed-off-by: NeatGuyCoding <[email protected]>
Signed-off-by: -LAN- <[email protected]>
Signed-off-by: yihong0618 <[email protected]>
Co-authored-by: QuantumGhost <[email protected]>
Co-authored-by: 盐粒 Yanli <[email protected]>
Co-authored-by: wangxiaolei <[email protected]>
Co-authored-by: Stephen Zhou <[email protected]>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Co-authored-by: Cursx <[email protected]>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: lif <[email protected]>
Co-authored-by: 非法操作 <[email protected]>
Co-authored-by: Asuka Minato <[email protected]>
Co-authored-by: fenglin <[email protected]>
Co-authored-by: qiaofenglin <[email protected]>
Co-authored-by: -LAN- <[email protected]>
Co-authored-by: TomoOkuyama <[email protected]>
Co-authored-by: Tomo Okuyama <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: zyssyz123 <[email protected]>
Co-authored-by: hj24 <[email protected]>
Co-authored-by: Coding On Star <[email protected]>
Co-authored-by: CodingOnStar <[email protected]>
Co-authored-by: yyh <[email protected]>
Co-authored-by: Xiangxuan Qu <[email protected]>
Co-authored-by: fghpdf <[email protected]>
Co-authored-by: coopercoder <[email protected]>
Co-authored-by: zhaiguangpeng <[email protected]>
Co-authored-by: Junyan Qin (Chin) <[email protected]>
Co-authored-by: E.G <[email protected]>
Co-authored-by: GlobalStar117 <[email protected]>
Co-authored-by: Claude Haiku 4.5 <[email protected]>
Co-authored-by: CodingOnStar <[email protected]>
Co-authored-by: crazywoola <[email protected]>
Co-authored-by: heyszt <[email protected]>
Co-authored-by: NeatGuyCoding <[email protected]>
Co-authored-by: Yeuoly <[email protected]>
Co-authored-by: zxhlyh <[email protected]>
Co-authored-by: moonpanda <[email protected]>
Co-authored-by: warlocgao <[email protected]>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: KVOJJJin <[email protected]>
Co-authored-by: eux <[email protected]>
Co-authored-by: bangjiehan <[email protected]>
Co-authored-by: FFXN <[email protected]>
Co-authored-by: Jyong <[email protected]>
Co-authored-by: Nie Ronghua <[email protected]>
Co-authored-by: JQSevenMiao <[email protected]>
Co-authored-by: jiasiqi <[email protected]>
Co-authored-by: Seokrin Taron Sung <[email protected]>
Co-authored-by: CrabSAMA <[email protected]>
Co-authored-by: Copilot <[email protected]>
Co-authored-by: yihong <[email protected]>
Co-authored-by: Joel <[email protected]>
Co-authored-by: Wu Tianwei <[email protected]>
Co-authored-by: yessenia <[email protected]>
Co-authored-by: Jax <[email protected]>
Co-authored-by: niveshdandyan <[email protected]>
Co-authored-by: OSS Contributor <[email protected]>
Co-authored-by: niveshdandyan <[email protected]>
Co-authored-by: Sean Kenneth Doherty <[email protected]>
2026-02-04 19:04:24 +08:00

75 lines
2.2 KiB
Python

import os
from typing import Literal
from flask import session
from pydantic import BaseModel, Field
from sqlalchemy import select
from sqlalchemy.orm import Session
from configs import dify_config
from controllers.fastopenapi import console_router
from extensions.ext_database import db
from models.model import DifySetup
from services.account_service import TenantService
from .error import AlreadySetupError, InitValidateFailedError
from .wraps import only_edition_self_hosted
class InitValidatePayload(BaseModel):
password: str = Field(..., max_length=30, description="Initialization password")
class InitStatusResponse(BaseModel):
status: Literal["finished", "not_started"] = Field(..., description="Initialization status")
class InitValidateResponse(BaseModel):
result: str = Field(description="Operation result", examples=["success"])
@console_router.get(
"/init",
response_model=InitStatusResponse,
tags=["console"],
)
def get_init_status() -> InitStatusResponse:
"""Get initialization validation status."""
init_status = get_init_validate_status()
if init_status:
return InitStatusResponse(status="finished")
return InitStatusResponse(status="not_started")
@console_router.post(
"/init",
response_model=InitValidateResponse,
tags=["console"],
status_code=201,
)
@only_edition_self_hosted
def validate_init_password(payload: InitValidatePayload) -> InitValidateResponse:
"""Validate initialization password."""
tenant_count = TenantService.get_tenant_count()
if tenant_count > 0:
raise AlreadySetupError()
if payload.password != os.environ.get("INIT_PASSWORD"):
session["is_init_validated"] = False
raise InitValidateFailedError()
session["is_init_validated"] = True
return InitValidateResponse(result="success")
def get_init_validate_status() -> bool:
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() is not None
return True