| | |
| | | class LoginManager |
| | | { |
| | | protected Features $siteFeatures; |
| | | protected ?MagicLinkManager $magicLink = null; |
| | | protected ?MetaForm $metaForm = null; |
| | | protected EmailManager $emailManager; |
| | | protected AjaxRateLimiter $rateLimiter; |
| | | protected CacheManager $cache; |
| | | |
| | | |
| | |
| | | public function __construct() |
| | | { |
| | | $this->siteFeatures = Features::forSite(); |
| | | $this->emailManager = new EmailManager(); |
| | | |
| | | |
| | | $this->cache = CacheManager::for('login'); |
| | |
| | | // Login success handling |
| | | add_action('wp_login', [$this, 'handleSuccessfulLogin'], 10, 2); |
| | | |
| | | add_filter( 'login_url', [$this, 'loginUrl'], 10, 3 ); |
| | | // Allow other features to register handlers |
| | | do_action('jvbLoginManagerInit', $this); |
| | | add_action('user_register', array($this, 'saveRegistrationFields'), 999, 2); |
| | | } |
| | | |
| | | /************************************************************************** |
| | |
| | | return; |
| | | } |
| | | // Build custom login URL with all query args |
| | | $custom_login_page = home_url('/login'); |
| | | $custom_login_page = home_url('/login/'); |
| | | $query_args = $_GET; |
| | | |
| | | // Remove WordPress internal args |
| | |
| | | } |
| | | } |
| | | } |
| | | public function loginUrl(string $login_url, string $redirect, bool $force_reauth):string |
| | | { |
| | | // This will append /custom-login/ to you main site URL as configured in general settings (ie https://domain.com/custom-login/) |
| | | $login_url = site_url( '/login/', 'login' ); |
| | | if ( ! empty( $redirect ) ) { |
| | | $login_url = add_query_arg( 'redirect_to', urlencode( $redirect ), $login_url ); |
| | | } |
| | | if ( $force_reauth ) { |
| | | $login_url = add_query_arg( 'reauth', '1', $login_url ); |
| | | } |
| | | return $login_url; |
| | | } |
| | | public function getLoginPage():int|false |
| | | { |
| | | return (int)get_option(BASE.'login_page'); |
| | |
| | | if (!Features::forSite()->has('magicLink')) { |
| | | return; |
| | | } |
| | | $this->magicLink = new MagicLinkManager(); |
| | | } |
| | | |
| | | /********************************************************************* |
| | |
| | | $checked = (is_user_logged_in() && current_user_can('prefers_dark_theme', true)) ? ' checked' : ''; |
| | | $title = ($checked == '') ? 'Toggle Dark Mode' : 'Toggle Light Mode'; |
| | | echo '<label title="'.$title.'" id="theme-switch" class="toggle-switch" for="theme-switcher"> |
| | | <input class="theme-switch row" id="theme-switcher" type="checkbox"'.$checked.' data-setting="theme" data-theme role="switch" name="dark-mode"><span class="slider">'. |
| | | <span class="screen-reader-text">Toggle dark mode</span> |
| | | <input class="theme-switch row" id="theme-switcher" name="theme-switcher" type="checkbox"'.$checked.' data-setting="theme" data-theme name="dark-mode" aria-label="Toggle dark mode"><span class="slider">'. |
| | | jvbIcon('sun-dim', ['title'=> 'Light Mode']). |
| | | jvbIcon('moon', ['title'=>'Dark Mode']). |
| | | '</span></label>'; |
| | |
| | | |
| | | protected function maybeMagicLink(): void |
| | | { |
| | | if (!$this->magicLink || !in_array($this->action, ['login', 'lostpassword'])) { |
| | | if (!JVB()->magicLink() || !in_array($this->action, ['login', 'lostpassword'])) { |
| | | return; |
| | | } |
| | | ?> |
| | |
| | | method: 'POST', |
| | | headers: { |
| | | 'Content-Type': 'application/json', |
| | | 'X-WP-Nonce': jvbSettings.nonce |
| | | 'X-WP-Nonce': window.auth.getNonce() |
| | | }, |
| | | body: JSON.stringify(realFormData) |
| | | }); |
| | |
| | | window.LoginController.handleFormSuccess(form, result); |
| | | } |
| | | |
| | | if (window.auth && typeof window.auth.handleLogin === 'function' && Object.hasOwn(result, 'auth')) { |
| | | console.log('Awaiting Auth...'); |
| | | await window.auth.handleLogin(result.auth); // Pass the full result |
| | | } |
| | | |
| | | // Handle redirect |
| | | if (result.redirect) { |
| | | setTimeout(() => { |
| | | window.location.href = result.redirect; |
| | | }, 500); // Brief delay to show success message |
| | | }, 200); // Brief delay to show success message |
| | | } |
| | | |
| | | } catch (error) { |
| | |
| | | wp_safe_redirect($login_url); |
| | | exit; |
| | | } |
| | | |
| | | public function saveRegistrationFields(int $user_id, array $userdata):void |
| | | { |
| | | |
| | | } |
| | | } |
| | | |
| | | // Initialize the login manager |