GTAOnline.net

San Andreas Multiplayer (sa:mp) => Scripting SA-MP [Pawn center] => Discussion démarrée par: Tetsuka le 11 Juin 2011, 23:44:09

Titre: Soucis reconnaissance mdp
Posté par: Tetsuka le 11 Juin 2011, 23:44:09
Salut salut,
J'ai pas vraiment l'habitude de demander de l'aide, mais là je suis sur une tuile et je sèche.
J'ai du mal avec la reconnaissance du mot de passe, ici, peu importe le mot de passe qui est tapé dans la boite de dialogue, c'est considéré comme bon et le joueur peut se connecter...

public OnPlayerLoginAttempt( playerid, password[])
{
new string[ 128 ], Nom[MAX_PLAYER_NAME];
GetPlayerName( playerid, Nom, sizeof(Nom) );
format( string, sizeof( string ), "Comptes/%s.ini", Nom);
        if(fexist( string) )
{
               if(strcmp( dini_Get( string, "Password" ), password, false ) == 0)
      {
              etc...

Le dialogue en question:

case 3894:
{
if(strlen(inputtext) > 128 || strlen(inputtext) < 1)
{
ShowPlayerDialog( playerid, 3894, DIALOG_STYLE_INPUT, "Authentification", "Bienvenue sur le serveur\n\nEntre ton mot de passe pour te connecter", "Connexion", "Aide" );
}
else
{
if( Player[playerid][Authentif] == 0 )
{
OnPlayerLoginAttempt( playerid, inputtext);
}
else
{
SendClientMessage( playerid, GRIS, "Tu es déjà authentifié." );
}
}
}


J'ai esssayé pas mal de trucs en zieutant sur d'autres scripts, mais rien n'y fait.

Merci d'avance,
Tetsu
Titre: Re : Soucis reconnaissance mdp
Posté par: Syg le 12 Juin 2011, 00:04:49
La fonction strcmp à un bug : Si une des chaînes est vide, elle se comporte comme si les deux chaînes étaient égales.

Donc dans un premier temps, il faut vérifier que tes chaînes de caractères ne sont pas vides.
Pour cela, il suffit de rajouter un printf juste avant la comparaison :
public OnPlayerLoginAttempt( playerid, password[])
{
new string[ 128 ], Nom[MAX_PLAYER_NAME];
GetPlayerName( playerid, Nom, sizeof(Nom) );
format( string, sizeof( string ), "Comptes/%s.ini", Nom);
        if(fexist( string) )
{
               printf ("---> strcmp (<%s>, <%s>)", dini_Get( string, "Password" ), password); // LIGNE A AJOUTER
               if(strcmp( dini_Get( string, "Password" ), password, false ) == 0)
      {
              etc...

Puis, on regarde dans la console du serveur si on n'a pas un affichage du genre
---> strcmp (<Toto>, <>)
ou
---> strcmp (<>, <Titi>)
NB : <> indique une chaîne vide

Ensuite, si c'est la cas, il te suffira de déterminer pourquoi la chaîne est vide.
NB : Il faut quand même gérer le cas où le joueur ne saisit pas de mot de passe.

++
Syg
Titre: Re : Soucis reconnaissance mdp
Posté par: Tetsuka le 12 Juin 2011, 00:30:14
Salut Syg,
Merci pour ton coup de pouce, je vais voir ça.
Sinon, le cas où le joueur ne saisit pas de mot de passe est géré dans le dialog: if(strlen(inputtext) > 128 || strlen(inputtext) < 1)
(Si c'est bien de ça que tu parlais)


Double post
Voilà le résultat du test:
[00:33:15] ---> strcmp (<>, <test>)
J'ai donc un soucis avec la variable joueur...
Je me rend compte que, dans mon fichier joueur, à chaque fois que je me connecte, ce qui était "Password = ..." devient "ÿPassword = ..." Je pense que le soucis viens de là, mais aucune idée d'où ça peut venir...
Titre: Re : Soucis reconnaissance mdp
Posté par: cristab le 12 Juin 2011, 08:28:21
dans un sens c'est normale

if(strcmp( dini_Get( string, "Password" ), password, false ) == 0)

ceci est bien trop long une fonction dans une fonction

new passfichier[256];
passfichier = dini_Get( string, "Password" );
if(strcmp( passfichier, password, false ) == 0)

voila qui devrais etre capable de lire le fichier

pour le soucis de Password a ÿPassword tu as du faire une erreure de frappe quelque part.
Titre: Re : Soucis reconnaissance mdp
Posté par: Tetsuka le 12 Juin 2011, 10:57:13
Salut Cristab, merci pour ton aide.
Le mot de passe n'est toujours pas récupéré, je suis persuadé que le soucis vient du ÿPassword.
Lorsque je me connecte, la ligne Password devient ÿPassword et à la déconnexion un nouvelle ligne Password apparait à la fin...
J'ai bien vérifié, je n'ai fait aucune erreur de frappe.
Titre: Re : Soucis reconnaissance mdp
Posté par: cristab le 12 Juin 2011, 11:07:08
tu peu me montrer tout sa au moment de la connection ect ect
Titre: Re : Soucis reconnaissance mdp
Posté par: Syg le 12 Juin 2011, 13:19:08
Le caractère ÿ correspond au code ASCII 255. Ce n'est certainement pas une coïncidence.
Je pense comme cristab, le fichier doit être mal écrit mais ça ne vient pas forcément de la ligne Password=, ça peut aussi venir de celle qui est juste au dessus.

++
Syg
Titre: Re : Soucis reconnaissance mdp
Posté par: Tetsuka le 12 Juin 2011, 13:40:57
Voici un pastebin avec les 3 fonctions qui concernent le mot de passe.
http://pastebin.gtaonline.fr/pastebin.php?show=1105 (http://pastebin.gtaonline.fr/pastebin.php?show=1105)

Le Password est en première ligne sur tous les fichiers (sauf dans le cas où la nouvelle ligne se crée)
Titre: Re : Soucis reconnaissance mdp
Posté par: cristab le 12 Juin 2011, 13:47:52
tu n'est pas obliger de sauver a chaque coup le password dans SavePlayerData tu l'enregistre dans le /register  et dans le /changepass mais c'est tout je rapelle que Dini est un peu long mais la tu fais des save un peu partout ce qui le rendras forcement instable
Titre: Re : Soucis reconnaissance mdp
Posté par: S!m le 12 Juin 2011, 14:11:27
Salut,

il a l'air de ne sauvegarder qu'à la déconnexion...ce n'est pas si pire...
Normalement il faut que ça puisse sauvegarder correctement...

Si tu fais un print du string avant de l'enregistrer, es-ce que ça t'affiche le mot de passe correctement?

++Sim++
Titre: Re : Soucis reconnaissance mdp
Posté par: Tetsuka le 12 Juin 2011, 15:10:52
Salut,

Donc, si je suis vos conseils:
-Je supprime l'enregistrement du mot de passe dans le SavePlayerData pour ne le garder qu'à l'enregistrement/changement
-Je fais en sorte que les stats soient sauvegardées de manière récurrente? En sachant que j'ai quand même fait en sorte d'appeler souvent cette fonction.
C'est bien ça?

Sim, voici le résultat du printf: [15:07:24] ---> strcmp (<test>, <test>) Ca a donc l'air de bien fonctionner..


Double post
Bon, je me suis rendu compte que le problème n'est pas général.
Avec tous les autres comptes que j'ai crée/testé tout fonctionne nickel, sauf avec un seul et le soucis du ÿPassword... Une idée?
Titre: Re : Soucis reconnaissance mdp
Posté par: Syg le 13 Juin 2011, 13:21:31
Corrige le fichier du joueur qui pose problème à la main (supprime le ÿ) et regarde si le problème est toujours là.
Si il est toujours là ... il faudra investiguer plus en profondeur..

++
Syg
Titre: Re : Soucis reconnaissance mdp
Posté par: Tetsuka le 13 Juin 2011, 13:56:09
Déjà fait, le ÿ réapparait à chaque fois.
Titre: Re : Soucis reconnaissance mdp
Posté par: cristab le 13 Juin 2011, 14:04:53
efface le fichier en question est demande au joueur de le recreer
Titre: Re : Soucis reconnaissance mdp
Posté par: Tetsuka le 13 Juin 2011, 14:30:00
C'est la seule solution je crois oui, mais c'est dommage de pas trouver l'origine de ce bug, car si ça se reproduit, ça peut devenir embêtant.
Merci pour votre aide, je vous tiens au courant.
Titre: Re : Soucis reconnaissance mdp
Posté par: Syg le 13 Juin 2011, 14:56:30
C'est quoi le pseudo du joueur qui pose problème ?

++
Syg