plandex-ai/plandex · error

error validating email verification: %v

Error message

error validating email verification: %v

What it means

Wraps a failure from db.ValidateEmailVerification(req.Email, req.Pin) during non-local-mode sign-in. The email verification pin did not validate — wrong/expired pin, missing verification row, or a DB error.

Source

Thrown at app/server/handlers/auth_helpers.go:344

		user, err = db.GetUserByEmail(req.Email)

		if err != nil {
			log.Printf("Error getting user: %v\n", err)
			return nil, fmt.Errorf("error getting user: %v", err)
		}

		if user == nil {
			log.Printf("User not found for email: %v\n", req.Email)
			return nil, fmt.Errorf("not found")
		}

		// only validate email in non-local mode
		if !isLocalMode {
			emailVerificationId, err = db.ValidateEmailVerification(req.Email, req.Pin)

			if err != nil {
				log.Printf("Error validating email verification: %v\n", err)
				return nil, fmt.Errorf("error validating email verification: %v", err)
			}

			log.Println("Email verification successful")
		}
	}

	var token string
	var authTokenId string

	err = db.WithTx(r.Context(), "validate and sign in", func(tx *sqlx.Tx) error {
		var err error
		// create auth token
		token, authTokenId, err = db.CreateAuthToken(user.Id, tx)

		if err != nil {
			log.Printf("Error creating auth token: %v\n", err)
			return fmt.Errorf("error creating auth token: %v", err)
		}

View on GitHub (pinned to e2d772072e)

Solutions

  1. Have the user request a fresh verification pin and retry
  2. Verify isLocalMode expectation — dev bypass only applies when local mode is enabled
  3. Check expiry window/TTL configuration for email verifications
  4. Confirm email delivery is working so users actually receive pins

Example fix

// before
return nil, fmt.Errorf("error validating email verification: %v", err)
// after
log.Printf("email verification failed email=%s: %v", req.Email, err)
return nil, fmt.Errorf("error validating email verification: %v", err)
Defensive patterns

Strategy: retry

Validate before calling

// client-side: ensure a pin was actually entered before submitting
if len(strings.TrimSpace(pin)) == 0 {
	return errors.New("enter the verification pin from your email")
}

Try / catch

user, err := ValidateAndSignIn(w, r, req)
if err != nil {
	if strings.HasPrefix(err.Error(), "error validating email verification") {
		http.Error(w, "invalid or expired pin — request a new one", http.StatusUnauthorized)
		return
	}
	http.Error(w, err.Error(), http.StatusUnauthorized)
}

Prevention

When it happens

Trigger: isLocalMode is false and the client's email+pin fails ValidateEmailVerification: pin mismatch, pin expired, verification record absent, or underlying DB error.

Common situations: User enters an old or mistyped pin; verification pin TTL expired; emails not delivered so user never got a fresh pin; clock skew invalidating expiry windows.

Related errors


AI-assisted analysis of plandex-ai/plandex@e2d772072e (2026-09-05). Data as JSON: /api/errors/f9ad6b32b8e14de2. Report an issue: GitHub.