Full-project rename. `git grep -i aksrt` is now empty apart from the
DBMigrator 3.3.0 changelog note that documents the rename itself.
Code identifiers
- PHP namespace AKSRT\ -> Jio\ (composer PSR-4 + 378 declarations)
- global constants AKSRT_* -> JIO_* (VERSION/DIR/URI, PAY_TYPE_*, CAPTCHA_*)
- procedural functions, hooks, options, meta keys, table names,
cookies, query vars, ajax actions and nonces: aksrt_ -> jio_
- text domain aksrt -> jio; Theme Name -> Jio
- JS globals: aksrtData/aksrtAdminData/... -> jioData/jioAdminData/...,
window.AKSRTCaptcha & friends -> window.JioCaptcha, Aksrt* -> Jio*
- Vue components Aks*.vue -> Jio*.vue (15 files renamed + imports)
- CSS classes/data-attrs/custom properties: aksrt- -> jio-
- REST namespace aksrt/v1 -> jio/v1 (incl. payment gateway callbacks)
Storage layer
- DB tables {prefix}aksrt_* -> {prefix}jio_*; SCHEMA_VERSION 3.2.0 -> 3.3.0
so dbDelta creates the new names on install
- widget id_base aksrt_widget_* -> jio_widget_*
- uninstall.php drop list rebuilt from the actual migrator tables
(dropped 3 stale entries, added the 17 missing ones)
Removed
- hardcoded https://api.aksrt.com/version.json default update endpoint;
get_endpoint() now reads the 「更新端点」 setting and do_check() no-ops
when it is empty
Files renamed: inc/helpers/aksrt-*.php -> jio-*.php (54),
assets/admin/src/components/form/Aks*.vue -> Jio*.vue (15).
Build artifacts regenerated: assets/css/build, assets/js/runtime,
assets/admin/build.
Verified: audit-psr4-paths errors=0, audit-admin-contracts errors=0
(warnings=56, unchanged baseline), 813/813 widget-system tests,
44/44 phpunit, php -l clean across all PHP.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
140 lines
5.3 KiB
PHP
140 lines
5.3 KiB
PHP
<?php
|
|
/**
|
|
* SchemaProvider OAuth 设置校验(代理模式 / 各平台凭据 / HTTPS 地址)。
|
|
*
|
|
* @package Jio
|
|
*/
|
|
|
|
namespace Jio\Admin;
|
|
|
|
defined('ABSPATH') || exit;
|
|
|
|
trait SchemaProviderOAuthValidation {
|
|
|
|
private function validate_oauth_settings(array $settings, array $stored = []): array {
|
|
if (empty($settings['oauth_s'])) {
|
|
return [];
|
|
}
|
|
|
|
$errors = [];
|
|
$mode = sanitize_key((string) ($settings['oauth_proxy_mode'] ?? 'close'));
|
|
$secret_configured = $this->oauth_secret_is_configured($settings['oauth_proxy_secret'] ?? '', $stored['oauth_proxy_secret'] ?? '');
|
|
|
|
if ($mode === 'client') {
|
|
$url = trim((string) ($settings['oauth_proxy_server_url'] ?? ''));
|
|
if (!$this->is_secure_oauth_url($url)) {
|
|
$errors[] = __('客户端代理模式需要有效的 HTTPS 服务端地址', 'jio');
|
|
}
|
|
if (!$secret_configured) {
|
|
$errors[] = __('客户端代理模式需要代理 HMAC 密钥', 'jio');
|
|
}
|
|
if (empty($settings['oauth_proxy_client_providers']) || !is_array($settings['oauth_proxy_client_providers'])) {
|
|
$errors[] = __('客户端代理模式至少需要启用一个登录平台', 'jio');
|
|
}
|
|
return $errors;
|
|
}
|
|
|
|
if ($mode === 'server') {
|
|
if (!$secret_configured) {
|
|
$errors[] = __('服务端代理模式需要代理 HMAC 密钥', 'jio');
|
|
}
|
|
$selected = is_array($settings['oauth_proxy_server_providers'] ?? null) ? $settings['oauth_proxy_server_providers'] : [];
|
|
if ($selected === []) {
|
|
$errors[] = __('服务端代理模式至少需要允许一个登录平台', 'jio');
|
|
}
|
|
$provider_fields = [
|
|
'github' => ['GitHub', 'github_appid', 'github_appkey'],
|
|
'gitee' => ['Gitee', 'gitee_appid', 'gitee_appkey'],
|
|
'qq' => ['QQ', 'qq_appid', 'qq_appkey'],
|
|
'google' => ['Google', 'google_client_id', 'google_client_secret'],
|
|
'weibo' => ['微博', 'weibo_appid', 'weibo_appkey'],
|
|
'weixin' => ['微信开放平台', 'weixin_appid', 'weixin_appsecret'],
|
|
];
|
|
foreach ($selected as $provider) {
|
|
if (!isset($provider_fields[$provider])) {
|
|
continue;
|
|
}
|
|
[$label, $id_key, $secret_key] = $provider_fields[$provider];
|
|
if (trim((string) ($settings[$id_key] ?? '')) === '' || !$this->oauth_secret_is_configured($settings[$secret_key] ?? '', $stored[$secret_key] ?? '')) {
|
|
$errors[] = sprintf(__('代理服务端的 %s 平台缺少完整凭据', 'jio'), $label);
|
|
}
|
|
}
|
|
return $errors;
|
|
}
|
|
|
|
$providers = [
|
|
'github' => ['GitHub', 'github_appid', 'github_appkey'],
|
|
'gitee' => ['Gitee', 'gitee_appid', 'gitee_appkey'],
|
|
'qq' => ['QQ', 'qq_appid', 'qq_appkey'],
|
|
'google' => ['Google', 'google_client_id', 'google_client_secret'],
|
|
'weibo' => ['微博', 'weibo_appid', 'weibo_appkey'],
|
|
'weixin' => ['微信开放平台', 'weixin_appid', 'weixin_appsecret'],
|
|
];
|
|
$enabled = 0;
|
|
foreach ($providers as $provider => [$label, $id_key, $secret_key]) {
|
|
if (empty($settings['oauth_' . $provider . '_s'])) {
|
|
continue;
|
|
}
|
|
$enabled++;
|
|
if (trim((string) ($settings[$id_key] ?? '')) === '' || !$this->oauth_secret_is_configured($settings[$secret_key] ?? '', $stored[$secret_key] ?? '')) {
|
|
$errors[] = sprintf(__('%s 登录已启用,请填写完整凭据', 'jio'), $label);
|
|
}
|
|
}
|
|
|
|
if (!empty($settings['oauth_weixingzh_s'])) {
|
|
$enabled++;
|
|
$gzh_type = sanitize_key((string) ($settings['weixingzh_gzh_type'] ?? 'service'));
|
|
$base_ready = $this->oauth_secret_is_configured($settings['weixingzh_token'] ?? '', $stored['weixingzh_token'] ?? '')
|
|
&& trim((string) ($settings['weixingzh_appid'] ?? '')) !== '';
|
|
$mode_ready = $gzh_type === 'subscribe'
|
|
? trim((string) ($settings['weixingzh_code_qrcode'] ?? '')) !== ''
|
|
&& trim((string) ($settings['weixingzh_code_keyword'] ?? '')) !== ''
|
|
: $this->oauth_secret_is_configured($settings['weixingzh_appsecret'] ?? '', $stored['weixingzh_appsecret'] ?? '');
|
|
if (!$base_ready || !$mode_ready) {
|
|
$errors[] = $gzh_type === 'subscribe'
|
|
? __('微信公众号订阅号登录已启用,请填写 Token、AppID、二维码和回复关键词', 'jio')
|
|
: __('微信公众号服务号登录已启用,请填写 Token、AppID 和 AppSecret', 'jio');
|
|
}
|
|
}
|
|
|
|
if (!empty($settings['clogin_s'])) {
|
|
$enabled++;
|
|
if (!$this->is_secure_oauth_url((string) ($settings['clogin_url'] ?? ''))
|
|
|| trim((string) ($settings['clogin_id'] ?? '')) === ''
|
|
|| !$this->oauth_secret_is_configured($settings['clogin_key'] ?? '', $stored['clogin_key'] ?? '')
|
|
|| empty($settings['clogin_oauth_s'])
|
|
) {
|
|
$errors[] = __('彩虹聚合登录已启用,请填写 HTTPS 接口地址、AppID、AppKey 并选择平台', 'jio');
|
|
}
|
|
}
|
|
|
|
if ($enabled === 0) {
|
|
$errors[] = __('启用第三方登录后,至少需要启用一个本地登录提供商', 'jio');
|
|
}
|
|
|
|
return $errors;
|
|
}
|
|
|
|
private function oauth_secret_is_configured($value, $stored_value = ''): bool {
|
|
$value = trim((string) $value);
|
|
if ($value === '***') {
|
|
return trim((string) $stored_value) !== '';
|
|
}
|
|
return $value !== '';
|
|
}
|
|
|
|
private function is_secure_oauth_url(string $url): bool {
|
|
$url = trim($url);
|
|
if ($url === '' || filter_var($url, FILTER_VALIDATE_URL) === false) {
|
|
return false;
|
|
}
|
|
$parts = wp_parse_url($url);
|
|
return is_array($parts)
|
|
&& strtolower((string) ($parts['scheme'] ?? '')) === 'https'
|
|
&& !empty($parts['host'])
|
|
&& empty($parts['user'])
|
|
&& empty($parts['pass'])
|
|
&& empty($parts['fragment']);
|
|
}
|
|
}
|