AJAX Registration Check

Relação de extensões criadas.
Avatar do usuário
Chico Gois
Administrador
Administrador
Mensagens: 149
Registrado em: 16 Dez 2025, 22:05
Localização: São Paulo - SP
Contato:

AJAX Registration Check

  • Favoritar esta postagem
  • Mensagem por Chico Gois »

    [Extensão] AJAX Registration Check (Atualização 3.3.x)

    Autor Original: MarkusWME (pcgamingfreaks.at)
    Versão Original: 1.0.0 / 1.0.1 (Lançada em 2017)
    Versão atual: 1.0.3
    Atualizada para: phpBB 3.3.15+ (Compatível com PHP 8.x)

    Descrição
    Esta extensão adiciona verificações em tempo real (via AJAX) ao formulário de registro de novos usuários. Ela checa a disponibilidade do nome de usuário, validade e disponibilidade do e-mail, força da senha e confirmação de senha instantaneamente, sem que o usuário precise recarregar a página. Isso melhora significativamente a experiência do usuário (UX) e evita submissões de formulários com erros.

    Por que esta atualização?
    Como a extensão original foi projetada para o phpBB 3.1 e 3.2, ela não possui validação oficial para versões modernas e contém bugs e chamadas depreciadas que geram erros críticos em ambientes phpBB 3.3.x e PHP 8.

    Principais Mudanças e Correções:
    • Remoção de Configurações Depreciadas: O phpBB 3.3 removeu o limite de caracteres para senhas (max_pass_chars). Ajustei o listener.php, os templates HTML e o JavaScript para remover essas referências, substituindo o limite por um indicador de "infinito" (∞) nas mensagens de validação para evitar quebras de layout ou erros.
    • Correção na Verificação de E-mails Banidos: Corrigi uma falha no controller.php onde a checagem na tabela de banimentos (BANLIST_TABLE) só buscava correspondências exatas. Agora a extensão reconhece corretamente padrões com wildcards (ex: *.provedor.com) usando preg_quote.
    • Wildcards em Nomes de Usuário: Lógica atualizada para tratar o caractere * em nomes de usuário desativados com o devido "escaping", seguindo o padrão moderno do phpBB.
    • Melhorias em PHP 8.x e JS:
      • Compatibilidade total com PHP 8.x.
      • Alteração das chamadas AJAX para POST para maior segurança e consistência.
      • Integração de um círculo de carregamento (loading) personalizado para feedback visual durante as checagens.
    • Otimização Geral: Mantive o suporte à verificação de força de senha no lado do cliente, mas removi limitações obsoletas que causavam conflitos em versões recentes do core do fórum.
    Compatibilidade
    • phpBB 3.3.0 até 3.3.15+
    • PHP 7.4 até 8.x
    Nota: Esta versão mantém a essência da extensão original, garantindo estabilidade e segurança para as instalações atuais do phpBB.
    format-zip
    ajaxregistrationcheck.zip
    22.53 KiB - Baixado 12 vezes
    Avatar do usuário
    Chico Gois
    Administrador
    Administrador
    Mensagens: 149
    Registrado em: 16 Dez 2025, 22:05
    Localização: São Paulo - SP
    Contato:
    Você favoritou esta postagem

    Re: AJAX Registration Check

  • Remover marcador da postagem
  • Mensagem por Chico Gois »

    Arquivo: controller.php
    ===================================================================
    --- controller.php	(original)
    +++ controller.php	(modificado)
    @@ -1,160 +1,151 @@
     <?php
    -
    +/**
    -/**
    + * @author MarkusWME <markuswme@pcgamingfreaks.at>
    - * @author    MarkusWME <markuswme@pcgamingfreaks.at>
    + * @copyright 2017 MarkusWME
    - * @copyright 2017 MarkusWME
    + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
    - * @license   http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
    + */
    - */
    +namespace pcgf\ajaxregistrationcheck\controller;
    -
    +use phpbb\db\driver\factory;
    -namespace pcgf\ajaxregistrationcheck\controller;
    +use phpbb\event\dispatcher;
    -
    +use phpbb\json_response;
    -use phpbb\db\driver\factory;
    +use phpbb\request\request;
    -use phpbb\event\dispatcher;
    +use phpbb\user;
    -use phpbb\json_response;
    +/** @version 1.0.1 (atualizado para phpBB 3.3.15) */
    -use phpbb\request\request;
    +class controller
    -use phpbb\user;
    +{
    -use rmcgirr83\stopforumspam\event\main_listener;
    +    /** @var request $request Request object */
    -
    +    protected $request;
    -/** @version 1.0.0 */
    +    /** @var factory $db Database object */
    -class controller
    +    protected $db;
    -{
    +    /** @var user $user User object */
    -    /** @var request $request Request object */
    +    protected $user;
    -    protected $request;
    +    /** @var dispatcher $dispatcher phpBB event dispatcher */
    -
    +    protected $dispatcher;
    -    /** @var factory $db Database object */
    +    /**
    -    protected $db;
    +     * Controller constructor
    -
    +     *
    -    /** @var user $user User object */
    +     * @access public
    -    protected $user;
    +     * @since 1.0.0
    -
    +     *
    -    /** @var dispatcher $dispatcher phpBB event dispatcher */
    +     * @param request $request Request object
    -    protected $dispatcher;
    +     * @param factory $db Database object
    -
    +     * @param user $user User object
    -    /**
    +     * @param dispatcher $dispatcher phpBB event dispatcher
    -     * Controller constructor
    +     */
    -     *
    +    public function __construct(request $request, factory $db, user $user, dispatcher $dispatcher)
    -     * @access public
    +    {
    -     * @since  1.0.0
    +        $this->request = $request;
    -     *
    +        $this->db = $db;
    -     * @param request    $request    Request object
    +        $this->user = $user;
    -     * @param factory    $db         Database object
    +        $this->dispatcher = $dispatcher;
    -     * @param user       $user       User object
    +    }
    -     * @param dispatcher $dispatcher phpBB event dispatcher
    +    /**
    -     */
    +     * Function that checks the user input
    -    public function __construct(request $request, factory $db, user $user, dispatcher $dispatcher)
    +     *
    -    {
    +     * @access public
    -        $this->request = $request;
    +     * @since 1.0.0
    -        $this->db = $db;
    +     *
    -        $this->user = $user;
    +     * @param string $type The input type
    -        $this->dispatcher = $dispatcher;
    +     */
    -    }
    +    public function check($type)
    -
    +    {
    -    /**
    +        // Load needed language data
    -     * Function that checks the user input
    +        $this->user->add_lang('ucp');
    -     *
    +        $this->user->add_lang_ext('pcgf/ajaxregistrationcheck', array('ajaxregistrationcheck'));
    -     * @access public
    +        $response = new json_response();
    -     * @since  1.0.0
    +        $response_text = array('INVALID QUERY', $this->user->lang('PCGF_AJAXREGISTRATIONCHECK_INVALID_QUERY'));
    -     *
    +        if ($this->request->is_ajax())
    -     * @param string $type The input type
    +        {
    -     */
    +            switch ($type)
    -    public function check($type)
    +            {
    -    {
    +                case 'username':
    -        // Load needed language data
    +                    $username = $this->request->variable('search', '');
    -        $this->user->add_lang('ucp');
    +                    if ($username !== '')
    -        $this->user->add_lang_ext('pcgf/ajaxregistrationcheck', array('ajaxregistrationcheck'));
    +                    {
    -        $response = new json_response();
    +                        $username_escaped = $this->db->sql_escape($username);
    -        $response_text = array('INVALID QUERY', $this->user->lang('PCGF_AJAXREGISTRATIONCHECK_INVALID_QUERY'));
    +                        // Check if the name is already used
    -        if ($this->request->is_ajax())
    +                        $query = 'SELECT username
    -        {
    +                                    FROM ' . USERS_TABLE . "
    -            switch ($type)
    +                                    WHERE username = '" . $username_escaped . "'";
    -            {
    +                        $result = $this->db->sql_query($query);
    -                case 'username':
    +                        if ($this->db->sql_fetchrow($result))
    -                    $username = $this->request->variable('search', '');
    +                        {
    -                    if ($username !== '')
    +                            $response_text[0] = 'NOT OK';
    -                    {
    +                            $response_text[1] = $this->user->lang('USERNAME_TAKEN_USERNAME');
    -                        $username_escaped = $this->db->sql_escape($username);
    +                        }
    -                        // Check if the name is already used
    +                        $this->db->sql_freeresult($result);
    -                        $query = 'SELECT username
    +                        if ($response_text[0] !== 'NOT OK')
    -                                    FROM ' . USERS_TABLE . "
    +                        {
    -                                    WHERE username = '" . $username_escaped . "'";
    +                            // Check if the username is blocked by the board admin
    -                        $result = $this->db->sql_query($query);
    +                            $query = 'SELECT disallow_username
    -                        if ($this->db->sql_fetchrow($result))
    +                                        FROM ' . DISALLOW_TABLE;
    -                        {
    +                            $result = $this->db->sql_query($query);
    -                            $response_text[0] = 'NOT OK';
    +                            while ($disallowed_user = $this->db->sql_fetchrow($result))
    -                            $response_text[1] = $this->user->lang('USERNAME_TAKEN_USERNAME');
    +                            {
    -                        }
    +                                // Check if the username matches the rule (corrigido com preg_quote e wildcard *)
    -                        $this->db->sql_freeresult($result);
    +                                $pattern = str_replace('\*', '.*', preg_quote($disallowed_user['disallow_username'], '/'));
    -                        if ($response_text[0] !== 'NOT OK')
    +                                if (preg_match('/^' . $pattern . '$/i', $username))
    -                        {
    +                                {
    -                            // Check if the username is blocked by the board admin
    +                                    $response_text[0] = 'NOT OK';
    -                            $query = 'SELECT disallow_username
    +                                    $response_text[1] = $this->user->lang('USERNAME_DISALLOWED_USERNAME');
    -                                        FROM ' . DISALLOW_TABLE;
    +                                    break;
    -                            $result = $this->db->sql_query($query);
    +                                }
    -                            while ($disallowed_user = $this->db->sql_fetchrow($result))
    +                            }
    -                            {
    +                            $this->db->sql_freeresult($result);
    -                                // Check if the username matches the rule
    +                            if ($response_text[0] !== 'NOT OK')
    -                                if (preg_match('/^' . str_replace('%', '.*', $disallowed_user['disallow_username']) . '$/i', $username))
    +                            {
    -                                {
    +                                // All checks passed - set status to OK
    -                                    $response_text[0] = 'NOT OK';
    +                                $response_text[0] = 'OK';
    -                                    $response_text[1] = $this->user->lang('USERNAME_DISALLOWED_USERNAME');
    +                                $response_text[1] = $this->user->lang('PCGF_AJAXREGISTRATIONCHECK_USERNAME_OK');
    -                                    break;
    +                            }
    -                                }
    +                        }
    -                            }
    +                    }
    -                            $this->db->sql_freeresult($result);
    +                break;
    -                            if ($response_text[0] !== 'NOT OK')
    +                case 'email':
    -                            {
    +                    $email = $this->request->variable('search', '');
    -                                // All checks passed - set status to OK
    +                    if ($email !== '')
    -                                $response_text[0] = 'OK';
    +                    {
    -                                $response_text[1] = $this->user->lang('PCGF_AJAXREGISTRATIONCHECK_USERNAME_OK');
    +                        $email_escaped = $this->db->sql_escape($email);
    -                            }
    +                        // Check if the email is already used
    -                        }
    +                        $query = 'SELECT user_email
    -                    }
    +                                    FROM ' . USERS_TABLE . "
    -                break;
    +                                    WHERE user_email = '" . $email_escaped . "'";
    -                case 'email':
    +                        $result = $this->db->sql_query($query);
    -                    $email = $this->request->variable('search', '');
    +                        if ($this->db->sql_fetchrow($result))
    -                    if ($email !== '')
    +                        {
    -                    {
    +                            $response_text[0] = 'NOT OK';
    -                        $email_escaped = $this->db->sql_escape($email);
    +                            $response_text[1] = $this->user->lang('EMAIL_TAKEN_EMAIL');
    -                        // Check if the email is already used
    +                        }
    -                        $query = 'SELECT user_email
    +                        $this->db->sql_freeresult($result);
    -                                    FROM ' . USERS_TABLE . "
    +                        if ($response_text[0] !== 'NOT OK')
    -                                    WHERE user_email = '" . $email_escaped . "'";
    +                        {
    -                        $result = $this->db->sql_query($query);
    +                            // Check if the email is blocked (fix: busca todos os bans e verifica padrões com preg_quote e *)
    -                        if ($this->db->sql_fetchrow($result))
    +                            $query = 'SELECT ban_email
    -                        {
    +                                        FROM ' . BANLIST_TABLE . "
    -                            $response_text[0] = 'NOT OK';
    +                                        WHERE ban_email != ''";
    -                            $response_text[1] = $this->user->lang('EMAIL_TAKEN_EMAIL');
    +                            $result = $this->db->sql_query($query);
    -                        }
    +                            while ($banned_email = $this->db->sql_fetchrow($result))
    -                        $this->db->sql_freeresult($result);
    +                            {
    -                        if ($response_text[0] !== 'NOT OK')
    +                                $pattern = str_replace('\*', '.*', preg_quote($banned_email['ban_email'], '/'));
    -                        {
    +                                if (preg_match('/^' . $pattern . '$/i', $email))
    -                            // Check if the username is blocked by the board admin
    +                                {
    -                            $query = 'SELECT ban_email
    +                                    $response_text[0] = 'NOT OK';
    -                                        FROM ' . BANLIST_TABLE . "
    +                                    $response_text[1] = $this->user->lang('EMAIL_BANNED_EMAIL');
    -                                        WHERE ban_email = '" . $email_escaped . "'";
    +                                    break;
    -                            $result = $this->db->sql_query($query);
    +                                }
    -                            while ($disallowed_email = $this->db->sql_fetchrow($result))
    +                            }
    -                            {
    +                            $this->db->sql_freeresult($result);
    -                                // Check if the username matches the rule
    +                            if ($response_text[0] !== 'NOT OK')
    -                                if (preg_match('/^' . str_replace('%', '.*', $disallowed_email['ban_email']) . '$/i', $email))
    +                            {
    -                                {
    +                                // All checks passed - set status to OK
    -                                    $response_text[0] = 'NOT OK';
    +                                $response_text[0] = 'OK';
    -                                    $response_text[1] = $this->user->lang('EMAIL_BANNED_EMAIL');
    +                                $response_text[1] = $this->user->lang('PCGF_AJAXREGISTRATIONCHECK_EMAIL_OK');
    -                                    break;
    +                            }
    -                                }
    +                        }
    -                            }
    +                    }
    -                            $this->db->sql_freeresult($result);
    +                break;
    -                            if ($response_text[0] !== 'NOT OK')
    +            }
    -                            {
    +        }
    -                                // All checks passed - set status to OK
    +        $response->send($response_text);
    -                                $response_text[0] = 'OK';
    +    }
    -                                $response_text[1] = $this->user->lang('PCGF_AJAXREGISTRATIONCHECK_EMAIL_OK');
    +}
    -                            }
    -                        }
    -                    }
    -                break;
    -            }
    -        }
    -        $response->send($response_text);
    -    }
    -}
    Avatar do usuário
    Chico Gois
    Administrador
    Administrador
    Mensagens: 149
    Registrado em: 16 Dez 2025, 22:05
    Localização: São Paulo - SP
    Contato:

    Re: AJAX Registration Check

  • Favoritar esta postagem
  • Mensagem por Chico Gois »

    Arquivo: listener.php
    ===================================================================
    --- listener.php	(original)
    +++ listener.php	(modificado)
    @@ -1,129 +1,122 @@
     <?php
    -
    +/**
    -/**
    + * @copyright 2017 MarkusWME
    - * @author    MarkusWME <markuswme@pcgamingfreaks.at>
    + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
    - * @copyright 2017 MarkusWME
    + */
    - * @license   http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
    +
    - */
    +namespace pcgf\ajaxregistrationcheck\event;
     
    -namespace pcgf\ajaxregistrationcheck\event;
    +use phpbb\config\config;
    -
    +use phpbb\controller\helper;
    -use phpbb\config\config;
    +use phpbb\template\template;
    -use phpbb\controller\helper;
    +use phpbb\user;
    -use phpbb\template\template;
    +use Symfony\Component\EventDispatcher\EventSubscriberInterface;
    -use phpbb\user;
    +
    -use Symfony\Component\EventDispatcher\EventSubscriberInterface;
    +/** @version 1.0.1 (atualizado para phpBB 3.3.15) */
    -
    +class listener implements EventSubscriberInterface
    -/** @version 1.0.0 */
    +{
    -class listener implements EventSubscriberInterface
    +    /** @var config $config Configuration object */
    -{
    +    protected $config;
    -    /** @var config $config Configuration object */
    +
    -    protected $config;
    +    /** @var helper $helper Controller helper object */
    -
    +    protected $helper;
    -    /** @var helper $helper Controller helper object */
    +
    -    protected $helper;
    +    /** @var template $template Template object */
    -
    +    protected $template;
    -    /** @var template $template Template object */
    +
    -    protected $template;
    +    /** @var user $user User object */
    -
    +    protected $user;
    -    /** @var user $user User object */
    +
    -    protected $user;
    +    /**
    -
    +     * Listener constructor
    -    /**
    +     * @access public
    -     * Listener constructor
    +     * @since  1.0.0
    -     *
    +     * @param config   $config   Configuration object
    -     * @access public
    +     * @param helper   $helper   Controller helper object
    -     * @since  1.0.0
    +     * @param template $template Template object
    -     *
    +     * @param user     $user     User object
    -     * @param config   $config   Configuration object
    +     */
    -     * @param helper   $helper   Controller helper object
    +    public function __construct(config $config, helper $helper, template $template, user $user)
    -     * @param template $template Template object
    +    {
    -     * @param user     $user     User object
    +        $this->config = $config;
    -     */
    +        $this->helper = $helper;
    -    public function __construct(config $config, helper $helper, template $template, user $user)
    +        $this->template = $template;
    -    {
    +        $this->user = $user;
    -        $this->config = $config;
    +    }
    -        $this->helper = $helper;
    +
    -        $this->template = $template;
    +    /**
    -        $this->user = $user;
    +     * Function that returns the subscribed events
    -    }
    +     * @access public
    -
    +     * @since  1.0.0
    -    /**
    +     * @return array Array with the subscribed events
    -     * Function that returns the subscribed events
    +     */
    -     *
    +    static public function getSubscribedEvents()
    -     * @access public
    +    {
    -     * @since  1.0.0
    +        return array(
    -     *
    +            'core.ucp_register_data_before' => 'assign_register_data',
    -     * @return array Array with the subscribed events
    +        );
    -     */
    +    }
    -    static public function getSubscribedEvents()
    +
    -    {
    +    /**
    -        return array(
    +     * Function to assign all needed data to the registration form
    -            'core.ucp_register_data_before' => 'assign_register_data',
    +     * @access public
    -        );
    +     * @since  1.0.0
    -    }
    +     */
    -
    +    public function assign_register_data()
    -    /**
    +    {
    -     * Function to assign all needed data to the registration form
    +        // Load language data
    -     *
    +        $this->user->add_lang_ext('pcgf/ajaxregistrationcheck', array('ajaxregistrationcheck'));
    -     * @access public
    +        $username_rule = $this->config['allow_name_chars'];
    -     * @since  1.0.0
    +        switch ($username_rule)
    -     */
    +        {
    -    public function assign_register_data()
    +            case 'USERNAME_CHARS_ANY':
    -    {
    +                $username_rule = "^.+$";
    -        // Load language data
    +            break;
    -        $this->user->add_lang_ext('pcgf/ajaxregistrationcheck', array('ajaxregistrationcheck'));
    +            case 'USERNAME_ALPHA_ONLY':
    -        $username_rule = $this->config['allow_name_chars'];
    +                $username_rule = "^[a-zA-Z0-9]+$";
    -        switch ($username_rule)
    +            break;
    -        {
    +            case 'USERNAME_ALPHA_SPACERS':
    -            case 'USERNAME_CHARS_ANY':
    +                $username_rule = "^[a-zA-Z0-9 \\-\\+_\\[\\\]]+$";
    -                $username_rule = "^.+$";
    +            break;
    -            break;
    +            case 'USERNAME_LETTER_NUM':
    -            case 'USERNAME_ALPHA_ONLY':
    +                $username_rule = "^[a-zA-Z0-9äöüÄÖÜ]+$";
    -                $username_rule = "^[a-zA-Z0-9]+$";
    +            break;
    -            break;
    +            case 'USERNAME_LETTER_NUM_SPACERS':
    -            case 'USERNAME_ALPHA_SPACERS':
    +                $username_rule = "^[a-zA-Z0-9äöüÄÖÜ \\-\\+_\\[\\\]]+$";
    -                $username_rule = "^[a-zA-Z0-9 \\-\\+_\\[\\\]]+$";
    +            break;
    -            break;
    +            case 'USERNAME_ASCII':
    -            case 'USERNAME_LETTER_NUM':
    +                $username_rule = "^[a-zA-Z0-9 !\\\"#\\$%&'\\(\\)\\*\\+,\\-\\.\\/:;<=>\\?@\\[\\\]\\^_`\\{\\|\\}~]+$";
    -                $username_rule = "^[a-zA-Z0-9äöüÄÖÜ]+$";
    +            break;
    -            break;
    +        }
    -            case 'USERNAME_LETTER_NUM_SPACERS':
    +        $password_rule = $this->config['pass_complex'];
    -                $username_rule = "^[a-zA-Z0-9äöüÄÖÜ \\-\\+_\\[\\\]]+$";
    +        switch ($password_rule)
    -            break;
    +        {
    -            case 'USERNAME_ASCII':
    +            case 'PASS_TYPE_ANY':
    -                $username_rule = "^[a-zA-Z0-9 !\\\"#\\$%&'\\(\\)\\*\\+,\\-\\.\\/:;<=>\\?@\\[\\\]\\^_`\\{\\|\\}~]+$";
    +                $password_rule = 0;
                 break;
    -        }
    +            case 'PASS_TYPE_CASE':
    -        $password_rule = $this->config['pass_complex'];
    +                $password_rule = 10;
    -        switch ($password_rule)
    +            break;
    -        {
    +            case 'PASS_TYPE_ALPHA':
    -            case 'PASS_TYPE_ANY':
    +                $password_rule = 100;
    -                $password_rule = 0;
    +            break;
    -            break;
    +            case 'PASS_TYPE_SYMBOL':
    -            case 'PASS_TYPE_CASE':
    +                $password_rule = 1000;
    -                $password_rule = 10;
    +            break;
    -            break;
    +        }
    -            case 'PASS_TYPE_ALPHA':
    +        $this->template->assign_vars(array(
    -                $password_rule = 100;
    +            'PCGF_AJAXREGISTRATIONCHECK'                             => true,
    -            break;
    +            'PCGF_AJAXREGISTRATIONCHECK_USERNAME_MIN'                => $this->config['min_name_chars'],
    -            case 'PASS_TYPE_SYMBOL':
    +            'PCGF_AJAXREGISTRATIONCHECK_USERNAME_MAX'                => $this->config['max_name_chars'],
    -                $password_rule = 1000;
    +            'PCGF_AJAXREGISTRATIONCHECK_USERNAME_RULE'               => $username_rule,
    -            break;
    +            'PCGF_AJAXREGISTRATIONCHECK_USERNAME_INVALID_BOUNDARIES' => $this->user->lang($this->config['allow_name_chars'] . '_EXPLAIN', $this->config['min_name_chars'], $this->config['max_name_chars']),
    -        }
    +            'PCGF_AJAXREGISTRATIONCHECK_EMAIL_RULE'                  => str_replace('\\', '\\\\', get_preg_expression('email')),
    -        $this->template->assign_vars(array(
    +            'PCGF_AJAXREGISTRATIONCHECK_PASSWORD_MIN'                => $this->config['min_pass_chars'],
    -            'PCGF_AJAXREGISTRATIONCHECK'                             => true,
    +            // Removido PASSWORD_MAX para 3.3.x
    -            'PCGF_AJAXREGISTRATIONCHECK_USERNAME_MIN'                => $this->config['min_name_chars'],
    +            'PCGF_AJAXREGISTRATIONCHECK_PASSWORD_RULE'               => $password_rule,
    -            'PCGF_AJAXREGISTRATIONCHECK_USERNAME_MAX'                => $this->config['max_name_chars'],
    +            'PCGF_AJAXREGISTRATIONCHECK_PASSWORD_INVALID_BOUNDARIES' => $this->user->lang($this->config['pass_complex'] . '_EXPLAIN', $this->config['min_pass_chars'], '∞'), // Max infinito
    -            'PCGF_AJAXREGISTRATIONCHECK_USERNAME_RULE'               => $username_rule,
    +            'PCGF_AJAXREGISTRATIONCHECK_CHECK_USERNAME_LINK'         => $this->helper->route('pcgf_ajaxregistrationcheck_controller', array('type' => 'username')),
    -            'PCGF_AJAXREGISTRATIONCHECK_USERNAME_INVALID_BOUNDARIES' => $this->user->lang($this->config['allow_name_chars'] . '_EXPLAIN', $this->config['min_name_chars'], $this->config['max_name_chars']),
    +            'PCGF_AJAXREGISTRATIONCHECK_CHECK_EMAIL_LINK'            => $this->helper->route('pcgf_ajaxregistrationcheck_controller', array('type' => 'email')),
    -            'PCGF_AJAXREGISTRATIONCHECK_EMAIL_RULE'                  => str_replace('\\', '\\\\', get_preg_expression('email')),
    +        ));
    -            'PCGF_AJAXREGISTRATIONCHECK_PASSWORD_MIN'                => $this->config['min_pass_chars'],
    +    }
    -            'PCGF_AJAXREGISTRATIONCHECK_PASSWORD_MAX'                => $this->config['max_pass_chars'],
    +}
    -            'PCGF_AJAXREGISTRATIONCHECK_PASSWORD_RULE'               => $password_rule,
    -            'PCGF_AJAXREGISTRATIONCHECK_PASSWORD_INVALID_BOUNDARIES' => $this->user->lang($this->config['pass_complex'] . '_EXPLAIN', $this->config['min_pass_chars'], $this->config['max_pass_chars']),
    -            'PCGF_AJAXREGISTRATIONCHECK_CHECK_USERNAME_LINK'         => $this->helper->route('pcgf_ajaxregistrationcheck_controller', array('type' => 'username')),
    -            'PCGF_AJAXREGISTRATIONCHECK_CHECK_EMAIL_LINK'            => $this->helper->route('pcgf_ajaxregistrationcheck_controller', array('type' => 'email')),
    -        ));
    -    }
    -}
    Avatar do usuário
    Chico Gois
    Administrador
    Administrador
    Mensagens: 149
    Registrado em: 16 Dez 2025, 22:05
    Localização: São Paulo - SP
    Contato:

    Re: AJAX Registration Check

  • Favoritar esta postagem
  • Mensagem por Chico Gois »

    Arquivo: ajaxregistrationcheck.js
    ===================================================================
    --- ajaxregistrationcheck.js	(original)
    +++ ajaxregistrationcheck.js	(modificado)
    @@ -1,30 +1,181 @@
    -<input id="pcgf-ajaxregistrationcheck-sfs-field" name="sfs" class="hidden" type="text"/>
    +var pcgfAJAXRegistrationCheckUsername = $('#pcgf-ajaxregistrationcheck-username');
    -<div id="pcgf-ajaxregistrationcheck-sfs" class="sfs invalid"></div>
    +var pcgfAJAXRegistrationCheckEMail = $('#pcgf-ajaxregistrationcheck-email');
    -<div id="pcgf-ajaxregistrationcheck-username" class="inline"></div>
    +var pcgfAJAXRegistrationCheckPassword = $('#pcgf-ajaxregistrationcheck-password');
    -<div id="pcgf-ajaxregistrationcheck-email" class="inline"></div>
    +var pcgfAJAXRegistrationCheckConfirmPassword = $('#pcgf-ajaxregistrationcheck-confirm-password');
    -<div id="pcgf-ajaxregistrationcheck-password" class="inline"></div>
    +
    -<div id="pcgf-ajaxregistrationcheck-confirm-password" class="inline"></div>
    +pcgfAJAXRegistrationCheckEMailRule = new RegExp(pcgfAJAXRegistrationCheckEMailRule, 'i');
    -<script type="text/javascript">
    +pcgfAJAXRegistrationCheckUsernameRule = new RegExp(pcgfAJAXRegistrationCheckUsernameRule, 'i');
    -    var pcgfAJAXRegistrationCheckLoading = '{LA_LOADING}...';
    +
    -    var pcgfAJAXRegistrationCheckUsernameMin = '{PCGF_AJAXREGISTRATIONCHECK_USERNAME_MIN}';
    +function setInvalid(message, messageField, field) {
    -    var pcgfAJAXRegistrationCheckUsernameMax = '{PCGF_AJAXREGISTRATIONCHECK_USERNAME_MAX}';
    +    messageField.removeClass('valid').addClass('invalid');
    -    var pcgfAJAXRegistrationCheckUsernameRule = "{PCGF_AJAXREGISTRATIONCHECK_USERNAME_RULE}";
    +    messageField.html(message);
    -    var pcgfAJAXRegistrationCheckUsernameInvalidBoundaries = '{PCGF_AJAXREGISTRATIONCHECK_USERNAME_INVALID_BOUNDARIES}';
    +    field.get(0).setCustomValidity(message);
    -    var pcgfAJAXRegistrationCheckUsernameCheckLink = '{PCGF_AJAXREGISTRATIONCHECK_CHECK_USERNAME_LINK}';
    +}
    -    var pcgfAJAXRegistrationCheckEMailRule = "{PCGF_AJAXREGISTRATIONCHECK_EMAIL_RULE}";
    +
    -    var pcgfAJAXRegistrationCheckEMailInvalid = '{LA_PCGF_AJAXREGISTRATIONCHECK_EMAIL_INVALID}';
    +function setValid(message, messageField, field) {
    -    var pcgfAJAXRegistrationCheckEMailCheckLink = '{PCGF_AJAXREGISTRATIONCHECK_CHECK_EMAIL_LINK}';
    +    messageField.removeClass('invalid').addClass('valid');
    -    var pcgfAJAXRegistrationCheckPasswordMin = '{PCGF_AJAXREGISTRATIONCHECK_PASSWORD_MIN}';
    +    messageField.html(message);
    -    var pcgfAJAXRegistrationCheckPasswordMax = '{PCGF_AJAXREGISTRATIONCHECK_PASSWORD_MAX}';
    +    field.get(0).setCustomValidity('');
    -    var pcgfAJAXRegistrationCheckPasswordRule = "{PCGF_AJAXREGISTRATIONCHECK_PASSWORD_RULE}";
    +}
    -    var pcgfAJAXRegistrationCheckPasswordInvalid = '{PCGF_AJAXREGISTRATIONCHECK_PASSWORD_INVALID_BOUNDARIES}';
    +
    -    var pcgfAJAXRegistrationCheckConfirmPasswordValid = '{LA_PCGF_AJAXREGISTRATIONCHECK_CONFIRM_PASSWORD_OK}';
    +function setLoading(message, messageField, field) {
    -    var pcgfAJAXRegistrationCheckConfirmPasswordInvalid = '{LA_NEW_PASSWORD_ERROR}';
    +    messageField.removeClass('invalid').removeClass('valid');
    -    var pcgfAJAXRegistrationCheckPasswordStrength = '{LA_PCGF_AJAXREGISTRATIONCHECK_PASSWORD_STRENGTH}{LA_COLON}';
    +    messageField.html('<div class="loading-circle"><div class="circle1 circle"></div><div class="circle2 circle"></div><div class="circle3 circle"></div><div class="circle4 circle"></div><div class="circle5 circle"></div><div class="circle6 circle"></div><div class="circle7 circle"></div><div class="circle8 circle"></div><div class="circle9 circle"></div><div class="circle10 circle"></div><div class="circle11 circle"></div><div class="circle12 circle"></div></div>&nbsp;&nbsp;&nbsp;' + message);
    -    var pcgfAJAXRegistrationCheckPasswordVeryWeak = '{LA_PCGF_AJAXREGISTRATIONCHECK_PASSWORD_VERY_WEAK}';
    +    field.get(0).setCustomValidity('');
    -    var pcgfAJAXRegistrationCheckPasswordWeak = '{LA_PCGF_AJAXREGISTRATIONCHECK_PASSWORD_WEAK}';
    +}
    -    var pcgfAJAXRegistrationCheckPasswordNormal = '{LA_PCGF_AJAXREGISTRATIONCHECK_PASSWORD_NORMAL}';
    +
    -    var pcgfAJAXRegistrationCheckPasswordStrong = '{LA_PCGF_AJAXREGISTRATIONCHECK_PASSWORD_STRONG}';
    +$(document).ready(function() {
    -    var pcgfAJAXRegistrationCheckPasswordVeryStrong = '{LA_PCGF_AJAXREGISTRATIONCHECK_PASSWORD_VERY_STRONG}';
    +    var passwordField = $('#new_password');
    -</script>
    +    var passwordConfirmationField = $('#password_confirm');
    -<!-- INCLUDEJS @pcgf_ajaxregistrationcheck/javascript/ajaxregistrationcheck.js -->
    +    pcgfAJAXRegistrationCheckConfirmPassword.insertAfter(passwordConfirmationField);
    +    passwordConfirmationField.on('keyup', function() {
    +        if ($(this).val() === passwordField.val()) {
    +            setValid(pcgfAJAXRegistrationCheckConfirmPasswordValid, pcgfAJAXRegistrationCheckConfirmPassword, $(this));
    +        } else {
    +            setInvalid(pcgfAJAXRegistrationCheckConfirmPasswordInvalid, pcgfAJAXRegistrationCheckConfirmPassword, $(this));
    +        }
    +    });
    +    passwordConfirmationField.trigger('keyup');
    +    pcgfAJAXRegistrationCheckPassword.insertAfter(passwordField);
    +    passwordField.on('keyup', function() {
    +        passwordConfirmationField.trigger('keyup');
    +        var value = $(this).val();
    +        var containsLowerCase = value.match(/[a-z]/g);
    +        var containsUpperCase = value.match(/[A-Z]/g);
    +        var containsNumber = value.match(/[0-9]/g);
    +        var containsSymbol = value.match(/[^a-zA-Z0-9]/g);
    +        var valid = false;
    +        if (value.length < pcgfAJAXRegistrationCheckPasswordMin) {
    +            // The password is too short (removido 'or too long' para 3.3.x)
    +            setInvalid(pcgfAJAXRegistrationCheckPasswordInvalid, pcgfAJAXRegistrationCheckPassword, $(this));
    +        } else {
    +            if (pcgfAJAXRegistrationCheckPasswordRule <= 0) {
    +                valid = true;
    +            } else if (containsLowerCase && containsUpperCase) {
    +                if (pcgfAJAXRegistrationCheckPasswordRule <= 10) {
    +                    valid = true;
    +                } else if (containsNumber) {
    +                    if (pcgfAJAXRegistrationCheckPasswordRule <= 100) {
    +                        valid = true;
    +                    } else if (containsSymbol) {
    +                        valid = true;
    +                    } else {
    +                        setInvalid(pcgfAJAXRegistrationCheckPasswordInvalid, pcgfAJAXRegistrationCheckPassword, $(this));
    +                    }
    +                } else {
    +                    setInvalid(pcgfAJAXRegistrationCheckPasswordInvalid, pcgfAJAXRegistrationCheckPassword, $(this));
    +                }
    +            } else {
    +                setInvalid(pcgfAJAXRegistrationCheckPasswordInvalid, pcgfAJAXRegistrationCheckPassword, $(this));
    +            }
    +        }
    +        if (valid) {
    +            var percentage = 0;
    +            if (containsLowerCase) {
    +                percentage += (containsLowerCase.length > 5 ? 5 : containsLowerCase.length) * 5;
    +            }
    +            if (containsUpperCase) {
    +                percentage += (containsUpperCase.length > 3 ? 3 : containsUpperCase.length) * 7;
    +            }
    +            if (containsNumber) {
    +                percentage += (containsNumber.length > 2 ? 2 : containsNumber.length) * 10;
    +            }
    +            if (containsSymbol) {
    +                percentage += (containsSymbol.length > 2 ? 2 : containsSymbol.length) * 14;
    +            }
    +            var usernameField = $('#username');
    +            var eMailField = $('#email');
    +            if ((usernameField.val() === '' || value.indexOf(usernameField.val()) < 0) && (eMailField.val() === '' || value.indexOf(eMailField.val()) < 0)) {
    +                percentage += 6;
    +            }
    +            if (pcgfAJAXRegistrationCheckPassword.hasClass('invalid')) {
    +                pcgfAJAXRegistrationCheckPassword.removeClass('invalid').addClass('password-strength');
    +                var securityHTML = '<span>' + pcgfAJAXRegistrationCheckPasswordStrength + '</span>';
    +                securityHTML += '<div class="progressbar"><div id="pcgf-ajaxregistrationcheck-security">&nbsp;</div></div>';
    +                securityHTML += '<span id="pcgf-ajaxregistrationcheck-strength"></span>';
    +                pcgfAJAXRegistrationCheckPassword.html(securityHTML);
    +            }
    +            $(this).get(0).setCustomValidity('');
    +            var securityPB = $('#pcgf-ajaxregistrationcheck-security');
    +            var strengthText = $('#pcgf-ajaxregistrationcheck-strength');
    +            securityPB.stop().animate({width: percentage + '%', overflow: 'overflow'}, 800);
    +            if (percentage >= 95) {
    +                strengthText.html(pcgfAJAXRegistrationCheckPasswordVeryStrong);
    +                securityPB.removeClass().addClass('very-strong');
    +            } else if (percentage >= 85) {
    +                strengthText.html(pcgfAJAXRegistrationCheckPasswordStrong);
    +                securityPB.removeClass().addClass('strong');
    +            } else if (percentage >= 60) {
    +                strengthText.html(pcgfAJAXRegistrationCheckPasswordNormal);
    +                securityPB.removeClass().addClass('normal');
    +            } else if (percentage >= 45) {
    +                strengthText.html(pcgfAJAXRegistrationCheckPasswordWeak);
    +                securityPB.removeClass().addClass('weak');
    +            } else {
    +                strengthText.html(pcgfAJAXRegistrationCheckPasswordVeryWeak);
    +                securityPB.removeClass().addClass('very-weak');
    +            }
    +        } else {
    +            pcgfAJAXRegistrationCheckPassword.removeClass('password-strength');
    +        }
    +    });
    +    passwordField.trigger('keyup');
    +    var usernameField = $('#username');
    +    pcgfAJAXRegistrationCheckUsername.insertAfter(usernameField);
    +    usernameField.on('keyup', function() {
    +        passwordField.trigger('keyup');
    +        var value = $(this).val();
    +        if (value.length < pcgfAJAXRegistrationCheckUsernameMin || value.length > pcgfAJAXRegistrationCheckUsernameMax || value.match(pcgfAJAXRegistrationCheckUsernameRule) === null) {
    +            setInvalid(pcgfAJAXRegistrationCheckUsernameInvalidBoundaries, pcgfAJAXRegistrationCheckUsername, $(this));
    +        } else {
    +            setLoading(pcgfAJAXRegistrationCheckLoading, pcgfAJAXRegistrationCheckUsername, $(this));
    +            $.ajax({
    +                url: pcgfAJAXRegistrationCheckUsernameCheckLink,
    +                type: 'POST',
    +                data: {'search': value},
    +                success: function(result) {
    +                    if (result[0] === 'OK') {
    +                        setValid(result[1], pcgfAJAXRegistrationCheckUsername, usernameField);
    +                    } else if (result[0] === 'INVALID QUERY') {
    +                        setLoading(result[1], pcgfAJAXRegistrationCheckUsername, usernameField);
    +                    } else {
    +                        setInvalid(result[1], pcgfAJAXRegistrationCheckUsername, usernameField);
    +                    }
    +                }
    +            });
    +        }
    +    });
    +    usernameField.trigger('keyup');
    +    var eMailField = $('#email');
    +    pcgfAJAXRegistrationCheckEMail.insertAfter(eMailField);
    +    eMailField.on('keyup', function() {
    +        passwordField.trigger('keyup');
    +        var value = $(this).val();
    +        if (value.match(pcgfAJAXRegistrationCheckEMailRule) === null) {
    +            setInvalid(pcgfAJAXRegistrationCheckEMailInvalid, pcgfAJAXRegistrationCheckEMail, $(this));
    +        } else {
    +            setLoading(pcgfAJAXRegistrationCheckLoading, pcgfAJAXRegistrationCheckEMail, $(this));
    +            $.ajax({
    +                url: pcgfAJAXRegistrationCheckEMailCheckLink,
    +                type: 'POST',
    +                data: {'search': value},
    +                success: function(result) {
    +                    if (result[0] === 'OK') {
    +                        setValid(result[1], pcgfAJAXRegistrationCheckEMail, eMailField);
    +                    } else if (result[0] === 'INVALID QUERY') {
    +                        setLoading(result[1], pcgfAJAXRegistrationCheckEMail, eMailField);
    +                    } else {
    +                        setInvalid(result[1], pcgfAJAXRegistrationCheckEMail, eMailField);
    +                    }
    +                }
    +            });
    +        }
    +    });
    +    eMailField.trigger('keyup');
    +    $('#ucp').on('submit', function() {
    +        if (pcgfAJAXRegistrationCheckUsername.hasClass('invalid') || pcgfAJAXRegistrationCheckEMail.hasClass('invalid') || pcgfAJAXRegistrationCheckPassword.hasClass('invalid') || pcgfAJAXRegistrationCheckConfirmPassword.hasClass('invalid')) {
    +            return false;
    +        }
    +        return true;
    +    });
    +});
    Responder