Parte III — Ramas, savia y semillas

08 · Las semillas: federación

El viento y los animales llevan lejos las semillas del baobab. La federación lleva los saberes públicos fuera de la red de mucuas: a clientes de chat (XMPP) y al Fediverso (ActivityPub).

Archivos para leer

  1. federacao/visibilidade.py — la traba: solo sale lo que es protecao: publico + visibility: public + no cifrado.
  2. federacao/mapeador.py, federacao/atores.py — saber → Dublin Core / ActivityStreams; mucua, galaxia, mocambola → actores.
  3. federacao/adaptadores/base.py y los adaptadores (xmpp*.py, activitypub.py).
  4. federacao/ingestao.py — lo que llega de afuera entra en el acervo.
  5. federacao/xmpp_bot.py + xmpp_i18n.py + bot_backend.py — el bot que publica y busca por chat.
  6. federacao/xmpp_ponte.py, xmpp_extauth.py, api/v3/xmpp.py — el XMPP de la propia mucua (lo que el protocolo llama servidor), usando las cuentas de Baobáxia.
  7. federacao/http_sig.py, api/v3/activitypub.py.

Adaptadores enchufables

classDiagram
    class Adaptador {
        <<abstract>>
        +nome
        +habilitado
        +publicar(saber)
        +consumir(atividade)
        +status()
    }
    class XMPPAdaptador
    class ActivityPubAdaptador {
        +documento_ator()
        +documento_outbox()
        -_assina_entrega()
    }
    class Transporte {
        <<xmpp>>
    }
    class TransporteHTTP {
        <<activitypub>>
    }
    class SlixmppTransporte
    class ComponenteTransporte
    class HttpxTransporte
    Adaptador <|-- XMPPAdaptador
    Adaptador <|-- ActivityPubAdaptador
    XMPPAdaptador --> Transporte
    ActivityPubAdaptador --> TransporteHTTP
    Transporte <|-- SlixmppTransporte : cliente
    Transporte <|-- ComponenteTransporte : XEP-0114
    TransporteHTTP <|-- HttpxTransporte

Cada adaptador se enciende con BBX_FED_<NOMBRE>=on (federacao/config.py).

Lo que llega de afuera (versión 3.3)

sequenceDiagram
    participant R as mucua remota
    participant I as POST /ap/galaxia/{uuid}/inbox
    participant H as _remetente_verificado
    participant G as ingestao.ingerir
    R->>I: Create + Signature(keyId=…/ap/mucua/X#main-key) + Digest + Date
    I->>H: comprueba Digest, Date (±5 min) y Ed25519 con la pubkey de la mucua X
    alt firma ausente o inválida
        I-->>R: 401
    end
    I->>G: saber externo
    G->>G: ¿uuid bien formado? ¿la nature no es de identidad?
    G->>G: ¿el uuid ya existe y es LOCAL? → rechaza
    G->>G: marca origem_externa, origem_mucua, _verificado
    G-->>I: saber ingerido (entra en la búsqueda normal)

Hasta la 3.2 esta ruta estaba siempre montada, sin firma, y el upsert aceptaba el uuid de cualquier saber local — ver el módulo 11.

El bot

El bot conversa en varios idiomas (xmpp_i18n.py): buscar pesca, publicar, mandar una foto, titulo …, enviar. Usa la misma capa publica/operacoes.py que la CLI. Mensajes y comandos están separados de la lógica — un idioma nuevo es un diccionario nuevo.

Prácticas

  1. Lee visibilidade.pode_federar y lista tres saberes que nunca salen.
  2. En test_xmpp_bot_i18n.py, agrega un comando en otro idioma.
  3. Corre testes/test_federacao_inbox_segura.py. Cambia una línea de la traba en ingestao.py y mira qué test se rompe.

Para conversar

  • ¿Qué saberes quiere una comunidad esparcir al viento, y cuáles quiere guardar solo entre sus mucuas?

vedi questo capitolo come sapere