GTAOnline.net

San Andreas Multiplayer (sa:mp) => Scripting SA-MP [Pawn center] => Discussion démarrée par: Kiloutre le 04 Septembre 2012, 10:46:13

Titre: Probleme Dini
Posté par: Kiloutre le 04 Septembre 2012, 10:46:13
Bonjour a tous et a toutes, j'aimerai savoir dans dini comment sauter une ligne (Si possible), et separer des partie de textes pour pouvoir par exemple faire des Statistiques.

J'ai bien regardé le tuto de cristab, mais il explique juste les fonctions, et ce n'est pas ce que je cherche.
Titre: Re : Information sur Dini
Posté par: Xolokos le 04 Septembre 2012, 14:27:17
Passer une ligne si je ne me trompe pas c'est bien \n ou bien \r...
Titre: Re : Information sur Dini
Posté par: Kiloutre le 04 Septembre 2012, 16:00:56
Ah donc ca marche dans tous les "BlaBlaBla" merci  :laugh !

Mais ce probleme est deja passer car dini saute des lignes automatiquements...
Mais ne partez pas encore, j'ai encore un probleme !

J'essaye de crée un simple /register et /login mais un probleme survient lorsque je veut recuperer le mot de passe pour le comparer avec celui entrer dans le /login.

Voici mon code (en entier, sisi ;)):


#include <dini>
new pRank[MAX_PLAYERS];
new pRegister[MAX_PLAYERS];

//Dans le OnPlayerConnect
public OnPlayerConnect(playerid)
{
if(pRegister[playerid] == 0)
{
TogglePlayerControllable(playerid,0);
SendClientMessage(playerid, ORANGE, "Faites /register <MOTDEPASSE> pour pouvoir vous connecter !");
}
pRank[playerid] = 1;
new playername[MAX_PLAYER_NAME];
GetPlayerName(playerid, playername, sizeof(playername));
if(!fexist("Stats.txt")) dini_Create("Stats.txt");
dini_Set("Stats.txt","Pseudo", playername);
dini_IntSet("Stats.txt","Rang", pRank[playerid]);
return 1;
}

//Dans le OnPlayerCommandText :

new cmd[128], tmp[128], idx;
cmd = strtok(cmdtext, idx);
if(strcmp(cmd,"/register",true)==0)
{
tmp = strtok(cmdtext, idx);
if(pRegister[playerid] == 1) return SendClientMessage(playerid, ROUGE, "Vous ètes deja enregistrer !");
if(strlen(tmp) == 0) return SendClientMessage(playerid, ROUGE, "Usage : /register <MOTDEPASSE>");
pRegister[playerid] = 1;
dini_Set("Stats.txt","Mot de Passe", tmp);
dini_IntSet("Stats.txt","Enregistrer", pRegister[playerid]);
SendClientMessage(playerid, ORANGE, "Vous vous ètes enregistrer, /login <MOTDEPASSE> pour vous connecter !");
return 1;
}

if(strcmp(cmd,"/login",true)==0)
{
   tmp = strtok(cmdtext, idx);
   new password;
password = dini_Int("Stats.txt","Mot de Passe");
if(strcmp(tmp, password,true)==0) //Ici que le probleme survient
{
TogglePlayerControllable(playerid,1);
SendClientMessage(playerid, VERT, "Vous ètes maintenant connecté !");
}
else return SendClientMessage(playerid, ROUGE, "Erreur, votre mot de passe ne correspond pas !");
   return 1;
}

