diff --git a/Home.md b/Home.md index cdb8d0e..2e4c666 100644 --- a/Home.md +++ b/Home.md @@ -1 +1,84 @@ -init \ No newline at end of file +# Oasis para escritorio — rama de desarrollo experimental + +> # ⚠ ESTO NO ES OASIS OFICIAL +> +> Esta wiki documenta una **rama de desarrollo experimental** mantenida por el +> hacklab, **sin afiliación** con el proyecto original. +> +> ## El Oasis oficial es el de epsylon: https://github.com/epsylon/oasis +> +> Si quieres **usar Oasis de verdad, instala el oficial**. Lo que se documenta aquí +> puede romperse, cambiar de forma incompatible o desaparecer sin aviso. No está +> auditado y no tiene garantía de ninguna clase. +> +> **Los fallos de esta rama se reportan aquí, nunca a epsylon.** + +Versión base: **Oasis 0.9.5**. Rama: `PRUEBAS`. + +--- + +## Qué añade respecto al oficial + +Una sola cosa, pero grande: **Karvan**, un módulo de salas efímeras con llamadas. + +![Oasis de escritorio con el menú lateral](img/01-escritorio-menu.png) + +El resto es Oasis 0.9.5 tal cual. La interfaz es la del proyecto original: el menú +lateral por grupos, no la rejilla de hexágonos, que es de la versión para móvil. + +| | | +|---|---| +| **[Karvan](Karvan)** | Salas que viven solo en memoria y se autodestruyen | +| **[Llamadas](Llamadas)** | Audio y vídeo sobre WebRTC, sin servidores de terceros | +| **[Instalar](Instalar)** | Igual que el oficial | +| **[Estado](Roadmap)** | Qué funciona y qué no | + +--- + +## Instalación + +Exactamente igual que el Oasis oficial: + +```sh +cd src/server && npm install +cd ../.. && ./oasis.sh +``` + +Karvan aparece en el menú lateral, en el grupo de comunicación, junto a los chats. Se +puede apagar desde `/modules` como cualquier otro módulo. + +--- + +## Relación con la versión para móvil + +Hay un repositorio hermano, **OASIS_MOBILE**, con la versión de Android: misma base y +mismo módulo Karvan, pero con una interfaz distinta pensada para el pulgar. + +El código de Karvan es el mismo en ambos. Lo que cambia es el enganche: aquí un enlace +en el menú lateral siguiendo el patrón del proyecto original, allí una rejilla de +hexágonos. + +--- + +## Cómo está organizado el código + +El código propio vive separado de los ficheros del proyecto original: + +``` +src/models/karvan_model.js las salas y su ciclo de vida +src/views/karvan_view.js la interfaz de la sala +src/backend/fork_routes.js las rutas del módulo +src/backend/turnCredentials.js credenciales efímeras para TURN +src/client/public/js/karvan.js el cliente WebRTC del navegador +src/client/assets/styles/karvan.css los estilos del módulo +``` + +Sobre los ficheros de upstream solo hay **enganches de una línea**. El motivo: +epsylon publica una versión cada dos a cuatro días, y así cada una se integra sin +arrastrar nada. + +--- + +## Licencia + +AGPL-3.0, la misma que el proyecto original. diff --git a/Instalar.md b/Instalar.md new file mode 100644 index 0000000..caf845c --- /dev/null +++ b/Instalar.md @@ -0,0 +1,42 @@ +# Instalar + +> ⚠ Rama experimental, no oficial. El Oasis oficial es +> https://github.com/epsylon/oasis · [Volver a la portada](Home) + +Igual que el Oasis oficial, porque es el mismo árbol con un módulo más. + +```sh +git clone https://gitea.laenre.net/hacklab/OASIS_LINUX.git +cd OASIS_LINUX/src/server && npm install +cd ../.. && ./oasis.sh +``` + +Abre `http://localhost:3000`. + +## Activar Karvan + +Viene activado. Si no lo ves en el menú lateral, míralo en `/modules`. + +## Configurar un TURN + +Solo si quieres llamadas fuera de tu red local. En `src/configs/oasis-config.json`: + +```json +"rtc": { + "stun": ["stun:tu.pub:3478"], + "turn": { "urls": ["turn:tu.pub:3478"], "secret": "", "ttlSec": 3600 }, + "relayOnly": false +} +``` + +De fábrica está vacío: **sin servidores de terceros**. Ver [Llamadas](Llamadas) para +el porqué y para cómo endurecer coturn. + +## Si vienes del Oasis oficial + +Tu identidad y tus datos están en `~/.ssb` y esta rama los usa igual. Aun así, **haz +copia de seguridad antes de probar**: es una rama experimental. + +> ⚠ **No ejecutes esta rama y el Oasis oficial a la vez con la misma identidad.** +> Publicar desde dos sitios con el mismo `secret` **parte tu registro y lo deja +> inservible para siempre**. No es recuperable. diff --git a/Karvan.md b/Karvan.md new file mode 100644 index 0000000..62d7983 --- /dev/null +++ b/Karvan.md @@ -0,0 +1,68 @@ +# Karvan — salas efímeras + +> ⚠ Rama experimental, no oficial. El Oasis oficial es +> https://github.com/epsylon/oasis · [Volver a la portada](Home) + +Salas de chat que **viven solo en memoria** y se destruyen solas. Nada se escribe en +disco ni en el registro de SSB. + + +## Cómo funciona + +Al crear una sala eliges cuánto vive. A partir de ahí: + +- **Se autodestruye por inactividad** (30 minutos por defecto) y **por tiempo + absoluto** (2 horas), lo que ocurra antes. El plazo absoluto no se renueva con la + actividad: la sala muere igual. +- Al vencer, **se borra todo**: mensajes, señales y la lista de miembros. +- Si reinicias Oasis, las salas desaparecen. Es lo correcto: solo existían en memoria. + +## Quién puede entrar + +**Quien tenga el enlace.** El identificador de la sala son 72 bits al azar y es la +única credencial que existe. No hay lista de miembros ni permisos. + +Esto es deliberado —así una sala se comparte pegando un enlace— pero conviene tenerlo +claro: **cualquiera con el enlace entra**, y quien esté dentro puede pasárselo a otro. + +Para invitar a un contacto sin pegar el enlace en ningún sitio, el botón de invitación +le manda un **mensaje privado de SSB** con el enlace dentro. + +## Límites + +Existen para que una sala no pueda tumbar el nodo: + +| | | +|---|---| +| Mensajes que se conservan | 250 (los más recientes) | +| Salas a la vez | 100 | +| Miembros por sala | 50 | +| Tamaño de señalización | 16 KiB | +| Texto por mensaje | 2000 caracteres | + +## Funciona sin JavaScript + +El chat es utilizable **con JavaScript desactivado**: escribir manda un formulario y +la página se recarga sola cada diez segundos para traer los mensajes nuevos. + +Con JavaScript activado se añade un canal directo entre navegadores, y entonces los +mensajes llegan al instante sin pasar por el servidor. + +## Qué protege y qué no + +**Protege**: los mensajes no tocan el disco, no entran en tu registro de SSB y +desaparecen solos. No queda rastro que replicar ni que incautar después. + +**No protege**: + +- El **servidor ve los mensajes** que pasan por él. Solo el canal directo entre + navegadores queda fuera de su alcance. +- Mientras la sala existe, sus **metadatos existen** en memoria: quién está dentro, + cuándo se creó. +- El **relay entre dispositivos** sí publica mensajes privados de SSB, que **son + permanentes**. Es lo que permite que una sala funcione entre tu móvil y tu + ordenador, pero conviene saberlo: eso ya no es efímero. +- Quien tenga el enlace entra, como se explica arriba. + +Karvan sirve para conversaciones que no quieres conservar. **No es una herramienta +contra un adversario que ya controla tu dispositivo o el servidor.** diff --git a/Llamadas.md b/Llamadas.md new file mode 100644 index 0000000..b574a14 --- /dev/null +++ b/Llamadas.md @@ -0,0 +1,97 @@ +# Llamadas de audio y vídeo + +> ⚠ Rama experimental, no oficial. El Oasis oficial es +> https://github.com/epsylon/oasis · [Volver a la portada](Home) + +Dentro de una sala de [Karvan](Karvan) hay un botón de llamada. El audio y el vídeo +van **directamente entre los participantes** por WebRTC, cifrados de extremo a extremo +por el propio protocolo. + +## Permisos de cámara y micrófono + +En escritorio los pide el navegador directamente, la primera vez que inicias una +llamada. No hay nada especial que configurar. + +En la versión de Android hizo falta un envoltorio propio para poder concederlos; aquí +no aplica. + +## Sin servidores de terceros + +Casi todas las aplicaciones con WebRTC traen configurado un servidor STUN público, +normalmente de Google. **Aquí no hay ninguno.** + +El motivo: un servidor STUN aprende **la IP pública y el momento exacto de cada +consulta**. Con la configuración habitual, cada llamada le estaría diciendo a Google +que ese usuario está llamando ahora. En un proyecto con esta postura sobre la +privacidad, no se sostiene. + +Por defecto solo se usan **candidatos host**: funciona en la misma red local y con +routers domésticos amables. Se prefiere degradar a nada antes que a un tercero. + +## Si necesitas atravesar NAT + +Con datos móviles o detrás de CGNAT hará falta un servidor TURN. La configuración va +en `oasis-config.json`: + +```json +"rtc": { + "stun": ["stun:tu.pub:3478"], + "turn": { + "urls": ["turn:tu.pub:3478"], + "secret": "", + "ttlSec": 3600 + }, + "relayOnly": false +} +``` + +Con `secret` se generan credenciales que **caducan solas** (mecanismo REST de coturn): +no hay usuarios que dar de alta y una credencial filtrada vale una hora. + +Con `relayOnly: true` **toda** la media pasa por el TURN, de modo que ningún +participante ve la dirección IP del otro. Cuesta ancho de banda del servidor, pero es +lo que hay que activar si los participantes no deberían conocer sus IPs. + +### Si montas el TURN, endurécelo + +Un TURN mal configurado es un **relay abierto** hacia la red interna del servidor. +Como mínimo, en `turnserver.conf`: + +``` +use-auth-secret +static-auth-secret=<32 bytes aleatorios, fichero con permisos 600> +realm= +fingerprint + +no-loopback-peers +no-multicast-peers +denied-peer-ip=10.0.0.0-10.255.255.255 +denied-peer-ip=172.16.0.0-172.31.255.255 +denied-peer-ip=192.168.0.0-192.168.255.255 +denied-peer-ip=169.254.0.0-169.254.255.255 +denied-peer-ip=100.64.0.0-100.127.255.255 +denied-peer-ip=127.0.0.0-127.255.255.255 +denied-peer-ip= + +user-quota=12 +total-quota=1200 +max-bps=1500000 +``` + +La última línea de `denied-peer-ip` es la que casi todo el mundo olvida: +`no-loopback-peers` impide llegar a `127.0.0.1`, **pero no impide que alguien pida un +relay hacia la IP pública de tu propia máquina** y alcance así tu puerto de SSB o tu +servidor web. Sin esa línea, tu TURN es una puerta a tus propios servicios. + +Compruébalo con `turnutils_uclient` contra una IP privada y contra la IP pública del +servidor: **las dos deben fallar**. + +## Limitaciones honestas + +- **Un participante = un nodo.** Dos pestañas del mismo Oasis comparten identidad y no + se enlazan entre sí. Para probar de verdad hacen falta dos nodos distintos. +- **Sin TURN, con datos móviles casi nunca conectará.** El CGNAT de los operadores lo + impide. +- La señalización pasa por el servidor de la sala: un servidor comprometido podría + colocarse en medio. La media va cifrada extremo a extremo, pero **quien controla la + señalización controla con quién crees que hablas**. diff --git a/Roadmap.md b/Roadmap.md new file mode 100644 index 0000000..cfa5155 --- /dev/null +++ b/Roadmap.md @@ -0,0 +1,24 @@ +# Estado + +> ⚠ Rama experimental, no oficial. El Oasis oficial es +> https://github.com/epsylon/oasis · [Volver a la portada](Home) + +## Hecho + +- Base **Oasis 0.9.5**, al día con el proyecto oficial. +- **[Karvan](Karvan)** con su enlace en el menú lateral, siguiendo el mismo patrón que + el resto de módulos. +- Estilos del módulo en su propia hoja, para que se vea igual con cualquier tema. +- **Sin STUN de terceros**, con configuración para TURN propio. + +## Sin empezar + +- Poner en marcha un TURN en un pub. +- Varias identidades en el mismo equipo con cambio desde la interfaz. +- Empaquetado `.deb` de esta rama. + +## Diferencias con la versión para móvil + +La versión de Android lleva además una interfaz propia (hexágonos, barra de accesos +rápidos) y algunos módulos recortados por peso. Aquí no: la interfaz es la del +proyecto original y están todos los módulos. diff --git a/img/01-escritorio-menu.png b/img/01-escritorio-menu.png new file mode 100644 index 0000000..98f3bcb Binary files /dev/null and b/img/01-escritorio-menu.png differ