# Segurança e RGPD

## Implementado na base

- passwords pelo hasher Laravel;
- sessão cifrada;
- CSRF nas operações autenticadas;
- isolamento por tenant;
- armazenamento privado;
- token público guardado apenas por hash;
- partilhas expiradas, limitadas e de uso único;
- `X-Content-Type-Options: nosniff` nos downloads;
- audit log por organização;
- Stripe Checkout e Billing Portal hospedados pela Stripe.

## Obrigatório antes de produção

- pentest e revisão de tenancy;
- 2FA para administradores;
- política de passwords e rate limiting;
- antivírus/Content Disarm para uploads;
- KMS/segredos geridos externamente;
- backups cifrados e testes de restauro;
- retenção e eliminação configurável;
- exportação de dados e direito ao apagamento;
- consentimento e prova para assinaturas;
- CSP, HSTS e cookies Secure;
- monitorização de erros, disponibilidade e jobs;
- DPA com fornecedores de hosting, email, storage e pagamentos.

## Regra crítica

Nunca confiar apenas na interface para esconder módulos ou dados. Toda a autorização deve ser aplicada no backend através de middleware, policies e filtros por tenant.

## Modelos PDF

- O PDF e as imagens ficam no disco privado e são transmitidos por rotas autenticadas.
- A assinatura binária `%PDF-` é confirmada antes do armazenamento.
- Imagens têm validação de MIME, extensão, tamanho e dimensões.
- A importação JSON é limitada, normalizada e sanitizada antes de gravar estilos e opções.
- O editor aceita apenas chaves, tipos, coordenadas, estilos e opções previstos no schema.
- UUIDs de regiões não podem ser reutilizados entre modelos.
- A edição requer licença do módulo e função `owner`, `admin` ou `editor`.
- A publicação cria uma revisão e o bloqueio otimista devolve HTTP 409 em conflitos.


## Preenchimento e geração final

- A cópia imutável do modelo é validada por SHA-256 imediatamente antes da renderização.
- O snapshot da região impede alterações silenciosas entre o pedido e o worker.
- O resolver de dados usa allowlists e não percorre relações ou atributos arbitrários.
- Overrides são limitados a 1 000 chaves e 100 000 caracteres por valor.
- Imagens só podem vir do namespace privado do próprio tenant ou de data URLs limitados.
- Os binários são processados em diretórios temporários `0700` e removidos automaticamente.
- A geração final é guardada por stream, com checksum e metadata de proveniência.
- Erros internos são registados para operadores; a interface não expõe caminhos físicos ou credenciais.


## ACL por pasta

As decisões de acesso são calculadas no servidor por `FolderAclService`. A interface apenas reflete a decisão e não constitui uma barreira de segurança. Negação prevalece sobre concessão, a cadeia respeita `acl_inherits` e toda alteração incrementa a versão ACL do tenant. Downloads, partilhas, anexos, PDFs, relatórios e lotes de comunicação repetem a autorização no endpoint correspondente. Alterações de role/estado da membership e mudanças de grupo invalidam a versão ACL. A movimentação de pastas exige gestão ACL na origem e no destino por alterar a cadeia de herança.
