feat(chromium): extract passwords from the account-synced store - #637
Open
slimwang wants to merge 1 commit into
Open
feat(chromium): extract passwords from the account-synced store#637slimwang wants to merge 1 commit into
slimwang wants to merge 1 commit into
Conversation
Chromium keeps account-synced credentials in a separate "Login Data For Account" DB. Entries carry a Store field because the same credential can legitimately exist in both stores.
There was a problem hiding this comment.
🟢 Approval recommended
The implementation consistently preserves store provenance and covers extraction, counting, ordering, output, and archival behavior.
Pull request overview
Adds extraction and provenance tracking for Chromium’s account-synced password store.
Changes:
- Extracts, counts, merges, and archives local and account password databases.
- Adds the required
storefield across password extractors and output formats. - Adds coverage for dual-store, account-only, duplicate, and archive scenarios.
File summaries
| File | Description |
|---|---|
types/models.go |
Defines password stores and adds provenance to login entries. |
output/reflect_test.go |
Updates reflected CSV/JSON schema tests. |
output/output_test.go |
Updates output fixtures and CSV expectations. |
browser/safari/extract_password.go |
Marks Safari credentials as local. |
browser/firefox/extract_password.go |
Marks Firefox credentials as local. |
browser/chromium/source.go |
Adds the account database fallback source. |
browser/chromium/profile.go |
Acquires, extracts, merges, and counts both stores. |
browser/chromium/profile_test.go |
Tests dual-store, duplicate, and account-only profiles. |
browser/chromium/extract_password.go |
Labels credentials and performs stable merged sorting. |
browser/chromium/extract_password_test.go |
Tests store labels and undecryptable credentials. |
browser/chromium/archive.go |
Includes account password databases in archives. |
browser/chromium/archive_test.go |
Verifies both databases are enumerated for archiving. |
Review details
- Files reviewed: 12/12 changed files
- Comments generated: 0
- Review effort level: Balanced
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Extract Chromium credentials from both the profile-local
Login Datadatabaseand the account-synced
Login Data For Accountdatabase.Chromium can legitimately keep the same credential in both databases. This
change preserves both records and adds a
storefield so consumers retaintheir source provenance instead of losing information through deduplication.
What changed
Login Data For Accountas a fallback when no local database exists.CreatedAtorder.localandaccountvalues totypes.LoginEntry.Store.localfor Firefox, Safari, and Yandex password extractors.archive source enumeration.
Output compatibility
This intentionally changes the password output schema:
storeproperty.password.csvgains a seventhstorecolumn.types.LoginEntrystruct gains aStore stringfield.storeidentifies the backend/source from which HackBrowserData read thecredential. It does not indicate whether a Firefox or Safari credential has
ever participated in browser or platform sync.
{ "url": "https://example.com", "username": "alice", "password": "secret", "created_at": "2026-01-15T10:30:00Z", "store": "account" }Validation
go test ./...with Go 1.26.2 on macOS arm64go test ./...with Go 1.20.14 on macOS arm64go vet ./...Windows test binaries were cross-compiled but not executed during this review.
Checklist
mainbranchgo.modremains at Go 1.20