# WEBIRC - Gateway Web-to-IRC

## 📋 CE ESTE WEBIRC?

**WebIRC** este un protocol care permite **gateway-urilor web-to-IRC** (clienți IRC în browser) să comunice **IP-ul real** al utilizatorilor către serverul IRC, în loc ca toți utilizatorii să apară cu IP-ul serverului web.

Este esențial pentru **integrarea IRC în pagini web** fără ca toți utilizatorii să fie văzuți ca provenind de pe același IP (care ar fi IP-ul serverului web).

---

## 🎯 SCOP

### **Problema FĂRĂ WebIRC:**

Când ai un **client IRC web** (ex: Kiwi IRC, TheLounge, etc.) pe site-ul tău:

```
User1 (România) → WebServer (10.0.0.50) → IRCd
User2 (SUA) → WebServer (10.0.0.50) → IRCd
User3 (Franța) → WebServer (10.0.0.50) → IRCd
```

**Ce vede IRCd-ul:**
```irc
[14:30] * Joins: User1 (user1@10.0.0.50)
[14:31] * Joins: User2 (user2@10.0.0.50)
[14:32] * Joins: User3 (user3@10.0.0.50)
#                        ^^^^^^^^^^^ TOȚI au același IP (serverul web)!
```

**Probleme:**
- ❌ Toți utilizatorii apar cu același IP (IP-ul serverului web)
- ❌ Limitele de conexiuni per IP (clone protection) blochează utilizatori legitimi
- ❌ Gline/Ban-uri afectează TOȚI utilizatorii web
- ❌ Imposibil de identificat abuza tori individuali
- ❌ GeoIP-ul arată locația serverului, nu a utilizatorului real

### **Soluția CU WebIRC:**

```
User1 (RO: 203.0.113.10) → WebServer → WEBIRC → IRCd
User2 (US: 198.51.100.25) → WebServer → WEBIRC → IRCd
User3 (FR: 192.0.2.15) → WebServer → WEBIRC → IRCd
```

**Ce vede IRCd-ul:**
```irc
[14:30] * Joins: User1 (user1@203.0.113.10)
[14:31] * Joins: User2 (user2@198.51.100.25)
[14:32] * Joins: User3 (user3@192.0.2.15)
#                        ^^^^^^^^^^^^^^^^ IP-uri REALE ale utilizatorilor!
```

**Avantaje:**
- ✅ Fiecare utilizator are IP-ul său real vizibil
- ✅ Clone protection funcționează normal
- ✅ Ban-uri afectează doar utilizatorul problematic
- ✅ GeoIP corect (arată țara reală)
- ✅ Identificare abuzatori individuali

---

## 🔧 CUM FUNCȚIONEAZĂ?

### **Protocolul WebIRC:**

1. **User** se conectează la **WebServer** (ex: https://chat.underchat.org)
2. **WebServer** (Kiwi IRC, etc.) se conectează la **IRCd**
3. **WebServer** trimite comanda **WEBIRC** ÎNAINTE de USER/NICK:
   ```
   WEBIRC parola_secreta cgiirc hostname.real 203.0.113.10
   ```
4. **IRCd** verifică:
   - Parola este corectă?
   - WebServer-ul este autorizat (în WebIRC block)?
   - IP-ul și hostname-ul sunt valide?
5. **IRCd** înlocuiește IP-ul WebServer-ului cu IP-ul real al utilizatorului
6. **User** apare pe IRC cu IP-ul său real!

---

## 📝 SINTAXĂ ÎN ircd.conf

### **Formatul de bază:**

```conf
WebIRC {
    host = "webserver@ip.address";
    password = "parola_secreta";
    description = "Kiwi IRC Gateway";
};
```

### **Parametri:**

| Parametru | Obligatoriu | Descriere |
|-----------|-------------|-----------|
| `host` | ✅ DA | Hostmask-ul serverului web autorizat (format: `user@host` sau `*@ip`) |
| `password` | ✅ DA | Parola secretă pentru autentificare (shared secret) |
| `description` | ❌ NU | Descriere afișată în WHOIS (ex: "Web User") |
| `ident` | ❌ NU | Ident fix pentru utilizatori web (ex: "webchat") |
| `userident` | ❌ NU | Folosește username-ul din USER ca ident (yes/no, default: no) |
| `ignoreident` | ❌ NU | Ignoră identd reply de la server web (yes/no, default: no) |
| `stripsslfp` | ❌ NU | Șterge SSL fingerprint de la web server (yes/no, default: no) |
| `enableoptions` | ❌ NU | Activează parsarea IRCv3 WEBIRC options (yes/no, default: no) |
| `trustaccount` | ❌ NU | Permite autentificare automată via WEBIRC (yes/no, default: no) |

---

## 💡 EXEMPLE PRACTICE

### **Exemplu 1: Configurare Simplă (Kiwi IRC)**

```conf
WebIRC {
    host = "*@203.0.113.50";
    password = "$PLAIN$k1w1_s3cr3t_p@ssw0rd";
    description = "Kiwi IRC Web Gateway";
};
```

**Explicație:**
- Orice conexiune de pe `203.0.113.50` (serverul unde rulează Kiwi IRC)
- Trebuie să furnizeze parola `k1w1_s3cr3t_p@ssw0rd`
- În WHOIS se va afișa: "Kiwi IRC Web Gateway"

**Configurare Kiwi IRC (config.ini):**
```ini
[webirc]
password = k1w1_s3cr3t_p@ssw0rd
```

---

### **Exemplu 2: Multiple Servere Web**

```conf
# Server Web Principal
WebIRC {
    host = "*@203.0.113.50";
    password = "$PLAIN$main_server_pass";
    description = "Main Web Chat";
};

# Server Web Backup
WebIRC {
    host = "*@203.0.113.51";
    password = "$PLAIN$backup_server_pass";
    description = "Backup Web Chat";
};

# Server Web Localhost (pentru testing)
WebIRC {
    host = "*@127.0.0.1";
    password = "$PLAIN$localhost_test";
    description = "Local Testing";
};
```

---

### **Exemplu 3: Cu Ident Custom și Opțiuni**

```conf
WebIRC {
    host = "*@203.0.113.50";
    password = "$PLAIN$web_password";
    description = "Web Chat";
    
    # Setări avansate
    ident = "webchat";          # Toți web users au ident "webchat"
    userident = no;             # Nu folosi username-ul ca ident
    ignoreident = yes;          # Ignoră identd de la webserver
    stripsslfp = yes;           # Șterge SSL fingerprint
    enableoptions = yes;        # Activează IRCv3 WEBIRC options
    trustaccount = no;          # Nu permite auto-auth
};
```

**Rezultat:**
```irc
/WHOIS WebUser
WebUser is webchat@203.0.113.10 * Real Name
#          ^^^^^^^ ident fix     ^^^^^^^^^^^ IP real
WebUser using Web Chat (Web Gateway)
#            ^^^^^^^^^ description
```

---

### **Exemplu 4: Rețea CIDR (Multiple IP-uri)**

```conf
# Permite tot subnet-ul 203.0.113.0/24
WebIRC {
    host = "*@203.0.113.*";
    password = "$PLAIN$subnet_password";
    description = "Web Gateway Farm";
};

# Sau cu CIDR notation:
WebIRC {
    host = "*@203.0.113.0/24";
    password = "$PLAIN$cidr_password";
    description = "Web Gateway CIDR";
};
```

---

### **Exemplu 5: TheLounge (Self-hosted IRC Client)**

```conf
WebIRC {
    host = "*@10.0.0.100";
    password = "$PLAIN$thelounge_secret";
    description = "TheLounge Web Client";
    ident = "lounge";
    userident = yes;
    ignoreident = yes;
};
```

**Configurare TheLounge (config.js):**
```javascript
webirc: {
    "underchat.org": {
        password: "thelounge_secret",
        server: "irc.underchat.org",
        port: 6667
    }
}
```

---

## 🎓 CAZURI DE UTILIZARE

### **1. Kiwi IRC pe site-ul tău**

```conf
WebIRC {
    host = "*@chat.underchat.org";
    password = "$PLAIN$kiwi_password";
    description = "UnderChat Web Client";
};
```

**Link-ul utilizatorilor:** https://chat.underchat.org/

---

### **2. IRCCloud / Hosted Services**

```conf
# IRCCloud folosește IP-uri specifice
WebIRC {
    host = "*@192.0.2.0/24";
    password = "$PLAIN$irccloud_pass";
    description = "IRCCloud Gateway";
};
```

---

### **3. Multiple Gateway-uri (Load Balancing)**

```conf
# Gateway 1
WebIRC {
    host = "*@gateway1.underchat.org";
    password = "$PLAIN$shared_password";
    description = "Web Gateway 1";
};

# Gateway 2
WebIRC {
    host = "*@gateway2.underchat.org";
    password = "$PLAIN$shared_password";
    description = "Web Gateway 2";
};

# Gateway 3
WebIRC {
    host = "*@gateway3.underchat.org";
    password = "$PLAIN$shared_password";
    description = "Web Gateway 3";
};
```

---

## ⚙️ CONFIGURARE COMPLETĂ ÎN ircd.conf

### **Exemplu pentru UnderChat:**

```conf
# ============================================================================
# SECȚIUNE: WEBIRC - Gateway-uri Web-to-IRC
# ============================================================================

# Kiwi IRC - Server Principal
WebIRC {
    host = "*@203.0.113.50";
    password = "$PLAIN$k1w1_Str0ng_P@ssw0rd_2026";
    description = "UnderChat Web Chat";
    ident = "webchat";
    userident = no;
    ignoreident = yes;
    stripsslfp = yes;
    enableoptions = yes;
    trustaccount = no;
};

# TheLounge - Self-hosted
WebIRC {
    host = "*@10.0.0.100";
    password = "$PLAIN$l0ung3_S3cr3t_K3y";
    description = "UnderChat Lounge";
    ident = "lounge";
    userident = yes;
    ignoreident = yes;
};

# Testing local
WebIRC {
    host = "*@127.0.0.1";
    password = "$PLAIN$localhost_test_123";
    description = "Local Testing";
};
```

---

## 🔍 VERIFICARE ȘI TESTARE

### **1. Verifică configurația:**

```bash
grep -A 5 'WebIRC {' /home/ircd/ircd/lib/ircd.conf
```

**Output așteptat:**
```conf
WebIRC {
    host = "*@203.0.113.50";
    password = "$PLAIN$password_here";
    description = "Web Gateway";
};
```

### **2. Testează conexiunea WebIRC:**

În **Kiwi IRC config** sau **TheLounge config**, adaugă parola WebIRC.

**Kiwi IRC (config.ini):**
```ini
[webirc]
password = k1w1_Str0ng_P@ssw0rd_2026
```

**TheLounge (config.js):**
```javascript
webirc: {
    "underchat.org": {
        password: "l0ung3_S3cr3t_K3y"
    }
}
```

### **3. Verifică în IRC:**

```irc
# Conectează-te prin web client
# Apoi verifică:

/WHOIS YourNick

# Ar trebui să vezi:
YourNick is webchat@YOUR_REAL_IP * Real Name
#           ^^^^^^^ ident  ^^^^^^^^^^^^^ IP-ul tău real!
YourNick using UnderChat Web Chat
#              ^^^^^^^^^^^^^^^^^^^ description
```

### **4. Verifică log-urile IRCd:**

```bash
tail -f /home/ircd/ircd/log/ircd.log | grep WEBIRC
```

**Output SUCCESS:**
```
WEBIRC Client host: from 203.0.113.50 [203.0.113.50] to user.isp.ro [198.51.100.25]
```

**Output ERROR:**
```
WEBIRC Attempt unauthorized from 203.0.113.50 [203.0.113.50]
# → IP-ul nu e în WebIRC block

WEBIRC Attempt with invalid password from 203.0.113.50
# → Parola greșită
```

---

## 📊 AVANTAJE vs DEZAVANTAJE

### ✅ **AVANTAJE:**

1. **IP-uri reale** - Fiecare user are IP-ul său vizibil
2. **Clone protection** - Funcționează normal (nu mai sunt toți pe același IP)
3. **GeoIP corect** - Arată țara reală a utilizatorului
4. **Ban-uri precise** - Afectează doar utilizatorul problematic
5. **Identificare** - Poți identifica abuzatori individuali
6. **Statistici** - GeoIP, conexiuni per țară, etc. sunt corecte

### ⚠️ **DEZAVANTAJE:**

1. **Configurare necesară** - Trebuie configurat în IRCd ȘI în web client
2. **Shared secret** - Parola trebuie păstrată secretă
3. **Securitate** - Dacă cineva află parola, poate spoofa IP-uri
4. **Trust** - Trebuie să ai încredere în gateway-ul web

---

## 🚨 SECURITATE - BEST PRACTICES

### **1. Folosește parole FOARTE PUTERNICE**

```conf
# ❌ SLAB:
password = "$PLAIN$123456";

# ❌ SLAB:
password = "$PLAIN$webirc";

# ✅ BINE:
password = "$PLAIN$W3b1RC_Str0ng_P@ssw0rd_2026_UnD3rCh@t";
```

### **2. Limitează la IP-uri SPECIFICE**

```conf
# ❌ PERICOL (oricine poate):
host = "*@*";

# ✅ SIGUR (doar server-ul tău):
host = "*@203.0.113.50";

# ✅ SIGUR (doar subnet-ul tău):
host = "*@203.0.113.0/24";
```

### **3. Folosește HTTPS pentru web client**

```
❌ http://chat.underchat.org (parola e trimisă în clar!)
✅ https://chat.underchat.org (parola e criptată)
```

### **4. Monitorizează încercări neautorizate**

```bash
# În ircd.conf, activează notificări:
Operator {
    # ...
    snomask = "+s +w";  # Include SNO_WEBIRC
};

# Vei primi notificări pentru:
# - Încercări cu parolă greșită
# - Încercări de pe IP-uri neautorizate
# - IP-uri/hostname-uri invalide
```

### **5. Rotează parolele regulat**

```
Schimbă parola WebIRC la fiecare 3-6 luni
Actualizează în:
- ircd.conf (pe server IRC)
- config web client (Kiwi/Lounge/etc.)
```

---

## 🔧 TROUBLESHOOTING

### **Problemă: WEBIRC nu funcționează**

**Cauze posibile:**

1. **WebIRC NU este configurat în ircd.conf**
   ```bash
   grep 'WebIRC {' /home/ircd/ircd/lib/ircd.conf
   # Dacă nu găsește → Trebuie adăugat
   ```

2. **Parola greșită în web client**
   ```bash
   # Log IRCd:
   tail -f /home/ircd/ircd/log/ircd.log | grep WEBIRC
   # Caută: "WEBIRC Attempt with invalid password"
   ```

3. **IP-ul web server-ului nu se potrivește**
   ```conf
   # Config:
   host = "*@203.0.113.50";
   
   # Dar web server-ul are IP: 203.0.113.51
   # → NU se potrivește → BLOCAT!
   ```

4. **Comanda WEBIRC trimisă prea târziu**
   ```
   WEBIRC trebuie trimisă ÎNAINTE de USER/NICK
   Ordinea corectă:
   1. WEBIRC password user host ip
   2. NICK nickname
   3. USER username 0 * :realname
   ```

### **Soluție generală:**

```bash
# 1. Adaugă WebIRC în ircd.conf
nano /home/ircd/ircd/lib/ircd.conf

# Adaugă:
WebIRC {
    host = "*@IP_WEB_SERVER";
    password = "$PLAIN$parola_aici";
    description = "Web Gateway";
};

# 2. Repornește IRCd
killall ircd
/home/ircd/ircd/bin/ircd -f /home/ircd/ircd/lib/ircd.conf

# 3. Configurează parola în web client (Kiwi/Lounge)

# 4. Testează conexiunea
```

---

## 📚 INTEGRARE CU CLIENȚI POPULARI

### **1. Kiwi IRC**

**Instalare:**
```bash
# Pe serverul web
cd /opt
git clone https://github.com/kiwiirc/kiwiirc.git
cd kiwiirc
npm install
```

**Configurare (config.ini):**
```ini
[webirc]
password = your_webirc_password

[connections]
default_server = irc.underchat.org
default_port = 6667
```

---

### **2. TheLounge**

**Instalare:**
```bash
npm install -g thelounge
thelounge start
```

**Configurare (config.js):**
```javascript
module.exports = {
    webirc: {
        "underchat.org": {
            password: "your_webirc_password",
            server: "irc.underchat.org",
            port: 6667
        }
    }
};
```

---

### **3. IRCCloud (Service Hosted)**

Contactează IRCCloud pentru a cere adăugarea rețelei tale.
Ei vor furniza IP-urile lor și parola WebIRC necesară.

---

## 🎯 REFERINȚE

- **Cod sursă:** `ircd/m_webirc.c`
- **Exemplu config:** `doc/example.conf` (liniile 1047-1089)
- **Specificație IRCv3:** https://ircv3.net/specs/extensions/webirc
- **Kiwi IRC:** https://kiwiirc.com/
- **TheLounge:** https://thelounge.chat/

---

## 🎯 CONCLUZIE

**WebIRC** = **Gateway Web-to-IRC cu IP-uri reale**

Transformă conexiuni web:
```
FĂRĂ: Toți → WebServer IP → IRCd (toți cu același IP)
CU:   User1 → WebServer → WEBIRC → IRCd (fiecare cu IP-ul său)
```

Este **ESENȚIAL** pentru:
- ✅ Clienți IRC web (Kiwi IRC, TheLounge)
- ✅ Integrare IRC pe site-uri
- ✅ GeoIP corect pentru web users
- ✅ Clone protection funcțional
- ✅ Ban-uri precise

---

**Data:** 14 Februarie 2026  
**Versiune:** 1.0  
**Pentru:** UnderChat IRCd v1.5.0+

---

## 🚀 QUICK START

**Pentru a adăuga WebIRC:**

```conf
# Adaugă în /home/ircd/ircd/lib/ircd.conf:

WebIRC {
    host = "*@IP_WEBSERVER_TĂU";
    password = "$PLAIN$parola_foarte_puternica_2026";
    description = "UnderChat Web Client";
    ident = "webchat";
    ignoreident = yes;
};
```

**În Kiwi IRC (config.ini):**
```ini
[webirc]
password = parola_foarte_puternica_2026
```

**Restart IRCd:**
```bash
killall ircd
/home/ircd/ircd/bin/ircd -f /home/ircd/ircd/lib/ircd.conf
```

**Testează:** Conectează-te prin web client și verifică `/WHOIS` - ar trebui să vezi IP-ul tău real!

**GATA!** ✅

