# 参数化保真校验的「有意升级」申报（阶段 2）
# 这些栈的这些函数与重构前不同，因为它们统一到了 lnmp 版——lnmp 早年修过的拼写、
# 补过的中文交互与自动化功能，nextlnmpa / lamp 从未同步到，属于复制粘贴漂移欠债。
# 未列在这里的偏差 = CI 红灯。

# ---- 全栈：Add_SSL_Menu 增加 Apache 证书链提示的条件分支 ----
# lamp 原版在此处是死循环（回车跳过时设了 Conf_SSLChain 却没 break，用户出不来），一并修掉。
lnmp:Add_SSL_Menu
lnmpa:Add_SSL_Menu
lamp:Add_SSL_Menu

# ---- 拼写与文案修正（lnmp 早已修正，另两栈沿用错版）----
# Sucessfully -> Successfully / diretcory -> directory / Virtul -> Virtual
# 用法提示：lamp 原写「Usage: lnmp ftp」但实际命令是 nextlnmp；lnmpa 的 database 子命令写成 mysql
lnmpa:Add_Database
lnmpa:Add_Ftp
lnmpa:Edit_Database
lnmpa:List_Database
lnmpa:List_Ftp
lnmpa:Del_Database
lnmpa:Edit_Ftp
lnmpa:Del_Ftp
lnmpa:Function_Ftp
lnmpa:Function_Vhost
lnmpa:Function_Database
lamp:Add_Database
lamp:Add_Ftp
lamp:Edit_Database
lamp:List_Database
lamp:List_Ftp
lamp:Del_Database
lamp:Edit_Ftp
lamp:Del_Ftp
lamp:Function_Ftp
lamp:Function_Vhost
lamp:Function_Database

# ---- 功能补齐：lnmp 独有的中文交互与自动化，补给 lnmpa / lamp ----
# Check_Acme_EMail    : 默认邮箱 + 中文提示（原版强制手输）
# Return_301_Menu     : HTTP->HTTPS 自动跳转询问（中文，默认开）
# Verify_DB_Password  : 自动读取 /root/.nextlnmp_db_password（由 include/main.sh 写入，全栈通用）
# Add_Database_Menu   : 按域名自动生成库名/用户名，回车即用
# List_VHost          : 中文站点列表文案
lnmpa:Check_Acme_EMail
lnmpa:Return_301_Menu
lnmpa:Verify_DB_Password
lnmpa:Add_Database_Menu
lnmpa:List_VHost
lamp:Check_Acme_EMail
lamp:Return_301_Menu
lamp:Verify_DB_Password
lamp:Add_Database_Menu
lamp:List_VHost

# ---- 路径参数化后的等价渲染差异（证书目录/vhost 目录随栈切换）----
lnmpa:Add_Dns_SSL
lamp:Add_SSL
lamp:Add_Dns_SSL
lamp:Add_Dns_SSL_Only
lamp:Install_Check_Acme.sh

# ---- 真机装测（2026-08-26）修复：Add_Database_Menu 两处缺陷 ----
# ① nextlnmp database add 独立调用时 ${domain} 未赋值 → 提示里"自动生成的："是空串，
#    用户按提示回车反被拒绝；现无域名时退回随机库名 dbXXXXXXXX。
# ② while read 无 EOF 守卫 → 管道/脚本调用时空转烧 CPU（真机实测 35% 停不下来）；
#    现 read 失败即退出循环。三个栈共用此函数，故三栈渲染均与基线不同。
lnmp:Add_Database_Menu

# ---- 全栈：两处菜单输入校验的交替式补上括号（真机审计发现）----
# 原写法 [[ $choice =~ ^1|2$ ]] 被 bash 解析成 (^1)|(2$)，于是任何以 1 开头的输入
# 都过关：提示写着「Enter 1 or 2」，输入 12 / 13 照样放行，随后按不存在的分支继续。
# ^2|3|4$ 更松，(3) 那支完全没锚，任何含 3 的输入都算数。
# 改为 ^(1|2)$ / ^(2|3|4)$，只接受菜单里真实存在的选项。
lnmp:Add_DNS_SSL_Select_Menu
lnmpa:Add_DNS_SSL_Select_Menu
lamp:Add_DNS_SSL_Select_Menu

# ---- 全栈：邮箱校验不再卡死现代顶级域 ----
# 原正则 ^...\.[A-Za-z]{2,4}$ 把顶级域限死 2~4 个字母，.online / .email / .website
# 这类邮箱一律判为"格式不正确"。而这段在 while :;do 里没有出口，用户不是被提示
# 一下，是【彻底卡死】、只能 Ctrl+C，SSL 配置整条路走不通。改为 {2,}。
lnmp:Check_Acme_EMail
lnmpa:Check_Acme_EMail
lamp:Check_Acme_EMail

# ---- 全栈：12 处交互循环补 EOF 护栏 ----
# 这些 while :;do ... read ... 循环判「不能为空」，但 read 读到 EOF 时变量仍为空、
# 循环不会退出。非交互调用（脚本、cron、</dev/null）下就是无限空转刷屏——
# 本机实测 3 秒刷 28 万行，足以把日志和磁盘撑爆。加护栏后同场景只剩 2 行。
# 正常交互路径不受影响（空回车照旧提示重输）。
lnmp:Enter_Database_Name
lnmpa:Enter_Database_Name
lamp:Enter_Database_Name
lnmp:Enter_Ftp_Name
lnmpa:Enter_Ftp_Name
lamp:Enter_Ftp_Name
lnmp:Add_Ftp_Menu
lnmpa:Add_Ftp_Menu
lamp:Add_Ftp_Menu
lnmp:Add_DNS_SSL_Only_Info_Menu
lnmpa:Add_DNS_SSL_Only_Info_Menu
lamp:Add_DNS_SSL_Only_Info_Menu
lnmp:Edit_Database
lamp:Edit_Database

# ---- 全栈：带明文密码的临时 SQL 从 /tmp 迁到 root 私有目录 ----
# 原来写死 /tmp/.mysql.tmp、/tmp/.add_mysql.sql、/tmp/.del.mysql.sql。两个问题：
#   ① 默认 umask 下是 0644，真机实测普通用户 www 能直接 cat 出
#      CREATE USER ... IDENTIFIED BY '<明文密码>'；
#   ② 每个站点的 open_basedir 恰好放行了 /tmp/，任何一个被挂马的 PHP 站点
#      都能在建站/删站的窗口里读到它。
# 改用 /root/.nextlnmp-tmp（700）。真机复验：www 读取与建链接均 Permission denied。
lnmp:Do_Query
lnmpa:Do_Query
lamp:Do_Query
lnmp:TempMycnf_Clean
lnmpa:TempMycnf_Clean
lamp:TempMycnf_Clean
lnmp:Add_Database
lnmp:Del_Database

# ---- 全栈：数据库密码验证不再把「连不上」报成「密码错」并无限重问 ----
# 原逻辑：Do_Query 非零一律 Echo_Red "密码错误，请重新输入！" 然后继续循环。
# 但非零还可能是数据库没启动（2002/2003）、甚至压根没装（MySQL_Bin=None）。
# 数据库没起来的用户会被无限追问密码，输什么都不对，也不会被告知该去启动服务；
# 而 read -e 不判 EOF，非交互场景下就是 100% CPU 的死循环。
# 现在：先判 MySQL_Bin=None 直接退出；连接类错误明确指出「不是密码问题」并给
# 出启动命令后退出；只有真的认证失败才重问；read 补 EOF 出口。
lnmp:Verify_DB_Password

# ---- 建站/SSL：不再假成功，自有证书分支不再造出无限重定向 ----
# Add_Database / Add_Ftp 现在把成败记进 Add_DB_Result / Add_FTP_Result，
# 收尾面板按真实结果打印。原来面板只看用户当初的 y/n：库没建成也照样吐出
# "数据库名/用户/密码"三行，用户拿去装 WordPress 才发现连不上。
# Add_SSL 的「自有证书」分支补上 :80 vhost 的存在性检查（分支 2-4 早就有）：
# 配置文件不存在时 Create_SSL_Config 的 `cat >>` 等于新建一个只有 443 的
# server，叠加默认开启的 301 之后 HTTPS 请求被 301 到自己，
# 浏览器 ERR_TOO_MANY_REDIRECTS。
lnmp:Add_Ftp
lnmpa:Add_Ftp
lamp:Add_Ftp
lnmp:Add_SSL
lnmpa:Add_SSL
lamp:Add_SSL
lnmp:Add_Database
