Дублирование записей, AuthSystem

Статус
В этой теме нельзя размещать новые ответы.
Сообщения
1,419
Реакции
2,509
Помог
59 раз(а)
Ошибка
Дублирование записей в БД используя систему AuthSystem
ОС
Linux
Amx Mod X
AMX Mod X 1.10.0.5242 (http://www.amxmodx.org)
Authors:
David "BAILOPAN" Anderson, Pavol "PM OnoTo" Marko
Felix "SniperBeamer" Geyer, Jonny "Got His Gun" Bergstrom
Lukasz "SidLuke" Wlasinski, Christian "Basic-Master" Hammacher
Borja "faluco" Ferrer, Scott "DS" Ehlert
Compiled: Dec 18 2018 01:18:22
Built from: https://github.com/alliedmodders/amxmodx/commit/af56d964
Build ID: 5242:af56d964
Core mode: JIT+ASM32
Билд
Protocol version 48
Exe version 1.1.2.7/Stdio (cstrike)
ReHLDS version: 3.4.0.668-dev
Build date: 09:47:42 Sep 29 2018 (1631)
Build from: https://github.com/dreamstalker/rehlds/commit/89be216
ReGamedll
ReGameDLL version: 5.7.0.319-dev
Build date: 10:52:38 Dec 23 2018
Build from: https://github.com/s1lentq/ReGameDLL_CS/commit/9d89a34
Версия Metamod
Metamod-r v1.3.0.128, API (5:13)
Metamod-r build: 15:47:38 Aug 24 2018
Metamod-r from: https://github.com/theAsmodai/metamod-r/commit/0cf2f70
Список метамодулей
Currently loaded plugins:
description stat pend file vers src load unload
[ 1] Reunion RUN - reunion_mm.dll v0.1.0.92 ini Start Never
[ 2] SafeNameAndChat RUN - safenameandchat.dll v1.1 ini ANY ANY
[ 3] Revoice RUN - revoice_mm.dll v0.1.0.32 ini Start Never
[ 4] AMX Mod X RUN - amxmodx_mm.dll v1.10.0.5242 ini Start ANY
[ 5] MySQL RUN - mysql_amxx.dll v1.10.0.5242 pl4 ANY ANY
5 plugins, 5 running
Список плагинов
Currently loaded plugins:
name version author file status
[ 1] AuthSystemCore 1.1.7 Boec[SpecOPs] auth_core.amxx running
1 plugins, 1 running
Автор плагина
BoecSpecOPs
Версия плагина
1.1.7
Исходный код
https://dev-cs.ru/resources/471/field?field=source
Процесс такой же описанный в этом сообщении но теперь уже без ошибок в консоли.
 
В этой теме было размещено решение! Перейти к решению.

Вложения

Сообщения
198
Реакции
273
Помог
5 раз(а)
w0w Довольно странное поведение, которое не могу у себя воссоздать.

Если судить логам, то происходит следующее:
  1. Подключение
  2. Разбор параметров пользователя (имя, пароль, стим, ип)
  3. Ожидание выдачи флагов пользователя (чтобы это не переписало выдачу флагов от дочерних плагинов)
  4. Попытка авторизации пользователя:
    1. Составление маски запроса, потоковый запрос к БД)
    2. Вызов натива получения пользователя из БД по заданной маске
    3. Ожидание получения результата в callback
  5. Попытка авторизации пользователя по полученным данным (провал)
  6. Регистрация пользователя
  7. Смена статуса: не авторизован -> проходит регистрацию
  8. Вызов натива добавления пользователя
  9. Форсируем авторизацию после регистрации (повтор четвёртого пункта)
  10. Попытка авторизации пользователя по полученным данным (успех)
  11. Авторизация успешна, смена статуса: нет значения (шта? должен быть другой статус...) -> авторизован
При повторном подключении сбоит четвёртый - пятый пункт. :/
В этом месте происходит следующее:
- Модуль mysql вызывает функцию обратного вызова и передаёт туда результат.
- Плагин проходит по всем строкам результата, парсит в структуру, структуру добавляет в массив.
- Массив возвращается как результат запроса.
Самое странное, что mysql результат отдаёт, это видно при повторном входе, сразу после
Native call auth_getuser(...) (caller id: 0)
После вывода дампа маски запроса, происходит вывод результата мускуля с уникальным идентификатором пользователя > user_id: 1

Есть предположение, что неадекватно работает метод получения результата array_read_user(Array:new_handle, user[UserStruct], new_index = -1) (расположен в include/auth_system.inc).

Если не сложно - можешь заменить его реализацию и ещё раз скинуть логи?
Код:
stock array_read_user(Array:new_handle, user[UserStruct], new_index = -1) {
    static Array:old_handle, old_index = 0, old_size = 1;
    if(any:new_handle <= 0)
        return false;
    old_size = ArraySize(new_handle);
    server_print("[AuthSystemCore::ReadResults] %d [%d/%d]", old_handle, old_index, old_size);
   
    // Обновляем данные, если поступил новый массив
    if(old_handle != new_handle) {
        old_handle = new_handle;
        old_index = new_index;
        if(old_index == -1) old_index = 0;
    }
    server_print("[AuthSystemCore::ReadResults] %d [%d/%d]", old_handle, old_index, old_size);
    if(old_index >= old_size) return false;
   
    ArrayGetArray(old_handle, old_index, user);
   
    // Автоинкрементим индекс по умолчанию (для циклов)
    if(new_index == -1) old_index++;
    return true;
}
 
Сообщения
198
Реакции
273
Помог
5 раз(а)
w0w, проблема найдена. Метод, что работал с динамическими массивами, обнулял индекс в том случае, если ему передавали новый номер хендла. В вашем случае этого не происходило.

Попробуйте скачать последнюю версию с гита и попробовать ещё раз.
 
Сообщения
1,419
Реакции
2,509
Помог
59 раз(а)
Проблема была решена автором обновлением плагина AuthSystem до последней версии, соответственно тему можно закрыть. Решение выше.
 
Статус
В этой теме нельзя размещать новые ответы.

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

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу