138 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			138 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
|  | using Dapper; | |||
|  | using Microsoft.Extensions.Configuration; | |||
|  | using PasswordMigrationUtil; // Namespace de tus clases copiadas/modificadas | |||
|  | using System.Data; | |||
|  | 
 | |||
|  | Console.WriteLine("Iniciando Utilidad de Migración de Contraseñas..."); | |||
|  | 
 | |||
|  | // --- Configuración --- | |||
|  | IConfiguration configuration = new ConfigurationBuilder() | |||
|  |     .SetBasePath(Directory.GetCurrentDirectory()) | |||
|  |     .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) | |||
|  |     .Build(); | |||
|  | 
 | |||
|  | string? connectionString = configuration.GetConnectionString("DefaultConnection"); | |||
|  | if (string.IsNullOrEmpty(connectionString)) | |||
|  | { | |||
|  |     Console.ForegroundColor = ConsoleColor.Red; | |||
|  |     Console.WriteLine("ERROR: No se encontró la cadena de conexión 'DefaultConnection' en appsettings.json."); | |||
|  |     Console.ResetColor(); | |||
|  |     return 1; // Termina con código de error | |||
|  | } | |||
|  | 
 | |||
|  | // --- Inicialización de Servicios --- | |||
|  | var connectionFactory = new DbConnectionFactory(connectionString); | |||
|  | var passwordHasher = new PasswordHasherService(); | |||
|  | int migratedCount = 0; | |||
|  | int errorCount = 0; | |||
|  | 
 | |||
|  | // --- Lógica Principal --- | |||
|  | try | |||
|  | { | |||
|  |     using (var connection = connectionFactory.CreateConnection()) | |||
|  |     { | |||
|  |         connection.Open(); | |||
|  |         Console.WriteLine("Conexión a base de datos establecida."); | |||
|  | 
 | |||
|  |         // Seleccionar usuarios que necesitan migración (ClaveSalt es NULL o vacía) | |||
|  |         // ¡¡AJUSTA 'ClaveHash' AL NOMBRE DE LA COLUMNA QUE TIENE LA CLAVE EN TEXTO PLANO AHORA MISMO!! | |||
|  |         var usersToMigrateQuery = @"
 | |||
|  |             SELECT Id, [User], ClaveHash AS PlainPassword -- Leer la clave plana de la columna correcta | |||
|  |             FROM dbo.gral_Usuarios | |||
|  |             WHERE ClaveSalt IS NULL OR ClaveSalt = ''";
 | |||
|  | 
 | |||
|  |         Console.WriteLine("Consultando usuarios para migrar..."); | |||
|  |         var users = await connection.QueryAsync<(int Id, string User, string PlainPassword)>(usersToMigrateQuery); | |||
|  | 
 | |||
|  |         if (!users.Any()) | |||
|  |         { | |||
|  |             Console.WriteLine("No se encontraron usuarios que necesiten migración."); | |||
|  |             return 0; | |||
|  |         } | |||
|  | 
 | |||
|  |         Console.WriteLine($"Se encontraron {users.Count()} usuarios para migrar."); | |||
|  | 
 | |||
|  |         foreach (var user in users) | |||
|  |         { | |||
|  |             Console.Write($"Migrando usuario ID: {user.Id}, Username: {user.User}... "); | |||
|  |             try | |||
|  |             { | |||
|  |                 if (string.IsNullOrWhiteSpace(user.PlainPassword)) | |||
|  |                 { | |||
|  |                     Console.ForegroundColor = ConsoleColor.Yellow; | |||
|  |                     Console.WriteLine("ADVERTENCIA: Contraseña vacía o nula, omitiendo hash."); | |||
|  |                     Console.ResetColor(); | |||
|  |                     // Opcionalmente, podrías poner un hash/salt inválido o manejarlo de otra forma | |||
|  |                     continue; // Saltar al siguiente usuario | |||
|  |                 } | |||
|  | 
 | |||
|  |                 // Generar hash y salt | |||
|  |                 (string hash, string salt) = passwordHasher.HashPassword(user.PlainPassword); | |||
|  | 
 | |||
|  |                 // Actualizar la base de datos (¡CON PARÁMETROS!) | |||
|  |                 var updateQuery = @"
 | |||
|  |                     UPDATE dbo.gral_Usuarios | |||
|  |                     SET ClaveHash = @HashedPassword, | |||
|  |                         ClaveSalt = @Salt | |||
|  |                     WHERE Id = @UserId";
 | |||
|  | 
 | |||
|  |                 var parameters = new | |||
|  |                 { | |||
|  |                     HashedPassword = hash, | |||
|  |                     Salt = salt, | |||
|  |                     UserId = user.Id | |||
|  |                 }; | |||
|  | 
 | |||
|  |                 int rowsAffected = await connection.ExecuteAsync(updateQuery, parameters); | |||
|  | 
 | |||
|  |                 if (rowsAffected == 1) | |||
|  |                 { | |||
|  |                     Console.ForegroundColor = ConsoleColor.Green; | |||
|  |                     Console.WriteLine("¡Éxito!"); | |||
|  |                     Console.ResetColor(); | |||
|  |                     migratedCount++; | |||
|  |                 } | |||
|  |                 else | |||
|  |                 { | |||
|  |                     Console.ForegroundColor = ConsoleColor.Red; | |||
|  |                     Console.WriteLine($"ERROR: No se actualizaron filas para el usuario {user.Id}."); | |||
|  |                     Console.ResetColor(); | |||
|  |                     errorCount++; | |||
|  |                 } | |||
|  |             } | |||
|  |             catch (Exception exHashUpdate) | |||
|  |             { | |||
|  |                 errorCount++; | |||
|  |                 Console.ForegroundColor = ConsoleColor.Red; | |||
|  |                 Console.WriteLine($"ERROR al procesar usuario {user.Id}: {exHashUpdate.Message}"); | |||
|  |                 Console.ResetColor(); | |||
|  |                 // Considera loggear exHashUpdate.ToString() para más detalles | |||
|  |             } | |||
|  |         } | |||
|  |     } | |||
|  | } | |||
|  | catch (Exception exConnect) | |||
|  | { | |||
|  |     Console.ForegroundColor = ConsoleColor.Red; | |||
|  |     Console.WriteLine($"ERROR de conexión o consulta general: {exConnect.Message}"); | |||
|  |     Console.ResetColor(); | |||
|  |     return 1; // Termina con código de error | |||
|  | } | |||
|  | 
 | |||
|  | Console.WriteLine("\n--- Resumen de Migración ---"); | |||
|  | Console.ForegroundColor = ConsoleColor.Green; | |||
|  | Console.WriteLine($"Usuarios migrados exitosamente: {migratedCount}"); | |||
|  | Console.ResetColor(); | |||
|  | if (errorCount > 0) | |||
|  | { | |||
|  |     Console.ForegroundColor = ConsoleColor.Red; | |||
|  |     Console.WriteLine($"Usuarios con errores: {errorCount}"); | |||
|  |     Console.ResetColor(); | |||
|  |     Console.WriteLine("Revise los mensajes de error anteriores."); | |||
|  |     return 1; // Termina con código de error si hubo fallos | |||
|  | } | |||
|  | else | |||
|  | { | |||
|  |     Console.WriteLine("¡Migración completada sin errores!"); | |||
|  |     return 0; // Termina exitosamente | |||
|  | } |