Parte III — Galhos, seiva e sementes

08 · As sementes: federação

O vento e os bichos levam as sementes do baobá para longe. A federação leva os saberes públicos para fora da rede de mucuas: para clientes de chat (XMPP) e para o Fediverso (ActivityPub).

Arquivos para ler

  1. federacao/visibilidade.py — a trava: só protecao: publico + visibility: public + não cifrado sai.
  2. federacao/mapeador.py, federacao/atores.py — saber → Dublin Core / ActivityStreams; mucua, galáxia, mocambola → atores.
  3. federacao/adaptadores/base.py e os adaptadores (xmpp*.py, activitypub.py).
  4. federacao/ingestao.py — o que chega de fora entra no acervo.
  5. federacao/xmpp_bot.py + xmpp_i18n.py + bot_backend.py — o bot que publica e busca pelo chat.
  6. federacao/xmpp_ponte.py, xmpp_extauth.py, api/v3/xmpp.py — o XMPP da própria mucua (o que o protocolo chama de servidor), usando as contas do Baobáxia.
  7. federacao/http_sig.py, api/v3/activitypub.py.

Adaptadores plugáveis

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 acende com BBX_FED_<NOME>=on (federacao/config.py).

O que chega de fora (versão 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: confere Digest, Date (±5 min) e Ed25519 com a pubkey da mucua X
    alt assinatura ausente ou inválida
        I-->>R: 401
    end
    I->>G: saber externo
    G->>G: uuid bem formado? nature não é de identidade?
    G->>G: o uuid já existe e é LOCAL? → recusa
    G->>G: marca origem_externa, origem_mucua, _verificado
    G-->>I: saber ingerido (entra na busca normal)

Até a 3.2 essa rota ficava sempre montada, sem assinatura, e o upsert aceitava o uuid de qualquer saber local — ver o módulo 11.

O bot

O bot conversa em vários idiomas (xmpp_i18n.py): buscar pesca, publicar, mandar uma foto, titulo …, enviar. Ele usa a mesma camada publica/operacoes.py da CLI. Mensagens e comandos estão separados da lógica — um idioma novo é um dicionário novo.

Práticas

  1. Leia visibilidade.pode_federar e liste três saberes que nunca saem.
  2. Em test_xmpp_bot_i18n.py, acrescente um comando em outro idioma.
  3. Rode testes/test_federacao_inbox_segura.py. Mude uma linha da trava em ingestao.py e veja qual teste quebra.

Para conversar

  • Que saberes uma comunidade quer espalhar ao vento, e quais quer guardar só entre as suas mucuas?

vedi questo capitolo come sapere