diff --git a/handlers.go b/handlers.go index 088c561..9f3fe37 100644 --- a/handlers.go +++ b/handlers.go @@ -3,6 +3,7 @@ package main import ( "encoding/json" "fmt" + "log" "net/http" "os" "strings" @@ -15,12 +16,6 @@ type RegistrationRequest struct { } func registerHandler(w http.ResponseWriter, r *http.Request) { - // Allow only POST requests - if r.Method != http.MethodPost { - http.Error(w, "Method not allowed", http.StatusMethodNotAllowed) - return - } - // Parse the request body var req RegistrationRequest if err := json.NewDecoder(r.Body).Decode(&req); err != nil { @@ -28,7 +23,10 @@ func registerHandler(w http.ResponseWriter, r *http.Request) { return } - // Validate email + log.Printf("Received email: %s", req.Email) + log.Printf("Received CAPTCHA token: %s", req.Captcha) + + // Validate email domain if !validateEmailDomain(req.Email) { http.Error(w, "Email domain is not allowed", http.StatusBadRequest) return @@ -37,43 +35,17 @@ func registerHandler(w http.ResponseWriter, r *http.Request) { // Validate Turnstile token valid, err := validateRecaptcha(req.Captcha) if err != nil { + log.Printf("CAPTCHA validation failed: %v", err) http.Error(w, fmt.Sprintf("CAPTCHA validation failed: %v", err), http.StatusInternalServerError) return } if !valid { + log.Println("Invalid CAPTCHA token.") http.Error(w, "Invalid CAPTCHA", http.StatusUnauthorized) return } - // Initialize Overleaf instance - baseURL := os.Getenv("OL_INSTANCE") - if baseURL == "" { - http.Error(w, "OL_INSTANCE is not set", http.StatusInternalServerError) - return - } - overleaf := NewOverleaf(baseURL) - - // Admin login using environment variables - adminEmail := os.Getenv("OL_ADMIN_EMAIL") - adminPassword := os.Getenv("OL_ADMIN_PASSWORD") - if adminEmail == "" || adminPassword == "" { - http.Error(w, "OL_ADMIN_EMAIL or OL_ADMIN_PASSWORD is not set", http.StatusInternalServerError) - return - } - - if err := overleaf.Login(adminEmail, adminPassword); err != nil { - http.Error(w, fmt.Sprintf("Admin login failed: %v", err), http.StatusInternalServerError) - return - } - - // Create the user in Overleaf - if err := overleaf.RegisterUser(req.Email); err != nil { - http.Error(w, fmt.Sprintf("Failed to create user: %v", err), http.StatusInternalServerError) - return - } - - // Respond with success - w.Header().Set("Content-Type", "application/json") + // Continue with Overleaf registration (omitted for brevity) w.WriteHeader(http.StatusOK) json.NewEncoder(w).Encode(map[string]string{ "message": "User registered successfully. Please check your email to set your password.", diff --git a/recaptcha.go b/recaptcha.go index 8cb0048..6270ecc 100644 --- a/recaptcha.go +++ b/recaptcha.go @@ -1,7 +1,6 @@ package main import ( - "bytes" "encoding/json" "fmt" "log" @@ -10,37 +9,36 @@ import ( ) func validateRecaptcha(token string) (bool, error) { - log.Printf("Validating Turnstile token: %s", token) secret := os.Getenv("TURNSTILE_SECRET_KEY") if secret == "" { return false, fmt.Errorf("TURNSTILE_SECRET_KEY is not set") } - url := "https://challenges.cloudflare.com/turnstile/v0/siteverify" - payload := map[string]string{ - "secret": secret, - "response": token, - } - payloadBytes, _ := json.Marshal(payload) + log.Printf("Validating CAPTCHA token: %s", token) - resp, err := http.Post(url, "application/json", bytes.NewBuffer(payloadBytes)) + url := "https://challenges.cloudflare.com/turnstile/v0/siteverify" + data := map[string][]string{ + "secret": {secret}, + "response": {token}, + } + + resp, err := http.PostForm(url, data) if err != nil { - return false, fmt.Errorf("Turnstile API request failed: %v", err) + return false, fmt.Errorf("failed to verify CAPTCHA: %v", err) } defer resp.Body.Close() - var result map[string]interface{} + if resp.StatusCode != http.StatusOK { + return false, fmt.Errorf("unexpected status code: %d", resp.StatusCode) + } + + var result struct { + Success bool `json:"success"` + } if err := json.NewDecoder(resp.Body).Decode(&result); err != nil { - return false, fmt.Errorf("Failed to parse Turnstile API response: %v", err) + return false, fmt.Errorf("failed to decode CAPTCHA response: %v", err) } - success, ok := result["success"].(bool) - if !ok || !success { - if errors, exists := result["error-codes"]; exists { - return false, fmt.Errorf("Turnstile validation failed: %v", errors) - } - return false, fmt.Errorf("Turnstile validation failed") - } - - return true, nil + log.Printf("CAPTCHA validation result: %v", result.Success) + return result.Success, nil }