summaryrefslogtreecommitdiff
path: root/architecture.md
diff options
context:
space:
mode:
Diffstat (limited to 'architecture.md')
-rw-r--r--architecture.md128
1 files changed, 128 insertions, 0 deletions
diff --git a/architecture.md b/architecture.md
new file mode 100644
index 0000000..986be62
--- /dev/null
+++ b/architecture.md
@@ -0,0 +1,128 @@
+# Architecture
+
+## Runtime Topology
+
+Four execution contexts:
+
+### 1. Background Page (control plane)
+- Entry: `background/background.html` → `background/background.js` (2.9MB minified)
+- Also loads: `background/health-check.js` (responds to `health-check-request`)
+- Central broker for all policy decisions, vault operations, native messaging, sync, telemetry
+- Initializes: database, core interface (WASM), feature flags (Unleash), native app connection, XAM backend, context menus, Watchtower data
+- Event subscriptions handle account changes, lock/unlock, session state transitions
+- Exports `b5xHandlers` for b5 web app integration and `initializeFinishedPromise` for startup gating
+
+### 2. Content Script Bootstrap (every page, every frame)
+- Entry: `inline/inject-content-scripts.js` at `document_start`, `all_frames: true`, `<all_urls>`
+- Guards against double-injection (`injectJsHasStarted` property)
+- Dynamically imports two modules:
+ - `/inline/injected.js` (368KB) — always loaded (page managers, autofill, inline menu, frame management)
+ - `/inline/injected/heuristics.js` — conditionally loaded when `login-detection-is-enabled` returns true from background
+- Import retry logic: 3 attempts with 25ms/50ms delays between retries
+- Error reporting via `report-error` message to background
+- Initializes a `LogReporter` (logger) that forwards all content-script logs to background via `new-tab-log-event`
+
+### 3. Specialized Content Scripts (host-specific)
+Declared in manifest, loaded on matching hosts:
+
+| Script | Hosts | Timing | Purpose |
+|--------|-------|--------|---------|
+| `webauthn.js` + `webauthn-listeners.js` | `https://*/*`, `http://localhost/*` | `document_start` | WebAuthn/passkey mediation (see [webauthn-analysis.md](webauthn-analysis.md)) |
+| `b5.js` | `*.1password.com/ca/eu`, `*.b5dev.*`, `*.b5test.*`, `*.b5local.*`, `*.b5staging.*`, `*.b5rev.*` | `document_idle` | 1Password web app integration, SSO completion, session init |
+| `kolide.js` | `app.kolide.com/ca/eu`, `auth.kolide.com/ca/eu` | `document_start` | Kolide device trust / EPM integration |
+| `secure-remote-autofill-start-pairing.js` | `www.director.ai/?*`, `www.director.ai/` | `document_end` | Remote autofill pairing initiation |
+| `secure-remote-autofill-complete-pairing.js` | `www.director.ai/complete-1password-pairing*` | `document_end` | Remote autofill pairing completion |
+| `autofill.js` | `autofill.me/*` | `document_start` | Test/demo autofill site |
+
+### 4. Extension UI Surfaces
+- `app/app.html` + `app/app.js` (682KB) — main extension window/panel
+- `popup/index.html` + `popup/index.js` (399KB) + `popup/set-popup-width.js` — browser action popup
+- `launcher/apps.html` + `launcher/apps.js` — app launcher
+- `inline/menu/menu.html` — inline autofill suggestion menu (web-accessible)
+- `inline/modal/modal.html` — modal dialogs for Privacy.com, email alias, Brex (web-accessible)
+- `inline/notification/notification.html` — save/update notifications (web-accessible)
+- `inline/universal-sign-on/universal-sign-on.html` — USO banner (web-accessible)
+- `inline/tutorial/tutorial.html` — onboarding tutorial
+- `devtools/devtools.html` + `devtools/panels.html` — DevTools logging panel
+
+## Chunk System
+
+356 chunk files under `chunks/`. Two categories:
+- **Code chunks**: `chunk-{HASH}.js` — shared logic modules (largest: `chunk-OJR52IF5.js` at 1.9MB, `chunk-MSIWLBOQ.js` at 804KB, `chunk-22IBMJDR.js` at 138KB)
+- **Icon/asset chunks**: named by icon (e.g., `icon_creditcard_color_32-HASH.js`, `sso_login_okta_32-HASH.js`)
+
+Semantic chunk name patterns observed: `account-family`, `account-team`, `developer_watchtower`, `browserbase_logo`, `browseruse-icon`, `anchor-browser-icon`, `browser-polyfill`, `import_guide_pen`.
+
+## WASM Modules
+
+Seven WebAssembly modules in `assets/wasm/` (total ~30MB):
+
+| Module | Size | Likely Purpose |
+|--------|------|----------------|
+| `op_wasm_b5x_bg` | 15.6MB | Core vault/crypto operations for b5x (extension) |
+| `op_wasm_xam_bg` | 11.2MB | XAM (cross-app management / device trust) backend |
+| `confidential_computing_bg` | 1.8MB | Confidential computing primitives |
+| `b5_trustlog_bg` | 1.3MB | Trust log generation/verification |
+| `b5_trust-verifier_bg` | 1.0MB | Trust verification |
+| `b5_mycelium_bg` | 319KB | Mycelium relay protocol (P2P communication for remote autofill) |
+| `b5_hpke_bg` | 82KB | Hybrid Public Key Encryption (RFC 9180) |
+
+The background.js initialization calls `rA.init(e)` ("initializeCoreInterface") which loads the main WASM module. CSP allows `wasm-unsafe-eval` for this purpose.
+
+## Permission Profile
+
+### Always granted
+`<all_urls>`, `alarms`, `clipboardWrite`, `contextMenus`, `downloads`, `idle`, `management`, `nativeMessaging`, `notifications`, `privacy`, `scripting`, `storage`, `tabs`, `webNavigation`, `webRequest`, `webRequestBlocking`, `declarativeNetRequestWithHostAccess`
+
+### Optional
+`bookmarks`
+
+### Web-Accessible Resources
+Source maps (`*.js.map`), fonts, images, and critically: `inline/injected.js`, `inline/injected/heuristics.js`, `inline/injected/styles/inline-tooltip.css`, and all inline UI HTML files (menu, notification, modal, universal-sign-on). These can be loaded/detected by any web page.
+
+## Feature Flags
+
+Unleash-based feature flag system with two tiers:
+- **Pre-registration flags**: evaluated before any account is signed in (e.g., `b5x-pre-auth-tracing`)
+- **Account-gated feature trials**: per-account feature flags from server
+
+Background broadcasts `unleash-features-changed` events to all listeners when flags update. Content scripts query individual flags (e.g., `login-detection-is-enabled`).
+
+## Initialization Sequence
+
+From `background.js` main init function (reconstructed):
+
+1. Initialize storage
+2. Initialize feature flags cache
+3. Check for terminated DB, set icon
+4. Get browser language
+5. Initialize Sentry
+6. Init build info
+7. Initialize core interface (WASM load)
+8. Set locale
+9. Initialize database (IndexedDB)
+10. Get device info, sync pre-registration feature flags
+11. Start performance observer (if tracing flag set)
+12. Load all accounts, set up account handlers
+13. Initialize crypto
+14. Subscribe to events: session changes, account updates, lock/unlock
+15. Load Watchtower data
+16. Initialize native app connection
+17. Initialize unlock-with-context cache
+18. Enable insiders (if appropriate)
+19. Initialize XAM backend
+20. Initialize App Launcher
+21. Migrate storage (if needed)
+22. Initialize context menus
+23. Initialize notifications
+
+## External Extension Communication
+
+3 references to `chrome.runtime.onMessageExternal` — the extension accepts messages from other extensions (likely 1Password desktop app or enterprise connectors). No `externally_connectable` manifest key found, so Firefox's default policy applies.
+
+## Build/Signing
+
+- Build channel: `stable`
+- Signed by Mozilla AMO Production Signing Service
+- COSE + RSA signatures in `META-INF/`
+- Sentry debug IDs embedded in every JS file for crash correlation