| | |
| | | protected array $fields = []; |
| | | protected ?string $action = null; |
| | | protected string $title = ''; |
| | | protected static LoginManager $instance; |
| | | |
| | | // Token handlers registry |
| | | protected array $messageHandlers = []; |
| | |
| | | ]; |
| | | private int $max_file_size = 5242880; // 5MB in bytes |
| | | |
| | | |
| | | public function __construct() |
| | | { |
| | | self::$instance = $this; |
| | | $this->cache = Cache::for('login'); |
| | | $this->cache->flush(); |
| | | // Initialize magic link support if enabled |
| | |
| | | add_action('user_register', array($this, 'saveRegistrationFields'), 999, 2); |
| | | add_filter('the_seo_framework_sitemap_exclude_ids', [$this, 'excludeLoginSitemap'], 10, 1); |
| | | } |
| | | public static function getInstance():self |
| | | { |
| | | return self::$instance; |
| | | } |
| | | |
| | | public function excludeLoginSitemap(array $ids): array |
| | | { |
| | |
| | | |
| | | protected function setupFields():void |
| | | { |
| | | $this->fields = $this->getFieldsForAction($this->action); |
| | | } |
| | | |
| | | protected function getFieldsForAction(string $action):array |
| | | { |
| | | $fields = []; |
| | | switch($this->action) { |
| | | switch($action) { |
| | | case 'register': |
| | | $fields = $this->getRegistrationFormFields(); |
| | | break; |
| | |
| | | break; |
| | | |
| | | } |
| | | $this->fields = $fields; |
| | | return $fields; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Ensure login page exists |
| | | */ |
| | |
| | | { |
| | | $form = $this->action.'form'; |
| | | ?> |
| | | <section class="login-box col btw"> |
| | | <section class="login-box col y-btw"> |
| | | <h1><?=$this->labels['title']?></h1> |
| | | <?= $this->labels['description'] ?> |
| | | |
| | | <?= $this->renderLoginForm($this->action); ?> |
| | | |
| | | <form name="<?=$form?>" method="post" data-action="jvb_<?=$this->action?>"> |
| | | <?= jvbFormStatus() ?> |
| | | <?php wp_nonce_field('jvb_'.$this->action, '_wpnonce'); ?> |
| | | <input type="hidden" name="action" value="jvb_<?=$this->action?>"> |
| | | <input type="hidden" name="redirect_to" value="<?= esc_attr($_GET['redirect_to'] ?? '') ?>"> |
| | | <input type="hidden" name="request_id" value="<?= wp_generate_password(16, false) ?>"> |
| | | <?= ($this->action === 'magic') ? '<input type="hidden" name="type" value="login">' : '' ?> |
| | | <?php |
| | | do_action('jvb_add_token_inputs', $this->action); |
| | | |
| | | foreach ($this->fields as $name => $config) { |
| | | echo Form::render($name, '', $config); |
| | | } |
| | | |
| | | $this->maybeTurnstile(); |
| | | ?> |
| | | <div class="row btw nowrap"> |
| | | <button type="submit" class="button button-primary button-large"><?=$this->labels['submit']?></button> |
| | | <?php $this->maybeMagicLink(); ?> |
| | | </div> |
| | | </form> |
| | | |
| | | <?php |
| | | if (is_array($this->labels['extra'])) { |
| | |
| | | } |
| | | ?> |
| | | |
| | | <div class="options row btw"> |
| | | <div class="options row x-btw"> |
| | | <?php |
| | | switch ($this->action) { |
| | | case 'login': ?> |
| | |
| | | |
| | | </div> |
| | | </section> |
| | | <div class="navigation row btw"> |
| | | <div class="navigation row x-btw"> |
| | | <a href="<?= get_home_url() ?>">Home</a> |
| | | <?php |
| | | $privacy = get_privacy_policy_url(); |
| | |
| | | </div> |
| | | <?php |
| | | } |
| | | public function renderLoginForm(string $action = 'login', string $redirect = '', string $title = ''):string |
| | | { |
| | | ob_start(); |
| | | do_action('jvb_add_token_inputs', $this->action); |
| | | $additionalInputs = ob_get_clean(); |
| | | |
| | | $fields = ''; |
| | | $theFields = $this->getFieldsForAction($action); |
| | | foreach ($theFields as $name => $config) { |
| | | $fields .= Form::render($name, '', $config); |
| | | } |
| | | |
| | | ob_start(); |
| | | $this->maybeTurnstile(); |
| | | $turnstile = ob_get_clean(); |
| | | |
| | | ob_start(); |
| | | $this->maybeMagicLink(); |
| | | $magicLink = ob_get_clean(); |
| | | |
| | | $redirect = !empty($redirect) ? $redirect : esc_attr($_GET['redirect_to'] ?? ''); |
| | | |
| | | return sprintf( |
| | | '<form name="%sform" method="post" data-action="jvb_%s"> |
| | | %s%s%s |
| | | <input type="hidden" name="action" value="jvb_%s"> |
| | | <input type="hidden" name="redirect_to" value="%s"> |
| | | <input type="hidden" name="request_id" value="%s"> |
| | | %s |
| | | %s |
| | | %s |
| | | %s |
| | | <div class="row x-btw nowrap"> |
| | | <button type="submit" class="button button-primary button-large">%s</button> |
| | | %s |
| | | </div> |
| | | </form>', |
| | | $action, |
| | | $action, |
| | | jvbFormStatus(), |
| | | $title, |
| | | wp_nonce_field('jvb_'.$action), |
| | | $action, |
| | | $redirect, |
| | | wp_generate_password(16, false), |
| | | ($action === 'magic') ? '<input type="hidden" name="type" value="login">' : '', |
| | | $additionalInputs, |
| | | $fields, |
| | | $turnstile, |
| | | $this->labels['submit'], |
| | | $magicLink |
| | | ); |
| | | } |
| | | protected function renderHeader():void |
| | | { |
| | | ?> |
| | |
| | | { |
| | | |
| | | } |
| | | public function setAction(string $action = 'login'):void |
| | | { |
| | | $this->action = $action; |
| | | $this->setup(); |
| | | } |
| | | } |
| | | |
| | | // Initialize the login manager |