diff --git a/:path/dns.osl b/:path/dns.osl
index b810a589..659693db 100644
--- a/:path/dns.osl
+++ b/:path/dns.osl
@@ -1,16 +1,112 @@
def reverse(ip) (
- url = "https://apps.mistium.com/cors?url=https://dns.google/query?name=" + ip.replace(":","%3A")
- content = url.httpGet().replaceFirst("\n
Query: ","").split(" ")[1]
- return content
+ if ip.contains(":") (
+ url = "https://dns.google/resolve?name=" ++ v6ptr(ip) ++ "&type=PTR"
+ ) else (
+ url = "https://dns.google/resolve?name=" ++ ip ++ ".in-addr.arpa&type=PTR"
+ )
+ content = url.httpGet()["Answer"][1]["data"]
+ terminal.writeLine(content)
)
-def checkipv4(ip) (
- def checkipv4octet(data) (
- return data <= 255 and data >= 0
+def checkipv4(string ip) boolean (
+ array octets = ip.split(".")
+ if octets.len != 4 (
+ return false
+ )
+ for i octets.len (
+ string octet_str = octets[i].toStr()
+ if octet_str == "" (
+ return false
+ )
+ for j octet_str.len (
+ if !"0123456789".contains(octet_str[j]) (
+ return false
+ )
+ )
+ octet = octet_str.toInt()
+ if octet < 0 or octet > 255 (
+ return false
+ )
)
- return ip.split(".").every(checkipv4octet)
+ return true
)
+def checkipv6(string ip) boolean (
+ string tempip = ip.replace("::", ":EMPTY:")
+ array octets = tempip.split(":")
+ boolean fail = false
+ boolean once = false
+ if ip.contains("::") (
+ if octets.len > 8 (
+ fail = true
+ )
+ ) else (
+ if octets.len != 8 (
+ fail = true
+ )
+ )
+ for i octets.len (
+ octet = octets[i]
+ if octet == "EMPTY" (
+ if once == false ( // As per RFC 4291 Section 2.2.2, the '::' can only appear once in an address.
+ once = true
+ continue
+ ) else (
+ fail = true
+ )
+ )
+ if octet == "" (
+ continue
+ )
+ if octet.len > 4 (
+ fail = true
+ )
+ for i octet.len (
+ if not ("abcdef0123456789".contains(octet[i].toLower())) (
+ fail = true
+ )
+ )
+ )
+ if fail == false (
+ return true
+ ) else (
+ return false
+ )
+)
+
+def v6ptr(string ip) string (
+ if ip.startsWith("::") (
+ ip = "0" ++ ip
+ )
+ if ip.endsWith("::") (
+ ip = ip ++ "0"
+ )
+ string tempip = ip.replace("::", ":EMPTY:")
+ array octets = tempip.split(":")
+ missing = 9 - octets.len
+ string full_hex = ""
+ for i octets.len (
+ string octet = octets[i].toStr()
+ if octet == "EMPTY" (
+ for j missing (
+ full_hex = full_hex ++ "0000"
+ )
+ ) else (
+ while octet.len < 4 (
+ octet = "0" ++ octet
+ )
+ full_hex = full_hex ++ octet
+ )
+ )
+ string ptr = ""
+ for i full_hex.len (
+ rev_index = full_hex.len - i + 1
+ ptr = ptr ++ full_hex[rev_index].toLower() ++ "."
+ )
+ ptr = ptr ++ "ip6.arpa."
+ return ptr
+)
+
if args.len == 0 (
terminal.writeLine("dns: not enough arguments")
)
@@ -28,41 +124,61 @@ if args[1] == "-h" (
terminal.writeLine(" dns MX example.com → Query mail exchange records")
terminal.writeLine(" dns TXT example.com → Query text records")
terminal.writeLine("")
- terminal.writeLine("Supported record types:")
- terminal.writeLine(" A, AAAA, MX, TXT, CNAME, NS, PTR, SOA, SRV")
+ terminal.writeLine("All DNS record types supported.")
return
)
if args.len == 1 (
- if args[1].count(":") >= 2 (
- url = "https://dns.google/resolve?name=" ++ reverse(args[1]) ++ "&type=PTR"
- response = url.httpGet()
- for i response.Answer.len (
- terminal.writeLine(response.Answer[i].data)
+ if args[1].contains(":") (
+ if checkipv6(args[1]) (
+ reverse(args[1])
+ ) else (
+ terminal.writeLine("Invalid IPv6")
)
- ) else if checkipv4(args[1]) (
- url = "https://dns.google/resolve?name=" ++ reverse(args[1]) ++ "&type=PTR"
- response = url.httpGet()
- for i response.Answer.len (
- terminal.writeLine(response.Answer[i].data)
+ ) else if args[1].split(".").len == 4 (
+ if checkipv4(args[1]) (
+ reverse(args[1])
+ ) else (
+ terminal.writeLine("Invalid IPv4")
)
) else (
url = "https://dns.google/resolve?name=" ++ args[1] ++ "&type=A"
- response = url.httpGet()
- for i response.Answer.len (
- terminal.writeLine(response.Answer[i].data)
+ responsea = url.httpGet()
+ for i responsea.Answer.len (
+ terminal.writeLine(responsea.Answer[i].data)
)
url = "https://dns.google/resolve?name=" ++ args[1] ++ "&type=AAAA"
- response = url.httpGet()
- for i response.Answer.len (
- terminal.writeLine(response.Answer[i].data)
+ responseaaaa = url.httpGet()
+ if responsea.Answer.len + responseaaaa.Answer.len == 0 (
+ terminal.writeLine("No records found.")
+ return
+ ) else if responsea.Answer.len == 0 (
+ terminal.writeLine("No A record found.")
+ )
+ for i responseaaaa.Answer.len (
+ terminal.writeLine(responseaaaa.Answer[i].data)
+ )
+ if responseaaaa.Answer.len == 0 (
+ terminal.writeLine("No AAAA record found.")
)
)
) else (
- url = "https://dns.google/resolve?name=" ++ args[2] ++ "&type=" ++ args[1]
- response = url.httpGet()
- for i response.Answer.len (
- terminal.writeLine(response.Answer[i].data)
+ if args[1].toUpper() in ["A","AAAA","CNAME","MX","TXT","NS","SOA","PTR","SRV","CAA","DNSKEY","DS","TLSA","HTTPS","SVCB","SSHFP","NAPTR","SPF","CERT","DNAME"] (
+ url = "https://dns.google/resolve?name=" ++ args[2] ++ "&type=" ++ args[1].toUpper()
+ response = url.httpGet()
+ if response.Answer == null (
+ terminal.writeLine("The record does not exist.")
+ break
+ )
+ for i response.Answer.len (
+ if args[1].toUpper() == "TXT" (
+ terminal.writeLine('"' ++ response.Answer[i].data ++ '"')
+ ) else (
+ terminal.writeLine(response.Answer[i].data)
+ )
+ )
+ ) else (
+ terminal.writeLine("Invalid RR Type")
)
-)
\ No newline at end of file
+)