PDA

Просмотр полной версии : [Вопрос] Неправильная работа strcmp



Skyline
12.06.2015, 18:03
Здравствуйте, после регистрации у меня идет авторизация игрока. Чтобы сверка паролей была. Проблема заключается в том, что пароль принимает любой. Помогите пожалуйста.


if(dialogid == 0)
{
if(!response) return Kick(playerid);
else if(response)
{
new string[280];
format(string,sizeof(string),"{FFDEAD}Здравствуй, %s \n\n\a Ты зашел на сервер AscarY(0.3.7)[RUS/UA]\n\a Игровой Режим: AscarY: LS/SF/LV\n\a На сервере: дома(ов)\n\a Бизнесов: \n\a Сбизнесов: \n\a Сайт Сервера: AscarY-Rpg.Ru\n\nИспользуемый тобой ник свободен.\nЗарегистрируйся.\n\nЗадай пароль от аккаунта:",sendername);
if(!strlen(inputtext)) return ShowPlayerDialog(playerid, 0, DIALOG_STYLE_PASSWORD, "Регистрация",string,"Далее","Отмена");
new account[37];
format(account,sizeof(account),"users/%s.ini",pNick(playerid));
format(string,sizeof(string),"{FFDEAD}Здравствуй, %s \n\n\a Ты зашел на сервер AscarY (0.3.7)[RUS/UA]\n\a Игровой режим: AscarY: LS/SF/LV(RPG)\n\a На сервере: дома(ов)\n\a Бизнесов: \n\a Сбизнесов: \n\a Сайт Сервера: AscarY-Rpg.Ru\n\nЭтот аккаунт уже зарегистрирован.\n\nВведи пароль от аккаунта:",sendername);
if(fexist(account)) return ShowPlayerDialog(playerid, 1, DIALOG_STYLE_PASSWORD,"Авторизация",string,"Вход","Отмена");
else
{
ShowPlayerDialog(playerid, 2, DIALOG_STYLE_PASSWORD,"Авторизация","{FFDEAD}Аккаунт зарегистрирован\nВведи пароль для продолжения:","Вход","Отмена");
CreateAccount(playerid, inputtext);
return 1;
}
}
}
else if(dialogid == 2)
{
if(!response) return Kick(playerid);
else if(response)
{
if(!strlen(inputtext))
{
ShowPlayerDialog(playerid, 2, DIALOG_STYLE_PASSWORD,"Авторизация","{FFDEAD}Аккаунт зарегистрирован\nВведи пароль для продолжения:","Вход","Отмена");
SendClientMessage(playerid, COLOR_WHITE, "Пароль не подошел! Попробуй еще раз.");
return 1;
}
else
{
new password[64], account[64];
new iniFile = ini_openFile(account);
ini_getString(iniFile, "Пароль",password);
ini_closeFile(iniFile);
if(!strcmp(inputtext, password, false)) return OnPlayerLogin(playerid);
else if(strcmp(inputtext, password, false))
{
ShowPlayerDialog(playerid, 2, DIALOG_STYLE_PASSWORD,"Авторизация","{FFDEAD}Аккаунт зарегистрирован\nВведи пароль для продолжения:","Вход","Отмена");
SendClientMessage(playerid, COLOR_WHITE, "Пароль не подошел! Попробуй еще раз.");
return 1;
}
}
}
}

Daniel_Cortez
12.06.2015, 19:26
Если в strcmp одна из строк пустая, функция вернёт 0, как будто обе строки одинаковы, в независимости от содержимого другой строки. Очень старый баг, который присутствует чуть ли не с самого начала существования Pawn.
Обойти его можно, добавив дополнительную проверку на нулевую строку.

if((inputtext[0] == EOS) || (strcmp(inputtext, password, false) != 0))
P.S.: Я не стал добавлять проверку на пустоту строки password, т.к. она должна проверяться ещё при регистрации/смене пароля.

P.P.S.: Сменил название темы, чтобы другим было проще найти её. Не забудьте отписаться, если проблема решена, перемещу тему в архив.

Skyline
13.06.2015, 02:10
Я наверное недопонял, куда эту проверку добавить нужно?

Daniel_Cortez
13.06.2015, 07:24
После ini_CloseFile.


ini_closeFile(iniFile);
if((inputtext[0] == EOS) || (strcmp(inputtext, password, false) != 0))
{
ShowPlayerDialog(playerid, 2, DIALOG_STYLE_PASSWORD,"Авторизация","{FFDEAD}Аккаунт зарегистрирован\nВведи пароль для продолжения:","Вход","Отмена");
return SendClientMessage(playerid, COLOR_WHITE, "Пароль не подошел! Попробуй еще раз.");
}
return OnPlayerLogin(playerid);

Skyline
13.06.2015, 11:47
К сожалению, так же заходит с любым паролем.
Как поменял диалог:

else if(dialogid == 2)
{
if(!response) return Kick(playerid);
else if(response)
{
if(!strlen(inputtext))
{
ShowPlayerDialog(playerid, 2, DIALOG_STYLE_PASSWORD,"Авторизация","{FFDEAD}Аккаунт зарегистрирован\nВведи пароль для продолжения:","Вход","Отмена");
SendClientMessage(playerid, COLOR_WHITE, "Пароль не подошел! Попробуй еще раз.");
return 1;
}
else
{
new password[64], account[64];
new iniFile = ini_openFile(account);
ini_getString(iniFile, "Пароль",password);
ini_closeFile(iniFile);
if((inputtext[0] == EOS) || (strcmp(inputtext, password, false) != 0))
{
ShowPlayerDialog(playerid, 2, DIALOG_STYLE_PASSWORD,"Авторизация","{FFDEAD}Аккаунт зарегистрирован\nВведи пароль для продолжения:","Вход","Отмена");
return SendClientMessage(playerid, COLOR_WHITE, "Пароль не подошел! Попробуй еще раз.");
}
return OnPlayerLogin(playerid);
}
}
}

Skyline
15.06.2015, 15:05
Вопрос к сожалению, так и не решен(

NewGreen
15.06.2015, 16:06
Есть такая вероятность что, строка "Пароль" в файле игрока users/%s.ini ничего не содержит, в связи с чем в массив password[64] ничего не записывается, strcmp сравнивает введенный пароль inputtext и пустой массив password[64], и возвращает 0.
Проверьте в файле игрока users/%s.ini строку "Пароль", и ищете причину почему пароль не записывается.

Skyline
15.06.2015, 16:54
Да кто говорит что не записывается? Все записывается, проблема в другом, не знаю в чем.

$continue$
15.06.2015, 17:40
Да кто говорит что не записывается? Все записывается, проблема в другом, не знаю в чем.

Выведи логи, но у меня вопрос где путь к аккаунту?


else if(dialogid == 2)
{
if(!response) return Kick(playerid);
else if(response)
{
if(!strlen(inputtext))
{
ShowPlayerDialog(playerid, 2, DIALOG_STYLE_PASSWORD,"Авторизация","{FFDEAD}Аккаунт зарегистрирован\nВведи пароль для продолжения:","Вход","Отмена");
SendClientMessage(playerid, COLOR_WHITE, "Пароль не подошел! Попробуй еще раз.");
return 1;
}
else
{
new password[64], account[64];
new iniFile = ini_openFile(account);
ini_getString(iniFile, "Пароль",password);
printf("Диалог авторизации | Пароль: %s | Вводимый пароль: %s", password, inputtext);
ini_closeFile(iniFile);
if((inputtext[0] == EOS) || (strcmp(inputtext, password, false) != 0))
{
ShowPlayerDialog(playerid, 2, DIALOG_STYLE_PASSWORD,"Авторизация","{FFDEAD}Аккаунт зарегистрирован\nВведи пароль для продолжения:","Вход","Отмена");
return SendClientMessage(playerid, COLOR_WHITE, "Пароль не подошел! Попробуй еще раз.");
}
return OnPlayerLogin(playerid);
}
}
}

Daniel_Cortez
15.06.2015, 19:29
Походу мой косяк, поспешил с выводами и только зря переименовал тему. Но доля правды в том выводе была.

Таки да, строковая переменная account не инициализирована (пропустили format?), из-за чего mxINI не открывает файл.
Функция ini_getString возвращает из несуществующего файла пустую строку, после чего имеет место баг strcmp, описанный мной выше. Таким образом, к аккаунту подходят все пароли.

Skyline
16.06.2015, 11:53
Походу мой косяк, поспешил с выводами и только зря переименовал тему. Но доля правды в том выводе была.

Таки да, строковая переменная account не инициализирована (пропустили format?), из-за чего mxINI не открывает файл.
Функция ini_getString возвращает из несуществующего файла пустую строку, после чего имеет место баг strcmp, описанный мной выше. Таким образом, к аккаунту подходят все пароли.

Да, проблема оказалась в этом. Не вывел format, по этому принимал любой пароль, из-за того что ник был неизвестен.
Спасибо большое)