Skip to content

v1.2.5: installers from winget manifests, recommendations, hardening - #1

Merged
IncludeSpecial merged 7 commits into
mainfrom
claude/project-review-improvements-jalgyq
Oct 12, 2026
Merged

IncludeSpecial merged 7 commits into
mainfrom
claude/project-review-improvements-jalgyq

Conversation

@IncludeSpecial

Copy link
Copy Markdown
Owner

Что внутри

Подробности по пунктам — в CHANGELOG.md.

Установка без ручных ссылок

  • В catalog.json теперь только витрина. Способ установки берётся из data/installers.json, который npm run catalog:installers генерирует из официального индекса winget (cdn.winget.microsoft.com): URL, SHA256, тип, ключи тихой установки.
  • Перед запуском сверяется SHA256. При несовпадении или сбое загрузки программа ставится через winget.
  • Тип файла определяется по содержимому, а HTML-страницы вместо установщика отклоняются. Это чинит Edge (его MSI сохранялся как .exe).
  • Загрузка только по HTTPS, включая перенаправления.
  • Исправлены 10 неверных winget ID (hwmonitor указывал на HWiNFO). Генератор сверяет название пакета с каталогом.
  • Итог: 113 программ скачиваются напрямую, 3 ставятся только через winget, 2 (FileZilla, RustDesk) — через Chocolatey.

Рекомендации

  • src/recommend.ts + data/related.json: полка «Для вас», ранжированная вкладка «Рекомендуем» с причиной на каждой карточке, блоки «Часто ставят вместе» и «Альтернативы» в карточке программы.

Безопасность и инструменты

  • sandbox: true, запрет новых окон и переходов, openExternal открывает только http(s).
  • Удалён отладочный логгер, который в сборке писал файл и отправлял события на 127.0.0.1:7367.
  • ESLint теперь действительно проверяет код. Добавлены CI (ci.yml) и еженедельное обновление installers.json (refresh-installers.yml).
  • npm run build работает в свежем клоне.
  • Исходники промо-роликов лежат в promo/, готовые видео в git не попадают.

Проверка

  • Линтер, tsc (main и renderer), verify-catalog, smoke (57), test-download (9), test-resilience, test-app-full и сборка проходят локально.
  • Проверка ссылок из installers.json: 107 рабочих, 0 битых, 6 не проверить с CI-адреса (SourceForge, Launchpad, hwinfo.com).
  • Выборочная сверка SHA256 (PuTTY, WireGuard, KeePass) с реально скачанными файлами: совпадает.
  • Интерфейс проверен по скриншотам собранного renderer.
  • На Windows не запускалось: стоит вручную поставить пару программ (EXE и MSI), в том числе с UAC, и проверить окно с sandbox: true.

После слияния

  • В Settings → Actions → General включить «Allow GitHub Actions to create and approve pull requests», иначе еженедельный PR не создастся.
  • Поставить тег v1.2.5, на Windows собрать npm run dist и приложить GetBox-1.2.5-portable.exe к релизу.

🤖 Generated with Claude Code

https://claude.ai/code/session_019LtWxNVyWyutDLyX8cWQFC


Generated by Claude Code

Direct catalog installs downloaded a file and executed it with no checks.

- Downloads must be HTTPS on every redirect hop (loopback http stays for tests).
- The file type comes from magic bytes (PE / MSI); anything else, such as an
  HTML page served by a broken link, is refused instead of executed. This also
  fixes Edge, whose fwlink serves an MSI that was saved and run as .exe.
- Authenticode is checked with Get-AuthenticodeSignature: the status must be
  Valid and the signer must match the new `publisher` field, or the entry must
  be marked `unsigned`. Failures use the new `untrusted` error code and fall
  back to winget when available.
- scripts/fetch-publishers.cjs reads signers from the PE certificate table or
  the MSI DigitalSignature stream and fills catalog.json (99 publishers,
  8 unsigned).
- Installer path is quoted and silentArgs are limited to a safe charset before
  reaching cmd.exe (kept for its UAC elevation and .msi association); MSI
  reboot-required exit codes 3010/1641 count as success.
- Remote catalog JSON is validated and stripped of install fields.
- shell:openExternal only accepts http(s) URLs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019LtWxNVyWyutDLyX8cWQFC
…ndations

