wiki: documentacion de la rama, con aviso de que no es Oasis oficial
Siete paginas: portada, Karvan, llamadas, interfaz, como compilar la APK, que NO tiene y hoja de ruta. Con capturas propias tomadas de esta build a 412x915. El aviso de rama experimental va arriba de la portada y repetido en la cabecera de cada pagina, porque la gente entra por enlaces directos y no siempre por el indice. Con enlace al repositorio oficial de epsylon y la indicacion de que los fallos de esta rama se reportan aqui, no a el. La pagina de limitaciones dice lo que falla sin adornos: que en movil no se eliminan los metadatos EXIF de las fotos —con la ubicacion dentro—, que el DNS va a Google y Cloudflare, que la contrasena de la copia de seguridad viaja en la URL, y que el envoltorio de Android compila pero todavia no se ha probado en un movil.
87
Compilar.md
Normal file
|
|
@ -0,0 +1,87 @@
|
||||||
|
# Compilar la APK
|
||||||
|
|
||||||
|
> ⚠ Rama experimental, no oficial. El Oasis oficial es
|
||||||
|
> https://github.com/epsylon/oasis · [Volver a la portada](Home)
|
||||||
|
|
||||||
|
La APK se construye con un **proyecto Gradle propio**, en `android/`. Ya no se parte
|
||||||
|
del APK oficial como molde.
|
||||||
|
|
||||||
|
## Qué se reutiliza y qué es nuevo
|
||||||
|
|
||||||
|
Tres bibliotecas nativas se toman tal cual del APK existente:
|
||||||
|
|
||||||
|
| Fichero | Qué es |
|
||||||
|
|---|---|
|
||||||
|
| `libnode.so` | **nodejs-mobile v18.20.4 oficial** (OpenSSL 3.0.13+quic). Artefacto público: no hay que compilar Node |
|
||||||
|
| `libnative-lib.so` | 6,8 KB. Un solo símbolo JNI que arranca Node |
|
||||||
|
| `libc++_shared.so` | Runtime de C++ |
|
||||||
|
|
||||||
|
Por eso el `namespace` del módulo es `com.solarnethub.oasis`: JNI resuelve por nombre
|
||||||
|
y la clase puente tiene que vivir en ese paquete. El identificador de la aplicación sí
|
||||||
|
es propio, `net.laenre.oasis`, y por eso se instala junto a la oficial.
|
||||||
|
|
||||||
|
**No hace falta el NDK.**
|
||||||
|
|
||||||
|
## Pasos
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# 1. bibliotecas nativas y empaquetado del backend
|
||||||
|
cd android
|
||||||
|
./scripts/prepare.sh ../../oasis_mobile # o la ruta de un APK
|
||||||
|
|
||||||
|
# 2. compilar
|
||||||
|
./gradlew assembleDebug # o assembleRelease para firmar
|
||||||
|
```
|
||||||
|
|
||||||
|
### De dónde sale `node_modules`
|
||||||
|
|
||||||
|
Esto no es obvio y es donde se atasca cualquiera que lo intente.
|
||||||
|
|
||||||
|
El `node_modules` del móvil **no es el que produce un `npm install` normal**: son unos
|
||||||
|
137 MB podados y **sin un solo binario nativo**, frente a 1,4 GB con 35 binarios de
|
||||||
|
una instalación de escritorio. Por eso el arranque fuerza criptografía en JavaScript
|
||||||
|
puro.
|
||||||
|
|
||||||
|
`prepare.sh` lo saca del APK base y sustituye solo el código. Es seguro porque las 98
|
||||||
|
dependencias son idénticas entre versiones.
|
||||||
|
|
||||||
|
Si algún día lo rellenas con un `npm install` normal, la APK se llevará binarios de
|
||||||
|
Linux de escritorio que en Android no sirven, y pesará diez veces más.
|
||||||
|
|
||||||
|
## Firmar
|
||||||
|
|
||||||
|
La contraseña **nunca** en el repositorio ni en `gradle.properties`:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
export OASIS_KEYSTORE=/ruta/oasis-alfa-key.jks
|
||||||
|
export OASIS_KEYSTORE_PASS=...
|
||||||
|
export OASIS_KEY_ALIAS=oasis
|
||||||
|
./gradlew assembleRelease
|
||||||
|
```
|
||||||
|
|
||||||
|
Y comprobar siempre antes de publicar:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
apksigner verify --print-certs app-release.apk
|
||||||
|
unzip -l app-release.apk | grep nodejs-project.zip # debe pesar más de 20 MB
|
||||||
|
aapt dump permissions app-release.apk | grep -E "CAMERA|RECORD_AUDIO"
|
||||||
|
```
|
||||||
|
|
||||||
|
La segunda línea importa: si el backend no se empaquetó bien, la APK compila,
|
||||||
|
instala y arranca **sin Oasis dentro**.
|
||||||
|
|
||||||
|
## Requisitos
|
||||||
|
|
||||||
|
JDK 17 o superior **con compilador**. Ojo: el OpenJDK de algunas distribuciones es
|
||||||
|
solo runtime y no trae `javac`; el proyecto apunta al JDK que trae Android Studio.
|
||||||
|
|
||||||
|
## Mejoras del envoltorio propio
|
||||||
|
|
||||||
|
- `targetSdk 35`.
|
||||||
|
- Tráfico sin cifrar permitido **solo hacia el propio dispositivo**, en vez de
|
||||||
|
permitido en general.
|
||||||
|
- Copia de seguridad de Android **desactivada**: `adb backup` ya no puede sacar tu
|
||||||
|
identidad de SSB.
|
||||||
|
- El backend corre como servicio en primer plano, así que **sobrevive en segundo
|
||||||
|
plano**. Antes se declaraba el permiso pero no había servicio, y el backend moría al
|
||||||
|
salir de la app.
|
||||||
72
Home.md
|
|
@ -1 +1,71 @@
|
||||||
prueba
|
# Oasis Mobile — 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é es esto
|
||||||
|
|
||||||
|
Una rama que sigue de cerca las versiones de epsylon y añade dos cosas: una interfaz
|
||||||
|
pensada para el móvil y un módulo de **salas efímeras con llamadas**.
|
||||||
|
|
||||||
|
| | |
|
||||||
|
|---|---|
|
||||||
|
| **[Karvan](Karvan)** | Salas que viven solo en memoria y se autodestruyen |
|
||||||
|
| **[Llamadas](Llamadas)** | Audio y vídeo sobre WebRTC, sin servidores de terceros |
|
||||||
|
| **[La interfaz](Interfaz)** | Hexágonos, barra de accesos rápidos y por qué son así |
|
||||||
|
| **[Compilar la APK](Compilar)** | Cómo se construye, de dónde sale cada pieza |
|
||||||
|
| **[Estado y hoja de ruta](Roadmap)** | Qué funciona, qué no, y qué está bloqueado |
|
||||||
|
| **[Qué NO tiene](Limitaciones)** | Lo que falta respecto al oficial, sin adornos |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## La interfaz
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
La navegación es una rejilla de hexágonos por categorías, con una barra de accesos
|
||||||
|
rápidos abajo que el usuario configura, y arriba los filtros Personal y Community.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Cómo se instala
|
||||||
|
|
||||||
|
La APK **no está en ninguna tienda**. Se descarga de las *releases* de este
|
||||||
|
repositorio y se instala a mano, con "orígenes desconocidos" activado.
|
||||||
|
|
||||||
|
Se instala **junto al Oasis oficial** sin pisarlo: el identificador de aplicación es
|
||||||
|
`net.laenre.oasis`, distinto del oficial. Puedes tener los dos y comparar.
|
||||||
|
|
||||||
|
> **Verifica siempre la huella de la firma** antes de instalar una APK descargada de
|
||||||
|
> un servidor propio. La huella de cada versión se publica en su release.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Aviso sobre privacidad
|
||||||
|
|
||||||
|
Esta rama **no elimina los metadatos EXIF** de las imágenes que subes desde el móvil,
|
||||||
|
**incluida la ubicación GPS** si la cámara la guarda. El limpiador de metadatos del
|
||||||
|
código depende de una biblioteca que no se empaqueta en Android.
|
||||||
|
|
||||||
|
Hasta que se resuelva: **quita la ubicación de las fotos antes de subirlas**, o
|
||||||
|
desactiva el guardado de ubicación en la cámara. Ver [Limitaciones](Limitaciones).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Licencia
|
||||||
|
|
||||||
|
AGPL-3.0, la misma que el proyecto original.
|
||||||
|
|
|
||||||
61
Interfaz.md
Normal file
|
|
@ -0,0 +1,61 @@
|
||||||
|
# La interfaz
|
||||||
|
|
||||||
|
> ⚠ Rama experimental, no oficial. El Oasis oficial es
|
||||||
|
> https://github.com/epsylon/oasis · [Volver a la portada](Home)
|
||||||
|
|
||||||
|
Es la diferencia más visible con el Oasis oficial. Está pensada para el pulgar, no
|
||||||
|
para el ratón.
|
||||||
|
|
||||||
|
## La pantalla principal
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Tres piezas:
|
||||||
|
|
||||||
|
- **Arriba**: logo, los filtros **Personal** y **Community**, y tu avatar.
|
||||||
|
- **En medio**: la rejilla de **hexágonos**, diez categorías que se despliegan al
|
||||||
|
tocarlas. Las categorías son puro CSS: funcionan sin JavaScript.
|
||||||
|
- **Abajo**: la **barra de accesos rápidos**, configurable.
|
||||||
|
|
||||||
|
## Los filtros Personal y Community
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Parten las diez categorías en dos mitades de cinco, para no tener que buscar entre
|
||||||
|
todas. Sin filtro se ven las diez.
|
||||||
|
|
||||||
|
## La barra de accesos rápidos
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Cuatro atajos que eliges tú, más un par fijo a la derecha. Se configuran con el lápiz.
|
||||||
|
|
||||||
|
## Módulos
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Cada módulo se enciende y se apaga por separado, igual que en el Oasis oficial.
|
||||||
|
|
||||||
|
## Por qué la interfaz vive aparte
|
||||||
|
|
||||||
|
Todo esto está en ficheros propios (`src/views/fork/hive_nav.js`) en vez de dentro de
|
||||||
|
los ficheros del proyecto original. No es manía: **epsylon publica una versión cada
|
||||||
|
dos a cuatro días** y reescribe a fondo justo los ficheros donde antes vivía esta
|
||||||
|
interfaz.
|
||||||
|
|
||||||
|
Con la separación, sobre los ficheros de upstream solo quedan **enganches de una
|
||||||
|
línea**, y una versión nueva se integra sin arrastrar nada. Antes eran unas 90
|
||||||
|
divergencias; ahora `backend.js` diverge en unas 30 líneas y `main_views.js` en unas
|
||||||
|
40, casi todas enganches.
|
||||||
|
|
||||||
|
Es lo que permite ir al día sin perder la interfaz por el camino.
|
||||||
|
|
||||||
|
## Sin JavaScript en la navegación
|
||||||
|
|
||||||
|
Se mantiene el criterio del proyecto original: la navegación no usa JavaScript. Los
|
||||||
|
desplegables son CSS, los filtros son formularios y los cambios de estado son envíos
|
||||||
|
con recarga.
|
||||||
|
|
||||||
|
La única excepción son las **llamadas**, que no pueden existir sin JavaScript. Van en
|
||||||
|
un fichero aparte servido desde el propio Oasis, del mismo modo que el visor de PDF
|
||||||
|
que el proyecto oficial ya incluye — y **solo se carga en la página de una sala**.
|
||||||
69
Karvan.md
Normal file
|
|
@ -0,0 +1,69 @@
|
||||||
|
# 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.**
|
||||||
69
Limitaciones.md
Normal file
|
|
@ -0,0 +1,69 @@
|
||||||
|
# Qué NO tiene, y qué falla
|
||||||
|
|
||||||
|
> ⚠ Rama experimental, no oficial. El Oasis oficial es
|
||||||
|
> https://github.com/epsylon/oasis · [Volver a la portada](Home)
|
||||||
|
|
||||||
|
Esta página existe porque una rama experimental honesta dice lo que falla. Si buscas
|
||||||
|
la lista de virtudes, está en la [portada](Home).
|
||||||
|
|
||||||
|
## Los metadatos EXIF no se eliminan en el móvil
|
||||||
|
|
||||||
|
**El más importante.** Al subir una foto desde Android, **sus metadatos viajan
|
||||||
|
intactos, incluida la ubicación GPS** si la cámara la guardó.
|
||||||
|
|
||||||
|
El código tiene un limpiador de metadatos, pero depende de una biblioteca con
|
||||||
|
componentes nativos que **no se empaqueta en Android** (el paquete móvil no lleva
|
||||||
|
ningún binario nativo, a propósito). El limpiador comprueba si está disponible y, si
|
||||||
|
no, **devuelve la imagen sin tocar**.
|
||||||
|
|
||||||
|
Mientras no se resuelva: **quita la ubicación de las fotos antes de subirlas**, o
|
||||||
|
desactiva el guardado de ubicación en tu cámara.
|
||||||
|
|
||||||
|
## Consultas de DNS a Google y Cloudflare
|
||||||
|
|
||||||
|
El arranque del backend en Android fija los servidores DNS a `8.8.8.8`, `1.1.1.1` y
|
||||||
|
`8.8.4.4`. Cada resolución de nombre pasa por Google o Cloudflare, y en redes que
|
||||||
|
filtren DNS externo puede directamente no funcionar.
|
||||||
|
|
||||||
|
## Módulos que no están
|
||||||
|
|
||||||
|
- **Inteligencia artificial**: fuera. El modelo son unos 4 GB.
|
||||||
|
- **housing**: portado pero apagado.
|
||||||
|
- **Descubrimiento en red local**: desactivado en el móvil.
|
||||||
|
|
||||||
|
## Traducciones incompletas
|
||||||
|
|
||||||
|
De las claves propias de la rama, **solo el castellano está completo**. Los otros diez
|
||||||
|
idiomas caen al inglés. No se han traducido a máquina a propósito: una traducción sin
|
||||||
|
alguien que la revise da una falsa sensación de cobertura.
|
||||||
|
|
||||||
|
## Cosas que aún no se han probado en un dispositivo real
|
||||||
|
|
||||||
|
El envoltorio propio de Android **compila y genera una APK correcta**, con los
|
||||||
|
permisos y el método que faltaba. Pero **no se ha probado todavía en un móvil
|
||||||
|
físico**: que arranque el backend, que la interfaz cargue y que la cámara funcione al
|
||||||
|
pulsar Llamar.
|
||||||
|
|
||||||
|
Hasta que eso esté comprobado, trátalo como lo que es: código que compila.
|
||||||
|
|
||||||
|
## Subir ficheros desde el navegador interno
|
||||||
|
|
||||||
|
El envoltorio propio **todavía no implementa el diálogo de selección de ficheros** del
|
||||||
|
navegador interno. Los botones de subir imagen o documento pueden no abrir nada.
|
||||||
|
Es hermano del problema de los permisos de cámara, y se arregla igual.
|
||||||
|
|
||||||
|
## La contraseña de la copia de seguridad viaja en la dirección
|
||||||
|
|
||||||
|
La exportación de identidad se hace con una petición que **lleva la contraseña en la
|
||||||
|
URL**, con lo que acaba en el historial del navegador y en los registros. Está
|
||||||
|
pendiente de volver a enviarse en el cuerpo de la petición.
|
||||||
|
|
||||||
|
## Un participante por nodo en las llamadas
|
||||||
|
|
||||||
|
Dos pestañas del mismo Oasis comparten identidad y no se enlazan entre sí.
|
||||||
|
|
||||||
|
## Y lo que se descartó a propósito
|
||||||
|
|
||||||
|
- **Subtemas en el foro**: la rama tenía un intento a medias que además rompía los
|
||||||
|
hilos. Se quitó. El proyecto oficial ya tiene subtemas de primera clase.
|
||||||
|
- **Selector de chats propio**: el oficial trae uno mejor. Se adoptó el suyo.
|
||||||
102
Llamadas.md
Normal file
|
|
@ -0,0 +1,102 @@
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
## Los permisos se piden al llamar, no al instalar
|
||||||
|
|
||||||
|
La app **declara** los permisos de cámara y micrófono porque Android obliga a que la
|
||||||
|
lista sea fija y se decida al compilar. Pero **no se conceden al instalar**: son
|
||||||
|
permisos peligrosos y el sistema los pide **la primera vez que pulsas Llamar**.
|
||||||
|
|
||||||
|
Si nunca llamas, no se te pide nada y la aplicación no accede a la cámara ni al
|
||||||
|
micrófono.
|
||||||
|
|
||||||
|
Esto no era posible con la APK anterior: el envoltorio de Android que se venía usando
|
||||||
|
no implementaba el método que concede permisos al contenido web, así que el navegador
|
||||||
|
interno **denegaba siempre** el acceso por mucho que se declararan los permisos.
|
||||||
|
|
||||||
|
## 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": "<el static-auth-secret de tu coturn>",
|
||||||
|
"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=<tu dominio>
|
||||||
|
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=<LA IP PÚBLICA DEL PROPIO SERVIDOR>
|
||||||
|
|
||||||
|
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**.
|
||||||
52
Roadmap.md
Normal file
|
|
@ -0,0 +1,52 @@
|
||||||
|
# Estado y hoja de ruta
|
||||||
|
|
||||||
|
> ⚠ Rama experimental, no oficial. El Oasis oficial es
|
||||||
|
> https://github.com/epsylon/oasis · [Volver a la portada](Home)
|
||||||
|
|
||||||
|
Sin fechas: esto se hace cuando se puede.
|
||||||
|
|
||||||
|
## Hecho
|
||||||
|
|
||||||
|
- **Al día con Oasis 0.9.5**, con los módulos nuevos del proyecto oficial (encuestas,
|
||||||
|
blogs, coincidencias, menciones) integrados y accesibles desde los hexágonos.
|
||||||
|
- **El código propio, separado** de los ficheros de upstream, que es lo que permite
|
||||||
|
seguir el ritmo de versiones sin perder la interfaz.
|
||||||
|
- **[Karvan](Karvan)**: salas efímeras con autodestrucción, funcionando sin JavaScript.
|
||||||
|
- **[Envoltorio Android propio](Compilar)**: resuelve el bloqueo que impedía las
|
||||||
|
videollamadas, y de paso mejora la seguridad del empaquetado.
|
||||||
|
- **Fuera el STUN de Google**, con configuración para TURN propio.
|
||||||
|
- **Traducción al castellano** de todo el módulo de salas, que antes salía en inglés.
|
||||||
|
|
||||||
|
## En curso
|
||||||
|
|
||||||
|
- Probar el envoltorio en un móvil real. Es lo único que separa a las videollamadas de
|
||||||
|
funcionar de verdad.
|
||||||
|
- Poner en marcha un TURN en un pub para las llamadas fuera de la red local.
|
||||||
|
|
||||||
|
## Sin empezar
|
||||||
|
|
||||||
|
- **Varias identidades en el mismo dispositivo**, con cambio desde la interfaz.
|
||||||
|
El diseño está: el obstáculo real no es técnico sino de seguridad — hay que impedir
|
||||||
|
que dos dispositivos publiquen con la misma identidad, porque eso **parte el registro
|
||||||
|
y la mata para siempre**.
|
||||||
|
- **Automatizar la construcción**: que una versión nueva del proyecto oficial genere
|
||||||
|
la APK firmada y publicada sola.
|
||||||
|
- **Limpiar los metadatos EXIF** en el móvil (ver [Limitaciones](Limitaciones)).
|
||||||
|
- **Diálogo de selección de ficheros** en el navegador interno.
|
||||||
|
|
||||||
|
## Bloqueado, y por qué
|
||||||
|
|
||||||
|
- **Play Store**: exige un formato de paquete que solo se puede generar desde el
|
||||||
|
proyecto Gradle. Ahora que existe, deja de estar bloqueado, pero sigue haciendo
|
||||||
|
falta una cuenta de desarrollador de pago.
|
||||||
|
- **Criptografía post-cuántica de karvan-protocol**: su componente nativo no compila
|
||||||
|
para Android. Haría falta una versión portable.
|
||||||
|
|
||||||
|
## Descartado
|
||||||
|
|
||||||
|
- **Subtemas propios en el foro**: nunca llegaron a funcionar, rompían los hilos y
|
||||||
|
habrían metido un campo que ningún otro cliente de la red entiende, permanente en el
|
||||||
|
registro. El proyecto oficial ya resuelve eso mejor.
|
||||||
|
- **Congelar las dependencias de SSB**: no aporta —ya viajan dentro del paquete— y
|
||||||
|
rompería la posibilidad de seguir las versiones del proyecto oficial, que es lo que
|
||||||
|
sostiene esta rama.
|
||||||
BIN
img/01-home-hexagonos.png
Normal file
|
After Width: | Height: | Size: 49 KiB |
BIN
img/03-lista-salas.png
Normal file
|
After Width: | Height: | Size: 42 KiB |
BIN
img/04-barra-personalizar.png
Normal file
|
After Width: | Height: | Size: 42 KiB |
BIN
img/05-modulos.png
Normal file
|
After Width: | Height: | Size: 42 KiB |
BIN
img/06-filtro-personal.png
Normal file
|
After Width: | Height: | Size: 45 KiB |
BIN
img/07-chats.png
Normal file
|
After Width: | Height: | Size: 42 KiB |
BIN
img/08-perfil.png
Normal file
|
After Width: | Height: | Size: 42 KiB |