fix(ban): state-aware ban copy and real login failure reasons
- fix(profile): 封号用户的公开主页提示不再沿用「当前账号处于限制状态, 部分互动能力已关闭」——封号=全面限制(无法登录),该描述与语境不符。 提示尾句按治理展示态分级:封号→禁封期间无法登录、账号功能全面停用; 小黑屋→发布、评论等操作已受限制;禁言→暂时无法发表评论。 UserRuntime 不再烘焙通用默认文案,缺省时由 get_profile_notice 按态取 - fix(auth): 登录失败透传真实原因——REST auth_login 此前将 Service::login_user 返回的具体错误硬编码为「账号或密码错误」, 禁封用户登录时 Toast 语境错误;现透传 error 字段, friendly_login_error 识别 user_banned 错误码后直接返回禁封文案 (无法登录 + 解封时间/永久 + 原因) - fix(auth): 禁封闸口覆盖全部登录路径——此前仅密码登录经 enforce_login_ban 拦截,短信验证码、公众号扫码、第三方 OAuth 均 直连 complete_login 可绕过封号限制;现将闸口收敛至 complete_login (返回 WP_Error),各调用方中止登录并透出原因;OAuth 重定向新增 account_banned 错误码,auth.js 与 user-center.js 同步文案映射 - test: 新增登录禁封面契约测试(文案单一来源、Toast 透传、免密闸口、 统一收口、前端映射),全量 362 项通过
This commit is contained in:
@@ -227,6 +227,48 @@ class Restriction {
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* 治理展示态公开提示尾句(资料卡提示框,接在徽章文案之后):
|
||||
* 封号 = 全面限制(无法登录、功能停用);
|
||||
* 小黑屋 = 部分限制(发布、评论等操作受限);
|
||||
* 禁言 = 仅评论域受限。
|
||||
* 后台 user_report_ban_notice_text 配置后覆盖全部状态。
|
||||
*
|
||||
* @return array<string,string> 展示态 => 提示文案
|
||||
*/
|
||||
public static function state_notices(): array {
|
||||
return [
|
||||
self::STATE_BANNED => __('禁封期间无法登录,账号功能全面停用。', 'aksrt'),
|
||||
self::STATE_RESTRICTED => __('发布、评论等操作已受限制。', 'aksrt'),
|
||||
self::STATE_MUTED => __('暂时无法发表评论。', 'aksrt'),
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* 登录禁封提示文案(登录拦截 / 免密登录 / Toast 共用)。
|
||||
* 对齐参考主题登录拦截页语义:封号 = 全面限制(无法登录),附期限与原因。
|
||||
*/
|
||||
public function login_ban_message(int $user_id): string {
|
||||
$msg = __('您的账号已被封禁,禁封期间无法登录。', 'aksrt');
|
||||
$ban = $this->get_active_ban($user_id);
|
||||
if (is_array($ban)) {
|
||||
$msg .= !empty($ban['expires_at'])
|
||||
? ' ' . sprintf(__('解封时间:%s。', 'aksrt'), (string) $ban['expires_at'])
|
||||
: ' ' . __('本次封禁为永久封禁。', 'aksrt');
|
||||
$reason = (string) ($ban['reason'] ?? '');
|
||||
$marker = "\n" . __('禁封说明:', 'aksrt');
|
||||
$pos = strpos($reason, $marker);
|
||||
if (false !== $pos) {
|
||||
$reason = substr($reason, 0, $pos);
|
||||
}
|
||||
$reason = trim($reason);
|
||||
if ($reason !== '') {
|
||||
$msg .= ' ' . sprintf(__('原因:%s', 'aksrt'), $reason);
|
||||
}
|
||||
}
|
||||
return $msg;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if a user is in 小黑屋 (active global suspend).
|
||||
*
|
||||
@@ -270,12 +312,7 @@ class Restriction {
|
||||
return $user;
|
||||
}
|
||||
if ($this->is_banned($user->ID)) {
|
||||
$ban = $this->get_active_ban($user->ID);
|
||||
$message = '您的账号已被封禁。';
|
||||
if (!empty($ban['reason'])) {
|
||||
$message .= '原因:' . $ban['reason'];
|
||||
}
|
||||
return new \WP_Error('user_banned', $message);
|
||||
return new \WP_Error('user_banned', $this->login_ban_message($user->ID));
|
||||
}
|
||||
return $user;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user