Estava patinando com A praga dos registros forçados que, além de perturbarem, estavam inchando as tabelas de usuários registrados. Resolvi o problema da praga e acabei constatando que as tabelas de usuários não só inchavam por conta dos candidatos a "spameiros", mas também por conta de usuários que fornecem endereços de email fictÃcios, que digitam endereços errados (um monte! se liga pessoal!) ou que simplesmente se esquecem de confirmar seus registros. Por que é que eu deveria guardar tais informações?
Se você leu o artigo sobre "A praga dos registros forçados" então você sabe que fiz um hack no componente com_user para me livrar parcialmente deles. Foi daà que parei para pensar: toda vez que houver uma atualização do Joomla vou ter que me lembrar de "hackear" novamente este componente. Bem, se este é o caso, então vou inserir mais um pouco de código no mesmo arquivo para fazer uma manutenção automática nas tabelas de usuários.
Desrespeitando o padrão MVC (Model-View-Controller) do novo Joomla e só para manter meus "hacks" restritos a um só arquivo, resolvi adicionar mais um pouquinho de código para chegar aonde queria - toda vez que um novo usuário se registrar, fazer uma varredura nas tabelas de usuários e eliminar aqueles que, depois de 15 dias, não tiverem confirmado seus registros. Foi mais simples do que imaginei no inÃcio.
O hack
No arquivo controller.php, localizado na pasta /components/com_user/, fica a função register_save(). Procure pelo trecho de código, já no finzinho da função
Everything went fine, set relevant message depending upon user activation state and display message
if ( $useractivation == 1 ) {
$message = JText::_( 'REG_COMPLETE_ACTIVATE' );
} else {
$message = JText::_( 'REG_COMPLETE' );
}
Logo depois do código acima e antes de
$this->setRedirect('index.php', $message);
coloque este código:
$db =& JFactory::getDBO();
$query = 'SELECT * FROM #__users WHERE block=1'
. ' AND TO_DAYS( NOW() ) - TO_DAYS( registerDate ) > 14';
$db->setQuery( $query );
$rows = $db->loadObjectList();
foreach( $rows as $row ) {
$query = 'DELETE FROM #__users WHERE id='.$row->id;
$db->setQuery( $query );
$db->loadResult();
$query = 'DELETE FROM #__core_acl_aro WHERE value='.$row->id;
$db->setQuery( $query );
$db->loadResult();
}
Â
Conhecendo os "infratores", basta trabalhar cada um dos registros com um loop foreach. Usamos a ID do "infrator" ($row->id) e o eliminamos da tabela jos_users e da tabela jos_core_acl_aro.
Duas tabelas? É isto mesmo! Todos os usuários registrados possuem dois registros e ambos precisam ser eliminados.Mais uma coisinha que aprendi com o tempo
Uma pequena atualização em 19.08.09
Depois de quase um ano usando este hack constatei que a técnica de registro usada pelos espertos de plantão evoluÃu. Agora estão conseguindo fazer registros que "dão um nó" na exigência de que sejam ativados (uma medida de segurança mÃnima num site Joomla). Soma-se a isto uma porção de usuários bem intencionados que fizeram seus registros e os confirmaram, mas que não fizeram nem um único login depois de 30 dias. Apesar de parecer meio draconiano, resolvi eliminá-los também e complementei meu hack com:
$query = "SELECT * FROM #__users WHERE lastvisitDate = '0000-00-00 00:00:00'"
. ' AND TO_DAYS( NOW() ) - TO_DAYS( registerDate ) > 30';
$db->setQuery( $query );
$rows = $db->loadObjectList();
foreach( $rows as $row ) {
$query = 'DELETE FROM #__users WHERE id=' . $row->id;
$db->setQuery( $query );
$db->loadResult();
$query = 'DELETE FROM #__core_acl_aro WHERE value=' . $row->id;
$db->setQuery( $query ); $db->loadResult()
;Valeu, pessoal. Espero que minha experiência sirva para outros "joomleiros".
Abraços para a vovó Vicki!!!
Fonte: Numa Boa
Â
| < Anterior | Próximo > |
|---|




Comentário
Thank you for sharing with us.