# Classes de arquivo e varredura

## Classes de arquivo

A classe vem do **conteúdo** (magic bytes), nunca da extensão nem do `Content-Type` enviado.

| Classe | Exemplos | Servido como |
|---|---|---|
| `image` | png, jpeg, webp, gif, avif | inline, transformável (`?w=`, `?q=`) |
| `svg` | svg | inline **só se passar na varredura de SVG**, sempre com CSP restritiva (`default-src 'none'; sandbox`) |
| `font` | woff2, woff, ttf, otf | inline, CORS `*` |
| `media` | mp4, webm, mp3, ogg | inline, com `Accept-Ranges` |
| `document` | pdf, txt, csv, json | **download** (`Content-Disposition: attachment`); texto sempre `text/plain` |
| `markup` | html, htm, xhtml, xml | **nunca renderiza**: download + `text/plain` + CSP `sandbox` |
| `archive` | zip, tar.gz | download; cifrado ou impossível de varrer é recusado |
| `binary` | exe, msi, dmg, apk, deb, appimage, desconhecido | download, `application/octet-stream` |

As URLs são sem cookies, com `X-Content-Type-Options: nosniff`; CORS `*` só para `image` e `font`. Não use um arquivo de
download (`document`, `markup`, `archive`, `binary`) como `<script>`/`<iframe>`: ele não renderiza por desenho.

## Varredura, quarentena e 451

- Todo arquivo entra em **quarentena** e só é publicado depois de `clean`: antivírus, regras YARA, reputação por
  hash (só o hash sai da nossa infraestrutura, nunca o conteúdo), decodificação de imagens em sandbox e varredura
  específica de SVG. **Nada é publicado antes de `clean`.**
- Detectado ⇒ recusado (`422`), com auditoria. A amostra não é guardada.
- Se o scanner estiver fora do ar, o upload fica `pending` (202) e **não** é publicado (fail-closed).
- **Nova varredura diária** de tudo que está publicado, com as assinaturas do dia. Um arquivo que passou ontem pode
  ser detectado hoje: ele muda para `quarantined`, **sai do ar** (a CDN passa a responder `451`), o cache é purgado e o
  time é avisado. Em sistemas que dependem de uma URL, trate `451` como "indisponível por motivo de segurança": não
  insista, avise uma pessoa. Consulte `scan.status` / `scan.reason` no detalhe do arquivo.

## Por que meu SVG foi recusado e como reexportar

O SVG é um arquivo ativo (pode conter script), então só publicamos **SVG estático**, sem limpar nem alterar nada: o
que vai ao ar é o arquivo exatamente como você enviou. O `422 svg_unsafe` traz `reasons[]` com códigos do scanner;
a orientação é a mesma que o painel mostra:

| Se o motivo for… | O que significa | Como resolver |
|---|---|---|
| script, eventos ou links externos (`script_element`, `event_handler_attr`, `dangerous_scheme`, `external_or_unsafe_url`, `xml_base`, `form_element`, `embed_element`, `media_element`, `link_meta_element`, …) | O SVG contém script, atributos de evento (`onclick`, `onload`…) ou referências a URLs externas. | Remova scripts/`onclick` e referências a URLs externas. Só aceitamos SVG estático. |
| CSS externo (`style_type`, `css_*`) | O CSS do SVG referencia recursos externos ou ativos (`url()` externo, `@import`, `expression`). | Use estilos sem `url()` externo. |
| imagem embutida (`data_uri_not_allowed`, `data_uri_magic_mismatch`) | Imagem embutida não permitida. | Só PNG/JPEG/GIF/WebP em base64 são aceitos como imagem embutida. |
| Illustrator / HTML embutido (`foreign_namespace_element`, `html_element`, `ns_forbidden`, `ns_prefix_spoof`, `metadata_ns_outside_metadata`) | O SVG foi salvo com **"Preservar recursos de edição do Illustrator"** ou contém HTML embutido. | No Illustrator: **Arquivo → Exportar → Exportar para telas (SVG)**, ou **Salvar como SVG** desmarcando "Preservar recursos de edição". |
| DOCTYPE/ENTITY antigo (`doctype_entity`, `doctype_internal_subset`, `doctype_not_allowed`, `doctype_too_long`, `directive_not_allowed`, `processing_instruction`) | O SVG tem um cabeçalho `<!DOCTYPE …>` / `<!ENTITY …>` antigo. | Reexporte como **SVG 1.1** (Illustrator: Exportar para telas; Inkscape: **Salvar como → SVG otimizado**) ou remova o bloco `<!DOCTYPE …>`. |
| tamanho (`too_large`, `too_deep`, `too_many_elements`, `too_many_attrs`, `name_too_long`, `css_too_large`) | O SVG é grande ou complexo demais. | Simplifique/otimize (ex.: SVGO) e envie de novo. |
| formato (`xml_malformed`, `no_root`, `not_svg_root`, `multiple_roots`, `text_outside_root`, `duplicate_attribute`, `odd_attr_name`, `odd_element_name`, `deprecated_element`, `attr_namespace`, `style_element`) | O arquivo não é um SVG válido ou bem formado. | Reexporte do editor. |

Quando houver vários motivos, resolva primeiro os de segurança (script/eventos/links, CSS, imagem embutida), depois os
de exportação (Illustrator, DOCTYPE), depois tamanho e formato. Códigos que não estão na tabela: reexporte como
SVG 1.1 estático e, se persistir, denuncie o problema ao time com o `reasons` recebido.
