| | |
| | | <?php |
| | | namespace JVBase\managers; |
| | | |
| | | use JVBase\blocks\CustomBlocks; |
| | | use JVBase\forms\TaxonomySelector; |
| | | use JVBase\meta\MetaManager; |
| | | use JVBase\meta\MetaForm; |
| | | use JVBase\managers\AjaxRateLimiter; |
| | | use JVBase\meta\Form; |
| | | |
| | | use JVBase\utility\Features; |
| | | use WP_Error; |
| | | use WP_User; |
| | |
| | | class LoginManager |
| | | { |
| | | protected Features $siteFeatures; |
| | | protected ?MetaForm $metaForm = null; |
| | | protected CacheManager $cache; |
| | | protected ?Form $form = null; |
| | | protected Cache $cache; |
| | | |
| | | |
| | | protected array $forms =[]; |
| | |
| | | $this->siteFeatures = Features::forSite(); |
| | | |
| | | |
| | | $this->cache = CacheManager::for('login'); |
| | | $this->cache = Cache::for('login'); |
| | | |
| | | // Initialize magic link support if enabled |
| | | if ($this->siteFeatures->has('magicLink')) { |
| | |
| | | // Login success handling |
| | | add_action('wp_login', [$this, 'handleSuccessfulLogin'], 10, 2); |
| | | |
| | | add_filter('lostpassword_url', [$this, 'resetPasswordUrl'], 10, 2); |
| | | add_filter( 'login_url', [$this, 'loginUrl'], 10, 3 ); |
| | | add_filter( 'logout_url', [$this, 'logoutUrl'], 10, 2 ); |
| | | // Allow other features to register handlers |
| | |
| | | } |
| | | |
| | | public function logoutUrl(string $logout_url, string $redirect): string |
| | | { |
| | | // Build custom logout URL |
| | | $logout_url = site_url('/login/', 'login'); |
| | | $logout_url = add_query_arg('action', 'logout', $logout_url); |
| | | { |
| | | // Build custom logout URL |
| | | $logout_url = site_url('/login/', 'login'); |
| | | $logout_url = add_query_arg('action', 'logout', $logout_url); |
| | | |
| | | if (!empty($redirect)) { |
| | | $logout_url = add_query_arg('redirect_to', urlencode($redirect), $logout_url); |
| | | if (!empty($redirect)) { |
| | | $logout_url = add_query_arg('redirect_to', urlencode($redirect), $logout_url); |
| | | } |
| | | |
| | | // Add nonce for security |
| | | return wp_nonce_url($logout_url, 'log-out'); |
| | | } |
| | | public function resetPasswordUrl(string $url, string $redirect):string |
| | | { |
| | | error_log('reset Password Url:'.print_r($url, true)); |
| | | error_log('reset password redirect: '.print_r($redirect, true)); |
| | | |
| | | // Add nonce for security |
| | | return wp_nonce_url($logout_url, 'log-out'); |
| | | } |
| | | return str_replace('wp_login.php', 'login/', $url); |
| | | |
| | | } |
| | | public function getLoginPage():int|false |
| | | { |
| | | return (int)get_option(BASE.'login_page'); |
| | |
| | | wp_redirect(esc_attr($_GET['redirect_to'] ?? get_home_url())); |
| | | exit; |
| | | } |
| | | if (in_array($this->action, ['rp', 'resetpass']) && !is_user_logged_in()) { |
| | | wp_redirect(wp_login_url()); |
| | | exit; |
| | | } elseif (is_user_logged_in()) { |
| | | wp_redirect(get_home_url(null, '/dash/')); |
| | | } |
| | | $this->setupLabels(); |
| | | $this->setupFields(); |
| | | $this->setupTitle(); |
| | |
| | | protected function customStyles():void |
| | | { |
| | | $logo = get_theme_mod('custom_logo'); |
| | | $small = $large = ''; |
| | | if ($logo) { |
| | | $small = wp_get_attachment_image_src($logo, 'medium')[0]; |
| | | $large = wp_get_attachment_image_src($logo, 'large')[0]; |
| | | |
| | | $small = wp_get_attachment_image_src($logo, 'medium')[0]??''; |
| | | $large = wp_get_attachment_image_src($logo, 'large')[0]??''; |
| | | } |
| | | echo '<style> |
| | | .login header, |
| | |
| | | |
| | | protected function renderForms():void |
| | | { |
| | | $this->metaForm = new MetaForm(); |
| | | $form = $this->action.'form'; |
| | | ?> |
| | | <section class="login-box col btw"> |
| | |
| | | do_action('jvb_add_token_inputs', $this->action); |
| | | |
| | | foreach ($this->fields as $name => $config) { |
| | | $this->metaForm->render($name, '', $config); |
| | | echo Form::render($name, '', $config); |
| | | } |
| | | |
| | | $this->maybeTurnstile(); |
| | |
| | | 'successDescription' => JVB_LOGIN['forgot_password']['success']['description'] ?? ['Check your email for reset instructions'], |
| | | ]; |
| | | case 'resetpass': |
| | | case 'rp': |
| | | return [ |
| | | 'title' => JVB_LOGIN['reset_pass']['title'] ?? 'Reset Your Password', |
| | | 'description' => JVB_LOGIN['reset_pass']['description'] ?? [], |
| | |
| | | $has_turnstile = Features::hasIntegration('cloudflare'); |
| | | |
| | | ob_start(); |
| | | |
| | | ?> |
| | | |
| | | document.addEventListener('DOMContentLoaded', async function () { |
| | |
| | | const formData = new FormData(formElement); |
| | | const formObject = Object.fromEntries(formData.entries()); |
| | | |
| | | let params = new URLSearchParams(window.location.search); |
| | | if (params.has('key')) { |
| | | formObject['key'] = params.get('key'); |
| | | } |
| | | if (params.has('login')) { |
| | | formObject['login'] = params.get('login'); |
| | | } |
| | | |
| | | // Add redirect_to from URL |
| | | if (redirectTo) { |
| | | formObject.redirect_to = redirectTo; |