C'est ici  :laugh
if(strcmp(tmp, password,true)==0) //Ici que le probleme survient
Titre: Re : Probleme Dini
Posté par: Xolokos le 05 Septembre 2012, 17:37:14
Pourquoi ne fais tu pas une dialogbox style password ou input c'est beaucoup plus simple et propre ?
Et dans ton code tu oublis de créer le fichier avant d'enregistrer.
Je te conseille d'aller voir mon FS :
http://www.gtaonline.fr/forums/index.php/topic,12815.0.html (http://www.gtaonline.fr/forums/index.php/topic,12815.0.html)
Titre: Re : Probleme Dini
Posté par: cristab le 05 Septembre 2012, 18:50:11
en meme temps ce systeme pourras gerer un seul compte
Titre: Re : Probleme Dini
Posté par: Kiloutre le 05 Septembre 2012, 19:13:57
J'ai deja essayer le style input en essayant de comparer inputtext avec le mot de passe entrer lors du /register mais sans réussite.
Et j'ai modifié le systeme pour qu'il soit pour plusieurs compte, seul le systeme /register /login manque.
Je te l'assure je creer bien le fichier :    if(!fexist("Stats.txt")) dini_Create("Stats.txt");Je vais regarder ton fs pour essayer de faire la meme chose de mon coté, je vous en dirai des nouvelles.

Edit : J'ai bien regarder et j'ai tenter de faire tous en dialogue. Comme je pouvais pas utiliser le inputtext avec dini_IntSet j'ai decider de faire comme toi : "udb_hash" et j'ai bien entendu inclus dudb. Mais des erreurs apparaissent sans raison n'importe ou alors que pourtant le code marchait parfaitement sans dubd...
Titre: Re : Probleme Dini
Posté par: Xolokos le 05 Septembre 2012, 20:43:45
udb_hashC'est pour 'formater' le code dans un sens en chiffre pour ne pas ce faire hacker son compte et ce n'est pas réversible, donc sécurisé.
Regarde comment ça marche, mais ne copie pas.
Titre: Re : Probleme Dini
Posté par: Xartrick le 06 Septembre 2012, 03:02:32
udb_hashC'est pour 'formater' le code dans un sens en chiffre pour ne pas ce faire hacker son compte et ce n'est pas réversible, donc sécurisé.
Regarde comment ça marche, mais ne copie pas.

Ce n'est absolument pas sécurisé.
Titre: Re : Probleme Dini
Posté par: Kiloutre le 06 Septembre 2012, 07:36:49
Je sais d'ou vient le probleme. Avec dini, je ne peux pas recuperer du texte mais uniquement des nombres. C'est la que le hash intervient.
Titre: Re : Re : Probleme Dini
Posté par: cristab le 06 Septembre 2012, 12:53:28
Je sais d'ou vient le probleme. Avec dini, je ne peux pas recuperer du texte mais uniquement des nombres. C'est la que le hash intervient.
faux
Titre: Re : Probleme Dini
Posté par: Kiloutre le 06 Septembre 2012, 16:48:02
Effectivement je vient de trouver dini_Get dans ton tuto sur le forum samp (et non GTA-ONLINE) mais, je ne m'en sort pas trop...
Titre: Re : Probleme Dini
Posté par: cristab le 06 Septembre 2012, 17:16:49
il est ici aussi ;)
Titre: Re : Re : Probleme Dini
Posté par: Xolokos le 06 Septembre 2012, 17:42:43
udb_hashC'est pour 'formater' le code dans un sens en chiffre pour ne pas ce faire hacker son compte et ce n'est pas réversible, donc sécurisé.
Regarde comment ça marche, mais ne copie pas.

Ce n'est absolument pas sécurisé.

Comment ça, j'ai lu plutôt parcouru on va dire ça ?
Titre: Re : Probleme Dini
Posté par: Xartrick le 07 Septembre 2012, 01:40:13
udb_hashC'est pour 'formater' le code dans un sens en chiffre pour ne pas ce faire hacker son compte et ce n'est pas réversible, donc sécurisé.
Regarde comment ça marche, mais ne copie pas.

Ce n'est absolument pas sécurisé.

Comment ça, j'ai lu plutôt parcouru on va dire ça ?

stock udb_hash(buf[]) {
new length=strlen(buf);
new s1 = 1;
new s2 = 0;
new n;
for (n=0; n<length; n++)
{
        s1 = (s1 + buf[n]) % 65521;
        s2 = (s2 + s1) % 65521;
}
return (s2 << 16) + s1;
}

