feat(scripts): verifica a instalação de web push num site de fora - #22
Conversation
Web push depende de dois artefatos no lado do cliente, e meia instalação não falha de forma visível: o site simplesmente nunca capta assinatura, e nada no BMS indica isso. Conferir à mão exige abrir o site, o DevTools e comparar hashes na unha, o que é lento e fácil de errar logo depois de um deploy. O script roda o checklist de aceite por HTTP: sw.js responde na raiz com content-type de JavaScript, sem redirect para subpasta — o escopo do worker não sobe de diretório; o importScripts aponta para um /bms/push/<accountHash>.js que existe; o hash é o da conta esperada; e a página carrega bmsTrkOptions, o bmstrk.js e o mesmo hash. Sai 0 quando tudo passa e 1 na primeira falha real, então serve tanto para conferência manual quanto para amarrar num passo de deploy.
filipecrosk
left a comment
There was a problem hiding this comment.
Requesting changes before merge.
-
Page validation uses independent whole-document substring searches. A stale/commented snippet or unrelated text containing
bmsTrkOptions,bmstrk.js, and the hash passes while the actual page configuration is broken. Parse/check the actual configuration block and tracker script source. -
/tmp/sw-verify.$$is predictable and may be pre-created as a symlink by another local user, allowing curl to overwrite the target with the operators permissions. Usemktempand atrapcleanup (ideally a private temp directory).
Substring solto sobre o documento inteiro deixava passar um snippet comentado/stale contendo bmsTrkOptions, o hash e bmstrk.js — instalação quebrada reportada como correta. Passa a remover comentários HTML e checar o bloco de configuração real e o src do script. /tmp/sw-verify.$$ era previsível: outro usuário local podia pré-criar como symlink e o curl sobrescrever o alvo. Troca por mktemp -d + trap. sha256sum não existe no macOS; adiciona fallback para shasum -a 256.
filipecrosk
left a comment
There was a problem hiding this comment.
The original substring and predictable-temp-file findings were addressed, and the script passes and ShellCheck. Two failure-path blockers remain:\n\n1. A missing value for or hangs the argument loop. becomes empty, fails because only one argument remains, and without the same option is processed forever. I reproduced still running until an external 2-second alarm killed it (exit 142). Validate that each option has a non-empty following value and exit 2 on bad usage before shifting.\n\n2. is not checked. If /var/folders/bp/g36s8ny94p9520_jtt41dd_c0000gn/T/tmp.S5DkpjWgWZ fails, execution continues with an empty and the first curl targets instead of a private temp file. Abort immediately when temp-directory creation fails, then install the cleanup trap only after success.\n\nPlease add small shell regression coverage for bad option values and temp-creation failure so these paths stay fixed. No GitHub checks are configured.
filipecrosk
left a comment
There was a problem hiding this comment.
The original substring and predictable-temp-file findings were addressed, and the script passes bash -n and ShellCheck. Two failure-path blockers remain:
-
A missing value for
--accountor--pagehangs the argument loop.${2:-}becomes empty,shift 2fails because only one argument remains, and withoutset -ethe same option is processed forever. I reproduced--accountstill running until an external 2-second alarm killed it (exit 142). Validate that each option has a non-empty following value and exit 2 on bad usage before shifting. -
TMPD="$(mktemp -d)"is not checked. Ifmktempfails, execution continues with an emptyTMPDand the first curl targets/sw.jsinstead of a private temp file. Abort immediately when temp-directory creation fails, then install the cleanup trap only after success.
Please add small shell regression coverage for bad option values and temp-creation failure so these paths stay fixed. No GitHub checks are configured.
Summary
Adiciona
scripts/verify-web-push-install.sh, que roda o checklist de aceite de uma instalação de web push contra um site, de fora. Web push depende de dois artefatos no lado do cliente e meia instalação não falha de forma visível: o site simplesmente nunca capta assinatura, e nada no BMS indica isso. Conferir à mão exige abrir o site, o DevTools e comparar hashes na unha — lento e fácil de errar logo depois de um deploy, que é exatamente quando importa.Changes
scripts/verify-web-push-install.sh, com seis verificações:sw.jsresponde 200 na raiz; content-type é de JavaScript; não houve redirect para subpasta (o escopo do service worker não sobe de diretório); oimportScriptsaponta para uma URL/bms/push/<accountHash>.js; esse hash é o da conta esperada, quando--accounté passado; o worker referenciado resolve 200; e a página carregabmsTrkOptions, obmstrk.jse o mesmo hash, quando--pageé passado.--accountou--pageo script avisa que aquela verificação não foi feita, em vez de passar calado.Type of change
fix:)feat:)refactor:)docs:)chore:)Testing
Exercitado ponta a ponta contra um site falso servido por
python3 -m http.server, apontando para uma instalação local real do BMS — oimportScriptsdo caso feliz resolve num worker que a API de fato serve.Caso feliz: seis verificações verdes, exit 0.
Casos de falha, cada um verificado individualmente:
sw.jsausente — falha e interrompe, já que o resto depende do arquivo; exit 1.sw.jsque não é um shim (semimportScripts) — falha apontando isso.bmsTrkOptionsebmstrk.js.Na primeira versão a página sem snippet acusava também "accountHash diverge", o que sugeria conta errada quando o problema era ausência do snippet. A comparação de hash agora só roda quando há snippet.
pnpm type-checkpassespnpm lintpassespnpm testpassesNão se aplicam ao script:
prettiernão infere parser para.she o hook do repo usa--ignore-unknown. Rodeibash -n, que passa. Não consegui rodarshellcheck— não está instalado no ambiente; vale um olhar de quem tiver.Screenshots
Não se aplica.
Notes for reviewers
O script assume o formato de shim de duas linhas que a UI gera em Configurações → Push. Se o formato mudar, a extração do
importScriptsé o primeiro ponto a ajustar.A verificação de raiz compara a URL final depois de seguir redirects. Um site que responda
sw.jsna raiz via rewrite interno (sem redirect HTTP) passa, o que é o comportamento correto — o que quebra o escopo é o navegador receber o arquivo de outro caminho, não a origem interna dele.