# 🔧 FIX EXTENDED_ACCOUNTS - Problema cu Autentificare

**Data**: 23 Februarie 2026  
**Problema**: Protocol violation la autentificare + hidden host nu se aplică  
**Status**: ✅ **FIXED**

---

## 🐛 PROBLEMA RAPORTATĂ

### Simptome:

```
[19:01:22] * Quits: bello (~Raducu@188.24.9.36) (Registered)
[19:01:22] * Joins: bello (~Raducu@A5F8B9.CD8514.147F4A.B19664.IP)
```

**Așteptat**: `bello (~Raducu@Raducu.users.underchat.org)`  
**Observat**: `bello (~Raducu@A5F8B9.CD8514.147F4A.B19664.IP)` (stil 2, hash)

### Eroare în Status:

```
!HUB1.UnderChat.org! Protocol Violation from channels.underchat.org: 
ACCOUNT detected invalid subcommand token 'Raducu'. 
Old syntax maybe? See EXTENDED_ACCOUNTS F:line
```

### WHOIS:

```
Raducu is ~Raducu@A5F8B9.CD8514.147F4A.B19664.IP * Raducu
Raducu is actually ~Raducu@188.24.9.36 [188.24.9.36]
```

**Lipsește**: 
```
Raducu is logged in as Raducu
```

---

## 🔍 ANALIZA PROBLEMEI

### Ce se întâmplă:

1. **Serviciul (channels.underchat.org) trimite sintaxa VECHE**:
   ```
   :channels.underchat.org ACCOUNT ClientNumeric Raducu
   ```

2. **IRCD are `EXTENDED_ACCOUNTS = TRUE`**, așteaptă sintaxa NOUĂ:
   ```
   :channels.underchat.org ACCOUNT ClientNumeric A Raducu
   ```
   (cu subcomandă: A, R, M, U, C, D, H)

3. **IRCD refuză comanda** → Protocol violation

4. **Account nu se setează** → Hidden host nu se aplică corect

5. **HOST_HIDING_STYLE = 3** aplică:
   - Style 1 pentru authenticated: `Raducu.users.underchat.org` ✅
   - Style 2 pentru unauthenticated: `A5F8B9.CD8514.147F4A.B19664.IP` ❌ (hash)

6. **Rezultat**: User rămâne cu hash (style 2) în loc de hostname frumos (style 1)

---

## ✅ SOLUȚIA

### Fix Simplu: Setează `EXTENDED_ACCOUNTS = FALSE`

**În ircd.conf**:
```conf
features {
    # Extended Accounts Support (pentru servicii IRC)
    # TRUE = X3 modern cu sintaxă extinsă (R,M,U,C,A,D,H)
    # FALSE = Sintaxă standard (X, Anope 1.x, majoritatea serviciilor)
    "EXTENDED_ACCOUNTS" = "FALSE";
}
```

### De Ce FALSE Funcționează:

Când `EXTENDED_ACCOUNTS = FALSE`, IRCD acceptă sintaxa veche:

**Sintaxă veche (acceptată)**:
```
:channels.underchat.org ACCOUNT <ClientNumeric> <AccountName> [timestamp]

Exemplu:
:channels.underchat.org ACCOUNT AJAAB Raducu 1708704000
```

**Cod în m_account.c (liniile 300-332)**:
```c
else {
    // EXTENDED_ACCOUNTS = FALSE - sintaxă veche
    if (!(acptr = findNUser(parv[1])))
      return 0;

    // Setează account
    ircd_strncpy(cli_user(acptr)->account, parv[2], ACCOUNTLEN + 1);
    SetAccount(acptr);

    // Aplică hidden host pentru authenticated users
    if (((feature_int(FEAT_HOST_HIDING_STYLE) == 1) ||
         (feature_int(FEAT_HOST_HIDING_STYLE) == 3)) &&
        IsHiddenHost(acptr))
      hide_hostmask(acptr);  // ← APLICĂ HOSTNAME FRUMOS!
}
```

**Rezultat**: `Raducu.users.underchat.org` ✅

---

## 📊 EXTENDED_ACCOUNTS: TRUE vs FALSE

### EXTENDED_ACCOUNTS = TRUE (Sintaxă Modernă)

**Pentru**:
- X3 1.9+ (modern)
- Anope 2.x cu modul P10
- Atheme IRC Services moderne

**Sintaxă**:
```
:services ACCOUNT <ClientNumeric> <Subcommand> [params...]

Subcomenzile:
A <account> [timestamp] - Authenticate (login)
R <account>             - Register (creare cont nou)
M <account>             - Modify (redenumire cont)
U                       - Unregister (ștergere cont)
D                       - Deauthenticate (logout)
H <hostname>            - Set Hidden Host
C ...                   - LOC Check request
S ...                   - LOC SSL request
```