4 bytes pour une fonction de hache, c'est très peu.
Titre: Re : Probleme Dini
Posté par: Xolokos le 07 Septembre 2012, 20:44:03
D'accord mais on peut donc le 'reversé' je sais pas si c'est le bon mot, bref ?
Titre: Re : Probleme Dini
Posté par: Kiloutre le 07 Septembre 2012, 20:54:05
D'apres ce que j'ai vu, si on le "hash" quand il est deja "hasher" il se "de-hash" .
Je dit ca, je dit rien  :happy
Titre: Re : Probleme Dini
Posté par: Xartrick le 07 Septembre 2012, 21:13:57
Il est impossible de retrouver le message en clair d'un hash.
Il est en revanche possible de trouver des correspondances.
Titre: Re : Probleme Dini
Posté par: Ssk le 07 Septembre 2012, 21:22:44
Je vais un peu répéter Xartrick, mais quand une chaine de caractère est hashé, il n'est pas possible de retrouver le message en clair.


Par contre vu que ta fonction retourne un hash de 32 bits il y a de grande chance d'avoir des collisions (des strings qui ont le même hash), en gros plusieurs mot de passe qui fonctionne pour un hash.
Titre: Re : Probleme Dini
Posté par: Xartrick le 07 Septembre 2012, 21:25:54
En parlant de ça, c'est fonction n'est vraiment pas complexe du tout comme dit Ssk.
Je ne suis pas un très bon analyste de ce type de fonction, mais il est possible de trouver une collision en moins d'une seconde (ou un peu plus), évaluer la longueur d'un message et pleins de petite chose comme cela.
Titre: Re : Probleme Dini
Posté par: Xolokos le 08 Septembre 2012, 20:13:24
C'est plus clair pour moi maintenant, merci.
En bref autant garder le mot de passe en string/texte, normal.
Titre: Re : Probleme Dini
Posté par: Xartrick le 08 Septembre 2012, 21:39:52
C'est plus clair pour moi maintenant, merci.
En bref autant garder le mot de passe en string/texte, normal.

Non, cela garantie toujours une sécurité, mais pour qu'elle soit optimum, il faut trouver une autre fonction de hache (comme SHA-512 ou Whirlpool).
Titre: Re : Probleme Dini
Posté par: Diablo62 le 09 Septembre 2012, 00:35:55
Salut.

En voyant qu'on parle de Hash, j'ai vu que dans mon Gm je n'avais fais aucun cryptage (en même temps je ne sais pas faire et je ne savais pas comment ça fonctionnait  ::)). J'ai donc regardé dans mon ancien Gm pour voir comment c'était fait et j'ai trouvé ça :

public Encrypt(string[])
{
for(new x=0; x < strlen(string); x++)
  {
  string[x] += (3^x) * (x % 15);
  if(string[x] > (0xff))
  {
  string[x] -= 256;
  }
  }
return 1;
}

Même si je m'y connais un peu en Pawn, je ne sais pas si niveau sécurité c'est bien ou non. Vous croyez que ce système peut suffire et que je pourrais l'insérer dans mon nouveau Gm (même si plagié ne m’enchante pas  ::) ou je peux commencer à regarder sur le net pour autre chose ??
Titre: Re : Probleme Dini
Posté par: Xartrick le 09 Septembre 2012, 02:48:08
Cette image répondra à ta question:

(http://i.imgur.com/aPtGhl.png) (http://i.imgur.com/aPtGh.png)

Si tu ne comprend pas, j'ai simplement écrit la fonction en C (je n'ai pas de compilateur PAWN sous la main) et j'ai écrit une fonction pour déchiffré une chaîne donné par ta fonction de chiffrement (et non de hachage).

PS: Tu noteras que j'ai amélioré ta fonction en utilisant un modulo plutôt que ton immonde condition.
PS2: Le premier caractère ne sera jamais chiffré:

On défini x = 0.

3 ^ x = 3,  en effet i ^ 0 = i.
x % 15 = 0, en effet 0 % i = 0.

3 * 0 = 0.

En conclusion, (3 ^ x) * (x % 15) = 0.
Titre: Re : Probleme Dini
Posté par: cristab le 09 Septembre 2012, 09:11:41
je vient de retrouver ceci je pense sa pourras vous aidez http://forum.sa-mp.com/showthread.php?t=319574 (http://forum.sa-mp.com/showthread.php?t=319574)