Jake Vanderwerf
7 days ago 46d681c6b825d21b3f698d793c4e630c687d90ad
inc/managers/LoginManager.php
@@ -23,6 +23,7 @@
   protected array $fields = [];
   protected ?string $action = null;
   protected string $title = '';
   protected static LoginManager $instance;
   // Token handlers registry
   protected array $messageHandlers = [];
@@ -35,8 +36,10 @@
   ];
   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
@@ -65,6 +68,10 @@
      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
   {
@@ -183,8 +190,13 @@
   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;
@@ -255,9 +267,10 @@
            break;
      }
      $this->fields = $fields;
      return $fields;
   }
   /**
    * Ensure login page exists
    */
@@ -536,32 +549,12 @@
   {
      $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'])) {
@@ -575,7 +568,7 @@
         }
         ?>
         <div class="options row btw">
         <div class="options row x-btw">
            <?php
            switch ($this->action) {
               case 'login': ?>
@@ -600,7 +593,7 @@
         </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();
@@ -610,6 +603,59 @@
      </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
    {
    ?>
@@ -968,6 +1014,11 @@
   {
   }
   public function setAction(string $action = 'login'):void
   {
      $this->action = $action;
      $this->setup();
   }
}
// Initialize the login manager