AdguardTeam/AdGuardHome · error

searching user by login

Error message

searching user by login %q: %w

What it means

A session cookie resolved to a valid session, but loading the user by login from the users storage failed. The wrapped error indicates the user store (JSON/DB) backend error, not a missing user.

Solutions

  1. Inspect the wrapped error to identify the storage failure
  2. Check/repair the users storage file in the working directory
  3. Ensure single instance and correct file permissions
  4. As a last resort, recreate the users store (users will need re-provisioning)
Defensive patterns

Strategy: try-catch

Try / catch

// On user-store errors, force re-login rather than retrying
if err != nil { clearSessionCookie(w); redirect to login }

Prevention

When it happens

Trigger: userFromCookie with a session whose s.UserLogin lookup via Users.ByLogin returns an error (I/O, parse, or consistency failure).

Common situations: Users file corrupted or being rewritten concurrently, schema mismatch after downgrade, permission issues on data dir.

Related errors


AI-assisted analysis of AdguardTeam/AdGuardHome@b41aefbe51 (2026-08-27). Data as JSON: /api/errors/2e7d23f2d92208da. Report an issue: GitHub.

Appendix: source

Thrown at internal/home/authhttp.go:537

) (u *aghuser.User, err error) {
	t, err := sessionTokenFromHex(val)
	if err != nil {
		// Don't wrap the error because it's informative enough as is.
		return nil, err
	}

	s, err := mw.sessions.FindByToken(ctx, t)
	if err != nil {
		return nil, fmt.Errorf("searching session by token: %w", err)
	}

	if s == nil {
		return nil, nil
	}

	u, err = mw.users.ByLogin(ctx, s.UserLogin)
	if err != nil {
		return nil, fmt.Errorf("searching user by login %q: %w", s.UserLogin, err)
	}

	return u, nil
}

// sessionTokenFromHex converts a hexadecimal string into a session token.
func sessionTokenFromHex(val string) (token aghuser.SessionToken, err error) {
	sess, err := hex.DecodeString(val)
	if err != nil {
		return token, fmt.Errorf("decoding value: %w", err)
	}

	l := aghuser.SessionTokenLength

	err = validate.Equal("token length", l, len(sess))
	if err != nil {
		// Don't wrap the error because it's informative enough as is.
		return token, err

View on GitHub (pinned to b41aefbe51)