Parte III — Rami, linfa e semi

08 · I semi: federazione

Il vento e gli animali portano lontano i semi del baobab. La federazione porta i saberes pubblici fuori dalla rete delle mucua: ai client di chat (XMPP) e al Fediverso (ActivityPub).

File da leggere

  1. federacao/visibilidade.py — il cancello: esce solo ciò che è protecao: publico + visibility: public + non cifrato.
  2. federacao/mapeador.py, federacao/atores.py — saber → Dublin Core / ActivityStreams; mucua, galassia, mocambola → attori.
  3. federacao/adaptadores/base.py e gli adattatori (xmpp*.py, activitypub.py).
  4. federacao/ingestao.py — ciò che arriva da fuori entra nell'archivio.
  5. federacao/xmpp_bot.py + xmpp_i18n.py + bot_backend.py — il bot che pubblica e cerca via chat.
  6. federacao/xmpp_ponte.py, xmpp_extauth.py, api/v3/xmpp.py — l'XMPP della mucua stessa (ciò che il protocollo chiama server) XMPP che usa gli account di Baobáxia.
  7. federacao/http_sig.py, api/v3/activitypub.py.

Adattatori collegabili

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

Ogni adattatore si accende con BBX_FED_<NOME>=on (federacao/config.py).

Ciò che arriva da fuori (versione 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: verifica Digest, Date (±5 min) ed Ed25519 con la pubkey della mucua X
    alt firma assente o non valida
        I-->>R: 401
    end
    I->>G: saber esterno
    G->>G: uuid ben formato? la nature non è di identità?
    G->>G: l'uuid esiste già ed è LOCALE? → rifiuta
    G->>G: segna origem_externa, origem_mucua, _verificado
    G-->>I: saber acquisito (entra nella ricerca normale)

Fino alla 3.2 questa rotta era sempre montata, senza firma, e l'upsert accettava l'uuid di qualsiasi saber locale — vedi il modulo 11.

Il bot

Il bot parla in diverse lingue (xmpp_i18n.py): buscar pesca, publicar, mandare una foto, titulo …, enviar. Usa lo stesso strato publica/operacoes.py della CLI. Messaggi e comandi sono separati dalla logica — una lingua nuova è un dizionario nuovo.

Esercizi

  1. Leggi visibilidade.pode_federar ed elenca tre saberes che non escono mai.
  2. In test_xmpp_bot_i18n.py, aggiungi un comando in un'altra lingua.
  3. Esegui testes/test_federacao_inbox_segura.py. Cambia una riga del cancello in ingestao.py e guarda quale test si rompe.

Da discutere

  • Quali saberes una comunità vuole spargere al vento, e quali vuole custodire solo tra le proprie mucua?

vedi questo capitolo come sapere