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
federacao/visibilidade.py— a trava: sóprotecao: publico+visibility: public+ não cifrado sai.federacao/mapeador.py,federacao/atores.py— saber → Dublin Core / ActivityStreams; mucua, galáxia, mocambola → atores.federacao/adaptadores/base.pye os adaptadores (xmpp*.py,activitypub.py).federacao/ingestao.py— o que chega de fora entra no acervo.federacao/xmpp_bot.py+xmpp_i18n.py+bot_backend.py— o bot que publica e busca pelo chat.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.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
- Leia
visibilidade.pode_federare liste três saberes que nunca saem. - Em
test_xmpp_bot_i18n.py, acrescente um comando em outro idioma. - Rode
testes/test_federacao_inbox_segura.py. Mude uma linha da trava emingestao.pye veja qual teste quebra.
Para conversar
- Que saberes uma comunidade quer espalhar ao vento, e quais quer guardar só entre as suas mucuas?
