9.1 KiB
⚠️ PROBLEMA SVS* Commands - NEFUNCȚIONALE
Data: 24 Februarie 2026
Versiune Afectată: u2.10.12.19+UnderChat(2.0.1)
Severitate: 🔴 ÎNALTĂ (Impact pe servicii IRC)
🐛 PROBLEMA
Comenzile SVS* (SVSJOIN, SVSPART, SVSNICK, etc.) NU FUNCȚIONEAZĂ în versiunea curentă!
Comenzi Afectate
- ❌ SVSJOIN - Force user join
- ❌ SVSPART - Force user part
- ❌ SVSNICK - Force nick change
- ❌ SVSMODE - Force mode change
- ❌ SVSIDENT - Set ident
- ❌ SVSQUIT - Force quit
- ❌ SWHOIS - Set special WHOIS line
Simptome
/SVSJOIN user #channel
# Rezultat:
Unknown command: SVSJOIN
/SVSPART user #channel
# Rezultat:
Unknown command: SVSPART
🔍 CAUZA REALĂ
Ce există:
✅ Cod complet implementat:
ircd/m_svsjoin.c # SVSJOIN implementation
ircd/m_svspart.c # SVSPART implementation
ircd/m_svsnick.c # SVSNICK implementation
ircd/m_svsmode.c # SVSMODE implementation
ircd/m_svsident.c # SVSIDENT implementation
ircd/m_svsquit.c # SVSQUIT implementation
ircd/m_swhois.c # SWHOIS implementation
✅ Fișiere compilate:
ls -la ircd/*.o | grep svs
# Toate m_svs*.o sunt generate la compilare
Ce lipsește:
❌ Înregistrare în parser (ircd/parse.c):
grep "MSG_SVSJOIN" ircd/parse.c
# NU găsește nimic!
grep "SVSJOIN" ircd/parse.c
# NU găsește nimic!
Parser-ul IRC NU ȘTIE de aceste comenzi!
📊 EXPLICAȚIE TEHNICĂ
Cum funcționează parser-ul IRC:
- User trimite comandă:
/SVSJOIN user #channel - Parser caută în tabel (
parse.c): ExistăMSG_SVSJOIN? - NU găsește → Returnează: "Unknown command"
- Funcția
ms_svsjoin()dinm_svsjoin.cNU este apelată niciodată!
Tabelul de comenzi (parse.c):
// EXEMPLE de comenzi FUNCȚIONALE:
{ MSG_PRIVMSG, TOK_PRIVMSG, 0, MAXPARA, MFLG_SLOW, 0, {
m_unregistered, m_privmsg, ms_privmsg, mo_privmsg, m_ignore
}},
{ MSG_JOIN, TOK_JOIN, 0, MAXPARA, MFLG_SLOW, 0, {
m_unregistered, m_join, ms_join, mo_join, m_ignore
}},
// SVS* commands LIPSESC COMPLET din tabel!
// Ar trebui să existe:
{ MSG_SVSJOIN, TOK_SVSJOIN, 0, MAXPARA, MFLG_SLOW, 0, {
m_ignore, m_ignore, ms_svsjoin, m_ignore, m_ignore
}},
// DAR NU EXISTĂ!
🎯 SOLUȚIA
Pas 1: Verificare fișiere
cd ~/ircu2/ircd
# Verifică că fișierele există:
ls -la m_svs*.c m_swhois.c
# Output așteptat:
# -rw-r--r-- m_svsjoin.c
# -rw-r--r-- m_svspart.c
# -rw-r--r-- m_svsnick.c
# -rw-r--r-- m_svsmode.c
# -rw-r--r-- m_svsident.c
# -rw-r--r-- m_svsquit.c
# -rw-r--r-- m_swhois.c
Pas 2: Verificare Makefile
grep "m_svs" Makefile.in
# Ar trebui să apară în SOURCES:
# SOURCES = ... m_svsjoin.c m_svspart.c ... etc
Pas 3: Verificare headers
grep "ms_svsjoin\|ms_svspart" ../include/handlers.h
# Ar trebui să existe declarațiile:
# extern int ms_svsjoin(struct Client*, struct Client*, int, char*[]);
# extern int ms_svspart(struct Client*, struct Client*, int, char*[]);
# etc.
Pas 4: Adăugare în parse.c
Editează ircd/parse.c și adaugă în tabelul msgtab[]:
// După comenzile existente (ex: după SQUIT), adaugă:
/*
* SVS* commands - Services control commands
* Used by IRC services (X, ChanServ, NickServ) to control users
*/
{ MSG_SVSJOIN, TOK_SVSJOIN, 0, MAXPARA, MFLG_SLOW, 0, {
m_ignore, m_ignore, ms_svsjoin, m_ignore, m_ignore
}},
{ MSG_SVSPART, TOK_SVSPART, 0, MAXPARA, MFLG_SLOW, 0, {
m_ignore, m_ignore, ms_svspart, m_ignore, m_ignore
}},
{ MSG_SVSNICK, TOK_SVSNICK, 0, MAXPARA, MFLG_SLOW, 0, {
m_ignore, m_ignore, ms_svsnick, m_ignore, m_ignore
}},
{ MSG_SVSMODE, TOK_SVSMODE, 0, MAXPARA, MFLG_SLOW, 0, {
m_ignore, m_ignore, ms_svsmode, m_ignore, m_ignore
}},
{ MSG_SVSIDENT, TOK_SVSIDENT, 0, MAXPARA, MFLG_SLOW, 0, {
m_ignore, m_ignore, ms_svsident, m_ignore, m_ignore
}},
{ MSG_SVSQUIT, TOK_SVSQUIT, 0, MAXPARA, MFLG_SLOW, 0, {
m_ignore, m_ignore, ms_svsquit, m_ignore, m_ignore
}},
{ MSG_SWHOIS, TOK_SWHOIS, 0, MAXPARA, MFLG_SLOW, 0, {
m_ignore, m_ignore, ms_swhois, m_ignore, m_ignore
}},
Pas 5: Verificare MSG_* și TOK_* defines
Editează include/msg.h și adaugă:
// SVS* commands
#define MSG_SVSJOIN "SVSJOIN"
#define TOK_SVSJOIN "SJ"
#define MSG_SVSPART "SVSPART"
#define TOK_SVSPART "SP"
#define MSG_SVSNICK "SVSNICK"
#define TOK_SVSNICK "SN"
#define MSG_SVSMODE "SVSMODE"
#define TOK_SVSMODE "SM"
#define MSG_SVSIDENT "SVSIDENT"
#define TOK_SVSIDENT "SI"
#define MSG_SVSQUIT "SVSQUIT"
#define TOK_SVSQUIT "SQ"
#define MSG_SWHOIS "SWHOIS"
#define TOK_SWHOIS "SW"
Pas 6: Recompilare
cd ~/ircu2
make clean
make
make install
# Restart IRCd:
killall -9 ircd
/home/ircd/ircd/bin/ircd -f /home/ircd/ircd/lib/ircd.conf
Pas 7: Testare
# În IRC ca oper:
/SVSJOIN testuser #testchannel
# Ar trebui să funcționeze (sau să dea eroare specifică, nu "Unknown command")
📋 CHECKLIST ACTIVARE
- Verificat că fișierele
m_svs*.cexistă - Verificat că sunt în
Makefile.in - Verificat declarații în
include/handlers.h - Adăugat
MSG_*șiTOK_*îninclude/msg.h - Adăugat entries în tabelul
msgtab[]dinircd/parse.c - Recompilat cu
make clean && make - Instalat cu
make install - Restart IRCd
- Testat comenzile SVS*
- Verificat că serviciile IRC funcționează
🎭 IMPACT
Fără SVS* commands:
❌ Servicii IRC limitate:
- X (IRC services) NU poate force join users pe #CService
- ChanServ NU poate auto-op/voice users
- NickServ NU poate force nick change pentru nick enforcement
- BotServ NU poate auto-join bots pe canale
❌ Management manual:
- Operatorii trebuie să folosească manual
/OPMODEpentru modes - NU există force join/part automat
- Serviciile au funcționalitate LIMITATĂ
Cu SVS* commands activate:
✅ Servicii IRC complete:
- X poate gestiona complet users și canale
- ChanServ auto-mode funcționează
- NickServ enforcement funcționează
- BotServ auto-join funcționează
✅ Automatizare:
- Serviciile gestionează totul automat
- Users primesc automat @ sau + când intră pe canale
- Nick enforcement automat
- Integration perfectă cu Anope/Atheme
🔧 ALTERNATIVE TEMPORARE
Până când SVS* sunt activate, poți folosi:
În loc de SVSJOIN:
# Manual prin oper:
/OPMODE #channel +o username
În loc de SVSPART:
/KICK #channel username :forced part
În loc de SVSNICK:
# Nu există alternativă directă
# User trebuie să schimbe manual nickname-ul
În loc de SVSMODE:
/OPMODE #channel +o username
/MODE username +x (pentru user modes)
În loc de SVSQUIT:
/KILL username :forced disconnect
Limitări: Toate alternative sunt MANUALE și necesită intervenție oper!
📊 PRIORITATE DEZVOLTARE
Efort vs Impact:
Efort: 🟢 SCĂZUT (2-3 ore)
- Verificare declarații existente
- Adăugare în parse.c și msg.h
- Recompilare și testare
Impact: 🔴 ÎNALT (Critic pentru servicii)
- Servicii IRC complet funcționale
- Automatizare completă
- Experience users mult îmbunătățit
Prioritate: 🔴 MAXIMĂ
- Ar trebui implementat în v2.0.2 sau v2.1.0
- Esențial pentru network-uri production cu servicii
📚 PENTRU DEVELOPERI
Structura unei comenzi SVS:
// În m_svsjoin.c:
int ms_svsjoin(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
{
// parv[0] = sender prefix
// parv[1] = target nickname
// parv[2] = channel
struct Client* acptr;
struct Channel* chptr;
// Find target user
if (!(acptr = FindUser(parv[1])))
return 0; // User not found
// Find/create channel
chptr = get_channel(acptr, parv[2], CGT_CREATE);
// Force join
add_user_to_channel(chptr, acptr, 0);
// Send JOIN to network
sendcmdto_channel_butserv_butone(acptr, CMD_JOIN, chptr, cptr, ...);
return 0;
}
Protocol P10:
# SVSJOIN în protocol P10:
:ServiceNumeric SJ TargetNumeric #channel
# Exemplu:
:ABCDE SJ FGHIJ #cservice
# ABCDE = X (services)
# FGHIJ = User target
✅ CÂND VA FI FIXED?
Roadmap propus:
v2.0.2 (patch release):
- Activare SVS* commands
- Testing cu Anope services
- Documentație actualizată
v2.1.0 (minor release):
- SVS* complete + optimizări
- SA* aliases (SAJOIN, SAPART, etc.)
- Integration testing complex
📞 RAPORTARE
Dacă observi probleme cu serviciile IRC (X, ChanServ nu funcționează corect):
- Verifică dacă SVS* sunt active:
/SVSJOIN - Dacă primești "Unknown command" → Confirmă problema
- Urmărește acest document pentru fix
- Alternative temporare: Folosește OPMODE manual
Creat de: Senior Software Architect
Data: 24 Februarie 2026
Status: 🔴 PROBLEMA IDENTIFICATĂ - Fix în curs
Versiune Afectată: u2.10.12.19+UnderChat(2.0.1)
⚠️ SVS COMMANDS NU FUNCȚIONEAZĂ! URMĂREȘTE ACEST DOC PENTRU FIX! 🔧*