diff --git a/data/data.json b/data/data.json index 9e26dfe..5a564d3 100644 --- a/data/data.json +++ b/data/data.json @@ -1 +1,10 @@ -{} \ No newline at end of file +{ + "friedhof8.hilden.de.": { + "dns": "friedhof8.hilden.de", + "ipv4": "1.1.1.2", + "ipv6": "2001::5b:41", + "user": "friedhof", + "token": "ef797c8118f02dfb649607dd5d3f8c7623048c9c063d532cc95c5ed7a898a64f", + "lastseen": "2025-01-14 06:53:45.7690632 +0100 CET m=+27.298316601" + } +} \ No newline at end of file diff --git a/main.go b/main.go index ed67490..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") @@ -147,6 +183,7 @@ func handleDNSRequest(w dns.ResponseWriter, r *dns.Msg) { // Durchlaufe alle Fragen in der Anfrage for _, q := range r.Question { + fmt.Println(q.Qtype) switch q.Qtype { case dns.TypeA: // IPv4-Anfrage ip, exists := D[q.Name] @@ -171,6 +208,27 @@ func handleDNSRequest(w dns.ResponseWriter, r *dns.Msg) { fmt.Println("Fehler beim Erstellen der Antwort (6):", err) } } + case dns.TypePTR: + for a, b := range D { + + 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) + } + } + } default: // Ignoriere nicht unterstützte Typen }