Skip to content

feat(browser_profiles): browser & embedded-Chromium container catalog#12

Merged
h4x0r merged 3 commits into
mainfrom
feat/browser-profile-catalog
Jul 12, 2026
Merged

feat(browser_profiles): browser & embedded-Chromium container catalog#12
h4x0r merged 3 commits into
mainfrom
feat/browser-profile-catalog

Conversation

@h4x0r

@h4x0r h4x0r commented Jul 12, 2026

Copy link
Copy Markdown
Contributor

Summary

Adds src/browser_profiles.rs — a pure-data knowledge module (sibling to temporal_formats.rs) describing the on-disk shape that marks a Chromium/Firefox profile, and an attribution catalog naming the desktop apps that ship an embedded Chromium profile. This is the knowledge half of a knowledge/engine split; the browser-forensic discovery engine consumes it to run a structural signature sweep (not an app allow-list), so an unknown-named Chromium-shaped directory is still discovered — just generically labelled.

What's in it

  • Profile-shape markersCHROMIUM_PROFILE_MARKERS / FIREFOX_PROFILE_MARKERS as &'static [ProfileMarker] (each with MarkerKind::File|Dir, incl. nested Local Storage/leveldb, Network/Cookies), plus CHROMIUM_ARTIFACT_FILES, CHROMIUM_SESSION_FILE_PREFIXES (Session_/Tabs_), FIREFOX_PROFILE_MARKER_SUFFIXES (.jsonlz4/.baklz4), and chromium_profile_markers() / firefox_profile_markers() accessors.
  • Attribution catalogContainerApp { name, vendor, kind: AppKind, path_tokens, macos/linux/windows_bases } and a 31-entry CONTAINER_APPS table spanning Browser / Electron / WebView2 / Cef. attribute_container(path) -> Option<&'static ContainerApp> does a zero-alloc, no_std-safe, case- & separator-insensitive substring match with folder-boundary anchoring (so /code/ does not swallow openai.codex_).

Tokens were seeded from Browser-Reviewer's discovery sweep and expanded via web research against each app's documented user-data location, cited in the module doc comment:

Honest caveats noted inline: Telegram Desktop is Qt/tdata (not Chromium) → deliberately absent; newest Windows WhatsApp is WebView2/Store, not the older Electron app; classic Teams (Electron) vs new Teams (WebView2) both catalogued.

Versioning

1.4.0 is already published to crates.io, so this additive module ships as 1.5.0 (package version + workspace pin bumped). Under release-plz the feat: commit yields the 1.5.0 release PR.

Gate

  • cargo test -p forensicnomicon — 1667 pass (14 new)
  • MSRV 1.75cargo +1.75 test green
  • Zero third-party deps preserved — cargo tree --edges no-dev shows only internal workspace crates
  • clippy (my module clean), fmt --check, cargo deny check (advisories/bans/licenses/sources ok)
  • Serde derives gated behind the optional serde feature, matching siblings

TDD: RED (7a676c8, failing tests) → GREEN (97f35bf).

🤖 Generated with Claude Code

h4x0r and others added 3 commits July 12, 2026 20:59
…atalog

Add the failing test suite for a new pure-data browser/embedded-Chromium
knowledge module: Chromium & Firefox profile-signature markers (file vs
dir), Chromium artifact filenames + session-file prefixes, and an app
attribution catalog (ContainerApp / AppKind / attribute_container) spanning
browsers, Electron, WebView2 (EBWebView) and CEF hosts.

Types + empty tables + stub attribute_container compile; 12 tests fail.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…talog

Fill the pure-data browser/container knowledge module:

- Chromium & Firefox profile-signature markers (file vs dir, incl. nested
  Local Storage/leveldb and Network/Cookies), Chromium artifact filenames,
  session-file prefixes, and Firefox mozLz4 suffixes.
- CONTAINER_APPS: 31-entry attribution catalog across Browser / Electron /
  WebView2 (EBWebView) / CEF hosts — Chrome, Edge, Brave, Vivaldi, Opera,
  Arc, Yandex, Chromium, Firefox; OneDrive, new Outlook (Olk), Widgets,
  Copilot, new Teams; Slack, Discord, classic Teams, Signal, WhatsApp,
  VS Code, OpenAI Codex, Notion, 1Password, Obsidian, GitHub Desktop,
  Postman, Figma, Element, Skype; Steam (CEF), Spotify (CEF). Tokens seeded
  from Browser-Reviewer and expanded from each app's documented user-data
  location (Electron app.getPath, WebView2 UDF, Chromium user_data_dir).
- attribute_container(): zero-alloc, no_std-safe, case- & separator-
  insensitive substring match with folder-boundary anchoring so /code/ does
  not swallow openai.codex_.

Serde derives gated behind the optional feature, matching siblings. All 14
tests pass; MSRV 1.75 clean; zero third-party deps preserved.

Ships in 1.5.0 (1.4.0 already published to crates.io).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…rust 1.96)

Pre-existing CI red on this branch's base (unrelated to browser_profiles):
- rustfmt --all collapses a wrapped import in a generated descriptor file.
- clippy 1.96 doc_lazy_continuation flags a NEW_CHANNEL_EVENTS doc line that
  is a new paragraph, not a list continuation — separate it with a blank
  doc line.

Both fixes are mechanical; browser_profiles was already fmt/clippy clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@h4x0r h4x0r marked this pull request as ready for review July 12, 2026 13:51
@h4x0r h4x0r merged commit 3d7737b into main Jul 12, 2026
11 checks passed
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.

1 participant