[Résolu] Migration mots de passe D5->D7 (problème de hash)

Information importante

En raison d'un grand nombre d'inscriptions de spammers sur notre site, polluant sans relache notre forum, nous suspendons la création de compte via le formulaire de "sign up".

Il est néanmoins toujours possible de devenir adhérent•e en faisant la demande sur cette page, rubrique "Inscription" : https://www.drupal.fr/contact


De plus, le forum est désormais "interdit en écriture". Il n'est plus autorisé d'y écrire un sujet/billet/commentaire.

Pour contacter la communauté, merci de rejoindre le slack "drupalfrance".

Si vous voulez contacter le bureau de l'association, utilisez le formulaire disponible ici, ou envoyez-nous un DM sur twitter.

Salut à tous.

Je dois migrer un site internet et son contenu de Drupal 5 vers Drupal 7. J'ai bien réussi à transférer tous les utilisateurs mais aucun n'arrive à se connecter au nouveau site. Le problème étant que Drupal 5 utilise md5 pour crypter les mots de passe alors que Drupal 7 utilise sha512.

Savez-vous alors comment résoudre ce problème?

Merci, a+

Version de Drupal : 

C'est bon j'ai trouvé. Il faut exécuter le script suivant dans votre répertoire drupal 7. Il permet de convertir tous les mots de passes.

<?php
   
// bootstrap stuff
   
define('DRUPAL_ROOT', getcwd());

    include_once
DRUPAL_ROOT . '/includes/bootstrap.inc';
   
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);

    require_once
DRUPAL_ROOT . '/' . variable_get('password_inc', 'includes/password.inc');

   
// Lower than DRUPAL_HASH_COUNT to make the update run at a reasonable speed.
   
$hash_count_log2 = 11;

   
//  Hash again all current hashed passwords.
   
$has_rows = FALSE;

   
// Update this many users
   
$count = 1000;

   
$result = db_query_range("SELECT uid, pass FROM {users} WHERE uid > 1 ORDER BY uid", 0, $count);
    foreach (
$result as $account) {
     
$has_rows = TRUE;
     
$new_hash = user_hash_password($account->pass, $hash_count_log2);
      if (
$new_hash) {
       
// Indicate an updated password.
       
$new_hash  = 'U' . $new_hash;
       
db_update('users')
          ->
fields(array('pass' => $new_hash))
          ->
condition('uid', $account->uid)
          ->
execute();
      }
    }
?>

Je viens d'utiliser le script. Ca ne fonctionnait pas :-(.
Puis j'ai remarqué que la première lettre des mots de passe était en trop: Pour mon site, un "U majuscule". Le mot de passe donné par le script est : U$S$9bkIEKkDdW.96kmZxp3YRr4Ou4xuacISszvAM/gfJ8nwKkZtFIyW en modifiant le mot de passe crypté par $S$9bkIEKkDdW.96kmZxp3YRr4Ou4xuacISszvAM/gfJ8nwKkZtFIyW, le nouvel utilisateur arrive à se connecter.

Est-il possible de corriger le script?
Est-ce que la ligne
$new_hash = 'U' . $new_hash;
n'est pas tout simplement de trop?

Est-ce bien sur la ligne
$result = db_query_range("SELECT uid, pass FROM {users} WHERE uid > 1 ORDER BY uid", 0, $count);
qu'il faut choisir les "uid" dont les mots de passe vont subir la modification?