08 noviembre 2007

Cómo migrar los usuarios de UNB forums a phpbb

(English Version)
Si tienes un UNB forum instalado con cantidad de usuarios y quieres cambiar el sistema a phpbb, te encontrarás con que la contraseña no funciona debido al sistema kmd5 en UNB.

Encontré este problema con nuestros foros, y estuve trabajando en ello, y finalmente creo que funciona, pero necesito probarlo, y probarlo...

Estos son los pasos que seguí para hacerlo

1.- Cambié el tamaño de la columna password en la tabla phpbb_users ejecutando la siguiente sentencia SQL:

 ALTER TABLE phpbb_users MODIFY user_password varchar(32);

2.- Cambié al directorio raíz de phpbb y abrí el fichero login.php. Ahí incluí la función unbCheckUserPassword del fichero session.lib.php de UNB forums. En login.php llamé a la función checkUserPassword.

function checkUserPassword($hashed, $stored)
{
// update old hashes
if (strlen($stored) == 34)
{
$stored = '{kmd5}' . $stored;
}

// compare passwords based on used hash method
if (substr($stored, 0, 6) == '{kmd5}')
{
// input password must be an MD5 hash
$stored = substr($stored, 6); // remove identifier
#$key = substr($stored, 0, 2);
#return $key . strtolower(md5($key . $hashed)) == $stored;

// retrieve key
$key = substr($stored, 16, 2);
// build keyed hash
$hash1 = strtolower(md5($key . $hashed));
$hash2 = substr($hash1, 0, 16) . $key . substr($hash1, 16);
return $hash2 == $stored;
}
return false;
}

3.- En la línea 124 cambié la condición. Antes del cambio la condición era:

if( (md5($password) == $row['user_password'] && $row['user_active'])


Ahora la condición es (la escribí en una línea):

if( (md5($password) == $row['user_password'] && $row['user_active']) || (checkUserPassword(md5($password),$row['user_password ']) && $row['user_active']))



4.-Cambié al directorio includes, ahí abrí usercp_register.php. He vuelto a incluir la función userCheckPassword. Aproximadamente en la línea 395 cambiamos la condición. La condición antigua era:

if ( $row['user_password'] == md5($password) ]



Ahora la condición es:

if ( ( checkUserPassword(md5($cur_password),$row['user_password'])!=1) xor ($row['user_password'] == md5($cur_password)))



Es un poco raro, pero tenemos que utilizar XOR porque si ambas condiciones son verdad, no es cierto para nosotros. Lo probé de esta manera, y aparentemente funciona.

No hay comentarios: