SB-MaterialAdmin / Web

SourceBans Material Design
64 stars 45 forks source link

Баг (?) с правами на игровом сервере #261

Closed MAGNAT2645 closed 5 years ago

MAGNAT2645 commented 5 years ago

ВНИМАНИЕ! Я ни в коем случае не пытаюсь обвинить функционал данного SB, есть ещё одно возможное подозрение (кроется в моём плагине, который зачисляет игрока в админ.группу в зависимости от номера его группы), но баг возникает именно почему-то при попытке создать нового админа.

Странный баг (если это действительно баг), переписывающий права на игровом сервере при регистрации нового администратора через веб-панель. После регистрации нового админа посылается RCON-запрос (как я понял), в итоге все игроки могут использовать админские фичи (даже в моих самописных плагинах, некоторые меню с ITEMDRAW_DISABLED резко становятся доступны обычным игрокам, например:

bool IsClientHasAccess(int client) {
    return ( GetUserAdmin( client ) ).HasFlag( Admin_Generic );
}

видимо возвращает true даже для INVALID_ADMIN_ID, в итоге все игроки могут нажимать на заблокированные пункты:

        } case MenuAction_DrawItem: {
            int iStyle = ITEMDRAW_DEFAULT;
            char sId[ INT_MAX_DIGITS ];
            menu.GetItem( param2, sId, sizeof( sId ), iStyle );

            if ( iStyle != ITEMDRAW_IGNORE ) {
                int iId = StringToInt( sId );
                if ( GetSoundData( iId, SoundData_Admin, g_bDefForAdmin ) && !IsClientHasAccess( param1 ) )
                    iStyle = ITEMDRAW_DISABLED; // здесь не происходит блокирование пункта для игрока с INVALID_ADMIN_ID
            }

            return iStyle; 

Этот баг может продолжаться до тех пор, пока не попытаться перезагрузить админ. кэш несколько раз.

В моём случае, чтобы вызвать этот баг, достаточно при создании нового админа привязать его к самому серверу и не указывать серверную группу (скрыл название, чтобы не было "рекламы"): изображение

Опять же, повторюсь, баг может возникать не со стороны веб-панели и SB в целом, а со стороны одного из моих плагинов, НО сам по себе этот баг не возникает (что говорит о вполне стабильной работе плагина). Возникает он именно после регистрации нового админа (когда происходит перезагрузка кэша?)

EDIT: У меня серверных групп, кстати, вообще нет. Я хочу редактировать админ.группы отдельно от SB (на SB указывать только веб-права зарегистрированному админу).

MAGNAT2645 commented 5 years ago

Главный вопрос в данном случае: можно ли как-то вообще отключить серверные группы, чтобы SB не трогал админ.кэш на сервере?

CrazyHackGUT commented 5 years ago
bool IsClientHasAccess(int client) {
    return ( GetUserAdmin( client ) ).HasFlag( Admin_Generic );
}

Это вообще неправильно. У SourceMod есть натив GetUserFlagBits(), который и надо использовать:

bool IsClientHasAccess(int client) {
    return (GetUserFlagBits(client) & ADMFLAG_GENERIC) == ADMFLAG_GENERIC;
}

видимо возвращает true даже для INVALID_ADMIN_ID, в итоге все игроки могут нажимать на заблокированные пункты

Это вообще нездоровое поведение. И я б лично это зарепортил.

можно ли как-то вообще отключить серверные группы, чтобы SB не трогал админ.кэш на сервере?

Можно попросить веб-часть не производить отправку админок при изменениях в СБ. изображение И аналогично можно и в самом плагине выключить любые попытки вмешаться в админкеш. В конфиге есть. (у старого по крайней мере точно, у нового не помню)

MAGNAT2645 commented 5 years ago

Я как-то не заметил про GetUserFlagBits, надо будет попробовать. (а вообще, я думаю, можно также попробовать GroupHandlerAPI) Вообще GetUserAdmin.HasFlag всегда возвращает false для INVALID_ADMIN_ID, но в случае настройки серверных групп с Веб-части, происходит такая странная вещь (это ещё учитывая, что плагин присваивает админ.группу даже после OnRebuildAdminCache с параметром part = AdminCache_Admins).

public void OnRebuildAdminCache(AdminCachePart part) {
    if ( part == AdminCache_Admins ) {
        for ( int i = 1; i <= MaxClients; i++ ) {
            if ( IsClientInGame( i ) && !IsFakeClient( i ) && g_bIsLoaded[ i ] )
                SetPlayerTypePermissions( i, g_iPlayerType[ i ] );
        }
    }
}

Я отключу перезагрузку кэша на всякий случай, раз уж не пользуюсь серверными группами с веб-части.

Это вообще нездоровое поведение. И я б лично это зарепортил.

Не буду забегать вперёд. Тут скорее мой косяк, такого не было у кого-либо. Просто для меня это слегка странное поведение. Я сколько раз вручную перезагружал кэш командой, всё было нормально. А как создал нового админа, так после этого пошли жалобы, что меню не блочит пункты для не-админов. В итоге все игроки могли спамить звуками (это как SaySounds, но написанный с нуля)

MAGNAT2645 commented 5 years ago

И ещё, не по теме: в списке админов отображается неверное кол-во банов у определённого админа (у меня нет банов с демо вообще) изображение

Обе кнопки "Найти" по сути отображают один и тот же список банов админа.

CrazyHackGUT commented 5 years ago

а вообще, я думаю, можно также попробовать GroupHandlerAPI

Интересная штука. Я для себя написал недавно что-то подобное, но полагающееся полностью на MySQL. И интерфейса пока никакого нет. Рыться полностью в базе для добавления админа/группы. И апи тоже никакого нет, кроме получения хендла на соединение с БД.

Обе кнопки "Найти" по сути отображают один и тот же список банов админа.

Про это известно. Сначала надо вообще сами счётчики починить хД

MAGNAT2645 commented 5 years ago

Пока закрою тему, т.к. проблема вроде как решена. Если проблема всё же не решилась, то переоткрою.