Links
- catalog.json is curation only: installUrl, fallbacks, silentArgs,
  altProvider and the Authenticode publisher fields are gone.
- scripts/refresh-installers.cjs (npm run catalog:installers) builds
  data/installers.json from the official winget index on
  cdn.winget.microsoft.com (source2.msix -> versionData -> manifest):
  installer URL, SHA256, type, silent/custom switches, success codes.
  It prefers x64, per-user scope and ru-RU/en-US, and refuses a winget Id
  whose package name does not match the catalog app.
- 113 apps download directly and run only after the SHA256 matches; Teams,
  ImageGlass and Rufus (MSIX/portable only) go through winget; FileZilla
  and RustDesk, absent from winget, are pinned to Chocolatey.
- Fixed winget Ids: hwmonitor pointed at HWiNFO, plus nine stale Ids.
- SHA256 replaces the Authenticode check (signature.ts and
  fetch-publishers.cjs removed). Installer switches from manifests may
  contain quotes, so the cmd.exe guard now rejects metacharacters and
  unbalanced quotes instead of whitelisting characters.
- Removed the leftover debug logger that wrote a log file and posted
  events to a localhost ingest endpoint in production builds.

Recommendations
- src/recommend.ts scores catalog apps from installed and starred ones:
  stacks in data/related.json and install profiles ("goes with X"),
  alternatives demoted once one is owned, category affinity and
  editorial picks; cold start shows editor's picks.
- Home gets a "For you" shelf, the Recommended tab is ranked with a
  reason per card, and the app modal lists "Often installed together"
  and "Alternatives".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019LtWxNVyWyutDLyX8cWQFC
- eslint.config.js had only ignores, and `--ext` is not supported by
  ESLint 9 flat config, so `npm run lint` checked nothing. Added
  typescript-eslint, react-hooks and per-folder globals; fixed the ten
  findings (dead imports and variables, a shadowed `crypto` in smoke.cjs).
- Renderer runs with sandbox: true (the preload only needs contextBridge
  and ipcRenderer). window.open is denied and in-page navigation blocked;
  http(s) links go to the system browser.
- `npm run build` creates dist-electron before copying the Scoop
  bootstrap script into it, so it works in a fresh clone.
- Recommendation reasons get their own one-line row on cards instead of
  replacing the uppercase category label, which wrapped over 4-5 lines.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019LtWxNVyWyutDLyX8cWQFC
- ci.yml: lint, typecheck, catalog checks, unit/integration tests and the
  main + renderer build on every push to main and every PR.
- refresh-installers.yml: weekly (and on demand) runs
  `npm run catalog:installers` and opens a PR with the new URLs, hashes
  and switches, so pinned downloads do not go stale between releases.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019LtWxNVyWyutDLyX8cWQFC
promo/ holds the 40 s 1080p promo: promo.html (scenes as a pure render(t)
function, so frames render deterministically), capture.cjs (real renderer
screenshots with window.getbox stubbed from data/*.json), render.cjs
(frame-by-frame into ffmpeg) and music.py (synthesised ambient bed).
Rendered video, audio and captured frames are gitignored; README lists
the steps to rebuild them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019LtWxNVyWyutDLyX8cWQFC
shorts.html: 30 s, 1080x1920, 60 fps, cut to a 128 bpm grid — dialog
pile-up hook, logo drop, catalog counter, click-to-install demo, icon
storm, recommendations, trust badges, CTA. music-shorts.py synthesises
the matching track (filtered intro, riser, drop on bar 3, crashes on the
scene hits). render.cjs now takes the page and reads its size, fps and
duration from window.FORMAT, so it renders both formats.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019LtWxNVyWyutDLyX8cWQFC
Bump version to 1.2.5 and add CHANGELOG.md covering the installer,
recommendation, security and tooling changes since 1.2.0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019LtWxNVyWyutDLyX8cWQFC
@IncludeSpecial
IncludeSpecial merged commit 95a61d5 into main Oct 12, 2026
1 check passed
@vercel

vercel Bot commented Oct 12, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
get-box Ready Ready Preview Oct 12, 2026 5:52pm UTC

This branch was successfully deployed

1 active deployment
Preview — 01047ef2 Deployed Oct 12, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants