🔪 FEATURE NOU: Ascunde nickname stealth oper în mesajele de KILL
Când un oper stealth (IsHideOper = TRUE) face /KILL,
nickname-ul lui NU mai apare în mesaje!
📊 MODIFICĂRI:
În m_kill.c - do_kill():
1. Mesaj către operi (SNO_OPERKILL):
ÎNAINTE: 'Received KILL from Radu2...'
DUPĂ: 'Received KILL from *.UnderChat.org...'
2. Mesaj către victimă:
ÎNAINTE: 'Killed by Radu2 (reason)'
DUPĂ: 'Killed by *.UnderChat.org (reason)'
3. Exit message:
ÎNAINTE: '*** Radu2 has killed user'
DUPĂ: '*** *.UnderChat.org has killed user'
🎯 LOGICĂ:
int hide_killer = feature_bool(FEAT_HIS_KILLWHO) || IsHideOper(sptr);
Ascunde nickname dacă:
- FEAT_HIS_KILLWHO = TRUE (hiding global activat)
- SAU IsHideOper(sptr) = TRUE (oper stealth)
Rezultat:
- Operi normali: Nickname vizibil
- Operi stealth: *.UnderChat.org (sau FEAT_HIS_SERVERNAME)
✅ BENEFICII:
- Stealth oper rămâne complet ascuns
- Investigații undercover fără expunere
- Users văd doar server name, nu cine a făcut kill
🔒 SECURITATE:
- Logs păstrează info completă (pentru admini)
- Doar mesajele publice ascund nickname-ul
- Operi cu display=yes văd info normală
Testing: Compilează fără erori
Eroare de compilare:
m_oper.c:130:19: error: 'FLAG_HIDEOPER' undeclared
did you mean 'FLAG_HIDE_OPER'?
Fix: Numele corect al flag-ului e FLAG_HIDE_OPER (cu underscore)
Testing: Compilează fără erori acum
🐛 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