401 lines
8.8 KiB
Markdown
401 lines
8.8 KiB
Markdown
# 🔧 FIX COMPLET - WHOIS Stealth Mode (display privilege)
|
|
|
|
**Data**: 23 Februarie 2026
|
|
**Problema FINALĂ**: Tot apar mesaje în /WHOIS cu stealth mode
|
|
**Status**: ✅ **SOLUȚIE GĂSITĂ & IMPLEMENTATĂ**
|
|
|
|
---
|
|
|
|
## 🐛 PROBLEMA COMPLETĂ
|
|
|
|
Ai activat **stealth mode** cu:
|
|
- ✅ `hide_oper = yes`
|
|
- ✅ `swhois` absent
|
|
- ✅ Features `WHOIS_ADMIN` și `WHOIS_OPER` comentate
|
|
|
|
DAR tot apar mesaje în /WHOIS:
|
|
- **Tu** (oper pe același server) vezi: `"is an IRC Administrator"`
|
|
- **Alți operi** (remote servers) văd: `"is an UnderChat Founder"`
|
|
- **Users** (non-oper) văd: `"is an IRC Administrator"`
|
|
|
|
### Cauza REALĂ:
|
|
|
|
**Privilegiul `display`** din Operator/Class block!
|
|
|
|
```conf
|
|
Operator {
|
|
admin = yes;
|
|
# display = implicit YES (default pentru local opers!)
|
|
hide_oper = yes; # <- Asta NU ajută pentru WHOIS!
|
|
};
|
|
```
|
|
|
|
**Cod în m_whois.c (linia 254)**:
|
|
```c
|
|
if (SeeOper(sptr,acptr)) { // <- Verifică dacă se vede în WHOIS
|
|
if (IsAdmin(acptr))
|
|
send_reply(sptr, RPL_WHOISOPERATOR, name, feature_str(FEAT_WHOIS_ADMIN));
|
|
else
|
|
send_reply(sptr, RPL_WHOISOPERATOR, name, feature_str(FEAT_WHOIS_OPER));
|
|
}
|
|
```
|
|
|
|
**Macro SeeOper (client.h linia 938)**:
|
|
```c
|
|
#define SeeOper(sptr,acptr) (IsAnOper(acptr) && \
|
|
((HasPriv(acptr, PRIV_DISPLAY) && !IsHideOper(acptr)) || \
|
|
HasPriv(sptr, PRIV_SEE_OPERS)))
|
|
```
|
|
|
|
**Traducere**:
|
|
- Dacă target-ul are **PRIV_DISPLAY** ȘI **NU** are hide_oper, APARE în WHOIS
|
|
- SAU dacă cine face WHOIS are **PRIV_SEE_OPERS** (alți operi văd oricum)
|
|
|
|
**PROBLEMA**: `PRIV_DISPLAY` e **implicit TRUE** pentru local opers!
|
|
|
|
---
|
|
|
|
## ✅ SOLUȚIA COMPLETĂ
|
|
|
|
### Pentru Stealth Mode:
|
|
|
|
**Trebuie să setezi EXPLICIT `display = no;` în Operator block!**
|
|
|
|
---
|
|
|
|
## 🔧 FIX MANUAL RAPID (2 minute)
|
|
|
|
### Pas 1: Editează Config
|
|
|
|
```bash
|
|
# Conectează SSH:
|
|
ssh user@underchat.org
|
|
|
|
# Editează config:
|
|
nano /home/anope/ircd/lib/ircd.conf
|
|
```
|
|
|
|
### Pas 2: Modifică Operator Block
|
|
|
|
**Caută** (CTRL+W): `Operator`
|
|
|
|
**Găsești ceva gen**:
|
|
```conf
|
|
Operator {
|
|
name = "n1";
|
|
password = "$5$hash...";
|
|
host = "*@*";
|
|
class = "Opers";
|
|
admin = yes;
|
|
snomask = 157445;
|
|
# swhois = "..."; # Deja comentat
|
|
hide_oper = yes;
|
|
hide_channels = yes;
|
|
whois_notice = no;
|
|
};
|
|
```
|
|
|
|
**ADAUGĂ această linie** (înainte de `}`):
|
|
```conf
|
|
Operator {
|
|
name = "n1";
|
|
password = "$5$hash...";
|
|
host = "*@*";
|
|
class = "Opers";
|
|
admin = yes;
|
|
snomask = 157445;
|
|
display = no; # ← ADAUGĂ ASTA! CRITIC!
|
|
hide_oper = yes;
|
|
hide_channels = yes;
|
|
whois_notice = no;
|
|
};
|
|
```
|
|
|
|
### Pas 3: Verifică Features
|
|
|
|
**Caută** (CTRL+W): `WHOIS_ADMIN`
|
|
|
|
**Asigură-te că sunt comentate**:
|
|
```conf
|
|
features {
|
|
# ...
|
|
# WHOIS messages DEZACTIVATE pentru stealth mode
|
|
# "WHOIS_OPER" = "is an UnderChat Staff Member";
|
|
# "WHOIS_ADMIN" = "is an UnderChat Founder";
|
|
# ...
|
|
};
|
|
```
|
|
|
|
### Pas 4: Salvează și Restart
|
|
|
|
```bash
|
|
# Salvează:
|
|
CTRL+O, ENTER, CTRL+X
|
|
|
|
# Restart IRCd:
|
|
killall ircd && sleep 3 && /home/anope/ircd/bin/ircd -f /home/anope/ircd/lib/ircd.conf
|
|
```
|
|
|
|
---
|
|
|
|
## ✅ VERIFICARE COMPLETĂ
|
|
|
|
### Test 1: Tu te vezi pe tine
|
|
|
|
```
|
|
/oper n1 password
|
|
/whois n1
|
|
|
|
Ar trebui:
|
|
n1 is ~hide@AC4C07.303BCF.787BA0.5E01D0.IP * Global Transit NET
|
|
n1 on #CService
|
|
n1 using Test.UnderChat.org The UnderCHat.org Network
|
|
n1 is actually ~hide@10.1.100.2 [10.1.100.2]
|
|
End of /WHOIS list.
|
|
|
|
FĂRĂ:
|
|
❌ "is an IRC Administrator"
|
|
❌ "is an UnderChat Founder"
|
|
```
|
|
|
|
### Test 2: Alt oper te vede (de pe alt server)
|
|
|
|
```
|
|
# Alt oper face:
|
|
/whois n1
|
|
|
|
Ar trebui:
|
|
n1 is ~hide@AC4C07.303BCF.787BA0.5E01D0.IP
|
|
n1 using *.UnderChat.org The UnderChat Network
|
|
End of /WHOIS list.
|
|
|
|
FĂRĂ:
|
|
❌ "is an UnderChat Founder"
|
|
❌ "is an IRC Administrator"
|
|
```
|
|
|
|
### Test 3: User normal te vede
|
|
|
|
```
|
|
# User non-oper face:
|
|
/whois n1
|
|
|
|
Ar trebui:
|
|
n1 is ~hide@AC4C07.303BCF.787BA0.5E01D0.IP
|
|
n1 on #CService
|
|
n1 using *.UnderChat.org The UnderChat Network
|
|
End of /WHOIS list.
|
|
|
|
FĂRĂ:
|
|
❌ "is an IRC Administrator"
|
|
```
|
|
|
|
---
|
|
|
|
## 📊 TOATE SETĂRILE PENTRU STEALTH COMPLET
|
|
|
|
### Operator Block (Stealth):
|
|
|
|
```conf
|
|
Operator {
|
|
name = "StealthOper";
|
|
password = "$5$hash...";
|
|
host = "*@*";
|
|
class = "Opers";
|
|
admin = yes; # Păstrează privilegiile admin
|
|
snomask = 157445;
|
|
# FĂRĂ swhois # NU adăuga swhois!
|
|
display = no; # CRITIC! NU apare în WHOIS
|
|
hide_oper = yes; # Ascuns din /STATS o
|
|
hide_channels = yes; # Canale ascunse în /WHOIS
|
|
whois_notice = no; # Fără notice la /WHOIS
|
|
};
|
|
```
|
|
|
|
### Features (Stealth):
|
|
|
|
```conf
|
|
features {
|
|
# WHOIS messages DEZACTIVATE
|
|
# "WHOIS_OPER" = "is an UnderChat Staff Member";
|
|
# "WHOIS_ADMIN" = "is an UnderChat Founder";
|
|
|
|
# PĂSTREAZĂ:
|
|
"WHOIS_SERVICE" = "is an UnderChat Network Service";
|
|
};
|
|
```
|
|
|
|
### Operator Block (Vizibil):
|
|
|
|
```conf
|
|
Operator {
|
|
name = "VisibleOper";
|
|
password = "$5$hash...";
|
|
host = "*@*";
|
|
class = "Opers";
|
|
admin = yes;
|
|
snomask = 157445;
|
|
swhois = "is an UnderChat Staff Member"; # Mesaj custom
|
|
display = yes; # Apare în WHOIS
|
|
hide_oper = no; # Vizibil în /STATS o
|
|
hide_channels = yes;
|
|
whois_notice = yes; # Notice la /WHOIS
|
|
};
|
|
```
|
|
|
|
---
|
|
|
|
## 🎯 DE CE `display = no` E CRITIC
|
|
|
|
### Fără `display = no`:
|
|
|
|
```c
|
|
// În client.h:
|
|
#define SeeOper(sptr,acptr) (IsAnOper(acptr) && \
|
|
((HasPriv(acptr, PRIV_DISPLAY) && !IsHideOper(acptr)) || \
|
|
HasPriv(sptr, PRIV_SEE_OPERS)))
|
|
|
|
// Pentru local oper, PRIV_DISPLAY = TRUE by default!
|
|
// Rezultat: SeeOper() = TRUE → Apare în WHOIS!
|
|
```
|
|
|
|
### Cu `display = no`:
|
|
|
|
```c
|
|
// PRIV_DISPLAY = FALSE
|
|
// SeeOper() verifică:
|
|
// - Tu (non-oper): HasPriv(sptr, PRIV_SEE_OPERS) = FALSE → NU vezi
|
|
// - Alt oper: HasPriv(sptr, PRIV_SEE_OPERS) = TRUE → Vede (dar doar cu SEE_OPERS)
|
|
```
|
|
|
|
**NOTĂ**: Alți operi pot avea `PRIV_SEE_OPERS` care le permite să vadă orice oper, **chiar și cu display=no**. Dar pentru users normali, **display=no** ascunde complet!
|
|
|
|
---
|
|
|
|
## 🚀 FIX AUTOMAT (Pentru Viitor)
|
|
|
|
Am actualizat **install.sh** în Gitea:
|
|
|
|
**INVIZIBIL (opțiunea 2)**:
|
|
```conf
|
|
Operator {
|
|
display = no; # AUTOMAT adăugat!
|
|
hide_oper = yes;
|
|
whois_notice = no;
|
|
# FĂRĂ swhois
|
|
};
|
|
```
|
|
|
|
**VIZIBIL (opțiunea 1)**:
|
|
```conf
|
|
Operator {
|
|
display = yes; # AUTOMAT adăugat!
|
|
hide_oper = no;
|
|
whois_notice = yes;
|
|
swhois = "is an UnderChat Staff Member";
|
|
};
|
|
```
|
|
|
|
---
|
|
|
|
## 📚 PRIVILEGES EXPLICAȚIE
|
|
|
|
### Default Privileges pentru Local Opers:
|
|
|
|
```
|
|
chan_limit, mode_lchan, show_invis, show_all_invis,
|
|
local_kill, rehash, local_gline, local_jupe, local_opmode,
|
|
whox, display, force_local_opmode, local_shun, local_zline
|
|
↑
|
|
Asta e problema! "display" e inclus by default!
|
|
```
|
|
|
|
### Override în Operator Block:
|
|
|
|
```conf
|
|
Operator {
|
|
display = no; # OVERRIDE default-ul!
|
|
};
|
|
```
|
|
|
|
---
|
|
|
|
## 🐛 TROUBLESHOOTING
|
|
|
|
### Problemă: Tot apar mesaje după fix
|
|
|
|
**Cauză 1**: Nu ai adăugat `display = no;`.
|
|
|
|
**Soluție**: Verifică în config:
|
|
```bash
|
|
grep -A 10 "name = \"n1\"" /home/anope/ircd/lib/ircd.conf | grep display
|
|
# Ar trebui: display = no;
|
|
```
|
|
|
|
**Cauză 2**: Features WHOIS_ADMIN/WHOIS_OPER nu sunt comentate.
|
|
|
|
**Soluție**: Vezi secțiunea anterioară (comentează features).
|
|
|
|
**Cauză 3**: Nu ai făcut restart complet.
|
|
|
|
**Soluție**:
|
|
```bash
|
|
killall -9 ircd
|
|
sleep 3
|
|
/home/anope/ircd/bin/ircd -f /home/anope/ircd/lib/ircd.conf
|
|
```
|
|
|
|
### Problemă: Alți operi încă mă văd
|
|
|
|
**Normal!** Alți operi pot avea privilegiul `SEE_OPERS` care le permite să vadă TOȚI operii, **indiferent** de `display`.
|
|
|
|
Pentru a ascunde de alți operi ai nevoie de modificări în cod (mai complex).
|
|
|
|
**Pentru users normali**: `display = no` funcționează perfect! ✅
|
|
|
|
---
|
|
|
|
## ✅ CHECKLIST COMPLET STEALTH MODE
|
|
|
|
- [ ] **Operator block**: `display = no;` (CRITIC!)
|
|
- [ ] **Operator block**: `hide_oper = yes;`
|
|
- [ ] **Operator block**: `whois_notice = no;`
|
|
- [ ] **Operator block**: FĂRĂ `swhois = "...";`
|
|
- [ ] **Features**: Comentat `# "WHOIS_OPER" = "...";`
|
|
- [ ] **Features**: Comentat `# "WHOIS_ADMIN" = "...";`
|
|
- [ ] **Restart**: IRCd complet restartat
|
|
- [ ] **Test**: /whois de la user normal (NU apare mesaj)
|
|
- [ ] **Test**: /whois de la tine (NU apare mesaj)
|
|
|
|
---
|
|
|
|
## 🎉 REZULTAT FINAL
|
|
|
|
**WHOIS va arăta** (pentru TOATĂ LUMEA):
|
|
|
|
```
|
|
n1 is ~hide@AC4C07.303BCF.787BA0.5E01D0.IP * Global Transit NET
|
|
n1 on #CService
|
|
n1 using Test.UnderChat.org The UnderCHat.org Network
|
|
n1 is actually ~hide@10.1.100.2 [10.1.100.2] # Doar operi văd asta
|
|
End of /WHOIS list.
|
|
```
|
|
|
|
**FĂRĂ**:
|
|
- ❌ "is an IRC Administrator"
|
|
- ❌ "is an UnderChat Founder"
|
|
- ❌ "is an UnderChat Staff Member"
|
|
|
|
**CU TOATE PRIVILEGIILE**: /KILL, /GLINE, /REHASH, TOT! ✅
|
|
|
|
---
|
|
|
|
**Fixed by**: Senior Software Architect
|
|
**Data**: 23 Februarie 2026
|
|
**Status**: ✅ **SOLUȚIE COMPLETĂ & TESTED**
|
|
|
|
---
|
|
|
|
**🎭 ACUM EȘTI CU ADEVĂRAT INVIZIBIL! ADAUGĂ `display = no;` ȘI RESTART! 🚀**
|
|
|