{"record":{"id":"f9ad6b32b8e14de2","repo":"plandex-ai/plandex","slug":"error-validating-email-verification-v","errorCode":null,"errorMessage":"error validating email verification: %v","messagePattern":"error validating email verification: (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"app/server/handlers/auth_helpers.go","lineNumber":344,"sourceCode":"\t\tuser, err = db.GetUserByEmail(req.Email)\n\n\t\tif err != nil {\n\t\t\tlog.Printf(\"Error getting user: %v\\n\", err)\n\t\t\treturn nil, fmt.Errorf(\"error getting user: %v\", err)\n\t\t}\n\n\t\tif user == nil {\n\t\t\tlog.Printf(\"User not found for email: %v\\n\", req.Email)\n\t\t\treturn nil, fmt.Errorf(\"not found\")\n\t\t}\n\n\t\t// only validate email in non-local mode\n\t\tif !isLocalMode {\n\t\t\temailVerificationId, err = db.ValidateEmailVerification(req.Email, req.Pin)\n\n\t\t\tif err != nil {\n\t\t\t\tlog.Printf(\"Error validating email verification: %v\\n\", err)\n\t\t\t\treturn nil, fmt.Errorf(\"error validating email verification: %v\", err)\n\t\t\t}\n\n\t\t\tlog.Println(\"Email verification successful\")\n\t\t}\n\t}\n\n\tvar token string\n\tvar authTokenId string\n\n\terr = db.WithTx(r.Context(), \"validate and sign in\", func(tx *sqlx.Tx) error {\n\t\tvar err error\n\t\t// create auth token\n\t\ttoken, authTokenId, err = db.CreateAuthToken(user.Id, tx)\n\n\t\tif err != nil {\n\t\t\tlog.Printf(\"Error creating auth token: %v\\n\", err)\n\t\t\treturn fmt.Errorf(\"error creating auth token: %v\", err)\n\t\t}","sourceCodeStart":326,"sourceCodeEnd":362,"githubUrl":"https://github.com/plandex-ai/plandex/blob/e2d772072efadbe41d2946d97d79be55532dbab5/app/server/handlers/auth_helpers.go#L326-L362","documentation":"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.","triggerScenarios":"isLocalMode is false and the client's email+pin fails ValidateEmailVerification: pin mismatch, pin expired, verification record absent, or underlying DB error.","commonSituations":"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.","solutions":["Have the user request a fresh verification pin and retry","Verify isLocalMode expectation — dev bypass only applies when local mode is enabled","Check expiry window/TTL configuration for email verifications","Confirm email delivery is working so users actually receive pins"],"exampleFix":"// before\nreturn nil, fmt.Errorf(\"error validating email verification: %v\", err)\n// after\nlog.Printf(\"email verification failed email=%s: %v\", req.Email, err)\nreturn nil, fmt.Errorf(\"error validating email verification: %v\", err)","handlingStrategy":"retry","validationCode":"// client-side: ensure a pin was actually entered before submitting\nif len(strings.TrimSpace(pin)) == 0 {\n\treturn errors.New(\"enter the verification pin from your email\")\n}","typeGuard":null,"tryCatchPattern":"user, err := ValidateAndSignIn(w, r, req)\nif err != nil {\n\tif strings.HasPrefix(err.Error(), \"error validating email verification\") {\n\t\thttp.Error(w, \"invalid or expired pin — request a new one\", http.StatusUnauthorized)\n\t\treturn\n\t}\n\thttp.Error(w, err.Error(), http.StatusUnauthorized)\n}","preventionTips":["Request a fresh pin on failure rather than retrying the same one","Keep pin TTL generous enough for email delivery delay","Verify email delivery pipeline health (bounce/complaint monitoring)","In dev, enable isLocalMode to bypass verification"],"tags":["auth","email-verification","pin"],"backgroundTag":"email-verification-failed","analyzedSha":"e2d772072efadbe41d2946d97d79be55532dbab5","analyzedAt":"2026-09-05T20:56:53.631Z","contentChangedAt":"2026-09-05T20:56:53.631Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}