Files
wordpress-theme-aksrt/src/Admin/ImportExportControllerPart2.php
T
kate522 ff4ec1eb43 feat(captcha): 打通人机验证 11 个场景的前后端完整链路
- 统一验证入口 aksrt_require_captcha(),返回 true|WP_Error,启用场景配置缺失时 fail-closed 拒绝
- 前端公共 API 重构为 window.AKSRTCaptcha(verify/collect/reset/run),单飞锁防并发重复验证,一次性 proof 绑定浏览器 cookie+场景+服务商+主机名
- challenge/exchange REST 端点:challenge 原子占用防票据放大厂商调用,增加频率限制
- 新增 OAuth bind pass:服务端签发 5 分钟一次性令牌,绑定用户+服务商+浏览器,微信扫码延迟消费
- 覆盖场景:评论、登录、注册、绑定第三方、绑定手机、找回密码、修改密码、更改邮箱、资料下载、签到、前台投稿
- 移除 Service 层重复验证与 _auth_code_verified/_defer_login 等客户端可伪造标志,删除下载共享 pass 死代码
- 修复腾讯 TC3 签名 scope、Cloudflare action/cdata/hostname 严格校验、阿里云验签错误码映射
- 后台 Schema 保存对 secret 字段做掩码/保留合并;导入导出过滤 aksrt_captcha_config
- 重建 public bundle 与 admin SPA;新增 captcha 运行时/安全/业务契约测试与 harness
2026-09-02 13:03:24 +08:00

87 lines
2.8 KiB
PHP

<?php
/**
* @package AKSRT
*/
namespace AKSRT\Admin;
defined('ABSPATH') || exit;
trait ImportExportControllerPart2 {
private function get_backup_schedule_settings(): array {
$provider = SchemaProvider::get_instance();
$settings = $provider->read_settings('tools', 'backup');
$frequency = sanitize_key((string) ($settings['backup_frequency'] ?? 'weekly'));
$allowed = ['daily', 'weekly', 'monthly'];
if (!in_array($frequency, $allowed, true)) {
$frequency = 'weekly';
}
return [
'enabled' => !empty($settings['backup_auto']),
'schedule' => $frequency === 'monthly' ? self::MONTHLY_SCHEDULE : $frequency,
];
}
private function build_settings_backup(string $type, string $label = ''): array {
$schema_provider = SchemaProvider::get_instance();
$domains = $schema_provider->get_domain_keys();
$payload = [
'version' => AKSRT_VERSION ?? '3.4.0',
'exported' => gmdate('Y-m-d H:i:s'),
'domains' => [],
'standalone'=> [],
];
foreach ($domains as $domain) {
$payload['domains'][$domain] = [
'option_key' => $schema_provider->get_option_key($domain),
'data' => $schema_provider->read_settings($domain),
];
}
foreach (\AKSRT\Settings\Settings::standalone_export_keys() as $key) {
$value = get_option($key);
if ($value !== false) {
$payload['standalone'][$key] = $value;
}
}
$payload = \AKSRT\Settings\Settings::redact_sensitive_settings($payload);
return [
'id' => time(),
'type' => $type,
'label' => $label !== '' ? $label : $this->default_backup_label($type),
'created_at' => gmdate('Y-m-d H:i:s'),
'payload' => $payload,
];
}
private function trim_setting_backups(array $backups): array {
$retain = (int) (\AKSRT\Settings\Settings::get_value('backup_retain', 7));
$retain = max(3, min(20, $retain));
if (count($backups) <= $retain) {
return array_values($backups);
}
return array_values(array_slice($backups, 0, $retain));
}
private function default_backup_label(string $type): string {
$map = [
'manual' => __('手动备份', 'aksrt'),
'scheduled' => __('定期备份', 'aksrt'),
'reset_all' => __('重置全部前快照', 'aksrt'),
'reset_domain' => __('重置分区前快照', 'aksrt'),
'update_theme' => __('更新主题前快照', 'aksrt'),
];
return $map[$type] ?? __('设置快照', 'aksrt');
}
}