Skip to content

Ship TronBrowser's own engine: install the portable ungoogled-chromium, prefer it, drop the pin-flag workaround - #107

Merged
ralyodio merged 1 commit into
mainfrom
feat/bundled-engine
Sep 16, 2026
Merged

ralyodio merged 1 commit into
mainfrom
feat/bundled-engine

Conversation

@ralyodio

Copy link
Copy Markdown
Contributor

What

TronBrowser ships its own engine on Linux: the installer fetches the pinned portable ungoogled-chromium next to the launcher, the launcher prefers it, and the --ignore-certificate-errors-spki-list workaround from #106 is reverted. https on Moshpit names then works through the ordinary per-name NSS trust the pit helper already does: no flag, no "unsupported command-line flag" bar, no relaunch.

Why

The Flathub ungoogled-chromium ignores NSS user trust. On bonita (152.0.7977.82-1) strace showed it opening the exact database holding the leaf, every sandbox switch made no difference, and its net log still said "No matching issuer found". The same 152 release as a portable build accepts that database in every variant tried. The pin flag made the Flatpak work but Chromium flags it as an unsupported switch at every start, which is not shippable. Owning the engine removes the dependency on whatever Chromium a machine happens to have, and it is the build the Docker image already runs.

Changes

  • install.sh: ensure_engine downloads ungoogled-chromium-<version>-<arch>_linux.tar.xz (152.0.7977.82-1, x86_64 and arm64) into <launcher dir>/engine/, atomically (extract to .new, swap), with a VERSION marker; no-op when current; runs on install and on tron upgrade; ensure-engine subcommand; skip with TB_NO_ENGINE_INSTALL=1, pin with TRONBROWSER_ENGINE_VERSION. ensure_browser returns early when the engine is present. Linux only; macOS keeps the Homebrew cask.
  • launcher/tronbrowser: prefers $DIR/engine/chrome over system and Flatpak candidates, after a --version probe so a machine missing a shared library falls through instead of failing. The pin flag code is removed. The no-engine message now points at the installer first.
  • tron-tor-helper (3.4.3): pin recording removed; trust reports why: flatpak-engine when the launcher started a Flatpak, so the sidebar can say "run tron upgrade" instead of promising trust that build ignores.
  • sidepanel.js: that message. Doc updated with the finding and the decision.

Verified

  • End to end in a Debian container: the real launcher staged as build-release does, engine linked at engine/, fake $HOME, pit resolver up. Launcher log: engine Chromium 152.0.7977.82 — /t/stage/engine/chrome. Helper log: leaf trusted into ~/.pki/nssdb. --dump-dom https://chovy.hacker/<title>chovy.hacker</title>, zero spki on the command line.
  • ensure_engine with the real functions against a temp app dir: skip switch honoured, real download (515 MB chrome on disk, VERSION = 152.0.7977.82-1), second run a no-op, ensure_browser skips when the engine exists.
  • pnpm lint clean, extension tests 30/30, helper compiles, sh -n on launcher and install.sh.

Shipping

Both halves must land: the tag carries the launcher and helper; install.sh deploys from main to tronbrowser.dev and is what tron upgrade runs. After the deploy, tron upgrade on bonita downloads the engine, and the next launch uses it.

🤖 Generated with Claude Code

…m, prefer it, drop the pin-flag workaround

The Flathub ungoogled-chromium ignores NSS user trust (bonita, 152: the leaf sat in the exact database strace showed it opening, every sandbox switch made no difference, net log said No matching issuer found), while the same 152 as a portable build accepts that database. The pin flag from #106 worked but Chromium marks it unsupported at every start. So install.sh now fetches the pinned portable ungoogled-chromium into <launcher dir>/engine on install and upgrade, the launcher prefers it after a --version probe, and https on Moshpit names goes back to the silent per-name NSS import. The helper (3.4.3) reports flatpak-engine so the sidebar points at tron upgrade when a Flatpak is still running. Verified end to end in a container: the real launcher picked the engine, the helper imported the leaf, https://chovy.hacker loaded with no flags.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Comment thread apps/desktop/launcher/tronbrowser Dismissed
Comment thread apps/web/public/install.sh Dismissed
@github-actions

Copy link
Copy Markdown

ThreatCrush Security Scan

55 finding(s)

HIGH/CRITICAL: 2 | MEDIUM: 33 | LOW: 20

