feat(servidor): adiciona SSE, token, E-Stop real e trava de hardware
- comum.py: ler_json (Origin/JSON/tamanho), gravar_atomico e token (CARINHA_TOKEN ou seguranca.json), substituindo 6 copias nos modulos - eventos.py: hub SSE em /eventos com heartbeat e Last-Event-ID; modulos publicam expressao, telemetria, conversa, reacao, ia, motores - /estado agrega o snapshot inicial; /comando unifica gesto/rosto/cor/reacao - /parar-tudo desliga o PCA9685, para reacoes e trava motores ate /rearmar - braco: lease (ttl_ms) e interpolacao com limite de velocidade no servidor - braco e diagnostico nao disputam o PCA9685 (409 para o segundo dono) - fila limitada (20) com validade de 10 s; POST /face usa prefixo "rosto" - /app/config passa a checar Origin e JSON; versao vem de version.json - figurinhas automaticas do Gemini limitadas a 6 por hora - rosto entende a ordem "calma" enviada pelo E-Stop Token so e exigido quando configurado (docs/SEGURANCA.md). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,43 @@
|
||||
# Segurança do servidor
|
||||
|
||||
## Token de controle
|
||||
|
||||
Com um token configurado, o servidor (porta 8100) exige `Authorization: Bearer <token>`
|
||||
em todo POST e nas leituras de dados (`/eventos`, `/estado`, `/fila`, `/app/*`, `/rtc/*`,
|
||||
`/camera/*`, `/conversa/*`, `/treinamento/*`, `/braco/*`, `/servos/*`, `/ia/status`, `/api/*`).
|
||||
EventSource e o app Android podem mandar `?t=<token>` na URL.
|
||||
|
||||
Continuam públicos apenas: páginas estáticas, `/app/health`, `/faces`, `/gestos`,
|
||||
`GET /config` (aparência), `/ia/modelo` e `/app.apk`.
|
||||
|
||||
Configure **um** dos dois (mínimo 8 caracteres):
|
||||
|
||||
```
|
||||
# /etc/carinha.env, carregado pelo carinha-pc.service (EnvironmentFile=)
|
||||
CARINHA_TOKEN=troque-por-um-segredo-longo
|
||||
```
|
||||
|
||||
ou `seguranca.json` na pasta do servidor (fora do git):
|
||||
|
||||
```json
|
||||
{"token": "troque-por-um-segredo-longo"}
|
||||
```
|
||||
|
||||
Sem token configurado o servidor fica aberto na rede local, como antes.
|
||||
|
||||
> **Ordem de ativação.** O painel antigo e o `carinha.html`/APK atuais ainda não enviam token.
|
||||
> Ative o token na placa só depois de publicar o painel novo e o rosto/APK com suporte a token
|
||||
> (fases 2–5 do plano de modernização). Até lá o servidor já aplica as demais proteções:
|
||||
> checagem de Origin em todos os POST, comandos validados e E-Stop.
|
||||
|
||||
## E-Stop
|
||||
|
||||
`POST /parar-tudo` desliga as 16 saídas do PCA9685, cancela a interpolação do braço,
|
||||
para reações e manda `calma` ao rosto. Braço e servos ficam **travados** (HTTP 409) até
|
||||
`POST /rearmar`.
|
||||
|
||||
## Trava de hardware
|
||||
|
||||
Braço (`/braco/*`) e diagnóstico (`/servos/*`) usam o mesmo PCA9685 com limites
|
||||
diferentes. Quem estiver com motores ativos é o dono; o outro recebe 409 até os motores
|
||||
desligarem (parar, ou ~2 s sem comando).
|
||||
Reference in New Issue
Block a user