مراية لـ
https://github.com/postalserver/postal.git
تم المزامنة 2025-11-30 21:32:30 +00:00
fix: translate unicode domain names to Punycode for compatibility with DNS (#2823)
هذا الالتزام موجود في:
ملتزم من قبل
GitHub
الأصل
ae30cc7615
التزام
be0df7b463
1
Gemfile
1
Gemfile
@@ -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,10 +17,8 @@ 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
|
||||||
|
|
||||||
@@ -29,10 +27,8 @@ class DNSResolver
|
|||||||
# @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
|
||||||
|
|
||||||
@@ -41,10 +37,8 @@ class DNSResolver
|
|||||||
# @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
|
||||||
|
|
||||||
@@ -53,10 +47,8 @@ class DNSResolver
|
|||||||
# @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
|
||||||
|
|
||||||
@@ -65,16 +57,14 @@ class DNSResolver
|
|||||||
# @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|
|
if a[0] == b[0]
|
||||||
if a[0] == b[0]
|
[-1, 1].sample
|
||||||
[-1, 1].sample
|
else
|
||||||
else
|
a[0] <=> b[0]
|
||||||
a[0] <=> b[0]
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -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
|
||||||
|
|||||||
المرجع في مشكلة جديدة
حظر مستخدم