Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 1 из 2 1 2 ПоследняяПоследняя
Показано с 1 по 10 из 11
  1. #1
    Аватар для Skyline
    Пользователь

    Статус
    Оффлайн
    Регистрация
    31.01.2014
    Адрес
    Россия
    Сообщений
    304
    Репутация:
    2 ±

    Неправильная работа strcmp

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

    PHP код:
        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(playerid0DIALOG_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(playerid1DIALOG_STYLE_PASSWORD,"Авторизация",string,"Вход","Отмена");
                else
                {
                    
    ShowPlayerDialog(playerid2DIALOG_STYLE_PASSWORD,"Авторизация","{FFDEAD}Аккаунт зарегистрирован\nВведи пароль для продолжения:","Вход","Отмена");
                    
    CreateAccount(playeridinputtext);
                    return 
    1;
                }
            }
        }
         else if(
    dialogid == 2)
        {
             if(!
    response) return Kick(playerid);
             else if(
    response)
             {
                 if(!
    strlen(inputtext))
                {
                    
    ShowPlayerDialog(playerid2DIALOG_STYLE_PASSWORD,"Авторизация","{FFDEAD}Аккаунт зарегистрирован\nВведи пароль для продолжения:","Вход","Отмена");
                    
    SendClientMessage(playeridCOLOR_WHITE"Пароль не подошел! Попробуй еще раз.");
                      return 
    1;
                }
                else
                {
                    new 
    password[64], account[64];
                    new 
    iniFile ini_openFile(account);
                    
    ini_getString(iniFile"Пароль",password);
                    
    ini_closeFile(iniFile);
                    if(!
    strcmp(inputtextpasswordfalse)) return OnPlayerLogin(playerid);
                    else if(
    strcmp(inputtextpasswordfalse))
                    {
                        
    ShowPlayerDialog(playerid2DIALOG_STYLE_PASSWORD,"Авторизация","{FFDEAD}Аккаунт зарегистрирован\nВведи пароль для продолжения:","Вход","Отмена");
                           
    SendClientMessage(playeridCOLOR_WHITE"Пароль не подошел! Попробуй еще раз.");
                           return 
    1;
                    }
                }
            }
        } 

  2. #2
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Если в strcmp одна из строк пустая, функция вернёт 0, как будто обе строки одинаковы, в независимости от содержимого другой строки. Очень старый баг, который присутствует чуть ли не с самого начала существования Pawn.
    Обойти его можно, добавив дополнительную проверку на нулевую строку.
    PHP код:
    if((inputtext[0] == EOS) || (strcmp(inputtextpasswordfalse) != 0)) 
    P.S.: Я не стал добавлять проверку на пустоту строки password, т.к. она должна проверяться ещё при регистрации/смене пароля.

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

  3. Пользователь сказал cпасибо:
    Skyline (16.06.2015)
  4. #3
    Аватар для Skyline
    Пользователь

    Статус
    Оффлайн
    Регистрация
    31.01.2014
    Адрес
    Россия
    Сообщений
    304
    Репутация:
    2 ±
    Я наверное недопонял, куда эту проверку добавить нужно?

  5. #4
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    После ini_CloseFile.
    PHP код:
                    ini_closeFile(iniFile);
                    if((
    inputtext[0] == EOS) || (strcmp(inputtextpasswordfalse) != 0))  
                    {
                        
    ShowPlayerDialog(playerid2DIALOG_STYLE_PASSWORD,"Авторизация","{FFDEAD}Аккаунт зарегистрирован\nВведи пароль для продолжения:","Вход","Отмена");
                        return 
    SendClientMessage(playeridCOLOR_WHITE"Пароль не подошел! Попробуй еще раз.");
                    }
                    return 
    OnPlayerLogin(playerid); 
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  6. Пользователь сказал cпасибо:
    Skyline (16.06.2015)
  7. #5
    Аватар для Skyline
    Пользователь

    Статус
    Оффлайн
    Регистрация
    31.01.2014
    Адрес
    Россия
    Сообщений
    304
    Репутация:
    2 ±
    К сожалению, так же заходит с любым паролем.
    Как поменял диалог:
    PHP код:
    else if(dialogid == 2)
        {
             if(!
    response) return Kick(playerid);
             else if(
    response)
             {
                 if(!
    strlen(inputtext))
                {
                    
    ShowPlayerDialog(playerid2DIALOG_STYLE_PASSWORD,"Авторизация","{FFDEAD}Аккаунт зарегистрирован\nВведи пароль для продолжения:","Вход","Отмена");
                    
    SendClientMessage(playeridCOLOR_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(inputtextpasswordfalse) != 0))
                    {
                        
    ShowPlayerDialog(playerid2DIALOG_STYLE_PASSWORD,"Авторизация","{FFDEAD}Аккаунт зарегистрирован\nВведи пароль для продолжения:","Вход","Отмена");
                           return 
    SendClientMessage(playeridCOLOR_WHITE"Пароль не подошел! Попробуй еще раз.");
                    }
                    return 
    OnPlayerLogin(playerid);
                }
            }
        } 

  8. #6
    Аватар для Skyline
    Пользователь

    Статус
    Оффлайн
    Регистрация
    31.01.2014
    Адрес
    Россия
    Сообщений
    304
    Репутация:
    2 ±
    Вопрос к сожалению, так и не решен(

  9. #7
    Аватар для NewGreen
    Пользователь

    Статус
    Оффлайн
    Регистрация
    29.09.2014
    Сообщений
    61
    Репутация:
    44 ±
    Есть такая вероятность что, строка "Пароль" в файле игрока users/%s.ini ничего не содержит, в связи с чем в массив password[64] ничего не записывается, strcmp сравнивает введенный пароль inputtext и пустой массив password[64], и возвращает 0.
    Проверьте в файле игрока users/%s.ini строку "Пароль", и ищете причину почему пароль не записывается.

  10. #8
    Аватар для Skyline
    Пользователь

    Статус
    Оффлайн
    Регистрация
    31.01.2014
    Адрес
    Россия
    Сообщений
    304
    Репутация:
    2 ±
    Да кто говорит что не записывается? Все записывается, проблема в другом, не знаю в чем.

  11. #9
    Аватар для $continue$
    Пользователь

    Статус
    Оффлайн
    Регистрация
    02.08.2014
    Адрес
    г. Киров (aka Вятка)
    Сообщений
    1,487
    Репутация:
    276 ±
    Цитата Сообщение от Skyline Посмотреть сообщение
    Да кто говорит что не записывается? Все записывается, проблема в другом, не знаю в чем.
    Выведи логи, но у меня вопрос где путь к аккаунту?
    PHP код:
    else if(dialogid == 2)
    {
        if(!
    response) return Kick(playerid);
        else if(
    response)
        {
            if(!
    strlen(inputtext))
            {
                
    ShowPlayerDialog(playerid2DIALOG_STYLE_PASSWORD,"Авторизация","{FFDEAD}Аккаунт зарегистрирован\nВведи пароль для продолжения:","Вход","Отмена");
                
    SendClientMessage(playeridCOLOR_WHITE"Пароль не подошел! Попробуй еще раз.");
                return 
    1;
            }
            else
            {
                new 
    password[64], account[64];
                new 
    iniFile ini_openFile(account);
                
    ini_getString(iniFile"Пароль",password);
                
    printf("Диалог авторизации | Пароль: %s | Вводимый пароль: %s"passwordinputtext);
                
    ini_closeFile(iniFile);
                if((
    inputtext[0] == EOS) || (strcmp(inputtextpasswordfalse) != 0))
                {
                    
    ShowPlayerDialog(playerid2DIALOG_STYLE_PASSWORD,"Авторизация","{FFDEAD}Аккаунт зарегистрирован\nВведи пароль для продолжения:","Вход","Отмена");
                    return 
    SendClientMessage(playeridCOLOR_WHITE"Пароль не подошел! Попробуй еще раз.");
                }
                return 
    OnPlayerLogin(playerid);
            }
        }


  12. Пользователь сказал cпасибо:
    Daniel_Cortez (16.06.2015)
  13. #10
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Походу мой косяк, поспешил с выводами и только зря переименовал тему. Но доля правды в том выводе была.

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

  14. Пользователь сказал cпасибо:
    Skyline (16.06.2015)
 

 
Страница 1 из 2 1 2 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •