From 025466f9d8a1c25989e69fdb0a366b335c0af802 Mon Sep 17 00:00:00 2001 From: jbergner Date: Tue, 14 Jan 2025 08:12:13 +0100 Subject: [PATCH] PTR Fix + IPv6 Fix --- data/data.json | 2 +- main.go | 51 ++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 50 insertions(+), 3 deletions(-) diff --git a/data/data.json b/data/data.json index fcfcdb2..5a564d3 100644 --- a/data/data.json +++ b/data/data.json @@ -2,7 +2,7 @@ "friedhof8.hilden.de.": { "dns": "friedhof8.hilden.de", "ipv4": "1.1.1.2", - "ipv6": "", + "ipv6": "2001::5b:41", "user": "friedhof", "token": "ef797c8118f02dfb649607dd5d3f8c7623048c9c063d532cc95c5ed7a898a64f", "lastseen": "2025-01-14 06:53:45.7690632 +0100 CET m=+27.298316601" diff --git a/main.go b/main.go index 865bb3e..8918c4d 100644 --- a/main.go +++ b/main.go @@ -6,6 +6,7 @@ import ( "encoding/json" "fmt" "log" + "net" "net/http" "os" "os/signal" @@ -79,6 +80,41 @@ func VerifyToken(token, storedHash string) bool { return HashToken(token) == storedHash } +func reverseString(s string) string { + // Konvertiere den String in eine Rune-Slice, um Unicode-Zeichen zu unterstützen + runes := []rune(s) + n := len(runes) + // Tausche die Elemente, um den String umzudrehen + for i := 0; i < n/2; i++ { + runes[i], runes[n-1-i] = runes[n-1-i], runes[i] + } + // Konvertiere die Rune-Slice zurück in einen String + return string(runes) +} + +func IPv6ToPTR(ipv6 string) (string, error) { + // Parse the IPv6 address to validate it + parsedIP := net.ParseIP(ipv6) + if parsedIP == nil || parsedIP.To16() == nil || parsedIP.To4() != nil { + return "", fmt.Errorf("invalid IPv6 address: %s", ipv6) + } + + // Expand the IPv6 address to its full form + expanded := parsedIP.To16() + + // Convert to a reversed nibble format for PTR + var nibbles []string + for i := len(expanded) - 1; i >= 0; i-- { + hexByte := fmt.Sprintf("%02x", expanded[i]) + // Add the nibbles in reverse order + nibbles = append(nibbles, string(hexByte[1]), string(hexByte[0])) + } + + // Join the nibbles with dots and append the reverse domain + reversed := strings.Join(nibbles, ".") + return reversed + ".ip6.arpa.", nil +} + func handler(w http.ResponseWriter, r *http.Request) { Dns := r.URL.Query().Get("DDNS") Ip := r.URL.Query().Get("IP") @@ -174,8 +210,19 @@ func handleDNSRequest(w dns.ResponseWriter, r *dns.Msg) { } case dns.TypePTR: for a, b := range D { - fmt.Println(b.Ipv4, q.Name) - if b.Ipv4 == q.Name { + + iptocheck := reverseString(b.Ipv4) + fmt.Println(iptocheck, q.Name) + if iptocheck+".in-addr.arpa." == q.Name { + rr, err := dns.NewRR(q.Name + " PTR " + a) + if err == nil { + msg.Answer = append(msg.Answer, rr) + } + } + + ip6tocheck, _ := IPv6ToPTR(b.Ipv6) + fmt.Println(ip6tocheck, q.Name) + if ip6tocheck == q.Name { rr, err := dns.NewRR(q.Name + " PTR " + a) if err == nil { msg.Answer = append(msg.Answer, rr)