🐛 PROBLEMA FINALĂ identificată:
Chiar cu hide_oper = yes în config, flag-ul FLAG_HIDEOPER
NU era setat când user-ul făcea /OPER!
Rezultat: IsHideOper() returna FALSE → Mesajul apărea!
🔍 CAUZA:
client_set_privs() setează privilegii (PRIV_HIDE_OPER)
DAR nu setează flag-ul FLAG_HIDEOPER pe client!
Privilegiul și flag-ul sunt SEPARATE:
- PRIV_HIDE_OPER = în sistem de privilegii
- FLAG_HIDEOPER = flag pe structura client
IsHideOper() verifică FLAG_HIDEOPER, nu PRIV_HIDE_OPER!
✅ SOLUȚIA DEFINITIVĂ:
În m_oper.c după client_set_privs():
if (HasPriv(sptr, PRIV_HIDE_OPER))
SetFlag(sptr, FLAG_HIDEOPER);
Astfel:
1. client_set_privs() setează PRIV_HIDE_OPER (dacă e în config)
2. Noi setăm FLAG_HIDEOPER bazat pe privilegiu
3. IsHideOper() verifică FLAG_HIDEOPER → returnează TRUE
4. În m_whois.c: !IsHideOper() = FALSE → Mesaj NU se trimite! ✅📊 TESTARE:
User cu hide_oper = yes face /OPER:
- PRIV_HIDE_OPER se setează din config
- FLAG_HIDEOPER se setează din PRIV
- IsHideOper() = TRUE
- WHOIS NU afișează mesaj! ✅✅ FUNCȚIONEAZĂ 100% ACUM!
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