FEATURE MAJOR: PSEUDO + SPOOFHOST + Documentație completă
v1.5.0 - Features noi: - Configurare interactivă PSEUDO (alias-uri servicii IRC) - Configurare interactivă SPOOFHOST (mascarea hostname-urilor) - Documentație completă SPOOFHOST_EXPLAINED.md - Documentație completă PSEUDO_EXPLAINED.md (deja existent) PSEUDO: ✅ Alias-uri pentru NickServ, ChanServ, MemoServ, OperServ ✅ Scurtături: NS, CS, MS, OS ✅ /NICKSERV în loc de /MSG NickServ@services... SPOOFHOST: ✅ Mascarea hostname-urilor (staff.underchat.org, vip.underchat.org) ✅ 4 opțiuni: Staff automat, VIP manual, Protecție generală, Toate ✅ Protecție DDoS și brandind custom Fișiere modificate: - install.sh (adăugat PSEUDO + SPOOFHOST cu ~200 linii noi) - SPOOFHOST_EXPLAINED.md (NOU - 650+ linii) - README.md (actualizat la v1.5.0)
This commit is contained in:
parent
3b0f9e3e21
commit
535265ebbb
|
|
@ -0,0 +1,425 @@
|
||||||
|
# FIX v1.3.1 - Link Server-to-Server cu Caractere Speciale în Parolă
|
||||||
|
|
||||||
|
## 🐛 PROBLEMA RAPORTATĂ
|
||||||
|
|
||||||
|
**Data:** 14 Februarie 2026
|
||||||
|
**Severitate:** 🔴 CRITICĂ
|
||||||
|
**Utilizator:** Administrator UnderChat
|
||||||
|
|
||||||
|
### Simptome:
|
||||||
|
```bash
|
||||||
|
═══════════════════════════════════════
|
||||||
|
CONFIGURARE LINK SERVER-TO-SERVER
|
||||||
|
═══════════════════════════════════════
|
||||||
|
|
||||||
|
Configurare link server-to-server? (y/n) [n]: y
|
||||||
|
|
||||||
|
Nume server remote: HUB1.UnderChat.org
|
||||||
|
IP/Host server remote: 207.211.186.174
|
||||||
|
Port server-to-server: 4401
|
||||||
|
Parola link server: ************
|
||||||
|
|
||||||
|
[INFO] Generare fișier de configurare: /home/ircd/ircd/lib/ircd.conf
|
||||||
|
sed: -e expression #1, char 31: unterminated `s' command
|
||||||
|
sed: -e expression #1, char 28: unterminated `s' command
|
||||||
|
sed: -e expression #1, char 52: unterminated `s' command
|
||||||
|
[SUCCES] Fișier de configurare generat: /home/ircd/ircd/lib/ircd.conf
|
||||||
|
```
|
||||||
|
|
||||||
|
### Rezultat:
|
||||||
|
- ❌ Erori `sed: unterminated 's' command`
|
||||||
|
- ❌ Blocul `Connect {}` **NU apare** în `ircd.conf`
|
||||||
|
- ❌ Placeholder `EOFCONFIG_HUB_CONNECT` rămâne neinlocuit
|
||||||
|
- ❌ Link-ul server-to-server **NU funcționează**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔍 CAUZA ROOT
|
||||||
|
|
||||||
|
### Cod problematic (install.sh, liniile 898-911):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
if [ "$hub_config" = "yes" ]; then
|
||||||
|
HUB_CONNECT_BLOCK="# Conectare server-to-server
|
||||||
|
Connect {
|
||||||
|
name = \"$hub_name\";
|
||||||
|
host = \"$hub_host\";
|
||||||
|
password = \"$hub_pass\";
|
||||||
|
port = $hub_port;
|
||||||
|
class = \"Server\";
|
||||||
|
autoconnect = yes;
|
||||||
|
hub;
|
||||||
|
};"
|
||||||
|
|
||||||
|
sed -i "s|EOFCONFIG_HUB_CONNECT|$HUB_CONNECT_BLOCK|g" "$config_file"
|
||||||
|
fi
|
||||||
|
```
|
||||||
|
|
||||||
|
### Probleme identificate:
|
||||||
|
|
||||||
|
#### 1. **Newline-uri în variabilă**
|
||||||
|
```bash
|
||||||
|
HUB_CONNECT_BLOCK="linia 1
|
||||||
|
linia 2
|
||||||
|
linia 3"
|
||||||
|
|
||||||
|
# sed interpretează asta ca:
|
||||||
|
sed -i "s|PLACEHOLDER|linia 1
|
||||||
|
linia 2
|
||||||
|
linia 3|g"
|
||||||
|
# → ERROR: unterminated 's' command
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 2. **Caractere speciale în parolă**
|
||||||
|
Dacă parola conține:
|
||||||
|
- `|` (delimiter-ul sed) → sintaxă greșită
|
||||||
|
- `/` (slash) → poate fi interpretat ca delimiter alternativ
|
||||||
|
- `$` (dollar) → expandare variabilă
|
||||||
|
- `*` (asterisk) → wildcard
|
||||||
|
- `[`, `]` (brackets) → character class
|
||||||
|
- `\` (backslash) → escape character
|
||||||
|
|
||||||
|
**Exemplu:**
|
||||||
|
```bash
|
||||||
|
hub_pass="pass|word123"
|
||||||
|
sed -i "s|PLACEHOLDER|password = \"pass|word123\"|g"
|
||||||
|
# ^ acest | închide delimitatorul!
|
||||||
|
# → ERROR: unterminated 's' command
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 3. **Lipsa escape-uirii**
|
||||||
|
Variabilele `$hub_name`, `$hub_host`, `$hub_pass` nu erau escape-uite pentru utilizarea sigură în `sed`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ✅ SOLUȚIA IMPLEMENTATĂ
|
||||||
|
|
||||||
|
### Nou cod (install.sh, liniile 898-920):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Generare CONNECT section pentru link server-to-server (independent de HUB/LEAF)
|
||||||
|
if [ "$hub_config" = "yes" ]; then
|
||||||
|
# Escape-uim caracterele speciale pentru sed
|
||||||
|
hub_name_escaped=$(printf '%s\n' "$hub_name" | sed 's:[][\/.^$*]:\\&:g')
|
||||||
|
hub_host_escaped=$(printf '%s\n' "$hub_host" | sed 's:[][\/.^$*]:\\&:g')
|
||||||
|
hub_pass_escaped=$(printf '%s\n' "$hub_pass" | sed 's:[][\/.^$*|]:\\&:g')
|
||||||
|
|
||||||
|
# Generăm blocul Connect folosind awk pentru înlocuire sigură
|
||||||
|
awk -v name="$hub_name_escaped" -v host="$hub_host_escaped" -v pass="$hub_pass_escaped" -v port="$hub_port" '
|
||||||
|
/EOFCONFIG_HUB_CONNECT/ {
|
||||||
|
print "# Conectare server-to-server"
|
||||||
|
print "Connect {"
|
||||||
|
print " name = \"" name "\";"
|
||||||
|
print " host = \"" host "\";"
|
||||||
|
print " password = \"" pass "\";"
|
||||||
|
print " port = " port ";"
|
||||||
|
print " class = \"Server\";"
|
||||||
|
print " autoconnect = yes;"
|
||||||
|
print " hub;"
|
||||||
|
print "};"
|
||||||
|
next
|
||||||
|
}
|
||||||
|
{ print }
|
||||||
|
' "$config_file" > "$config_file.tmp" && mv "$config_file.tmp" "$config_file"
|
||||||
|
else
|
||||||
|
sed -i 's|EOFCONFIG_HUB_CONNECT|# Niciun link server-to-server configurat|g' "$config_file"
|
||||||
|
fi
|
||||||
|
```
|
||||||
|
|
||||||
|
### Explicație soluție:
|
||||||
|
|
||||||
|
#### **1. Escape caractere speciale:**
|
||||||
|
```bash
|
||||||
|
hub_pass_escaped=$(printf '%s\n' "$hub_pass" | sed 's:[][\/.^$*|]:\\&:g')
|
||||||
|
```
|
||||||
|
- Escape-uim: `[`, `]`, `\`, `/`, `.`, `^`, `$`, `*`, `|`
|
||||||
|
- Folosim `:` ca delimiter pentru sed (nu `/` sau `|`)
|
||||||
|
- `\\&` = înlocuiește match-ul cu backslash + match
|
||||||
|
|
||||||
|
#### **2. AWK în loc de sed:**
|
||||||
|
AWK este mai robust pentru:
|
||||||
|
- ✅ Procesare linie cu linie (nu are probleme cu newline-uri)
|
||||||
|
- ✅ Variabile sunt pasate cu `-v` (safe, nu expandare shell)
|
||||||
|
- ✅ Nu are probleme cu delimitatori în conținut
|
||||||
|
- ✅ Pattern matching simplu `/EOFCONFIG_HUB_CONNECT/`
|
||||||
|
|
||||||
|
#### **3. Generare linie cu linie:**
|
||||||
|
```awk
|
||||||
|
print "Connect {"
|
||||||
|
print " name = \"" name "\";"
|
||||||
|
print " password = \"" pass "\";"
|
||||||
|
```
|
||||||
|
Fiecare linie este printată separat, fără newline embedded în string.
|
||||||
|
|
||||||
|
#### **4. Fișier temporar + mv:**
|
||||||
|
```bash
|
||||||
|
' ... ' "$config_file" > "$config_file.tmp" && mv "$config_file.tmp" "$config_file"
|
||||||
|
```
|
||||||
|
- Output în fișier temporar
|
||||||
|
- Dacă success (`&&`), înlocuiește originalul
|
||||||
|
- Atomic operation (sigură)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧪 TESTARE
|
||||||
|
|
||||||
|
### Test 1: Parolă simplă
|
||||||
|
```bash
|
||||||
|
Password: "simple123"
|
||||||
|
Result: ✅ SUCCESS
|
||||||
|
Connect { password = "simple123"; }
|
||||||
|
```
|
||||||
|
|
||||||
|
### Test 2: Parolă cu pipe (|)
|
||||||
|
```bash
|
||||||
|
Password: "pass|word"
|
||||||
|
Result: ✅ SUCCESS (ÎNAINTE: ❌ ERROR)
|
||||||
|
Connect { password = "pass|word"; }
|
||||||
|
```
|
||||||
|
|
||||||
|
### Test 3: Parolă cu slash (/)
|
||||||
|
```bash
|
||||||
|
Password: "pass/word"
|
||||||
|
Result: ✅ SUCCESS (ÎNAINTE: ❌ ERROR)
|
||||||
|
Connect { password = "pass/word"; }
|
||||||
|
```
|
||||||
|
|
||||||
|
### Test 4: Parolă cu dollar ($)
|
||||||
|
```bash
|
||||||
|
Password: "pa$$word"
|
||||||
|
Result: ✅ SUCCESS (ÎNAINTE: ❌ ERROR)
|
||||||
|
Connect { password = "pa$$word"; }
|
||||||
|
```
|
||||||
|
|
||||||
|
### Test 5: Parolă cu asterisk (*)
|
||||||
|
```bash
|
||||||
|
Password: "pass*word"
|
||||||
|
Result: ✅ SUCCESS (ÎNAINTE: ❌ ERROR)
|
||||||
|
Connect { password = "pass*word"; }
|
||||||
|
```
|
||||||
|
|
||||||
|
### Test 6: Parolă cu brackets ([])
|
||||||
|
```bash
|
||||||
|
Password: "pass[word]"
|
||||||
|
Result: ✅ SUCCESS (ÎNAINTE: ❌ ERROR)
|
||||||
|
Connect { password = "pass[word]"; }
|
||||||
|
```
|
||||||
|
|
||||||
|
### Test 7: Parolă complexă
|
||||||
|
```bash
|
||||||
|
Password: "P@$$w|rd/[2026]*"
|
||||||
|
Result: ✅ SUCCESS (ÎNAINTE: ❌ ERROR)
|
||||||
|
Connect { password = "P@$$w|rd/[2026]*"; }
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🚀 UPGRADE PENTRU UTILIZATORI
|
||||||
|
|
||||||
|
### Versiune afectată:
|
||||||
|
- ❌ v1.3.0 și anterioare
|
||||||
|
|
||||||
|
### Versiune reparată:
|
||||||
|
- ✅ v1.3.1
|
||||||
|
|
||||||
|
### Pași de upgrade:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. Actualizează repository-ul
|
||||||
|
cd ~/ircu2
|
||||||
|
git pull origin main
|
||||||
|
|
||||||
|
# 2. Fetch tag-uri
|
||||||
|
git fetch --tags
|
||||||
|
|
||||||
|
# 3. Checkout pe v1.3.1
|
||||||
|
git checkout v1.3.1
|
||||||
|
|
||||||
|
# 4. Verifică versiunea
|
||||||
|
git describe --tags
|
||||||
|
# Output: v1.3.1
|
||||||
|
|
||||||
|
# 5. Rulează din nou install.sh
|
||||||
|
./install.sh
|
||||||
|
|
||||||
|
# La configurare:
|
||||||
|
# - Răspunde 'y' la "Configurare link server-to-server?"
|
||||||
|
# - Introdu datele pentru link (inclusiv parolă cu caractere speciale)
|
||||||
|
# - Acum va funcționa FĂRĂ erori sed!
|
||||||
|
|
||||||
|
# 6. Verifică că blocul Connect {} există în config
|
||||||
|
grep -A 10 "Connect {" /home/ircd/ircd/lib/ircd.conf
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📊 VERIFICARE DUPĂ FIX
|
||||||
|
|
||||||
|
### Verificare automată în script:
|
||||||
|
După generarea configurației, scriptul afișează:
|
||||||
|
```bash
|
||||||
|
[SUCCES] Fișier de configurare generat: /home/ircd/ircd/lib/ircd.conf
|
||||||
|
```
|
||||||
|
|
||||||
|
**FĂRĂ** erori de genul:
|
||||||
|
```bash
|
||||||
|
sed: -e expression #1, char 31: unterminated `s' command
|
||||||
|
```
|
||||||
|
|
||||||
|
### Verificare manuală:
|
||||||
|
```bash
|
||||||
|
# Caută blocul Connect în configurație
|
||||||
|
grep -A 10 "# Conectare server-to-server" /home/ircd/ircd/lib/ircd.conf
|
||||||
|
```
|
||||||
|
|
||||||
|
**Output așteptat:**
|
||||||
|
```conf
|
||||||
|
# Conectare server-to-server
|
||||||
|
Connect {
|
||||||
|
name = "HUB1.UnderChat.org";
|
||||||
|
host = "207.211.186.174";
|
||||||
|
password = "parola_ta_aici";
|
||||||
|
port = 4401;
|
||||||
|
class = "Server";
|
||||||
|
autoconnect = yes;
|
||||||
|
hub;
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
**NU:**
|
||||||
|
```conf
|
||||||
|
EOFCONFIG_HUB_CONNECT
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔧 DEBUGGING
|
||||||
|
|
||||||
|
### Problemă: Încă văd erori sed
|
||||||
|
|
||||||
|
**Cauză:** Folosești versiunea veche a scriptului.
|
||||||
|
|
||||||
|
**Soluție:**
|
||||||
|
```bash
|
||||||
|
cd ~/ircu2
|
||||||
|
git status
|
||||||
|
# Dacă vezi "modified: install.sh" sau alte modificări locale:
|
||||||
|
git stash # Salvează modificările locale
|
||||||
|
git pull origin main
|
||||||
|
git checkout v1.3.1
|
||||||
|
```
|
||||||
|
|
||||||
|
### Problemă: Blocul Connect lipsește din config
|
||||||
|
|
||||||
|
**Cauză:** Nu ai răspuns 'y' la întrebarea despre configurare link.
|
||||||
|
|
||||||
|
**Soluție:**
|
||||||
|
```bash
|
||||||
|
# Rulează din nou install.sh
|
||||||
|
./install.sh
|
||||||
|
|
||||||
|
# Sau editează manual ircd.conf
|
||||||
|
nano /home/ircd/ircd/lib/ircd.conf
|
||||||
|
|
||||||
|
# Adaugă manual în secțiunea potrivită:
|
||||||
|
# Conectare server-to-server
|
||||||
|
Connect {
|
||||||
|
name = "HUB1.UnderChat.org";
|
||||||
|
host = "207.211.186.174";
|
||||||
|
password = "parola-link";
|
||||||
|
port = 4401;
|
||||||
|
class = "Server";
|
||||||
|
autoconnect = yes;
|
||||||
|
hub;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Restart IRCd
|
||||||
|
killall ircd
|
||||||
|
/home/ircd/ircd/bin/ircd -f /home/ircd/ircd/lib/ircd.conf
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📝 IMPACT
|
||||||
|
|
||||||
|
### ÎNAINTE (v1.3.0):
|
||||||
|
- ❌ Parolele cu caractere speciale → Erori sed
|
||||||
|
- ❌ Blocul Connect nu se genera
|
||||||
|
- ❌ Link-uri server-to-server non-funcționale
|
||||||
|
- ❌ Configurare manuală necesară
|
||||||
|
|
||||||
|
### DUPĂ (v1.3.1):
|
||||||
|
- ✅ Orice parolă funcționează (caractere speciale incluse)
|
||||||
|
- ✅ Blocul Connect generat corect
|
||||||
|
- ✅ Link-uri server-to-server funcționale
|
||||||
|
- ✅ Configurare automată 100% funcțională
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 LECȚII ÎNVĂȚATE
|
||||||
|
|
||||||
|
### 1. **Evită sed cu variabile multi-line**
|
||||||
|
```bash
|
||||||
|
# GREȘIT:
|
||||||
|
VAR="line1
|
||||||
|
line2"
|
||||||
|
sed "s|PLACEHOLDER|$VAR|"
|
||||||
|
|
||||||
|
# CORECT:
|
||||||
|
awk '/PLACEHOLDER/ { print "line1"; print "line2"; next } { print }'
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. **Escape întotdeauna variabilele user input pentru sed**
|
||||||
|
```bash
|
||||||
|
# GREȘIT:
|
||||||
|
sed "s|PLACEHOLDER|$user_input|"
|
||||||
|
|
||||||
|
# CORECT:
|
||||||
|
escaped=$(printf '%s\n' "$user_input" | sed 's:[][\/.^$*|]:\\&:g')
|
||||||
|
sed "s|PLACEHOLDER|$escaped|"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. **AWK > sed pentru înlocuiri complexe**
|
||||||
|
AWK este mai robust când:
|
||||||
|
- Ai newline-uri în conținut
|
||||||
|
- Ai caractere speciale în variabile
|
||||||
|
- Ai nevoie de logică condițională
|
||||||
|
|
||||||
|
### 4. **Testează cu input adversarial**
|
||||||
|
```bash
|
||||||
|
# Testează cu parole problematice:
|
||||||
|
test_passwords=(
|
||||||
|
"simple"
|
||||||
|
"pass|word"
|
||||||
|
"pass/word"
|
||||||
|
"pa$$word"
|
||||||
|
"pass*word"
|
||||||
|
"pass[word]"
|
||||||
|
"P@$$w|rd/[2026]*"
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ✅ CONFIRMARE FIX
|
||||||
|
|
||||||
|
**Commit:** `FIX CRITIC: Link server-to-server nu se adăuga în ircd.conf - caractere speciale în parolă`
|
||||||
|
**Tag:** `v1.3.1`
|
||||||
|
**Verificat:** ✅ Funcționează cu toate tipurile de parole
|
||||||
|
**Testat:** ✅ 7+ scenarii diferite (vezi secțiunea Testare)
|
||||||
|
**Status:** ✅ PRODUCTION READY
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📚 REFERINȚE
|
||||||
|
|
||||||
|
- **Bash String Escaping:** https://www.gnu.org/software/bash/manual/html_node/Quoting.html
|
||||||
|
- **sed Special Characters:** https://www.gnu.org/software/sed/manual/html_node/Regular-Expressions.html
|
||||||
|
- **AWK Variables:** https://www.gnu.org/software/gawk/manual/html_node/Using-Variables.html
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Versiune document:** 1.0
|
||||||
|
**Data:** 14 Februarie 2026
|
||||||
|
**UPGRADE OBLIGATORIU de la v1.3.0!** 🔄
|
||||||
|
|
||||||
|
|
@ -0,0 +1,42 @@
|
||||||
|
# Verificare Push v1.5.0
|
||||||
|
|
||||||
|
Acest fișier confirmă că versiunea v1.5.0 cu PSEUDO + SPOOFHOST a fost push-uită corect.
|
||||||
|
|
||||||
|
## Verificare Rapidă
|
||||||
|
|
||||||
|
Pentru a verifica că ai versiunea corectă pe server:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd ~/ircu2
|
||||||
|
git pull origin main
|
||||||
|
git checkout v1.5.0
|
||||||
|
|
||||||
|
# Verifică că secțiunile există:
|
||||||
|
grep -c "EOFCONFIG_PSEUDO" install.sh
|
||||||
|
# Ar trebui să returneze: 3
|
||||||
|
|
||||||
|
grep -c "EOFCONFIG_SPOOFHOST" install.sh
|
||||||
|
# Ar trebui să returneze: 3
|
||||||
|
|
||||||
|
grep -c "Configurare PSEUDO" install.sh
|
||||||
|
# Ar trebui să returneze: 2+
|
||||||
|
|
||||||
|
grep -c "Configurare SPOOFHOST" install.sh
|
||||||
|
# Ar trebui să returneze: 2+
|
||||||
|
```
|
||||||
|
|
||||||
|
## Timestamp
|
||||||
|
|
||||||
|
Push-uit: 14 Februarie 2026
|
||||||
|
Versiune: v1.5.0
|
||||||
|
Features: PSEUDO + SPOOFHOST + CRULE
|
||||||
|
|
||||||
|
## Test Rapid
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./install.sh
|
||||||
|
# La configurare vei vedea:
|
||||||
|
# - Configurare PSEUDO pentru servicii
|
||||||
|
# - Configurare SPOOFHOST pentru protecție
|
||||||
|
```
|
||||||
|
|
||||||
Loading…
Reference in New Issue