Files
wordpress-theme-aksrt/src/Auth/ServicePart1a.php
T

198 lines
7.4 KiB
PHP

<?php
/**
* @package AKSRT
*/
namespace AKSRT\Auth;
defined('ABSPATH') || exit;
trait ServicePart1a {
public static function register_user(array $post, bool $verification_completed = false, bool $defer_login = false): array {
$user_login = sanitize_user(wp_unslash($post['user_login'] ?? ''), true);
$user_email = sanitize_email(wp_unslash($post['user_email'] ?? ''));
$password = (string) ($post['user_pass'] ?? '');
$confirm = (string) ($post['user_pass_confirm'] ?? '');
if (
class_exists('\AKSRT\Settings\Settings')
&& \AKSRT\Settings\Settings::signup_verification_enabled()
&& !$verification_completed
) {
return ['success' => false, 'error' => __('请先完成邮箱或手机验证', 'aksrt')];
}
$agreement = class_exists('\AKSRT\Settings\Settings')
? \AKSRT\Settings\Settings::user_agreement_settings()
: ['enabled' => false, 'privacy' => false, 'required' => false];
if ((!empty($agreement['enabled']) || !empty($agreement['privacy'])) && !empty($agreement['required']) && empty($post['agree_terms'])) {
return ['success' => false, 'error' => __('请先同意服务条款', 'aksrt')];
}
if (empty($user_login) || !validate_username($user_login)) {
return ['success' => false, 'error' => __('请输入有效的用户名', 'aksrt')];
}
if (mb_strlen($user_login) < 3 || mb_strlen($user_login) > 60) {
return ['success' => false, 'error' => __('用户名长度需在 3-60 个字符之间', 'aksrt')];
}
if (class_exists('\AKSRT\Settings\Settings')) {
foreach (\AKSRT\Settings\Settings::nickname_blacklist() as $keyword) {
if ($keyword !== '' && mb_stripos($user_login, $keyword) !== false) {
return ['success' => false, 'error' => __('用户名包含禁止使用的关键词', 'aksrt')];
}
}
}
if (username_exists($user_login)) {
return ['success' => false, 'error' => __('该用户名已被使用', 'aksrt')];
}
if (empty($user_email) || !is_email($user_email)) {
return ['success' => false, 'error' => __('请输入有效的邮箱地址', 'aksrt')];
}
if (class_exists('\AKSRT\Settings\Settings')) {
$email_limit = \AKSRT\Settings\Settings::email_limit();
$matches = false;
foreach ((array) ($email_limit['domains'] ?? []) as $keyword) {
if ($keyword !== '' && stripos($user_email, (string) $keyword) !== false) {
$matches = true;
break;
}
}
if ((($email_limit['type'] ?? 'not') === 'not' && $matches) || (($email_limit['type'] ?? 'not') === 'allow' && !empty($email_limit['domains']) && !$matches)) {
return ['success' => false, 'error' => __('该邮箱不符合本站注册规则', 'aksrt')];
}
}
if (email_exists($user_email)) {
return ['success' => false, 'error' => __('该邮箱已被其他账号使用', 'aksrt')];
}
if (
class_exists('\AKSRT\Settings\Settings')
&& \AKSRT\Settings\Settings::signup_verification_enabled()
&& \AKSRT\Settings\Settings::signup_omit_password_confirmation()
) {
$confirm = $password;
}
$password_check = self::validate_password($password, $confirm);
if ($password_check !== true) {
return ['success' => false, 'error' => $password_check];
}
$ref_service = class_exists('\AKSRT\Payment\ReferralAttribution')
? \AKSRT\Payment\ReferralAttribution::get_instance()
: null;
if ($ref_service) {
$ref_service->clear_registration_context();
}
$registration = class_exists('\AKSRT\Settings\Settings')
? \AKSRT\Settings\Settings::get_referral_registration_settings()
: ['enabled' => false, 'register_field' => 'hidden', 'reject_invalid' => true];
$submitted_ref = isset($post['ref']) ? sanitize_key((string) wp_unslash($post['ref'])) : '';
$field_mode = !empty($registration['enabled'])
? (string) ($registration['register_field'] ?? 'hidden')
: 'hidden';
$accept_submitted = !empty($registration['enabled']) && $field_mode !== 'hidden';
$ref_context = $ref_service
? $ref_service->prepare_registration($accept_submitted ? $submitted_ref : '')
: ['ref' => '', 'valid' => false, 'submitted_valid' => false, 'conflict' => false, 'source' => 'none'];
if ($field_mode === 'required' && empty($ref_context['valid'])) {
if ($submitted_ref === '') {
if ($ref_service) {
$ref_service->clear_registration_context();
}
return ['success' => false, 'error' => __('请填写推广码', 'aksrt')];
}
if (!empty($registration['reject_invalid'])) {
if ($ref_service) {
$ref_service->clear_registration_context();
}
return ['success' => false, 'error' => __('推广码无效,请检查后重试', 'aksrt')];
}
}
if ($submitted_ref !== '' && empty($ref_context['valid']) && !empty($registration['reject_invalid'])) {
if ($ref_service) {
$ref_service->clear_registration_context();
}
return ['success' => false, 'error' => __('推广码无效,请检查后重试', 'aksrt')];
}
$user_id = wp_create_user($user_login, $password, $user_email);
if (is_wp_error($user_id)) {
if ($ref_service) {
$ref_service->clear_registration_context();
}
return ['success' => false, 'error' => $user_id->get_error_message()];
}
$ref_notice = $ref_service ? $ref_service->take_registration_notice() : '';
$user = get_userdata($user_id);
if (!$user || is_wp_error($user)) {
return ['success' => false, 'error' => __('注册成功,但读取用户信息失败,请联系管理员', 'aksrt')];
}
if ($user instanceof \WP_User && is_email($user->user_email)) {
\AKSRT\Settings\Mail::send_event_email('reg_success', $user->user_email, [
'{username}' => $user->display_name,
'{site_name}' => get_bloginfo('name'),
'{url}' => function_exists('aksrt_get_user_center_url') ? aksrt_get_user_center_url() : home_url('/'),
]);
}
if (
!$defer_login
&& $verification_completed
&& class_exists('\AKSRT\Settings\Settings')
&& \AKSRT\Settings\Settings::signup_verification_enabled()
) {
self::mark_email_verified($user_id);
}
if (!$defer_login) {
wp_set_auth_cookie((int) $user_id, true);
do_action('wp_login', $user->user_login, $user);
}
return [
'success' => true,
'user_id' => (int) $user_id,
'user' => $user,
'user_login' => $user_login,
'redirect' => home_url('/'),
'notice' => $ref_notice,
];
}
public static function finalize_oauth_binding(int $user_id, array $oauth_data, string $obk = '') {
if ($user_id <= 0 || $obk === '') {
return new \WP_Error('oauth_binding_invalid', __('绑定会话无效', 'aksrt'));
}
$payload = $oauth_data;
if (empty($payload['_oauth_claimed'])) {
$row = OAuthTransactionStore::claim(sanitize_text_field($obk), 'obk');
$payload = is_array($row['payload'] ?? null) ? $row['payload'] : [];
if (!$row || $payload === []) {
return new \WP_Error('oauth_binding_consumed', __('绑定会话已过期或已使用,请重新授权', 'aksrt'));
}
}
unset($payload['_oauth_claimed']);
$provider = sanitize_key((string) ($payload['provider'] ?? ''));
$identity = is_array($payload['user_data'] ?? null) ? $payload['user_data'] : [];
if ($provider === '' || empty($identity['provider_id'])) {
return new \WP_Error('oauth_binding_invalid', __('第三方账号信息无效', 'aksrt'));
}
return OAuthAccountService::bind($user_id, $provider, $identity);
}
private static function mark_email_verified(int $user_id): void {
update_user_meta($user_id, self::EMAIL_VERIFIED_META, '1');
do_action('aksrt_email_verified', $user_id);
}
}