Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   HASH y Windows 10 (https://www.clubdelphi.com/foros/showthread.php?t=94196)

Angel.Matilla 27-09-2019 10:01:48

HASH y Windows 10
 
Hace unos meses planteaba un problema que estaba teniendo con una aplicación en red: En una máquina con W7 funciona sin problema alguno pero en otra con W10 no había manera de que el código que ponía en aquel hilo funcionara; ni bine, ni mal: directamente no funcionaba.

Por probar cambié un poco el diseño de la tabla donde se guardan los usuarios y ahora hago esta verificación:
Código:

try
{
    Application->OnException = NULL;
    Application->CreateForm(__classid(TfLogin), &fLogin);
    if ((nValor = fLogin->ShowModal()) != mrOk)
          throw Exception("Cancelado por el usuario.\nSistema desconectado.");

    delete fLogin;
    Application->OnException = DisplayError;

    Query->Close();
    Query->SQL->Text = "SELECT Clave, CAST(HASH('" + ClaveUser + "') AS VARCHAR(25)) FROM Claves WHERE Nombre = :Nombre";
    Query->ParamByName("Nombre")->AsString = NombreUser;
    Query->Open();

    if (Query->FieldByName("Clave")->AsString != Query->Fields->FieldByNumber(2)->AsString)
          throw Exception("Usuario / clave desconocidos.\nSistema desconectado.");

    DesconectaDb();

    Query->Params->Clear();
    Query->Params->Add("lc_ctype=ISO8859_1");
    Query->SQLDialect = 3;
}
catch(Exception &Exc)
{
    Mensaje(1, Exc.Message, "Terminar");
    Application->Terminate();
    return 0;
}

Y volvemos a lo mismo: en el puesto que funciona con W7 no hay ningún problema pero en el que tiene W10 no hay manera de que ese query y su validación posterior funcione. Ya no sé que hacer.

Casimiro Notevi 27-09-2019 13:03:39

¿Qué no funciona, qué mensaje o error sale, en qué línea, etc...?

Angel.Matilla 27-09-2019 13:33:41

No, no da ningún error no nada. Simplemente al llegar al condicional SIEMPRE se sale por el throw. Y he comprbado que lo que está guardado en la base de datos (Clave) y lo que se calcula a partir de CAST(HASH('" + ClaveUser + "') AS VARCHAR(25)) (ClaveUser es una variable del programa y está bien asignada) tienen el mismo valor si lo ejecuto en IBManager, por ejemplo.

mamcx 27-09-2019 17:17:29

Si se sale por throw tienes un error. Cual es...

Angel.Matilla 27-09-2019 18:20:51

Si te fijas el throw está puesto para cuando el HASH de la clave que pone el usuario y el valor que está grabado no coinciden; fuerzo el error, lo que significa que a pesar de lo que está grabado no coinciden los valores.

mamcx 27-09-2019 20:46:37

Algunas ideas:

1- Instala windows 10 en una VM y prueba.
2- Captura los sql que recibe firebird:

https://stackoverflow.com/questions/...rd-sql-queries

es probable que tengas 2 hilos/procesos que estan variando por problemas de timing y creas que el codigo esta haciendo paso 1 -> paso2 y resulta que es paso2 -> paso1

Ah, se me olvido el paso mas util:

3- Saca ese codigo del programa y lo pones en una app minima (como de consola), Si el error no se reproduce, sabes con certeza que el problema NO esta ahi, o tienes un bug parecido al que te puse arriba del orden.

Si el error SI se reproduce, tienes un codigo mucho mas minimo que mirar. Usando logs/traces puedes ver con claridad que pasa.

Angel.Matilla 28-09-2019 09:58:03

Cita:

Empezado por mamcx (Mensaje 533644)
Algunas ideas:

Gracias por las ideas. Intentaré hacer las pruebas que me sugieres. No obstante vuelvo a señalar que la misma aplicación corriendo en dos máquinas distintas en la que tiene W7 funciona sin ningún problema, al igual que en mi equipo que tiene el mismo S.O., mientras que todos los problemas los está dando el PC con W10. Por eso, al igual que en el otro hilo que refería, me inclino a pensar que tiene algo que ver con el S.O.

Cita:

Empezado por mamcx (Mensaje 533644)
es probable que tengas 2 hilos/procesos que estan variando por problemas de timing

No digo que no sea posible, pero no creo porque esa parte del código es lo primero que se lanza y no hay nada más funcionando cuando se pide la clave de acceso al sistema. De todas maneras indagaré, aunque también he de decir que no uso hilos en mis programas porque no acabo de entender como funcionan. Sé que en muchos casos supone un atraso, pero no soy capaz de comprenderlos.

Angel.Matilla 28-09-2019 10:07:55

Otra cosa.
Cita:

Empezado por mamcx (Mensaje 533644)

Interesantísimo enlace. Tengo que leerlo con atención porque me podría ayudar bastante.

Casimiro Notevi 28-09-2019 12:02:35

¿Y por qué no presentas la excepción en lugar del mensaje personalizado?
Código:

throw Exception(e....);

Angel.Matilla 30-09-2019 10:52:12

Cita:

Empezado por Casimiro Notevi (Mensaje 533652)
¿Y por qué no presentas la excepción en lugar del mensaje personalizado?
Código:

throw Exception(e....);

También es verdad.


La franja horaria es GMT +2. Ahora son las 15:17:50.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi