Ввод пароля
#1

Пишу систему регистрации через диалоговые окна.
При логине, из файла берёт пароль не в порядке его написания, а в разброс. К примеру, в файле записано "Password=12302", А при логине читает как и 1230, так и 12302, 1203, т.е. читает только символы, а не их порядок написания и количество.

pawn Код:
new pass[MAX_STRING];
fread(accoun, pass);
strmid(PlayerInfo[playerid][Password], pass, 9, strlen(pass), 256);
if((strcmp(PlayerInfo[playerid][Password], inputtext, false, strlen(pass))) == 1){ //Проверка на правильность пароля
Reply
#2

Правильно будет
pawn Код:
new pass[128];
fread(accoun, pass);
strmid( PlayerInfo[playerid][Password], pass, 0, strlen(pass), 127);
if(!strcmp(PlayerInfo[playerid][Password], inputtext))
{
    //you input true password, bla bla bla...
}
И вообще это чем то напоминает все тот же Гф =)
Так что...
Reply
#3

pawn Код:
!strcmp
pawn Код:
pass, 0
С первого выходит такое условие (дословно): "Если Не сравнивать строку PlayerInfo[playerid][Password] с inputtext, то...", а со второго выходит, что мне нужно будет перед паролем ещё и полностью "Password=" написать
Reply
#4

Гхм. Ты бы сначала починать что условие делает! При подставлении "!" в начале переменной - это равносильно == 0. А если без == X на конце - то == 1.
pawn Код:
new var = 1;
if(var) print("var is 1");
var = 0;
if(!var) print("var is 0");
Так что, тот пример который я тебе дал - верный. Ты хотя бы попробовал ... ?
И не забывай, что в том же ГФ идет хэширование (или как его там) пароля, поэтому простым сравнением не обойтись.


pawn Код:
new something = strcmp("one", "one", true);
printf("strcmp result is %d", something);
Вот пример. Сравниваем строки. Различий сколько? Ноль. Так что же вернет функция? Правильно, ноль. Что дает использование "!" в условии? Ноль. Так в чем ж проблема?
Reply
#5

Я пробовал твой вариант, поэтому и пишу.

И насчёт "!" https://sampwiki.blast.hk/wiki/Основы_скриптинга_(RU) внизу смотри.
Reply
#6

Дык в моем варианте только пример сравнения строк, и причем правильный пример. 0 == НЕ == !. Не спорь)
Показывай код, что тебе там нужно, мб в другом месте ошибки.
Reply
#7

Сейчас мудрю над системой регистрации от ZiGGi в диалогах, та же проблема...

Вот полный код из OnDialogResponse (сжат):
pawn Код:
new string[MAX_STRING];
if(dialogid == player_RegLog_DialogID){
format(string, sizeof(string), "/accounts/%s.cer",GetPlayerNameZ(playerid));
if(response){
if(PlayerInfo[playerid][pIsLogin] == true) return SendClientMessage(playerid, COLOR_GREY, " Вы уже вошли!");
if(strlen(inputtext) == 0){
SendClientMessage(playerid,COLOR_RED,"Вы не ввели пароль");
return  ShowPlayerDialog(playerid,player_RegLog_DialogID,DIALOG_STYLE_INPUT,"{B7FF00}Аккаунт","Бла-бла-бла... введите пароль и выберите действие:","Вход","Регистрация");}
if(!fexist(string)){
SendClientMessage(playerid,COLOR_RED,"Ваш ник не зарегистрирован!");
return  ShowPlayerDialog(playerid,player_RegLog_DialogID,DIALOG_STYLE_INPUT,"{B7FF00}Аккаунт","Бла-бла-бла... введите пароль и выберите действие:","Вход","Регистрация");}
new File:accountf;
accountf = fopen(string,io_read);
new valtmp[128];
fread(accountf, valtmp);
strmid(PlayerInfo[playerid][pPass], valtmp, 5, strlen(valtmp), 127);
if((strcmp(PlayerInfo[playerid][pPass], inputtext, false, strlen(valtmp))) == 1){
new data[MAX_STRING],key[MAX_STRING];
while(fread(accountf,data,sizeof(data))){
key = ini_GetKey(data);
if(!strcmp(key, "Cash")) PlayerInfo[playerid][pCash] = strval(ini_GetValue(data));
if(!strcmp(key, "Kills")) PlayerInfo[playerid][pKills] = strval(ini_GetValue(data));
if(!strcmp(key, "Deaths")) PlayerInfo[playerid][pDeaths] = strval(ini_GetValue(data));
SetPlayerMoneyZ(playerid,PlayerInfo[playerid][pCash]);
SetPlayerScore(playerid, PlayerInfo[playerid][pKills]);}
PlayerInfo[playerid][pIsLogin] = true;
fclose(accountf);
SendClientMessage(playerid,NGREEN,"Вы успешно вошли! ");
}else{
SendClientMessage(playerid,COLOR_RED,"Неверный пароль!");
ShowPlayerDialog(playerid,player_RegLog_DialogID,DIALOG_STYLE_INPUT,"{B7FF00}Аккаунт","Бла-бла-бла... введите пароль и выберите действие:","Вход","Регистрация");
fclose(accountf);}
return 1;
}else{
//Регистрация...
Reply
#8

if(strlen(inputtext) == 0) бред, он всегда будет > 1. Почему - долго объяснять. Лучше использовать if(strval(inputtext) <= 0) { }.

strmid(PlayerInfo[playerid][pPass], valtmp, 5, strlen(valtmp), 127); Почему тут идет запись в массив с 5 символа?? Должно быть с 0.

if((strcmp(PlayerInfo[playerid][pPass], inputtext, false, strlen(valtmp))) == 1) - про это я уже писал, либо ставь == 0, либо в начале ! и без всяких ==.

Да и вообще лучше сразу прочитать всю инфу из файла, распределить по переменным, и уже потом сравнивать.
Reply
#9

Quote:

strmid(PlayerInfo[playerid][pPass], valtmp, 5, strlen(valtmp), 127); Почему тут идет запись в массив с 5 символа?? Должно быть с 0.

Потому, что с файла считывает первую строку, а она выглядит так: "Pass=12345" где 12345 - пароль, а "Pass=" - 5 лишних символов при вводе.

Quote:

if(strlen(inputtext) == 0) бред, он всегда будет > 1. Почему - долго объяснять. Лучше использовать if(strval(inputtext) <= 0) { }.

Здесь всё работает, за эту функцию можешь не беспокоится

Quote:

if((strcmp(PlayerInfo[playerid][pPass], inputtext, false, strlen(valtmp))) == 1) - про это я уже писал, либо ставь == 0, либо в начале ! и без всяких ==.

Пробовал уже несколько раз, тогда вообще ни один пароль не верный.
Reply
#10

Че то у тебя как то все странно сделано) Использовал бы d_ini для нормального использования файлов... например:
pawn Код:
new string[256];
format(string, 256, "%s", dini_Get("myaccount.cer", "Pass") )
// получаем строку со значением 12345
Reply


Forum Jump:


Users browsing this thread: 2 Guest(s)