Severity Rule Location
HIGH py-ssrf-outbound-request apps/desktop/launcher/tron-tor-helper:303
HIGH py-ssrf-outbound-request apps/desktop/launcher/tron-tor-helper:437
MEDIUM js-open-redirect apps/desktop/extensions/ai-sidebar/install-helper.js:156
MEDIUM js-unescaped-html-sink apps/desktop/extensions/ai-sidebar/media.js:34
MEDIUM js-unescaped-html-sink apps/desktop/extensions/ai-sidebar/media.js:57
MEDIUM js-unescaped-html-sink apps/desktop/extensions/ai-sidebar/newtab.js:237
MEDIUM js-unescaped-html-sink apps/desktop/extensions/ai-sidebar/newtab.js:266
MEDIUM js-unescaped-html-sink apps/desktop/extensions/ai-sidebar/newtab.js:336
MEDIUM js-unescaped-html-sink apps/desktop/extensions/ai-sidebar/options.js:305
MEDIUM js-unescaped-html-sink apps/desktop/extensions/ai-sidebar/sidepanel.js:78
MEDIUM js-unescaped-html-sink apps/desktop/extensions/ai-sidebar/sidepanel.js:166
MEDIUM sh-remote-script-execution apps/desktop/launcher/tronbrowser:131
MEDIUM sh-remote-script-execution apps/desktop/launcher/tronbrowser:454
MEDIUM js-unescaped-html-sink apps/extensions/public/store.js:77
MEDIUM js-unescaped-html-sink apps/extensions/public/store.js:227
MEDIUM js-unescaped-html-sink apps/extensions/public/store.js:569
MEDIUM js-unescaped-html-sink apps/web/public/app.js:29
MEDIUM js-unescaped-html-sink apps/web/public/dns.js:54
MEDIUM sh-remote-script-execution apps/web/public/install.sh:161
MEDIUM sh-remote-script-execution apps/web/public/install.sh:166
MEDIUM sh-remote-script-execution apps/web/public/install.sh:279
MEDIUM sh-remote-script-execution apps/web/public/install.sh:297
MEDIUM sh-remote-script-execution apps/web/public/install.sh:753
MEDIUM sh-remote-script-execution apps/web/public/install.sh:768
MEDIUM sh-remote-script-execution apps/web/public/install.sh:1051
MEDIUM js-unescaped-html-sink apps/web/public/settings.js:96
MEDIUM js-unescaped-html-sink apps/web/public/settings.js:168
MEDIUM js-dynamic-code-execution packages/sdk/src/mcp/tools.ts:80
MEDIUM js-dynamic-code-execution packages/sdk/src/mcp/tools.ts:92
MEDIUM js-dynamic-code-execution packages/sdk/src/mcp/tools.ts:103
MEDIUM js-dynamic-code-execution packages/sdk/src/page.ts:65
MEDIUM js-dynamic-code-execution packages/sdk/src/page.ts:70
MEDIUM sql-template-interpolation services/api/src/store/db.ts:116
MEDIUM js-dynamic-code-execution services/api/src/store/scanner.ts:44
MEDIUM sh-predictable-temp-path start.sh:25
LOW js-dynamic-code-execution apps/desktop/extensions/ai-sidebar/pit-proxy.test.js:8
LOW js-dynamic-code-execution packages/agent-runtime/src/analyze/form-script.test.ts:6
LOW js-unescaped-html-sink packages/agent-runtime/src/analyze/form-script.test.ts:26
LOW js-unescaped-html-sink packages/agent-runtime/src/analyze/form-script.test.ts:49
LOW js-dynamic-code-execution packages/browser-core/src/automation/extract-script.test.ts:6
LOW js-unescaped-html-sink packages/browser-core/src/automation/extract-script.test.ts:35
LOW js-unescaped-html-sink packages/browser-core/src/automation/extract-script.test.ts:47
LOW js-unescaped-html-sink packages/browser-core/src/automation/extract-script.test.ts:70
LOW js-unescaped-html-sink packages/browser-core/src/automation/extract-script.test.ts:89
LOW js-dynamic-code-execution packages/browser-core/src/automation/snapshot-script.test.ts:11
LOW js-unescaped-html-sink packages/browser-core/src/automation/snapshot-script.test.ts:24
LOW js-unescaped-html-sink packages/browser-core/src/automation/snapshot-script.test.ts:63
LOW js-unescaped-html-sink packages/provenance/src/scan.test.ts:47
LOW js-unescaped-html-sink packages/provenance/src/scan.test.ts:170
LOW js-unescaped-html-sink packages/provenance/src/scan.test.ts:216

…and 5 more. Full results in the Security tab.

Snippets are redacted; ThreatCrush never prints matched credential material.

@ralyodio
ralyodio merged commit dc7c7f3 into main Sep 16, 2026
8 checks passed
@ralyodio
ralyodio deleted the feat/bundled-engine branch September 17, 2026 09:12
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