Некорректно работает код

odelyaZ

Известный
Автор темы
269
164
Есть система неверного ввода пароля, код прописан так что при неверном вводе даётся 3 попытки на правильный. Но в действительности если ввести неправильно, то просто скроется диалог и всё, а если же правильный - пишет что не правильный :)

Lua:
case DLG_LOG:
        {
            if(response)
            {
                new checkpass[33];
                SHA256_PassHash(inputtext, player_info[playerid][SALT], checkpass, 33);
                if(!strcmp(player_info[playerid][PASSWORD], checkpass, false, 32) == 0)
                {
                    static const fmt_query[] = "SELECT * FROM `users` WHERE `name` = '%s' AND `password` = '%s'";
                    new query[sizeof(fmt_query)+(-2+MAX_PLAYER_NAME)+(-2+64)];
                    format(query, sizeof(query), fmt_query, player_info[playerid][NAME], player_info[playerid][PASSWORD]);
                    mysql_tquery(dbHandle, query, "PlayerLogin", "1", playerid);
                }
                else
                {
                    new string[87];
                    SetPVarInt(playerid, "WrongPassword", GetPVarInt(playerid, "WrongPassword")-1);
                    if(GetPVarInt(playerid, "WrongPassword") > 0)
                    {
                        format(string, sizeof(string), "[Ошибка] {FFFFFF}Вы ввели неверный пароль от аккаунта. У вас осталось %d попыток входа.", GetPVarInt(playerid, "WrongPassword"));
                        SCM(playerid, COLOR_RED, string);
                    }
                    if (GetPVarInt(playerid, "WrongPassword") == 0)
                    {
                        SCM(playerid, COLOR_RED, "[Ошибка] {FFFFFF} Вы исчерпали количество попыток для ввода пароля и были кикнуты");
                        Kick(playerid);
                    }
                    ShowLogin(playerid);
                }
            }
            else
            {
                SCM(playerid, COLOR_RED, "Введите в чат \"/q\",чтобы покинуть сервер и выйти из игры");
                SPD(playerid, -1, 0, " ", " ", " ", "");
                return Kick(playerid);
            }
        }
    }
    return 1;
}
Уточню что компил работает исправно и не выдаёт никаких ошибок
Лог mysql -

[23:50:40] [ERROR] mysql_tquery: callback error: invalid format specifier '1' (gamemodes\project.pwn:522)
upd: число 1 в 12 строке менял на d,не прокатило
Есть система неверного ввода пароля, код прописан так что при неверном вводе даётся 3 попытки на правильный. Но в действительности если ввести неправильно, то просто скроется диалог и всё, а если же правильный - пишет что не правильный :)

Lua:
case DLG_LOG:
        {
            if(response)
            {
                new checkpass[33];
                SHA256_PassHash(inputtext, player_info[playerid][SALT], checkpass, 33);
                if(!strcmp(player_info[playerid][PASSWORD], checkpass, false, 32) == 0)
                {
                    static const fmt_query[] = "SELECT * FROM `users` WHERE `name` = '%s' AND `password` = '%s'";
                    new query[sizeof(fmt_query)+(-2+MAX_PLAYER_NAME)+(-2+64)];
                    format(query, sizeof(query), fmt_query, player_info[playerid][NAME], player_info[playerid][PASSWORD]);
                    mysql_tquery(dbHandle, query, "PlayerLogin", "1", playerid);
                }
                else
                {
                    new string[87];
                    SetPVarInt(playerid, "WrongPassword", GetPVarInt(playerid, "WrongPassword")-1);
                    if(GetPVarInt(playerid, "WrongPassword") > 0)
                    {
                        format(string, sizeof(string), "[Ошибка] {FFFFFF}Вы ввели неверный пароль от аккаунта. У вас осталось %d попыток входа.", GetPVarInt(playerid, "WrongPassword"));
                        SCM(playerid, COLOR_RED, string);
                    }
                    if (GetPVarInt(playerid, "WrongPassword") == 0)
                    {
                        SCM(playerid, COLOR_RED, "[Ошибка] {FFFFFF} Вы исчерпали количество попыток для ввода пароля и были кикнуты");
                        Kick(playerid);
                    }
                    ShowLogin(playerid);
                }
            }
            else
            {
                SCM(playerid, COLOR_RED, "Введите в чат \"/q\",чтобы покинуть сервер и выйти из игры");
                SPD(playerid, -1, 0, " ", " ", " ", "");
                return Kick(playerid);
            }
        }
    }
    return 1;
}
Уточню что компил работает исправно и не выдаёт никаких ошибок
Лог mysql -

[23:50:40] [ERROR] mysql_tquery: callback error: invalid format specifier '1' (gamemodes\project.pwn:522)
 
Последнее редактирование:
Решение
Хэши эти сейчас вообще использует кто-то?
Почему в функции SHA256_PassHash ты указываешь размер 32, но в теле следующего условия создаешь запрос, и размер поля с паролем у тебя уже 64?
new query[sizeof(fmt_query)+(-2+MAX_PLAYER_NAME)+(-2+64)];
Получается, что лишние 32 ячейки ты выделяешь в пустую.

По поводу ошибки в mysql_tquery: это те же спецификаторы, которые ты используешь в sscanf проверках. Вместо единицы подойдёт i, так как передаем значение playerid - целочисленный тип данных. Подробнее: https://sampwiki.blast.hk/wiki/MySQL#Format_specifiers_2
Правильный запрос:
mysql_tquery(dbHandle, query, "PlayerLogin", "i", playerid);

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

repugnantbytheway

Известный
138
39
Хэши эти сейчас вообще использует кто-то?
Почему в функции SHA256_PassHash ты указываешь размер 32, но в теле следующего условия создаешь запрос, и размер поля с паролем у тебя уже 64?
new query[sizeof(fmt_query)+(-2+MAX_PLAYER_NAME)+(-2+64)];
Получается, что лишние 32 ячейки ты выделяешь в пустую.

По поводу ошибки в mysql_tquery: это те же спецификаторы, которые ты используешь в sscanf проверках. Вместо единицы подойдёт i, так как передаем значение playerid - целочисленный тип данных. Подробнее: https://sampwiki.blast.hk/wiki/MySQL#Format_specifiers_2
Правильный запрос:
mysql_tquery(dbHandle, query, "PlayerLogin", "i", playerid);

При вводе правильного пароля диалог скрывался, потому что выполнялось условие первого if, где ты сравниваешь строки, но само условие неправильно. Диалог с повторным вводом не показывался по вышеописанной ошибке. Эта же ошибка у тебя в mysql_log появлялась.

Попробуй вот так:
if(strcmp(player_info[playerid][PASSWORD], checkpass, false) == 0)