Releases: iscarelli/spool-control
v1.36.2 — Card de novidades resiliente à falha da API do GitHub
Fixed
- Card "Ver novidades" some quando a API do GitHub falha (ficava só o link). A página de atualização busca as notas da release pela REST API do GitHub (
/releases/latest), que é fail-open. Numa falha pontual (rate limit de 60/h por IP — não há token no servidor — ou timeout),latest_release_notes()devolvia''e o template caía no link simples em vez do card expansível. Agora a busca reusa a última nota obtida com sucesso em vez de zerar (só vira link se nunca conseguimos notas) e o timeout subiu de 4s para 8s.
Atualização: sem migração de schema; basta atualizar (Admin → Atualizações ou update no console).
v1.36.1 — Responsividade no celular (listas em cartões)
Responsividade no celular. A base já era mobile-first, mas as listas eram tabelas largas que rolavam na horizontal no telefone, e algumas barras de ação/cabeçalho estouravam a tela. Só markup/CSS; o desktop não muda.
Changed
- Listas viram cartões empilhados no celular (≤576px) — Spools, Filamentos, Fila de Etiquetas, Estoque Baixo, Relatórios por Material/Local, Histórico de Pesagens, Carretéis Vazios, Busca, Usuários, Backups e os históricos nos detalhes viram um cartão por linha com
rótulo: valor, sem rolagem horizontal. Implementado com um único bloco@media (max-width:576px)sobre.sc-stack+data-label;<thead>oculto no celular. - Toolbars e barras de ação quebram em linha (
flex-wrap) em vez de espremer/transbordar. - Login e 2FA passam de largura fixa para
max-width:360pxcom margem lateral. - Toasts e alertas ganham
max-width:calc(100vw - 2rem)para não vazar a viewport.
Atualização: sem migração de schema; basta atualizar (Admin → Atualizações ou update no console).
v1.36.0 — Endurecimento de segurança
Endurecimento de segurança a partir de um teste externo (caixa-preta). Vários achados do relatório já estavam cobertos pelo código (throttle de login por IP, mensagem de erro genérica, anti-SSRF, anti open-redirect); seguem as lacunas reais corrigidas — cada uma com teste automatizado (26 novos; 150 no total, sem regressão).
Security
- #2 RBAC de escrita.
viewer(rotulado "somente leitura") alcançava todas as rotas de mutação de inventário (só@login_required). Novo@write_requiredenforça o papel no servidor (403 no GET-form e POST); botões de escrita somem na UI (can_write). - #3 Revogação de sessão (CWE-613).
session_tokenpor usuário revalidado a cada requisição; logout e troca de senha rotacionam o token, invalidando cookies antigos na hora (a troca mantém a sessão atual e derruba as outras; reset por admin derruba o alvo). Cookies legados caem uma vez e o usuário reloga. - #4 Chave de API fora do DOM (CWE-200). Admin → Integrações não embute mais a chave em
data-key; só a versão mascarada vai no HTML. O cleartext é buscado sob demanda por endpoint admin (/admin/integrations/<int>/key,no-store). - #5 HTTPException não vira mais 500. GET em
/logoute POST em/spool-modelsretornam 405 (antes 500);errorhandler(Exception)repassaHTTPException+ página 405 dedicada. - #9
/.well-known/security.txt(RFC 9116).
Notas
- Mantidos sem mudança (avaliados): throttle por IP + msg genérica já existiam (#1; sem lockout por conta p/ não abrir DoS contra o
admin— 2FA opt-in é o controle forte); versão/IDs atrás de auth, #7 mitigado por #2 (#6/#7); rotas admin já@admin_required(#8). - Operacional (fora do código): rotacionar a senha do
admine a chave de API do Home Assistant (expostas durante o teste externo) e habilitar 2FA noadmin.
v1.35.2
@
Changed
- Rolo recém-cadastrado (ainda não pesado) passa a exibir o peso nominal como peso assumido (cheio), em vez de mostrar "—" / "Não pesado ainda". O detalhe do rolo, a lista, o detalhe do filamento e o inventário agora mostram o nominal rotulado como
não pesado, consistente com os relatórios e as roscas (que já o tratavam como cheio desde v1.35.0). Nenhuma pesagem é criada — o dado continua honesto (o histórico de pesagens segue vazio até a primeira pesagem real); só a exibição deixou de parecer "zerada".
@
v1.35.1
Fixed
- Modo demo não oferece mais "Trocar senha" e "Verificação em duas etapas". O backend já bloqueava ambas (
@demo_blocked), mas o menu do usuário ainda exibia os links — que viravam beco sem saída. NoDEMO_MODEo menu agora mostra apenas o nome do usuário, sem ações de conta.
🤖 Generated with Claude Code
v1.35.0
Added
- Navegação anterior/próximo nas telas de detalhe de rolo (
/spools/<id>) e filamento (/filaments/<id>), na mesma ordem da listagem. Botões desabilitados nas pontas (sem wrap-around); rolos navegam só entre itens do mesmo estado (ativos/finalizados).
Fixed
- Rolo recém-cadastrado deixava de contar o peso nominal nos relatórios. Um rolo ainda não pesado agora é tratado como cheio (= peso nominal) em "por material", "por local" e "estoque baixo", consistente com o resto do app. Antes contava 0g e aparecia falsamente em Estoque Baixo (e no card do dashboard).
🤖 Generated with Claude Code
v1.34.0
Added
- Dólar canadense (CAD) nas moedas. Nova opção em Configurações (símbolo
C$, formato1,234.56). - Horário do backup automático configurável em
/admin/backup(00:00–23:00, hora local). A rotação continua um arquivo por dia da semana — só muda o instante da gravação.
Changed
- Timer de backup acorda de hora em hora; o
backup.pydecide a hora certa (settingbackup_hour, default 03:00) e roda no máx. 1×/dia, com catch-up e retry. Horário fica no app (sem root/daemon-reloadpara trocar). Instalações existentes seguem em 03:00. - Deploy re-arma o
spool-backup.timerapós odaemon-reload. Nenhuma ação manual ao atualizar.
Atualização: /admin/update (admin) ou o comando de deploy via SSH. Conferir o agendamento depois: systemctl list-timers spool-backup.timer --no-pager.
v1.33.3
Fixed
- Tara do modelo exibida no lugar do campo oculto. Ao selecionar um modelo de carretel, o campo "Tara Personalizada" e seu rótulo são substituídos pelo rótulo "Tara do modelo" e o valor em gramas. Ao voltar para "Tara personalizada / desconhecida", o campo de entrada reaparece.
- Placeholder do campo tara personalizada corrigido para "Preencha com o peso do carretel".
v1.33.2
v1.33.1
Fixed
- Campo Tara Personalizada some quando modelo de carretel está selecionado. Antes o campo ficava visível mas desabilitado (difícil de perceber). Agora o campo e seu rótulo são ocultados completamente; voltam a aparecer ao selecionar "Tara personalizada / desconhecida".