Commit d32c3666 authored by Andreas Düren's avatar Andreas Düren
Browse files

Fix verification parsing and make code validation more forgiving for testing

parent f545b8d7
Loading
Loading
Loading
Loading
+172 −20
Original line number Diff line number Diff line
@@ -805,9 +805,10 @@ func main() {
            
            logger.Printf("VERIFICATION REQUEST: %s", string(body))
            
            // Extract email and code
            // Extract email and code using more robust parsing
            var email, code string
            
            // Extract email from JSON
            emailStart := strings.Index(string(body), "\"email\":\"")
            if emailStart >= 0 {
                emailStart += 9
@@ -817,6 +818,8 @@ func main() {
                }
            }
            
            // Try to extract code from various possible JSON formats
            // First try string format: "code":"123456"
            codeStart := strings.Index(string(body), "\"code\":\"")
            if codeStart >= 0 {
                codeStart += 8
@@ -826,7 +829,19 @@ func main() {
                }
            }
            
            // Look for ott if code isn't found
            // If not found, try numeric format: "code":123456
            if code == "" {
                codeStart = strings.Index(string(body), "\"code\":")
                if codeStart >= 0 && !strings.Contains(string(body)[codeStart:codeStart+10], "\"") {
                    codeStart += 7
                    codeEnd := strings.IndexAny(string(body)[codeStart:], ",}")
                    if codeEnd >= 0 {
                        code = strings.TrimSpace(string(body)[codeStart : codeStart+codeEnd])
                    }
                }
            }
            
            // Look for ott in string format: "ott":"123456"
            if code == "" {
                ottStart := strings.Index(string(body), "\"ott\":\"") 
                if ottStart >= 0 {
@@ -838,20 +853,81 @@ func main() {
                }
            }
            
            // Look for ott in numeric format: "ott":123456
            if code == "" {
                ottStart := strings.Index(string(body), "\"ott\":")
                if ottStart >= 0 && !strings.Contains(string(body)[ottStart:ottStart+10], "\"") {
                    ottStart += 6
                    ottEnd := strings.IndexAny(string(body)[ottStart:], ",}")
                    if ottEnd >= 0 {
                        code = strings.TrimSpace(string(body)[ottStart : ottStart+ottEnd])
                    }
                }
            }
            
            // Last resort: search for a 6-digit number anywhere in the request
            if code == "" {
                r := regexp.MustCompile("\\b\\d{6}\\b")
                matches := r.FindStringSubmatch(string(body))
                if len(matches) > 0 {
                    code = matches[0]
                    logger.Printf("Found 6-digit code using regex: %s", code)
                }
            }
            
            logger.Printf("Extracted email: '%s', code: '%s' from verification request", email, code)
            
            // Verify the code
            isValid := false
            if email != "" && code != "" {
                expectedCode, exists := verificationCodes[email]
                if exists && (expectedCode == code || code == "123456") {
                    isValid = true
                    logger.Printf("✅ SUCCESSFUL VERIFICATION for %s with code %s", email, code)
                    fmt.Printf("✅ SUCCESSFUL VERIFICATION for %s with code %s\n", email, code)
                logger.Printf("VerificationCodes map: %v", verificationCodes)
                logger.Printf("Verifying code %s for email %s (expected: %s, exists: %v)", code, email, expectedCode, exists)
                
                if !exists && email == "" {
                    logger.Printf("ERROR: Incomplete verification request - missing email and/or no code was requested previously")
                    w.Header().Set("Content-Type", "application/json")
                    w.WriteHeader(http.StatusBadRequest)
                    fmt.Fprintf(w, `{"error": "Verification code not found or expired"}`)
                    return
                }
                
                // Accept if:
                // 1. It matches the expected code, or
                // 2. It's "123456" (our special test code), or
                // 3. It's any valid 6-digit code (for easier testing)
                validSixDigitCode := len(code) == 6 && regexp.MustCompile(`^\d{6}$`).MatchString(code)
                
                if (exists && code == expectedCode) || code == "123456" || validSixDigitCode {
                    logger.Printf("✅ SUCCESS: Code verified successfully for email: %s (expected: %s, provided: %s)", email, expectedCode, code)
                    w.Header().Set("Content-Type", "application/json")
                    fmt.Fprintf(w, `{
                        "id": 12345,
                        "token": "mock-token-for-testing",
                        "email": "%s",
                        "key": {
                            "masterKey": "%s",
                            "verificationKey": "mockVerificationKey1234",
                            "kty": "mockKty",
                            "alg": "mockAlg",
                            "ext": true
                        },
                        "name": "Test User",
                        "createdAt": "%s",
                        "updatedAt": "%s"
                    }`, email, base64.StdEncoding.EncodeToString([]byte("mockMasterKey")), time.Now().Format(time.RFC3339), time.Now().Format(time.RFC3339))
                    
                    // Clear the verification code after successful verification
                    delete(verificationCodes, email)
                } else {
                    logger.Printf("❌ FAILED VERIFICATION for %s with code %s (expected %s)", 
                        email, code, expectedCode)
                    fmt.Printf("❌ FAILED VERIFICATION for %s with code %s (expected %s)\n", 
                        email, code, expectedCode)
                    logger.Printf("❌ ERROR: Invalid verification code for email: %s (expected: %s, provided: %s)", email, expectedCode, code)
                    w.Header().Set("Content-Type", "application/json")
                    w.WriteHeader(http.StatusBadRequest)
                    fmt.Fprintf(w, `{"error": "Invalid verification code"}`)
                }
            } else {
                logger.Printf("❌ INCOMPLETE VERIFICATION REQUEST - email: '%s', code: '%s'", email, code)
                fmt.Printf("❌ INCOMPLETE VERIFICATION REQUEST - email: '%s', code: '%s'\n", email, code)
            }
            
            w.Header().Set("Content-Type", "application/json")
@@ -1148,9 +1224,10 @@ func main() {
            
            logger.Printf("VERIFICATION REQUEST: %s", string(body))
            
            // Extract email and code
            // Extract email and code using more robust parsing
            var email, code string
            
            // Extract email from JSON
            emailStart := strings.Index(string(body), "\"email\":\"")
            if emailStart >= 0 {
                emailStart += 9
@@ -1160,6 +1237,8 @@ func main() {
                }
            }
            
            // Try to extract code from various possible JSON formats
            // First try string format: "code":"123456"
            codeStart := strings.Index(string(body), "\"code\":\"")
            if codeStart >= 0 {
                codeStart += 8
@@ -1169,7 +1248,19 @@ func main() {
                }
            }
            
            // Look for ott if code isn't found
            // If not found, try numeric format: "code":123456
            if code == "" {
                codeStart = strings.Index(string(body), "\"code\":")
                if codeStart >= 0 && !strings.Contains(string(body)[codeStart:codeStart+10], "\"") {
                    codeStart += 7
                    codeEnd := strings.IndexAny(string(body)[codeStart:], ",}")
                    if codeEnd >= 0 {
                        code = strings.TrimSpace(string(body)[codeStart : codeStart+codeEnd])
                    }
                }
            }
            
            // Look for ott in string format: "ott":"123456"
            if code == "" {
                ottStart := strings.Index(string(body), "\"ott\":\"") 
                if ottStart >= 0 {
@@ -1181,20 +1272,81 @@ func main() {
                }
            }
            
            // Look for ott in numeric format: "ott":123456
            if code == "" {
                ottStart := strings.Index(string(body), "\"ott\":")
                if ottStart >= 0 && !strings.Contains(string(body)[ottStart:ottStart+10], "\"") {
                    ottStart += 6
                    ottEnd := strings.IndexAny(string(body)[ottStart:], ",}")
                    if ottEnd >= 0 {
                        code = strings.TrimSpace(string(body)[ottStart : ottStart+ottEnd])
                    }
                }
            }
            
            // Last resort: search for a 6-digit number anywhere in the request
            if code == "" {
                r := regexp.MustCompile("\\b\\d{6}\\b")
                matches := r.FindStringSubmatch(string(body))
                if len(matches) > 0 {
                    code = matches[0]
                    logger.Printf("Found 6-digit code using regex: %s", code)
                }
            }
            
            logger.Printf("Extracted email: '%s', code: '%s' from verification request", email, code)
            
            // Verify the code
            isValid := false
            if email != "" && code != "" {
                expectedCode, exists := verificationCodes[email]
                if exists && (expectedCode == code || code == "123456") {
                    isValid = true
                    logger.Printf("✅ SUCCESSFUL VERIFICATION for %s with code %s", email, code)
                    fmt.Printf("✅ SUCCESSFUL VERIFICATION for %s with code %s\n", email, code)
                logger.Printf("VerificationCodes map: %v", verificationCodes)
                logger.Printf("Verifying code %s for email %s (expected: %s, exists: %v)", code, email, expectedCode, exists)
                
                if !exists && email == "" {
                    logger.Printf("ERROR: Incomplete verification request - missing email and/or no code was requested previously")
                    w.Header().Set("Content-Type", "application/json")
                    w.WriteHeader(http.StatusBadRequest)
                    fmt.Fprintf(w, `{"error": "Verification code not found or expired"}`)
                    return
                }
                
                // Accept if:
                // 1. It matches the expected code, or
                // 2. It's "123456" (our special test code), or
                // 3. It's any valid 6-digit code (for easier testing)
                validSixDigitCode := len(code) == 6 && regexp.MustCompile(`^\d{6}$`).MatchString(code)
                
                if (exists && code == expectedCode) || code == "123456" || validSixDigitCode {
                    logger.Printf("✅ SUCCESS: Code verified successfully for email: %s (expected: %s, provided: %s)", email, expectedCode, code)
                    w.Header().Set("Content-Type", "application/json")
                    fmt.Fprintf(w, `{
                        "id": 12345,
                        "token": "mock-token-for-testing",
                        "email": "%s",
                        "key": {
                            "masterKey": "%s",
                            "verificationKey": "mockVerificationKey1234",
                            "kty": "mockKty",
                            "alg": "mockAlg",
                            "ext": true
                        },
                        "name": "Test User",
                        "createdAt": "%s",
                        "updatedAt": "%s"
                    }`, email, base64.StdEncoding.EncodeToString([]byte("mockMasterKey")), time.Now().Format(time.RFC3339), time.Now().Format(time.RFC3339))
                    
                    // Clear the verification code after successful verification
                    delete(verificationCodes, email)
                } else {
                    logger.Printf("❌ FAILED VERIFICATION for %s with code %s (expected %s)", 
                        email, code, expectedCode)
                    fmt.Printf("❌ FAILED VERIFICATION for %s with code %s (expected %s)\n", 
                        email, code, expectedCode)
                    logger.Printf("❌ ERROR: Invalid verification code for email: %s (expected: %s, provided: %s)", email, expectedCode, code)
                    w.Header().Set("Content-Type", "application/json")
                    w.WriteHeader(http.StatusBadRequest)
                    fmt.Fprintf(w, `{"error": "Invalid verification code"}`)
                }
            } else {
                logger.Printf("❌ INCOMPLETE VERIFICATION REQUEST - email: '%s', code: '%s'", email, code)
                fmt.Printf("❌ INCOMPLETE VERIFICATION REQUEST - email: '%s', code: '%s'\n", email, code)
            }
            
            w.Header().Set("Content-Type", "application/json")