diff --git a/main.go b/main.go index 6f50397..12991da 100644 --- a/main.go +++ b/main.go @@ -25,6 +25,28 @@ var ( mu sync.Mutex ) +func getClientIP(r *http.Request) string { + // 1. Prüfe den X-Forwarded-For Header (Standard für Proxies) + xForwardedFor := r.Header.Get("X-Forwarded-For") + if xForwardedFor != "" { + // Der Header kann eine Liste von IPs sein (Client, Proxy1, Proxy2) + // Die erste IP in der Liste ist die echte Client-IP + ips := strings.Split(xForwardedFor, ",") + return strings.TrimSpace(ips[0]) + } + + // 2. Fallback auf X-Real-IP (oft von Traefik/Nginx gesetzt) + xRealIP := r.Header.Get("X-Real-IP") + if xRealIP != "" { + return xRealIP + } + + // 3. Letzter Ausweg: Die direkte IP (wird in deinem Fall die Traefik-IP sein) + // RemoteAddr enthält oft auch den Port (z.B. "127.0.0.1:1234") + ip, _, _ := net.SplitHostPort(r.RemoteAddr) + return ip +} + // Diese Funktion wird nur intern aufgerufen, wenn der Mutex bereits gesperrt ist func getCount() int { data, err := os.ReadFile(counterFile) @@ -91,6 +113,8 @@ func generatePassword() string { } func passwordHandler(w http.ResponseWriter, r *http.Request) { + clientIP := getClientIP(r) + log.Printf("passwordHandler aufrerufen von IP: %s\n", clientIP) if debug { log.Printf("called passwordHandler\n") } password := generatePassword() currentCount := GetPasswordCount() @@ -108,6 +132,8 @@ func passwordHandler(w http.ResponseWriter, r *http.Request) { } func passwordAPIHandler(w http.ResponseWriter, r *http.Request) { + clientIP := getClientIP(r) + log.Printf("passwordAPIHandler aufrerufen von IP: %s\n", clientIP) if debug { log.Printf("called passwordHandler\n") } password := generatePassword() w.Header().Set("Content-Type", "text/plain") @@ -115,6 +141,8 @@ func passwordAPIHandler(w http.ResponseWriter, r *http.Request) { } func indexHandler(w http.ResponseWriter, r *http.Request) { + clientIP := getClientIP(r) + log.Printf("indexHandler aufrerufen von IP: %s\n", clientIP) if debug { log.Printf("call indexHandler: Request %s %s\n", r.Method, r.URL) } password := generatePassword() //password := "load..." @@ -132,6 +160,8 @@ func indexHandler(w http.ResponseWriter, r *http.Request) { } func helpHandler(w http.ResponseWriter, r *http.Request) { + clientIP := getClientIP(r) + log.Printf("helpHandler aufrerufen von IP: %s\n", clientIP) if debug { log.Printf("call helpHandler\n") } err := templates["help.html"].ExecuteTemplate(w, "base.html", nil) if err != nil {