moonD4rk/HackBrowserData · critical
all retrievers failed: %w
Error message
all retrievers failed: %w
What it means
The aggregate failure returned when every retriever in the chain failed to produce a non-empty key. It wraps the errors.Join of all per-retriever errors, so the full failure list is available via errors.Unwrap/As. This is the terminal error of the multi-retriever RetrieveKey.
Source
Thrown at masterkey/retriever.go:48
}
func NewChain(retrievers ...Retriever) Retriever {
return &ChainRetriever{retrievers: retrievers}
}
func (c *ChainRetriever) RetrieveKey(hints Hints) ([]byte, error) {
var errs []error
for _, r := range c.retrievers {
key, err := r.RetrieveKey(hints)
if err == nil && len(key) > 0 {
return key, nil
}
if err != nil {
log.Debugf("retriever %T failed: %v", r, err)
errs = append(errs, fmt.Errorf("%T: %w", r, err))
}
}
return nil, fmt.Errorf("all retrievers failed: %w", errors.Join(errs...))
}
View on GitHub (pinned to 0503d04d7a)
Solutions
- Unwrap the joined errors (errors.Unwrap returns []error) and fix each underlying cause
- Verify at least one retriever is valid for the current OS/browser and correctly configured
- Confirm the key source exists (keychain unlocked, key file present, credentials set)
- Add a working retriever for the environment or skip key extraction gracefully
Example fix
// before
key, err := retriever.RetrieveKey(hints)
if err != nil { return nil, err }
// after
key, err := retriever.RetrieveKey(hints)
if err != nil {
if joined, ok := err.(interface{ Unwrap() []error }); ok {
for _, e := range joined.Unwrap() {
log.Printf("cause: %v", e)
}
}
return nil, fmt.Errorf("no master key available: %w", err)
} Defensive patterns
Strategy: fallback
Validate before calling
if !keychainAvailable() && !credentialsSet() {
return errors.New("no key source available on this machine")
} Type guard
func allRetrieversFailed(err error) bool {
return err != nil && strings.HasPrefix(err.Error(), "all retrievers failed")
} Try / catch
key, err := multiRetriever.RetrieveKey(hints)
if err != nil {
var joined interface{ Unwrap() []error }
if errors.As(err, &joined) {
for _, cause := range joined.Unwrap() {
log.Printf("all-retrievers cause: %v", cause)
}
}
} Prevention
- Verify the browser key source exists before attempting extraction
- Keep at least one OS-appropriate retriever in the chain
- Degrade gracefully: skip key extraction when all retrievers fail
When it happens
Trigger: Calling RetrieveKey when all configured retrievers either return an error or an empty key slice; errs is non-empty and no earlier retriever succeeded.
Common situations: Running on a machine without the target browser's key material, wrong keychain password on macOS, missing credentials on Windows/Linux, or all retrievers misconfigured.
Understand the failure class
Background: "API request failed": what wrapped HTTP errors from external APIs mean and how to find the real cause — this error's family across 29 libraries.
Related errors
- %T: %w
- %s: %w
- abe: unexpected key length %d (want 32)
- abe: encrypted key too short: %d bytes
- abe: unexpected prefix: got %q, want %q
AI-assisted analysis of moonD4rk/HackBrowserData@0503d04d7a (2026-09-06).
Data as JSON: /api/errors/b6e70bbd92d61dc0.
Report an issue: GitHub.