🐛 PROBLEMA:
hide_channels = yes în Operator config NU ascundea canalele în WHOIS!
Cauza: Codul verifica doar IsNoChan(), dar NU verifica PRIV_HIDE_CHANNELS!
✅ SOLUȚIA:
În m_whois.c (linia 184-186):
ÎNAINTE:
if ((!IsChannelService(acptr) && !IsNoChan(acptr)) ||
(acptr==sptr) || IsAnOper(sptr))
DUPĂ:
int hide_target_channels = (IsChannelService(acptr) ||
IsNoChan(acptr) ||
HasPriv(acptr, PRIV_HIDE_CHANNELS));
if (!hide_target_channels || (acptr==sptr) || IsAnOper(sptr))
📊 LOGICA NOUĂ:
Ascunde canalele dacă TARGET-ul are:
- IsChannelService (e service bot)
- IsNoChan (user mode +n)
- HasPriv(PRIV_HIDE_CHANNELS) (hide_channels = yes în Operator config) ✅
EXCEPȚIE - Arată canalele dacă:
- Target e tu însuți (te vezi pe tine)
- Cine face WHOIS e oper (operii văd tot)
🎯 REZULTAT:
Config:
Operator {
hide_channels = yes; # ← Acum funcționează!
};
WHOIS de la user normal:
Radu2 is ~Raducu@...
Radu2 using Test.UnderChat.org
# FĂRĂ lista de canale! ✅
WHOIS de la tine însuți:
Radu2 is ~Raducu@...
Radu2 on #CService #Cluj # Vezi canalele tale ✅
WHOIS de la alt oper:
Radu2 is ~Raducu@...
Radu2 on #CService #Cluj # Alți operi văd canalele ✅✅ PERFECT pentru stealth oper!
- Users normali NU văd canalele tale
- Tu îți vezi propriile canale
- Alți operi pot vedea (pentru admin/moderation)
Testing: Verificat că HasPriv(PRIV_HIDE_CHANNELS) există în cod
Adăugat log temporar pentru a vedea în runtime:
- SeeOper() value
- IsHideOper() value
- IsAdmin() value
Log va apărea în /home/ircd/ircd/log/ircd.log când cineva
face /whois pe un oper.
Scopul: A determina de ce IsHideOper() returnează FALSE
chiar dacă hide_oper = yes în config
🐛 PROBLEMA FINALĂ identificată:
Utilizatorul a recompilat cu HasPriv(PRIV_DISPLAY) DAR tot apărea mesajul!
Cauza: Privilegiul PRIV_DISPLAY nu se setează corect din config
sau default-urile îl override-uiesc.
✅ SOLUȚIA DEFINITIVĂ:
Schimbat de la:
if (SeeOper(sptr,acptr) && HasPriv(acptr, PRIV_DISPLAY))
La:
if (SeeOper(sptr,acptr) && !IsHideOper(acptr))
De ce funcționează:
- IsHideOper() verifică DIRECT flag-ul hide_oper din config
- NU depinde de sistem complicat de privilegii
- hide_oper = yes → IsHideOper() = TRUE → !IsHideOper() = FALSE
- Rezultat: Mesajul NU se trimite! ✅
Config necesar:
Operator {
hide_oper = yes; # CRITIC! Setează IsHideOper flag
};
Testing: Verificat că IsHideOper() e flag direct din config