Skip to content

Releases: iscarelli/spool-control

v1.36.2 — Card de novidades resiliente à falha da API do GitHub

12 Jun 00:52
aea3fa7

Choose a tag to compare

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)

12 Jun 00:11
4591c57

Choose a tag to compare

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:360px com 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

10 Jun 21:53
765e896

Choose a tag to compare

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_required enforç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_token por 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 /logout e POST em /spool-models retornam 405 (antes 500); errorhandler(Exception) repassa HTTPException + 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 admin e a chave de API do Home Assistant (expostas durante o teste externo) e habilitar 2FA no admin.

v1.35.2

10 Jun 16:58
700821b

Choose a tag to compare

@

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

10 Jun 15:33
cf53dd1

Choose a tag to compare

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. No DEMO_MODE o menu agora mostra apenas o nome do usuário, sem ações de conta.

🤖 Generated with Claude Code

v1.35.0

10 Jun 15:01
55147dc

Choose a tag to compare

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

10 Jun 13:46
a26f69d

Choose a tag to compare

Added

  • Dólar canadense (CAD) nas moedas. Nova opção em Configurações (símbolo C$, formato 1,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.py decide a hora certa (setting backup_hour, default 03:00) e roda no máx. 1×/dia, com catch-up e retry. Horário fica no app (sem root/daemon-reload para trocar). Instalações existentes seguem em 03:00.
  • Deploy re-arma o spool-backup.timer após o daemon-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

10 Jun 05:07
56d829c

Choose a tag to compare

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

10 Jun 05:00
223025b

Choose a tag to compare

Fixed

  • Campo Tara Personalizada oculto sem deslocar os campos adjacentes. A v1.33.1 usava display:none, que removia o elemento do fluxo e reorganizava os outros campos. Corrigido para visibility:hidden — o espaço é preservado e o layout não muda.

v1.33.1

10 Jun 04:55
0611038

Choose a tag to compare

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