
ssh-chat in C moderno

Software BBS Generale
SSH-Chatter è nato da una reimplementazione in C del server Go ssh-chat. Rispecchia/estende il comportamento originale utilizzando pattern C moderni e un core piccolo e testabile. Il server ascolta connessioni SSH/TELNET e colloca ogni utente autenticato in una chat room condivisa che espone la stessa superficie di comandi dell'implementazione di riferimento in Go.
Sai perché ci vuole così tanto per capire il C? Perché è un istinto.
/rss list, /rss read <tag>, più /rss add <url> <tag> e /rss del <tag> (solo operatori) così la stanza può navigare i titoli insieme./delete-msg per la pulizia mirata della cronologia chat./bbs che sblocca un sistema di bacheca retrò immersivo con tag, commenti, bumping e un compositore multi-linea.
bumped (attività recente), hot (trend per punteggio e commenti), top (punteggio netto più alto di upvote) o new (data di creazione) usando list [hot|top|new|bumped|all].search <query>.▲ 12 💬 5) direttamente negli elenchi./bbs nella modalità BBS./asciiart con limite di 640 righe, un cooldown di dieci minuti per IP, output multi-linea e scorciatoie da tastiera per annullare con Ctrl+A e inviare con Ctrl+S o il predefinito >/__ARTWORK_END> sensibile alla locale./birthday per registrare compleanni, /grant <ip> così gli operatori LAN possono delegare privilegi per indirizzo, e /revoke <ip> così gli amministratori LAN principali possono reclamarli./ban che accettano indirizzi IP grezzi insieme ai nomi utente./weather <città> per previsioni globali rapide.

Il codice è intenzionalmente compatto in modo che i nuovi contributori possano navigarlo rapidamente:

mainIl branch work diverge regolarmente dallo sviluppo upstream in modo che funzionalità più grandi possano incubare senza interrompere il traffico di produzione. Quando è il momento di sincronizzarsi con main, esegui il pull dell'albero più recente e uniscilo localmente prima di aprire una pull request:```bash
git fetch origin main
git checkout work
git merge --no-ff origin/main
Risolvi eventuali conflitti sul posto (le routine helper in `src/host_aggregate.c` rispecchiano già la struttura usata su `main`, quindi i merge sono generalmente semplici) ed esegui `make` per confermare che la build abbia ancora successo prima di inviare il risultato.
## Hooks di automazione
- `host_snapshot_last_captcha` espone il prompt e la risposta del captcha generato più di recente insieme a un timestamp, in modo che i client esterni possano superare le sfide per conto di automazione non presidiata.
## Rafforzamento della sicurezza
- `scripts/safe_permission.sh` restringe la proprietà e i permessi sui file di dati in esecuzione (stato BBS, stato dei voti, snapshot dei cooldown e stato generale della chat). Eseguilo dopo il deployment per confinare la directory dei dati a `ssh-chatter` e assicurarsi che ogni file sia impostato a `0600`. Sovrascrivi le destinazioni passando percorsi espliciti o esportando `STATE_ROOT` o le corrispondenti variabili d'ambiente `CHATTER_*_FILE` prima dell'esecuzione.
- Un watchdog BBS in background invia periodicamente post e commenti attraverso il pipeline di moderazione AI (Gemini primario con fallback su Ollama). I post segnalati vengono rimossi automaticamente e viene trasmesso un avviso nella stanza.
- I messaggi della chat, le ASCII art e i post/commenti BBS passano attraverso un pipeline di moderazione AI. Abilitalo con `CHATTER_SECURITY_AI=on` (imposta `GEMINI_API_KEY` per Gemini; il demone torna automaticamente al endpoint Ollama locale su `http://127.0.0.1:11434`). Disabilita tutto con `CHATTER_SECURITY_FILTER=off`. Se ogni provider fallisce, il filtro si disabilita automaticamente per mantenere il flusso delle conversazioni invece di eliminare silenziosamente i contenuti.
- Il trasporto SSH è ancorato a scambi di chiave, cifratura e MAC moderni, e ogni payload del bridge è avvolto in un onion AES-256-GCM triplo, così i relay vedono solo testo cifrato.
- I sottomissioni sospette che attivano il filtro a strati vengono ora tracciate per IP; colpi ripetuti attivano un kick e ban automatico quando abilitato, mentre il rilevatore di riconnessione rapida permette finestre di recupero più lunghe in modo che sessioni di rete instabili possano rientrare senza essere penalizzate. Le voci di ban automatico sono **disattivate per impostazione predefinita**; imposta `CHATTER_AUTO_BAN=on` (o `true`/`1`) per abilitarle, oppure lascia la variabile non impostata per mantenere avvisi e limitazioni senza scrivere voci di ban automatico.
- Gli operatori possono contrassegnare punti di ingresso fidati (uscite VPN, proxy inversi, localhost) con `CHATTER_PROTECTED_IPS` (separati da virgola, predefinito a `127.0.0.1,::1,192.168.0.1`) in modo che i ban di emergenza non blocchino mai il demone dal proprio piano di controllo.
## Archiviazione e trasferimento file
- Tutti i file gestiti dagli utenti ora si trovano in `/etc/ssh-chatter/user-files` (sovrascrivi con `CHATTER_FILESTORE_PATH`, fallback legacy: `CHATTER_FILE_STORAGE_ROOT`). Il demone crea la directory se necessario e mantiene gli upload confinati al suo interno.
- I client SSH usano `scp` standard senza wrapper personalizzato. Tratta `/name.ext` come radice dell'albero di archiviazione: `scp my.zip user@host:/demos/my.zip` scrive in `/etc/ssh-chatter/user-files/demos/my.zip` mentre `scp user@host:/readme.txt ./` scarica `/etc/ssh-chatter/user-files/readme.txt`.
- I client TELNET usano i nuovi comandi `/filestore`. `/filestore` elenca i file disponibili, `/filestore-upload` avvia una sessione `rz`, e `/filestore-download <name>` avvia una sessione `sz`. Installa `lrzsz` (o qualsiasi pacchetto che fornisca `rz`/`sz`) sul server così che il backend ZMODEM possa avviare questi helper.
- `/filestore-upload` accetta una destinazione opzionale (ad esempio `/filestore-upload /kitten/meow.png`). SSH-Chatter crea la directory `/kitten` automaticamente e posiziona lì il file caricato, rispecchiando come SCP usa percorsi come `user@host:/kitten/meow.png`.
- Entrambi i trasporti possono essere combinati: SSH per trasferimenti scriptati non presidiati, TELNET per client BBS nostalgici con strumentazione ZMODEM integrata.
## Relay Morse
SSH-Chatter supporta il relay per radioamatori.
Questo mostra i segnali Morse globali.
`/morse on` per vedere, `/morse-reply` per inviare.
### Dettagli del protocollo
L'implementazione segue le specifiche del protocollo Binkp:
- Struttura standard del frame Binkp con header a 2 byte
- Autenticazione tramite password di sessione (CMD\_PWD/CMD\_OK)
- Meccanismo keepalive (CMD\_NUL) ogni 60 secondi
- Comando CHAT personalizzato (CMD\_CHAT, estensione) per la sincronizzazione dei messaggi
## Prerequisiti
Per compilare il progetto è necessario un ambiente POSIX con:
- Un compilatore compatibile con C23 (ad es. `gcc` o `clang`)
- `make`
- Header e librerie di sviluppo `libssh` (`libssh-dev` su Debian/Ubuntu)
- Header e librerie di sviluppo `libcurl` (`libcurl4-openssl-dev` su Debian/Ubuntu)
- Header e librerie di sviluppo `uchardet` (`libuchardet-dev` su Debian/Ubuntu)
- Header e librerie di sviluppo `icu` (International Components for Unicode) (`libicu-dev` su Debian/Ubuntu)
- Libreria di compressione `lz4` e header di sviluppo (`liblz4-dev` su Debian/Ubuntu)
- Thread POSIX (di solito forniti dal sistema `libpthread`)
- `python3-pygments` (fornisce l'evidenziatore `pygmentize` per lo schermo di camuffamento Tetris)
Su Debian/Ubuntu le dipendenze possono essere installate con:```bash
sudo apt-get update
sudo apt-get install build-essential libssh-dev libcurl4-openssl-dev libuchardet-dev libicu-dev liblz4-dev
Clona il repository e usa il Makefile fornito:```bash
make
Questo produce un binario `ssh-chatter` nella root del repository e un oggetto condiviso `libssh_chatter_backend.so` che espone gli helper di traduzione per il riutilizzo in altre applicazioni. Pulisci gli artefatti intermedi con `make clean`.
### Utilizzo del backend di traduzione condiviso
L'oggetto condiviso riutilizza la pipeline di traduzione C del server (inclusa la conservazione dei placeholder ANSI) in modo che altri processi possano ottenere traduzioni senza avviare l'host SSH completo. Collega con `libssh_chatter_backend.so` e includi `include/ssh_chatter/ssh_chatter_backend.h`:```c
#include "ssh_chatter/ssh_chatter_backend.h"
int main(void) {
char translated[4096];
char detected[64];
if (ssh_chatter_backend_translate_line("Hello, world!", "ko", translated, sizeof(translated), detected, sizeof(detected))) {
printf("Detected %s -> %s\n", detected, translated);
}
}
Imposta GEMINI_API_KEY (e opzionalmente GEMINI_API_BASE o GEMINI_MODEL) nell'ambiente in modo che l'helper possa raggiungere l'API Google Generative Language, rispecchiando i requisiti di runtime del demone principale. Puoi eseguire ./scripts/test_gemini_connection.sh prima di avviare il server chat per verificare che le credenziali consentano chiamate in uscita; lo script stampa la risposta grezza di Gemini in modo da vedere se la richiesta è riuscita.
Il server è impostato in ascolto su 0.0.0.0:2222. Puoi regolare i parametri di runtime con i flag disponibili:```
Usage: ./ssh-chatter [-a address] [-p port] [-m motd_file] [-k host_key_dir] [-T telnet_port|off] [-J json_port|off]
./ssh-chatter [-h]
./ssh-chatter [-V]
Quando fornito, `-m` legge il messaggio del giorno dal percorso del file specificato.
Esempi comuni:```bash
# Start the chat server on port 2022, loading host keys from /etc/ssh
./ssh-chatter -p 2022 -k /etc/ssh
# Enable telnet access on 0.0.0.0:4242 alongside SSH
./ssh-chatter -T 0.0.0.0:4242
# Serve a custom MOTD from a file and bind to localhost
./ssh-chatter -a 127.0.0.1 -m /etc/ssh-chatter/motd
La directory delle chiavi host deve contenere un file ssh_host_rsa_key (e opzionalmente il .pub). Generane uno con ssh-keygen -t rsa -b 4096 -f /path/to/dir/ssh_host_rsa_key se non desideri riutilizzare le chiavi host SSH del tuo sistema. Le chiavi host aggiuntive denominate ssh_host_ed25519_key e ssh_host_ecdsa_key vengono caricate automaticamente quando presenti, in modo che il server possa offrire algoritmi moderni durante lo scambio di chiavi.
Una volta in esecuzione, connettiti con qualsiasi client SSH:```bash ssh -p 2222 user@server-address
Il server pubblico è disponibile all'indirizzo `bbs.chatter.pw` sulla porta SSH predefinita:```bash
ssh -p 2222 [email protected]
I nomi utente forniti al prompt SSH vengono usati come nickname della chat.
I client Telnet possono accedere con le stesse funzionalità. L'ascolto Telnet è abilitato per impostazione predefinita sulla porta 2323 e può essere regolato o disattivato con il flag -T. Fornisci -T indirizzo:porta per sovrascrivere l'indirizzo di bind (eredita il bind SSH se omesso; usa un host vuoto come -T :4242 per ascoltare su tutte le interfacce). Ad esempio, per connettersi via telnet da un terminale retro:```bash
telnet server-address 2323
Passa `-T off` (o `-T disable`) per disattivare completamente il listener telnet.
### JSON line API
Il server espone anche un protocollo JSON line su TCP per automazione e integrazioni esterne. Ascolta sulla porta `34567` di default e può essere disabilitato o riconfigurato con `-J`:```bash
# Disable the JSON API
./ssh-chatter -J off
# Bind JSON API on a custom port
./ssh-chatter -J 0.0.0.0:45678
Ogni richiesta è un singolo oggetto JSON terminato da \n. Le risposte e gli eventi di chat sono oggetti JSON, anche delimitati da newline. L'API supporta chat generale e i flussi /poll, /vote, /image, /video, /audio, /files, e /asciiart.
Payload degli eventi (server → client)```json {"type":"event","event":"message","payload":{"id":123,"username":"alice","message":"hello","created_at":1710000000,"system":false,"preserve_whitespace":false,"attachment":{"type":"none","target":"","caption":""}}}
**Esempi di richieste (client → server)**```json
{"type":"chat","id":1,"username":"alice","message":"안녕하세요"}
{"type":"image","id":2,"username":"alice","url":"https://example.com/cat.png","caption":"cat"}
{"type":"asciiart","id":3,"username":"alice","message":" /\\_/\\\\n( o.o )\\\\n > ^ <"}
{"type":"poll","id":4,"username":"op","is_operator":true,"question":"Favorite color?","options":["red","blue","green"]}
{"type":"poll","id":5,"username":"bob","action":"vote","choice":2}
{"type":"vote","id":6,"username":"op","label":"weekend","question":"Plan?","options":["hike","rest"],"allow_multiple":true}
{"type":"vote","id":7,"username":"bob","label":"weekend","action":"vote","choice":1}
Le risposte riportano l'id e includono gli oggetti status, message e, opzionalmente, result:```json
{"type":"response","id":4,"status":"ok","message":"poll started","result":{"poll":{"active":true,"allow_multiple":false,"id":10,"question":"Favorite color?","options":[{"index":1,"text":"red","votes":0},{"index":2,"text":"blue","votes":0}]}}}
Per un esempio eseguibile, vedi `scripts/json_api_example.py`:```bash
python3 scripts/json_api_example.py --url tcp://127.0.0.1:34567 --save /tmp/json_api_output.txt
Viene fornito uno script di supporto per automatizzare l'installazione su sistemi che utilizzano systemd:```bash
sudo ./scripts/install_chatter_service.sh
Cosa fa lo script:
1. Compila il progetto (`make`).
2. Installa il binario risultante in `/usr/local/bin/ssh-chatter`.
3. Crea un utente e gruppo di sistema `ssh-chatter` dedicati (se non esistono già).
4. Crea `/var/lib/ssh-chatter` per lo stato di runtime (inclusa la chiave host SSH) e `/etc/ssh-chatter` per i file di configurazione.
5. Genera una chiave host RSA predefinita in `/var/lib/ssh-chatter/ssh_host_rsa_key` quando manca.
6. Crea un MOTD predefinito in `/etc/ssh-chatter/motd` e un file di override `/etc/ssh-chatter/chatter.env` per la regolazione basata sulle variabili d'ambiente.
7. Scrive `/etc/systemd/system/chatter.service`, ricarica `systemd`, abilita il servizio e lo avvia immediatamente.
L'unità `chatter.service` risultante avvia il server con impostazioni predefinite sensate e concede la capacità `CAP_NET_BIND_SERVICE` in modo che l'account di servizio non root possa associarsi a porte privilegiate se necessario.
### Personalizzare il servizio
È possibile modificare le impostazioni predefinite modificando `/etc/ssh-chatter/chatter.env` e riavviando il servizio:```bash
sudo systemctl edit chatter.service # or edit the environment file directly
sudo systemctl restart chatter.service
Le variabili d'ambiente supportate includono:
CHATTER_BIND_ADDRESS – Indirizzo IP su cui ascoltare (predefinito 0.0.0.0).CHATTER_PORT – Porta TCP esposta ai client (predefinito 2222).CHATTER_MOTD_FILE – Percorso del file del messaggio del giorno (predefinito /etc/ssh-chatter/motd).CHATTER_HOST_KEY_DIR – Directory contenente ssh_host_rsa_key (predefinito /var/lib/ssh-chatter).CHATTER_EXTRA_ARGS – Argomenti aggiuntivi aggiunti all'invocazione di ssh-chatter.CHATTER_VOTE_FILE – Percorso del file di stato del voto (predefinito vote_state.dat).Frammenti di codice per Camouflage:
Per la funzionalità di camouflage Tetris, il runtime si aspetta file di snippet di codice in /var/lib/ssh-chatter/.
Questo repository ora include esempi pronti all'uso in ./camouflage/ (c.txt, cpp.txt, java.txt, go.txt, js.txt, ts.txt, rust.txt).
Copiali nella directory di runtime una volta durante la configurazione:```bash
sudo install -d /var/lib/ssh-chatter
sudo cp camouflage/*.txt /var/lib/ssh-chatter/
Puoi modificare qualsiasi file copiato per personalizzare ciò che appare quando la schermata di mimetizzazione è attiva.
Il supporto per la traduzione ora si basa sull'API Google Gemini. Imposta quanto segue in `chatter.env` (o nell'ambiente) per abilitarlo:
- `GEMINI_API_KEY` – Chiave API segreta utilizzata per autenticare le richieste di traduzione.
- `GEMINI_API_BASE` – Override opzionale per l'URL di base dell'API (predefinito a `https://generativelanguage.googleapis.com/v1beta`).
- `GEMINI_MODEL` – Override opzionale per il nome del modello Gemini (predefinito a `gemini-2.5-flash`).
Quando la traduzione è attiva, la chat consegna ogni messaggio immediatamente nella lingua originale e lo segue con una didascalia
rientrata che contiene il testo tradotto una volta che la risposta di Gemini arriva. I riepiloghi delle reazioni utilizzano lo stesso stile di didascalia in modo che
gli aggiornamenti appaiano direttamente sotto il messaggio a cui si riferiscono.
Se gli inserimenti di didascalie in linea risultano fastidiosi, puoi riservare in anticipo un piccolo buffer di righe vuote con `/chat-spacing <0-5>`.
L'impostazione riguarda solo i thread di chat in diretta—il contenuto della bacheca continua a tradursi senza riserva—così puoi regolare la
spaziatura per la tua sessione senza influenzare i post lunghi.
La tua opzione di traduzione e le scelte linguistiche vengono salvate in `chatter_state.dat`, quindi le sessioni future ripristinano automaticamente la stessa
configurazione una volta che ti riconnetti.
Se preferisci installare senza avviare immediatamente il servizio, esegui lo script con `SKIP_START=1`.
Comandi di gestione del servizio:```bash
sudo systemctl status chatter.service
sudo systemctl restart chatter.service
sudo systemctl disable --now chatter.service
-m o file di configurazione gestito dal servizio./help per i client connessi./ban, /poke)./weather/vote e alternative a scelta singola /vote-single, incluso /elect <label> <choice> come abbreviazione di voto testuale./bbs con tagging, commenti, "bump" e un compositore interattivo che termina con un terminatore sensibile alla lingua (predefinito >/__BBS_END>).Issue e pull request sono benvenuti. Si prega di includere i passaggi per riprodurre i bug e assicurarsi che make abbia successo prima di inviare le modifiche.
| Percorso | Descrizione |
|---|
src/main.c | Analisi della riga di comando e bootstrap del processo (indirizzo di bind, porta, MOTD, directory delle chiavi host). |
src/host_aggregate.c, include/ssh_chatter/host.h | Implementazione dell'host chat – ciclo di vita della sessione, gestione MOTD e hook per la futura logica di broadcast dei messaggi. |
src/host | Sottosistemi host modulari che compilano in una singola unità di traduzione tramite src/host_aggregate.c. |
include/ssh_chatter | Header condivisi per il demone, strumenti di stress e il backend di traduzione. |
include/ssh_chatter/contexts | Definizioni per session_ctx_t e strutture correlate che incapsulano lo stato per connessione. |
data/banner/banner | Banner di benvenuto di esempio a cui si può puntare con CHATTER_WELCOME_BANNER. |
scripts/install_chatter_service.sh | Installer di comodo che compila il binario, lo installa in /usr/local/bin e configura un'unità systemd (chatter.service). |
scripts/install_dependencies.sh | Installer di pacchetti minimo per i prerequisiti di build su sistemi Debian/Ubuntu. |
CHATTER_GEMINI_COOLDOWN_FILE – Percorso del file di stato del cooldown Gemini (predefinito gemini_cooldown.dat).CHATTER_SECURITY_FILTER – Imposta su off/false/0 per disabilitare il filtro di sicurezza a più livelli (abilitato per impostazione predefinita).CHATTER_SECURITY_AI – Imposta su on/true/1 per abilitare la moderazione AI (disabilitato per impostazione predefinita).CHATTER_FILESTORE_PATH – Sostituisce il percorso di archiviazione dei file gestiti (predefinito /etc/ssh-chatter/user-files).CHATTER_FILE_STORAGE_ROOT – Fallback legacy per il percorso di archiviazione dei file gestiti.CHATTER_MAX_ALLOC_BYTES – Limite superiore per un singolo tentativo di allocazione contigua nel gestore di memoria interno. Per impostazione predefinita non c'è limite (SIZE_MAX). Imposta questo solo se vuoi imporre un limite rigido su una singola allocazione. Imposta su 0, unlimited, inf o infinity per rimuovere esplicitamente qualsiasi limite./asciiart con bozze da 640 righe, un cooldown di pubblicazione di dieci minuti per IP, consegna su più righe e scorciatoie Ctrl+A/Ctrl+S./game con tetris integrato (transcodificato dall'implementazione C originale dell'era sovietica) e liargame, entrambi sospendibili tramite /suspend! o Ctrl+Z.