feat: add Chromium Browser with new v2 architecture (#530)

* feat: add Chromium Browser implementation with new architecture
* refactor: replace Walk with ReadDir+Stat for profile discovery
* refactor: remove queries override, use extractors for Yandex passwords
* refactor: remove dataSource wrapper, use []sourcePath directly
* fix: address Copilot review feedback on chromium_new.go
* fix: always call key retriever regardless of Local State existence
This commit is contained in:
Roger
2026-04-02 22:36:12 +08:00
committed by moonD4rk
parent 1ec2781131
commit 1b8bb1df3d
9 changed files with 899 additions and 54 deletions
+22 -7
View File
@@ -9,20 +9,28 @@ import (
"github.com/moond4rk/hackbrowserdata/types"
)
// defaultExtensionKeys are the JSON paths tried for standard Chromium browsers.
var defaultExtensionKeys = []string{
"extensions.settings",
"settings.extensions",
"settings.settings",
}
func extractExtensions(path string) ([]types.ExtensionEntry, error) {
return extractExtensionsWithKeys(path, defaultExtensionKeys)
}
// extractExtensionsWithKeys reads Secure Preferences and looks for extension
// settings under the given JSON key paths. This allows browser variants
// (e.g. Opera with "extensions.opsettings") to reuse the same parsing logic.
func extractExtensionsWithKeys(path string, keys []string) ([]types.ExtensionEntry, error) {
data, err := os.ReadFile(path)
if err != nil {
return nil, err
}
// Try known JSON paths for extension settings
settingKeys := []string{
"extensions.settings",
"settings.extensions",
"settings.settings",
}
var settings gjson.Result
for _, key := range settingKeys {
for _, key := range keys {
settings = gjson.GetBytes(data, key)
if settings.Exists() {
break
@@ -59,3 +67,10 @@ func extractExtensions(path string) ([]types.ExtensionEntry, error) {
return extensions, nil
}
// extractOperaExtensions extracts extensions from Opera's Secure Preferences,
// which stores extension data under "extensions.opsettings" instead of the
// standard "extensions.settings".
func extractOperaExtensions(path string) ([]types.ExtensionEntry, error) {
return extractExtensionsWithKeys(path, []string{"extensions.opsettings"})
}