1
0
مراية لـ https://github.com/postalserver/postal.git تم المزامنة 2025-12-01 05:43:04 +00:00

fix: translate unicode domain names to Punycode for compatibility with DNS (#2823)

هذا الالتزام موجود في:
Charlie Smurthwaite
2024-02-29 15:02:30 +00:00
ملتزم من قبل GitHub
الأصل ae30cc7615
التزام be0df7b463
4 ملفات معدلة مع 30 إضافات و27 حذوفات

عرض الملف

@@ -5,6 +5,7 @@ gem "authie"
gem "autoprefixer-rails" gem "autoprefixer-rails"
gem "bcrypt" gem "bcrypt"
gem "chronic" gem "chronic"
gem "domain_name"
gem "dotenv" gem "dotenv"
gem "dynamic_form" gem "dynamic_form"
gem "encrypto_signo" gem "encrypto_signo"

عرض الملف

@@ -101,6 +101,7 @@ GEM
date (3.3.4) date (3.3.4)
deep_merge (1.2.2) deep_merge (1.2.2)
diff-lcs (1.5.0) diff-lcs (1.5.0)
domain_name (0.6.20240107)
dotenv (3.0.2) dotenv (3.0.2)
dynamic_form (1.3.1) dynamic_form (1.3.1)
actionview (> 5.2.0) actionview (> 5.2.0)
@@ -334,6 +335,7 @@ DEPENDENCIES
chronic chronic
coffee-rails (~> 5.0) coffee-rails (~> 5.0)
database_cleaner database_cleaner
domain_name
dotenv dotenv
dynamic_form dynamic_form
encrypto_signo encrypto_signo

عرض الملف

@@ -17,56 +17,47 @@ class DNSResolver
# @param [String] name # @param [String] name
# @return [Array<String>] # @return [Array<String>]
def a(name) def a(name)
dns do |dns| get_resources(name, Resolv::DNS::Resource::IN::A).map do |s|
dns.getresources(name, Resolv::DNS::Resource::IN::A).map do |s|
s.address.to_s s.address.to_s
end end
end end
end
# Return all AAAA records for the given name # Return all AAAA records for the given name
# #
# @param [String] name # @param [String] name
# @return [Array<String>] # @return [Array<String>]
def aaaa(name) def aaaa(name)
dns do |dns| get_resources(name, Resolv::DNS::Resource::IN::AAAA).map do |s|
dns.getresources(name, Resolv::DNS::Resource::IN::AAAA).map do |s|
s.address.to_s s.address.to_s
end end
end end
end
# Return all TXT records for the given name # Return all TXT records for the given name
# #
# @param [String] name # @param [String] name
# @return [Array<String>] # @return [Array<String>]
def txt(name) def txt(name)
dns do |dns| get_resources(name, Resolv::DNS::Resource::IN::TXT).map do |s|
dns.getresources(name, Resolv::DNS::Resource::IN::TXT).map do |s|
s.data.to_s.strip s.data.to_s.strip
end end
end end
end
# Return all CNAME records for the given name # Return all CNAME records for the given name
# #
# @param [String] name # @param [String] name
# @return [Array<String>] # @return [Array<String>]
def cname(name) def cname(name)
dns do |dns| get_resources(name, Resolv::DNS::Resource::IN::CNAME).map do |s|
dns.getresources(name, Resolv::DNS::Resource::IN::CNAME).map do |s|
s.name.to_s.downcase s.name.to_s.downcase
end end
end end
end
# Return all MX records for the given name # Return all MX records for the given name
# #
# @param [String] name # @param [String] name
# @return [Array<Array<Integer, String>>] # @return [Array<Array<Integer, String>>]
def mx(name) def mx(name)
dns do |dns| records = get_resources(name, Resolv::DNS::Resource::IN::MX).map do |m|
records = dns.getresources(name, Resolv::DNS::Resource::IN::MX).map do |m|
[m.preference.to_i, m.exchange.to_s] [m.preference.to_i, m.exchange.to_s]
end end
records.sort do |a, b| records.sort do |a, b|
@@ -77,7 +68,6 @@ class DNSResolver
end end
end end
end end
end
# Return the effective nameserver names for a given domain name. # Return the effective nameserver names for a given domain name.
# #
@@ -90,7 +80,7 @@ class DNSResolver
(parts.size - 1).times do |n| (parts.size - 1).times do |n|
d = parts[n, parts.size - n + 1].join(".") 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 s.name.to_s
end end
@@ -124,6 +114,13 @@ class DNSResolver
end end
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 class << self
# Return a resolver which will use the nameservers for the given domain # Return a resolver which will use the nameservers for the given domain

عرض الملف

@@ -14,6 +14,9 @@ RSpec.describe DNSResolver do
it "returns a list of IP addresses" 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"] expect(resolver.a("www.test.postalserver.io").sort).to eq ["1.2.3.4", "2.3.4.5"]
end 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 end
describe "#aaaa" do describe "#aaaa" do