2011-06-01 18 views
7

No necesito importar datos en mi compilación D7 que no sean los usuarios. Sin embargo, he (por SQL) importé mis datos de usuario, el método de encriptación de contraseña D7 ahora es diferente.Drupal 6 contraseña de usuario importada a Drupal 7

no soy un experto en cualquier tramo de la imaginación y nunca he utilizado Drush, pero me he encontrado con este código user_update_7000 fragmento encontrado user.install (http://api.drupal.org/api/drupal/modules--user--user.install/function/user_update_7000/7)

<?php 
require_once DRUPAL_ROOT . '/' . variable_get('password_inc', 'includes/password.inc'); 
$old_hash = md5('password'); 
$hash_count_log2 = 11; 

$new_hash = user_hash_password($old_hash, $hash_count_log2); 

if ($new_hash) { 
    // Indicate an updated password. 
    $new_hash = 'U' . $new_hash; 
} 
?> 

dónde podría ejecutar este script para actualizar el campo de contraseña en mi DB?

Gracias,

Steve

Respuesta

8

creo que se puede crear una página con un nombre como rehash.php (en su raíz, mismo lugar que update.php). Luego, inicie sesión como administrador primero, busque esta página en segundo lugar. Vea el código a continuación (más tomado de user_update_7200 en la última instalación de drupal 7) ...

Peor aún, podría crear un módulo personalizado simple y poner este código allí.

Tenga en cuenta que debe hacer una copia cosas primero:

<?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(); 
     } 
    } 
?> 
+1

¡Funcionó perfectamente, gracias! Una cosa que necesitaba editar era el SQL en la línea 19 ... Si alguien más usa este uid debe ser mayor que 1 para evitar volver a hacer clic en la contraseña de administrador. –

+1

Buen punto =). Actualizado. – hross

+0

Creo que quiso decir user_update_7000, not user_update_7200 – aaronbauman

0

Esta respuesta fue perfecta. Lo usé para actualizar desde un sitio de Drupal 5. Hice un par de cambios para satisfacer mis propósitos:

  1. No he limitado el número de contraseñas que se actualizan. Quería actualizarlos a todos, y el sistema que estaba actualizando tenía muchos más de 1,000 usuarios.

  2. He añadido un cheque para asegurarme de que no estaba actualizando una contraseña dos veces. De esta forma, si se agota el tiempo (como lo hizo para mí) modificando todas las contraseñas, puedo volver a ejecutar el rehash.php para completar la conversión. Tenga en cuenta, sin embargo, que una vez que un usuario inicia sesión, la "U" inicial se elimina cuando se vuelve a codificar la contraseña.

    if (substr($account->pass, 0, 1) == 'U') 
    { 
        continue; 
    } 
    
0

no tengo suficientes puntos para añadir un comentario, pero yo he hecho varias mejoras a hross' respuesta (y presentó un proyecto de actualización).

Aquí hay una secuencia de comandos mejorada con documentación y la capacidad de especificar una tabla de usuarios no predeterminados para aquellos que realizan fusiones manuales de Drupal 6 a 7. También incorpora la comprobación de jpb.

<?php 
    /** 
    * Use this script to update Drupal 6 users password hashes to Drupal 7 specs. 
    * 
    * Ensure you BACKUP YOUR USERS TABLE before using this script! If not your whole site! 
    * Name this file update_users.php and place in your Drupal root, same place as update.php 
    * 
    * - If you've manually inserted a new table into your database, change the $databasename below. 
    * - If this does not run, ensure you are logged into your site as admin. 
    * - If this does not run, check your drupal watchdog and/or PHP logs 
    * - If you see this error "PDOException: SQLSTATE[22001]: String data, right truncated: 1406 Data too long for column 'pass' at row 1:" 
    * you need to update your table's structure so that pass is a varchar(128). 
    * 
    * BACKUP, THIS MAY BREAK YOUR SITE AND EAT YOUR DATA! 
    */ 

    echo "Starting. \r\n"; 

    // Change this if you've made a custom table 
    $databasename = "users"; 

    // Update this many users 
    $count = 1000; 

    // 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; 

    $result = db_query_range("SELECT uid, pass FROM {" . $databasename . "} WHERE uid > 10 ORDER BY uid", 0, $count); 
    foreach ($result as $account) { 
    $has_rows = TRUE; 
    if (substr($account->pass, 0, 1) != 'U') { 
     echo "updating account: " . $account->uid . " \r\n"; 
     $new_hash = user_hash_password($account->pass, $hash_count_log2); 
     if ($new_hash) { 
     // Indicate an updated password. 
     $new_hash = 'U' . $new_hash; 
     db_update($databasename) 
      ->fields(array('pass' => $new_hash)) 
      ->condition('uid', $account->uid) 
      ->execute(); 
     } 
    } 
    } 
    echo "Done."; 
?> 
+0

Cambie la variable $ databasename por $ tablename. Fue un poco confuso –

Cuestiones relacionadas