#!/usr/bin/env python3 # version 1: https://ar.noddex.com/raw/ea3o34y2PP0zAino1cWhh51XRJyYUhFWHar0UOYyEag # version 2: this file = fix for content_hash being k51... from dnslib import DNSRecord, RR, QTYPE, TXT import os, sys, urllib.request, urllib.parse, json # read raw DNS-wire POST body length = int(os.environ.get('CONTENT_LENGTH') or 0) raw = sys.stdin.buffer.read(length) if length else b'' if not raw: sys.stdout.buffer.write(b"Status: 400 Bad Request\r\nContent-Type: text/plain\r\n\r\nno body\n") sys.exit(0) try: parsed = DNSRecord.parse(raw) # parsed DNS request qname = str(parsed.q.qname).rstrip('.') # e.g. "_dnslink.ipfs3.eth" if qname.startswith("_dnslink."): name = qname[len("_dnslink."):] else: name = qname except Exception as e: sys.stdout.buffer.write(b"Status: 400 Bad Request\r\nContent-Type: text/plain\r\n\r\ninvalid DNS request\n") sys.exit(0) try: url = f"https://api.ensdata.net/{urllib.parse.quote(name)}" with urllib.request.urlopen(urllib.request.Request(url, headers={"User-Agent": "curl/7.88.1"})) as r: data = json.load(r) content_hash = data.get("contentHash", "") except Exception as e: sys.stdout.buffer.write(b"Status: 502 Bad Gateway\r\nContent-Type: text/plain\r\n\r\nupstream fetch error\n") sys.exit(0) if content_hash.startswith("k"): # starts with 'k' -> IPNS name dnslink_value = "dnslink=/ipns/" + content_hash else: dnslink_value = "dnslink=/ipfs/" + content_hash q_resp = DNSRecord.question(name, qtype='TXT') reply = q_resp.reply() reply.add_answer(RR(name, QTYPE.TXT, rdata=TXT(dnslink_value), ttl=300)) body = reply.pack() sys.stdout.buffer.write(b"Content-Type: application/dns-message\r\n\r\n") sys.stdout.buffer.write(body)