Quero reportar um bug da versão 9.6.005 na recuperação de senha via código de ativação. O bug está na aplicação app_change_pswd_apl.php, gerada pelo módulo de segurança. Ele impede completamente a recuperação de senha via código de ativação. O erro acontece antes do evento onValidate na aplicação controle app_change_pswd gerada pelo módulo de segurança. O passo a passo normal seria o seguinte:
- Usuário clica que esqueceu a senha e recebe o link contendo um código de ativação em seu email;
- Ao clicar no link gerado, este código de ativação é enviado pela URL via GET para a aplicação app_retrieve_pswd (não deveria ser via GET para não ficar visível na URL e também deveria ter um prazo de validade, mas isso é outra história, fica a sugestão);
- A aplicação app_retrieve_pswd salva o código de ativação no banco de dados, no registro do usuário (sec_users) e redireciona para a aplicação app_change_pswd passando como parâmetro a variável act_code;
- Ao receber esta variável no método onLoad da app_change_pswd, ela oculta o campo {old_pswd} com o método sc_field_display. É aqui que acontece o início do problema.
- A partir daqui, o usuário deveria apenas entrar com a nova senha e confirmar, mas não importa o que ele faça, acertando ou errando, colocando senhas que cumpram os requisitos ou colocando senhas diferentes entre os campos {pswd} e {confirm_pswd}, que o bug que está na rotina da app_change_pswd_apl.php entrará antes do evento onValidate com uma mensagem: “Senha antiga: exige um mínimo de [x] caracteres.” O [x] depende de quantos caracteres o usuário configurou como mínimo no módulo de segurança, tipo 6, 8, tanto faz. E dai o usuário não tem como gerar uma nova senha, não importa o que ele faça.
No modo debug o script é interrompido na linha 1130 da app_change_pswd_apl.php. Mas o erro acontece na function Valida_campos ou mais especificamente na function ValidateField_old_pswd que não aceita o campo {old_pswd} como vazio, embora ele tenha sido ocultado (display off) pelo evento onLoad da própria aplicação, porque não tem sentido mesmo, já que a recuperação de senha, ou melhor, a geração de nova senha é feita via código de ativação e não pela senha antiga, que não deve participar mesmo.
A confirmação de que o problema é esse foi feita da seguinte forma. Eu comentei a linha no onLoad que oculta o campo {old_pswd} deixando ele visível e colocando uma senha qualquer maior que o número mínimo de caracteres. Somente assim ele deixa o usuário gerar uma nova senha.
O bug é facilmente recriado em modo de desenvolvimento. Basta executar a aplicação app_change_pswd (sem alterar em nada o código gerado pela aplicação, deixando o campo {old_pswd} oculto mesmo) e entrar com um código de ativação qualquer (não importa qual, porque o bug irá interceptar a rotina antes da validação) e um usuário qualquer. Daí entre com uma senha valida e confirme com a mesma senha. A mensagem de erro do número mínimo de caracteres no campo senha antiga irá aparecer impedindo o usuário de prosseguir. Depois entre com uma senha válida e erre propositalmente a confirmação de senha com uma senha diferente. Ele deveria interceptar o erro com uma mensagem diferente pela rotina que está no evento onValidate, mas o bug intercepta antes do evento e reclama que o campo Senha Antiga {oldpswd} que está oculto, está com menos do que o mínimo de caracteres exigido.
Um bug pelo jeito muito antigo, pelo que vi no fórum aqui, de 2011 a 2016, que ficou sem resolução, pode ter sido corrigido em algum momento, mas voltou agora com certeza.
Esse bug gera um transtorno imenso para os desenvolvedores e usuários e precisa ser corrigido imediatamente. A única maneira de alterar uma senha que o usuário esqueceu agora é deletando o usuário do banco de dados e recriando um via aplicação, com uma nova senha.