Files
carinha-control-panel/docs/SEGURANCA.md
T
julioandClaude Opus 5.5 c5fd54c1d9 feat(celular): rosto e app usam SSE e token; remove telas legadas
- carinha.html assina /eventos (expressao, app_config, conversa, reacao,
  recarregar) e volta ao polling de /fila sozinho se o SSE cair; foto dos
  ajustes a cada (re)conexao; token (?t=) vai em todo fetch ao servidor
- APK 0.8-token: token nas preferencias e no menu de toque longo, enviado
  na pagina, no HTTP do Java e ao llama-server (--api-key); trocar servidor
  por Intent exige o token salvo; camera/microfone so para o servidor
  configurado ou a copia local
- cerebro/conversa mandam a chave ao llama-server do S10
- servidor: evento SSE 'recarregar'; remove /camera/frame e /app/connect;
  enderecos antigos redirecionam para a secao do painel novo
- remove dashboard, painel, conversa, emojis, treinamento, braco, servos,
  api, scripts e CSS antigos, audio-robot.js e servir-local.bat
- logica pura do painel em web/src/lib/nucleo.ts com testes node --test
  (substitui test_movimentos.js e test_rastreamento.js)
- testes de navegador portados para o painel novo (rtc, rosto, rastreamento)
- README, docs/PAINEL.md e docs/SEGURANCA.md reescritos; versao 0.8.0;
  carinha-pc.service le /etc/carinha.env

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 20:11:58 -03:00

2.3 KiB
Raw Blame History

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):

{"token": "troque-por-um-segredo-longo"}

Sem token configurado o servidor fica aberto na rede local, como antes.

Como ativar (ordem importa)

  1. Publique servidor e painel 0.8 (deploy.ps1) e instale o APK 0.8-token no S10.
  2. No S10: toque longo › Token do servidor › digite o token. O app passa a mandar o token na página do rosto (?t=), nos pedidos Java e no llama-server local (--api-key).
  3. Na placa: echo 'CARINHA_TOKEN=...' | sudo tee /etc/carinha.env && sudo chmod 600 /etc/carinha.env e sudo systemctl restart carinha-pc. O serviço lê o arquivo (EnvironmentFile=).
  4. Abra o painel: ele pede o token uma vez e guarda só naquele navegador.

O cérebro da placa usa o mesmo token para falar com o llama-server do S10 (ou CARINHA_IA_CHAVE, se forem diferentes).

App Android

  • Com token salvo, trocar o servidor por Intent (adb shell am start ... -e servidor URL) exige -e token <token>; outro app não consegue redirecionar o rosto.
  • Câmera e microfone só são liberados para a página do servidor configurado ou para a cópia local.

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).