**Exemplu login**:
```
:channels.underchat.org ACCOUNT AJAAB A Raducu 1708704000
```

**Beneficii**:
- ✅ Rename accounts
- ✅ Merge accounts
- ✅ Unregister accounts
- ✅ Set custom hidden hosts
- ✅ Operații complexe

**Dezavantaje**:
- ❌ Necesită services modern (X3 1.9+, Anope 2.x)
- ❌ Incompatibil cu X standard, Anope 1.x

---

### EXTENDED_ACCOUNTS = FALSE (Sintaxă Standard)

**Pentru**:
- X (standard Undernet)
- Anope 1.x
- EggDrop services
- Majoritatea serviciilor IRC legacy

**Sintaxă**:
```
:services ACCOUNT <ClientNumeric> <AccountName> [timestamp]

Exemplu:
:channels.underchat.org ACCOUNT AJAAB Raducu 1708704000
```

**Beneficii**:
- ✅ Compatibil cu majoritatea serviciilor
- ✅ Simplu și robust
- ✅ Login/logout funcționează perfect
- ✅ Hidden host se aplică automat

**Limitări**:
- ⚠️ Nu suportă rename accounts (trebuie făcut manual)
- ⚠️ Nu suportă merge accounts
- ⚠️ Nu suportă custom hidden hosts per-user

---

## 🎯 RECOMANDARE PENTRU UNDERCHAT

### Folosește `EXTENDED_ACCOUNTS = FALSE`

**De ce**:
1. ✅ **Compatibilitate** - Funcționează cu X standard și Anope 1.x
2. ✅ **Stabilitate** - Protocol testat și stabil de 15+ ani
3. ✅ **Simplu** - Mai puține puncte de eroare
4. ✅ **Suficient** - Login/logout funcționează perfect

**Când să folosești TRUE**:
- Doar dacă ai X3 1.9+ sau Anope 2.x
- Doar dacă ai nevoie de rename/merge accounts
- Doar dacă ai configurat corect serviciul pentru protocol extins

---

## 🔧 PAȘI PENTRU FIX

### 1. Modifică Configurația

**Editează ircd.conf**:
```bash
nano $HOME/ircd/lib/ircd.conf
```

**Caută și modifică**:
```conf
# DE LA:
"EXTENDED_ACCOUNTS" = "TRUE";

# LA:
"EXTENDED_ACCOUNTS" = "FALSE";
```

### 2. Restart IRCd

```bash
# Kill serverul
killall ircd

# Sau folosește /REHASH (dacă funcționează)
# SAU restart prin control panel

# Start server
$HOME/ircd/bin/ircd -f $HOME/ircd/lib/ircd.conf
```

### 3. Verifică Fix-ul

**Reconectează și autentifică**:
```
/server underchat.org 6667
/nick Raducu
/msg X@channels.underchat.org LOGIN username password
```

**Verifică WHOIS**:
```
/whois Raducu

Ar trebui să vezi:
Raducu is ~Raducu@Raducu.users.underchat.org * Raducu
Raducu is logged in as Raducu
```

**Verifică că nu mai sunt erori**:
```
# În status window, NU ar trebui să mai vezi:
# "Protocol Violation from channels.underchat.org"
```

---

## 📝 UPDATE INSTALL.SH

Am actualizat template-ul pentru instalări viitoare:

**Modificare în install.sh (linia ~999)**:
```bash
# ÎNAINTE:
"EXTENDED_ACCOUNTS" = "TRUE";

# DUPĂ:
# Extended Accounts Support (pentru servicii IRC)
# TRUE = X3 modern cu sintaxă extinsă (R,M,U,C,A,D,H)
# FALSE = Sintaxă standard (X, Anope 1.x, majoritatea serviciilor)
"EXTENDED_ACCOUNTS" = "FALSE";
```

**Impact**:
- Instalări NOI vor avea FALSE by default
- Compatibilitate out-of-the-box cu majoritatea serviciilor
- User experience mai bună (fără protocol violations)

---

## 🧪 TESTARE

### Test 1: Login Basic

```bash
# 1. Conectează
/server underchat.org
/nick TestUser

# 2. Autentifică
/msg X@channels.underchat.org LOGIN testuser password

# 3. Verifică hostname
/whois TestUser

# AȘTEPTAT:
# TestUser is ~user@TestUser.users.underchat.org * Real Name
# TestUser is logged in as TestUser
```

### Test 2: Logout

```bash
# 1. Deautentifică
/msg X@channels.underchat.org LOGOUT

# 2. Verifică hostname
/whois TestUser

# AȘTEPTAT:
# TestUser is ~user@HASH.isp.com * Real Name
# (sau IP direct dacă nu are +x)
```

### Test 3: +x Manual

```bash
# 1. Setează +x (fără login)
/mode TestUser +x

# 2. Verifică hostname
/whois TestUser

# AȘTEPTAT:
# TestUser is ~user@UnderChat-HASH.isp.com * Real Name
# (style 2 pentru unauthenticated)
```

### Test 4: Login apoi +x

```bash
# 1. Login
/msg X@channels.underchat.org LOGIN testuser password

# 2. Hostname ar trebui AUTOMAT să devină:
# TestUser.users.underchat.org (style 1 pentru authenticated)

# 3. Dacă nu, setează manual:
/mode TestUser +x

# Acum ar trebui:
# TestUser is ~user@TestUser.users.underchat.org * Real Name
```

---

## 🐛 TROUBLESHOOTING

### Problemă: Încă primesc protocol violation

**Cauză**: Config cache sau REHASH incomplet.

**Soluție**:
```bash
# 1. Oprește complet serverul
killall -9 ircd

# 2. Verifică că e oprit
ps aux | grep ircd

# 3. Pornește din nou
$HOME/ircd/bin/ircd -f $HOME/ircd/lib/ircd.conf

# 4. Test din nou
```

### Problemă: Hostname rămâne hash (A5F8B9...)

**Cauză 1**: Account nu se setează (protocol violation persistă).

**Soluție**: Verifică logs:
```bash
tail -f $HOME/ircd/log/ircd.log | grep -i account
```

**Cauză 2**: `HOST_HIDING_STYLE` nu e setat corect.

**Soluție**: Verifică în config:
```bash
grep "HOST_HIDING_STYLE" $HOME/ircd/lib/ircd.conf

# Ar trebui:
"HOST_HIDING_STYLE" = "3";
```

**Cauză 3**: User nu are +x setat.

**Soluție**: Setează manual:
```
/mode YourNick +x
```

### Problemă: "Raducu is logged in as" nu apare

**Cauză**: Account nu e setat în IRCD (protocol violation).

**Soluție**: 
1. Verifică că `EXTENDED_ACCOUNTS = FALSE`
2. Restart IRCD complet
3. Re-login la X

---

## 📚 REFERINȚE

### Cod Relevant:

- **ircd/m_account.c** (liniile 134-342)
  - Linia 147: Check pentru EXTENDED_ACCOUNTS
  - Linia 148-151: Protocol violation pentru sintaxă veche
  - Linia 300-338: Implementare sintaxă veche (FALSE)
  - Linia 329-332: Aplicare hidden host pentru authenticated

- **doc/readme.features** (liniile 1046-1053)
  - Documentație oficială EXTENDED_ACCOUNTS

### Protocol P10:

- **ACCOUNT command** - RFC-style documentation
- **UnderNet P10 Protocol** - Server-to-server

---

## ✅ CHECKLIST FIX

- [x] Identificat problema: EXTENDED_ACCOUNTS = TRUE incompatibil cu serviciul
- [x] Analizat cod: m_account.c liniile 147-338
- [x] Soluție găsită: Setează EXTENDED_ACCOUNTS = FALSE
- [x] Actualizat install.sh: Default FALSE pentru instalări noi
- [x] Creat documentație: FIX_EXTENDED_ACCOUNTS_PROBLEM.md
- [x] Pași de testare: Definite și documentate
- [x] Troubleshooting: Cazuri comune acoperite

---

## 🎯 CONCLUZIE

### Problema:
**`EXTENDED_ACCOUNTS = TRUE` cauza protocol violation cu serviciul standard X/Anope**

### Soluția:
**Setează `EXTENDED_ACCOUNTS = FALSE` în ircd.conf**

### Rezultat:
- ✅ Protocol violation dispare
- ✅ Account se setează corect
- ✅ Hidden host se aplică: `Raducu.users.underchat.org`
- ✅ WHOIS arată: "is logged in as Raducu"
- ✅ User experience îmbunătățit

### Pentru Viitor:
- ✅ Template actualizat cu FALSE default
- ✅ Comentarii clare în config
- ✅ Documentație comprehensivă

---

**Fixed by**: Senior Software Architect  
**Data**: 23 Februarie 2026  
**Status**: ✅ **PROBLEM SOLVED**

---

**🎉 AUTENTIFICAREA VA FUNCȚIONA ACUM CORECT! 🎉**

