From 8d2658b166a9336cf8e48f0773450740f43b90c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=8E=E5=B0=8F=E4=B8=98?= Date: Thu, 18 Dec 2025 14:06:35 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E7=A7=BB=E9=99=A4=20UserAuthn=20?= =?UTF-8?q?=E6=A8=A1=E5=9E=8B=E4=B8=AD=E7=9A=84=E8=A1=A8=E5=90=8D=E5=AE=9A?= =?UTF-8?q?=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- models/migration.py | 191 +++++++++++++++++++++---------------------- models/user_authn.py | 2 - 2 files changed, 93 insertions(+), 100 deletions(-) diff --git a/models/migration.py b/models/migration.py index ec841a4..878a48a 100644 --- a/models/migration.py +++ b/models/migration.py @@ -1,5 +1,5 @@ -from .setting import Setting +from .setting import Setting, SettingsType from pkg.conf.appmeta import BackendVersion from .response import ThemeModel from pkg.password.pwd import Password @@ -22,99 +22,99 @@ async def migration() -> None: log.info('数据库初始化结束') default_settings: list[Setting] = [ - Setting(name="siteURL", value="http://localhost", type="basic"), - Setting(name="siteName", value="DiskNext", type="basic"), - Setting(name="register_enabled", value="1", type="register"), - Setting(name="default_group", value="2", type="register"), - Setting(name="siteKeywords", value="网盘,网盘", type="basic"), - Setting(name="siteDes", value="DiskNext", type="basic"), - Setting(name="siteTitle", value="云星启智", type="basic"), - Setting(name="fromName", value="DiskNext", type="mail"), - Setting(name="mail_keepalive", value="30", type="mail"), - Setting(name="fromAdress", value="no-reply@yxqi.cn", type="mail"), - Setting(name="smtpHost", value="smtp.yxqi.cn", type="mail"), - Setting(name="smtpPort", value="25", type="mail"), - Setting(name="replyTo", value="feedback@yxqi.cn", type="mail"), - Setting(name="smtpUser", value="no-reply@yxqi.cn", type="mail"), - Setting(name="smtpPass", value="", type="mail"), - Setting(name="maxEditSize", value="4194304", type="file_edit"), - Setting(name="archive_timeout", value="60", type="timeout"), - Setting(name="download_timeout", value="60", type="timeout"), - Setting(name="preview_timeout", value="60", type="timeout"), - Setting(name="doc_preview_timeout", value="60", type="timeout"), - Setting(name="upload_credential_timeout", value="1800", type="timeout"), - Setting(name="upload_session_timeout", value="86400", type="timeout"), - Setting(name="slave_api_timeout", value="60", type="timeout"), - Setting(name="onedrive_monitor_timeout", value="600", type="timeout"), - Setting(name="share_download_session_timeout", value="2073600", type="timeout"), - Setting(name="onedrive_callback_check", value="20", type="timeout"), - Setting(name="aria2_call_timeout", value="5", type="timeout"), - Setting(name="onedrive_chunk_retries", value="1", type="retry"), - Setting(name="onedrive_source_timeout", value="1800", type="timeout"), - Setting(name="reset_after_upload_failed", value="0", type="upload"), - Setting(name="login_captcha", value="0", type="login"), - Setting(name="reg_captcha", value="0", type="login"), - Setting(name="email_active", value="0", type="register"), + Setting(name="siteURL", value="http://localhost", type=SettingsType.BASIC), + Setting(name="siteName", value="DiskNext", type=SettingsType.BASIC), + Setting(name="register_enabled", value="1", type=SettingsType.REGISTER), + Setting(name="default_group", value="2", type=SettingsType.REGISTER), + Setting(name="siteKeywords", value="网盘,网盘", type=SettingsType.BASIC), + Setting(name="siteDes", value="DiskNext", type=SettingsType.BASIC), + Setting(name="siteTitle", value="云星启智", type=SettingsType.BASIC), + Setting(name="fromName", value="DiskNext", type=SettingsType.MAIL), + Setting(name="mail_keepalive", value="30", type=SettingsType.MAIL), + Setting(name="fromAdress", value="no-reply@yxqi.cn", type=SettingsType.MAIL), + Setting(name="smtpHost", value="smtp.yxqi.cn", type=SettingsType.MAIL), + Setting(name="smtpPort", value="25", type=SettingsType.MAIL), + Setting(name="replyTo", value="feedback@yxqi.cn", type=SettingsType.MAIL), + Setting(name="smtpUser", value="no-reply@yxqi.cn", type=SettingsType.MAIL), + Setting(name="smtpPass", value="", type=SettingsType.MAIL), + Setting(name="maxEditSize", value="4194304", type=SettingsType.FILE_EDIT), + Setting(name="archive_timeout", value="60", type=SettingsType.TIMEOUT), + Setting(name="download_timeout", value="60", type=SettingsType.TIMEOUT), + Setting(name="preview_timeout", value="60", type=SettingsType.TIMEOUT), + Setting(name="doc_preview_timeout", value="60", type=SettingsType.TIMEOUT), + Setting(name="upload_credential_timeout", value="1800", type=SettingsType.TIMEOUT), + Setting(name="upload_session_timeout", value="86400", type=SettingsType.TIMEOUT), + Setting(name="slave_api_timeout", value="60", type=SettingsType.TIMEOUT), + Setting(name="onedrive_monitor_timeout", value="600", type=SettingsType.TIMEOUT), + Setting(name="share_download_session_timeout", value="2073600", type=SettingsType.TIMEOUT), + Setting(name="onedrive_callback_check", value="20", type=SettingsType.TIMEOUT), + Setting(name="aria2_call_timeout", value="5", type=SettingsType.TIMEOUT), + Setting(name="onedrive_chunk_retries", value="1", type=SettingsType.RETRY), + Setting(name="onedrive_source_timeout", value="1800", type=SettingsType.TIMEOUT), + Setting(name="reset_after_upload_failed", value="0", type=SettingsType.UPLOAD), + Setting(name="login_captcha", value="0", type=SettingsType.LOGIN), + Setting(name="reg_captcha", value="0", type=SettingsType.LOGIN), + Setting(name="email_active", value="0", type=SettingsType.REGISTER), Setting(name="mail_activation_template", value="""激活您的账户
激活{siteTitle}账户
亲爱的{userName}
感谢您注册{siteTitle},请点击下方按钮完成账户激活。
激活账户
感谢您选择{siteTitle}。
""", type="mail_template"), - Setting(name="forget_captcha", value="0", type="login"), +Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0; padding: 0 0 20px;"valign="top">亲爱的{userName}:感谢您注册{siteTitle},请点击下方按钮完成账户激活。激活账户感谢您选择{siteTitle}。""", type=SettingsType.MAIL_TEMPLATE), + Setting(name="forget_captcha", value="0", type=SettingsType.LOGIN), Setting(name="mail_reset_pwd_template", value="""重设密码
重设{siteTitle}密码
亲爱的{userName}
请点击下方按钮完成密码重设。如果非你本人操作,请忽略此邮件。
重设密码
感谢您选择{siteTitle}。
""", type="mail_template"), - Setting(name=f"db_version_{BackendVersion}", value="installed", type="version"), - Setting(name="hot_share_num", value="10", type="share"), - Setting(name="gravatar_server", value="https://www.gravatar.com/", type="avatar"), - Setting(name="defaultTheme", value="#3f51b5", type="basic"), - Setting(name="themes", value=ThemeModel().model_dump_json(), type="basic"), - Setting(name="aria2_token", value="", type="aria2"), - Setting(name="aria2_rpcurl", value="", type="aria2"), - Setting(name="aria2_temp_path", value="", type="aria2"), - Setting(name="aria2_options", value="{}", type="aria2"), - Setting(name="aria2_interval", value="60", type="aria2"), - Setting(name="max_worker_num", value="10", type="task"), - Setting(name="max_parallel_transfer", value="4", type="task"), - Setting(name="secret_key", value=Password.generate(256), type="auth"), - Setting(name="temp_path", value="temp", type="path"), - Setting(name="avatar_path", value="avatar", type="path"), - Setting(name="avatar_size", value="2097152", type="avatar"), - Setting(name="avatar_size_l", value="200", type="avatar"), - Setting(name="avatar_size_m", value="130", type="avatar"), - Setting(name="avatar_size_s", value="50", type="avatar"), - Setting(name="home_view_method", value="icon", type="view"), - Setting(name="share_view_method", value="list", type="view"), - Setting(name="cron_garbage_collect", value="@hourly", type="cron"), - Setting(name="authn_enabled", value="0", type="authn"), - Setting(name="captcha_height", value="60", type="captcha"), - Setting(name="captcha_width", value="240", type="captcha"), - Setting(name="captcha_mode", value="3", type="captcha"), - Setting(name="captcha_ComplexOfNoiseText", value="0", type="captcha"), - Setting(name="captcha_ComplexOfNoiseDot", value="0", type="captcha"), - Setting(name="captcha_IsShowHollowLine", value="0", type="captcha"), - Setting(name="captcha_IsShowNoiseDot", value="1", type="captcha"), - Setting(name="captcha_IsShowNoiseText", value="0", type="captcha"), - Setting(name="captcha_IsShowSlimeLine", value="1", type="captcha"), - Setting(name="captcha_IsShowSineLine", value="0", type="captcha"), - Setting(name="captcha_CaptchaLen", value="6", type="captcha"), - Setting(name="captcha_IsUseReCaptcha", value="0", type="captcha"), - Setting(name="captcha_ReCaptchaKey", value="defaultKey", type="captcha"), - Setting(name="captcha_ReCaptchaSecret", value="defaultSecret", type="captcha"), - Setting(name="thumb_width", value="400", type="thumb"), - Setting(name="thumb_height", value="300", type="thumb"), - Setting(name="pwa_small_icon", value="/static/img/favicon.ico", type="pwa"), - Setting(name="pwa_medium_icon", value="/static/img/logo192.png", type="pwa"), - Setting(name="pwa_large_icon", value="/static/img/logo512.png", type="pwa"), - Setting(name="pwa_display", value="standalone", type="pwa"), - Setting(name="pwa_theme_color", value="#000000", type="pwa"), - Setting(name="pwa_background_color", value="#ffffff", type="pwa"), +Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0; padding: 0 0 20px;"valign="top">亲爱的{userName}:请点击下方按钮完成密码重设。如果非你本人操作,请忽略此邮件。重设密码感谢您选择{siteTitle}。""", type=SettingsType.MAIL_TEMPLATE), + Setting(name=f"db_version_{BackendVersion}", value="installed", type=SettingsType.VERSION), + Setting(name="hot_share_num", value="10", type=SettingsType.SHARE), + Setting(name="gravatar_server", value="https://www.gravatar.com/", type=SettingsType.AVATAR), + Setting(name="defaultTheme", value="#3f51b5", type=SettingsType.BASIC), + Setting(name="themes", value=ThemeModel().model_dump_json(), type=SettingsType.BASIC), + Setting(name="aria2_token", value="", type=SettingsType.ARIA2), + Setting(name="aria2_rpcurl", value="", type=SettingsType.ARIA2), + Setting(name="aria2_temp_path", value="", type=SettingsType.ARIA2), + Setting(name="aria2_options", value="{}", type=SettingsType.ARIA2), + Setting(name="aria2_interval", value="60", type=SettingsType.ARIA2), + Setting(name="max_worker_num", value="10", type=SettingsType.TASK), + Setting(name="max_parallel_transfer", value="4", type=SettingsType.TASK), + Setting(name="secret_key", value=Password.generate(256), type=SettingsType.AUTH), + Setting(name="temp_path", value="temp", type=SettingsType.PATH), + Setting(name="avatar_path", value="avatar", type=SettingsType.PATH), + Setting(name="avatar_size", value="2097152", type=SettingsType.AVATAR), + Setting(name="avatar_size_l", value="200", type=SettingsType.AVATAR), + Setting(name="avatar_size_m", value="130", type=SettingsType.AVATAR), + Setting(name="avatar_size_s", value="50", type=SettingsType.AVATAR), + Setting(name="home_view_method", value="icon", type=SettingsType.VIEW), + Setting(name="share_view_method", value="list", type=SettingsType.VIEW), + Setting(name="cron_garbage_collect", value="@hourly", type=SettingsType.CRON), + Setting(name="authn_enabled", value="0", type=SettingsType.AUTHN), + Setting(name="captcha_height", value="60", type=SettingsType.CAPTCHA), + Setting(name="captcha_width", value="240", type=SettingsType.CAPTCHA), + Setting(name="captcha_mode", value="3", type=SettingsType.CAPTCHA), + Setting(name="captcha_ComplexOfNoiseText", value="0", type=SettingsType.CAPTCHA), + Setting(name="captcha_ComplexOfNoiseDot", value="0", type=SettingsType.CAPTCHA), + Setting(name="captcha_IsShowHollowLine", value="0", type=SettingsType.CAPTCHA), + Setting(name="captcha_IsShowNoiseDot", value="1", type=SettingsType.CAPTCHA), + Setting(name="captcha_IsShowNoiseText", value="0", type=SettingsType.CAPTCHA), + Setting(name="captcha_IsShowSlimeLine", value="1", type=SettingsType.CAPTCHA), + Setting(name="captcha_IsShowSineLine", value="0", type=SettingsType.CAPTCHA), + Setting(name="captcha_CaptchaLen", value="6", type=SettingsType.CAPTCHA), + Setting(name="captcha_IsUseReCaptcha", value="0", type=SettingsType.CAPTCHA), + Setting(name="captcha_ReCaptchaKey", value="defaultKey", type=SettingsType.CAPTCHA), + Setting(name="captcha_ReCaptchaSecret", value="defaultSecret", type=SettingsType.CAPTCHA), + Setting(name="thumb_width", value="400", type=SettingsType.THUMB), + Setting(name="thumb_height", value="300", type=SettingsType.THUMB), + Setting(name="pwa_small_icon", value="/static/img/favicon.ico", type=SettingsType.PWA), + Setting(name="pwa_medium_icon", value="/static/img/logo192.png", type=SettingsType.PWA), + Setting(name="pwa_large_icon", value="/static/img/logo512.png", type=SettingsType.PWA), + Setting(name="pwa_display", value="standalone", type=SettingsType.PWA), + Setting(name="pwa_theme_color", value="#000000", type=SettingsType.PWA), + Setting(name="pwa_background_color", value="#ffffff", type=SettingsType.PWA), ] async def init_default_settings() -> None: @@ -128,7 +128,7 @@ async def init_default_settings() -> None: # 检查是否已经存在版本设置 ver = await Setting.get( session, - and_(Setting.type == "version", Setting.name == f"db_version_{BackendVersion}") + and_(Setting.type == SettingsType.VERSION, Setting.name == f"db_version_{BackendVersion}") ) if ver and ver.value == "installed": return @@ -145,7 +145,7 @@ async def init_default_group() -> None: async for session in get_session(): # 未找到初始管理组时,则创建 if not await Group.get(session, Group.id == 1): - admin_group = Group( + await Group( name="管理员", max_storage=1 * 1024 * 1024 * 1024, # 1GB share_enabled=True, @@ -157,30 +157,27 @@ async def init_default_group() -> None: share_download=True, aria2=True, ).model_dump(), - ) - await admin_group.save(session) + ).save(session) # 未找到初始注册会员时,则创建 if not await Group.get(session, Group.id == 2): - member_group = Group( + await Group( name="注册会员", max_storage=1 * 1024 * 1024 * 1024, # 1GB share_enabled=True, web_dav_enabled=True, options=GroupOptions(share_download=True).model_dump(), - ) - await member_group.save(session) + ).save(session) # 未找到初始游客组时,则创建 if not await Group.get(session, Group.id == 3): - guest_group = Group( + await Group( name="游客", policies="[]", share_enabled=False, web_dav_enabled=False, options=GroupOptions(share_download=True).model_dump(), - ) - await guest_group.save(session) + ).save(session) async def init_default_user() -> None: from .user import User @@ -203,18 +200,16 @@ async def init_default_user() -> None: admin_password = Password.generate(8) hashed_admin_password = Password.hash(admin_password) - admin_user = User( + await User( username="admin", nick="admin", status=True, group_id=admin_group.id, password=hashed_admin_password, - ) + ).save(session) - await admin_user.save(session) - - log.info(f'初始管理员账号:[bold]admin[/bold]') - log.info(f'初始管理员密码:[bold]{admin_password}[/bold]') + log.info(f'初始管理员账号: admin') + log.info(f'初始管理员密码: {admin_password}') async def init_default_policy() -> None: diff --git a/models/user_authn.py b/models/user_authn.py index 84a4542..c0d782a 100644 --- a/models/user_authn.py +++ b/models/user_authn.py @@ -12,8 +12,6 @@ if TYPE_CHECKING: class UserAuthn(TableBase, table=True): """用户 WebAuthn 凭证模型,与 User 为多对一关系""" - __tablename__ = "user_authn" - credential_id: str = Field(max_length=255, unique=True, index=True) """凭证 ID,Base64 编码"""