BuildDump exports one Vault per installation (Firefox/Safari, lacking KeyManager, are skipped). Partial results are kept — a Chrome 127+ profile mixes v10+v20, so a v20-only failure must not discard a usable v10 key.
(browsers []Browser)
| 15 | // Partial results are kept — a Chrome 127+ profile mixes v10+v20, so a v20-only failure must not |
| 16 | // discard a usable v10 key. |
| 17 | func BuildDump(browsers []Browser) masterkey.Dump { |
| 18 | dump := masterkey.NewDump() |
| 19 | for _, b := range browsers { |
| 20 | km, ok := b.(KeyManager) |
| 21 | if !ok { |
| 22 | continue |
| 23 | } |
| 24 | mk, err := km.ExportKeys() |
| 25 | if err != nil { |
| 26 | status := "partial" |
| 27 | if !mk.HasAny() { |
| 28 | status = "failed" |
| 29 | } |
| 30 | log.Warnf("dump-keys: %s %s: %v", b.BrowserName(), status, err) |
| 31 | } |
| 32 | if !mk.HasAny() { |
| 33 | continue |
| 34 | } |
| 35 | kind, err := kindToDump(km.Kind()) |
| 36 | if err != nil { |
| 37 | log.Warnf("dump-keys: %s: %v", b.BrowserName(), err) |
| 38 | continue |
| 39 | } |
| 40 | dump.Vaults = append(dump.Vaults, masterkey.Vault{ |
| 41 | Browser: km.BrowserKey(), |
| 42 | Kind: kind, |
| 43 | UserDataDir: b.UserDataDir(), |
| 44 | Profiles: profileNames(b), |
| 45 | Keys: mk, |
| 46 | }) |
| 47 | } |
| 48 | return dump |
| 49 | } |
| 50 | |
| 51 | func profileNames(b Browser) []string { |
| 52 | profiles := b.Profiles() |