diff --git a/Gemfile b/Gemfile index 14ed05a..46eca03 100644 --- a/Gemfile +++ b/Gemfile @@ -5,6 +5,7 @@ gem "authie" gem "autoprefixer-rails" gem "bcrypt" gem "chronic" +gem "domain_name" gem "dotenv" gem "dynamic_form" gem "encrypto_signo" diff --git a/Gemfile.lock b/Gemfile.lock index d260085..1555c31 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -101,6 +101,7 @@ GEM date (3.3.4) deep_merge (1.2.2) diff-lcs (1.5.0) + domain_name (0.6.20240107) dotenv (3.0.2) dynamic_form (1.3.1) actionview (> 5.2.0) @@ -334,6 +335,7 @@ DEPENDENCIES chronic coffee-rails (~> 5.0) database_cleaner + domain_name dotenv dynamic_form encrypto_signo diff --git a/app/lib/dns_resolver.rb b/app/lib/dns_resolver.rb index 366ddb1..f3b212e 100644 --- a/app/lib/dns_resolver.rb +++ b/app/lib/dns_resolver.rb @@ -17,10 +17,8 @@ class DNSResolver # @param [String] name # @return [Array] def a(name) - dns do |dns| - dns.getresources(name, Resolv::DNS::Resource::IN::A).map do |s| - s.address.to_s - end + get_resources(name, Resolv::DNS::Resource::IN::A).map do |s| + s.address.to_s end end @@ -29,10 +27,8 @@ class DNSResolver # @param [String] name # @return [Array] def aaaa(name) - dns do |dns| - dns.getresources(name, Resolv::DNS::Resource::IN::AAAA).map do |s| - s.address.to_s - end + get_resources(name, Resolv::DNS::Resource::IN::AAAA).map do |s| + s.address.to_s end end @@ -41,10 +37,8 @@ class DNSResolver # @param [String] name # @return [Array] def txt(name) - dns do |dns| - dns.getresources(name, Resolv::DNS::Resource::IN::TXT).map do |s| - s.data.to_s.strip - end + get_resources(name, Resolv::DNS::Resource::IN::TXT).map do |s| + s.data.to_s.strip end end @@ -53,10 +47,8 @@ class DNSResolver # @param [String] name # @return [Array] def cname(name) - dns do |dns| - dns.getresources(name, Resolv::DNS::Resource::IN::CNAME).map do |s| - s.name.to_s.downcase - end + get_resources(name, Resolv::DNS::Resource::IN::CNAME).map do |s| + s.name.to_s.downcase end end @@ -65,16 +57,14 @@ class DNSResolver # @param [String] name # @return [Array>] def mx(name) - dns do |dns| - records = dns.getresources(name, Resolv::DNS::Resource::IN::MX).map do |m| - [m.preference.to_i, m.exchange.to_s] - end - records.sort do |a, b| - if a[0] == b[0] - [-1, 1].sample - else - a[0] <=> b[0] - end + records = get_resources(name, Resolv::DNS::Resource::IN::MX).map do |m| + [m.preference.to_i, m.exchange.to_s] + end + records.sort do |a, b| + if a[0] == b[0] + [-1, 1].sample + else + a[0] <=> b[0] end end end @@ -90,7 +80,7 @@ class DNSResolver (parts.size - 1).times do |n| d = parts[n, parts.size - n + 1].join(".") - records = dns.getresources(d, Resolv::DNS::Resource::IN::NS).map do |s| + records = get_resources(d, Resolv::DNS::Resource::IN::NS).map do |s| s.name.to_s end @@ -124,6 +114,13 @@ class DNSResolver end end + def get_resources(name, type) + encoded_name = DomainName::Punycode.encode_hostname(name) + dns do |dns| + dns.getresources(encoded_name, type) + end + end + class << self # Return a resolver which will use the nameservers for the given domain diff --git a/spec/lib/dns_resolver_spec.rb b/spec/lib/dns_resolver_spec.rb index d3f0d43..8ad8017 100644 --- a/spec/lib/dns_resolver_spec.rb +++ b/spec/lib/dns_resolver_spec.rb @@ -14,6 +14,9 @@ RSpec.describe DNSResolver do it "returns a list of IP addresses" do expect(resolver.a("www.test.postalserver.io").sort).to eq ["1.2.3.4", "2.3.4.5"] end + it "resolves a domain name containing an emoji" do + expect(resolver.a("☺.test.postalserver.io").sort).to eq ["3.4.5.6"] + end end describe "#aaaa" do