lib/net/dns/names.rb in net-dns-0.8.0 vs lib/net/dns/names.rb in net-dns-0.9.0
- old
+ new
@@ -1,19 +1,16 @@
module Net # :nodoc:
module DNS
-
module Names
-
# Base error class.
class Error < StandardError
end
# Generic Names Error.
class ExpandError < Error
end
-
INT16SZ = 2
# Expand a compressed name in a DNS Packet object. Please
# see RFC1025 for an explanation of how the compression
# in DNS packets works, how may it be useful and how should
@@ -21,98 +18,103 @@
#
# This method accept two parameters: a raw packet data and an
# offset, which indicates the point in the packet in which the
# parsing has arrived.
#
- def dn_expand(packet,offset)
+ def dn_expand(packet, offset)
name = ""
packetlen = packet.size
- while true
- raise ExpandError, "Offset is greater than packet lenght!" if packetlen < (offset+1)
+ loop do
+ raise ExpandError, "Offset is greater than packet lenght!" if packetlen < (offset + 1)
+
len = packet.unpack("@#{offset} C")[0]
if len == 0
offset += 1
break
elsif (len & 0xC0) == 0xC0
- raise ExpandError, "Packet ended before offset expand" if packetlen < (offset+INT16SZ)
+ raise ExpandError, "Packet ended before offset expand" if packetlen < (offset + INT16SZ)
+
ptr = packet.unpack("@#{offset} n")[0]
ptr &= 0x3FFF
- name2 = dn_expand(packet,ptr)[0]
- raise ExpandError, "Packet is malformed!" if name2 == nil
+ name2 = dn_expand(packet, ptr)[0]
+ raise ExpandError, "Packet is malformed!" if name2.nil?
+
name += name2
offset += INT16SZ
break
else
offset += 1
- raise ExpandError, "No expansion found" if packetlen < (offset+len)
- elem = packet[offset..offset+len-1]
+ raise ExpandError, "No expansion found" if packetlen < (offset + len)
+
+ elem = packet[offset..offset + len - 1]
name += "#{elem}."
offset += len
end
end
[name, offset] # name.chomp(".") if trailing dot has to be omitted
end
def pack_name(name)
- if name.size > 255
+ if name.size > 255
raise ArgumentError, "Name may not exceed 255 chars"
end
+
arr = name.split(".")
str = ""
arr.each do |elem|
if elem.size > 63
raise ArgumentError, "Label may not exceed 63 chars"
end
- str += [elem.size,elem].pack("Ca*")
+
+ str += [elem.size, elem].pack("Ca*")
end
str += [0].pack("C")
str
end
def names_array(name)
arr = name.split(".")
ar = []
string = ""
arr.size.times do |i|
- x = i+1
+ x = i + 1
elem = arr[-x]
len = elem.size
- string = ((string.reverse)+([len,elem].pack("Ca*")).reverse).reverse
+ string = (string.reverse + [len, elem].pack("Ca*").reverse).reverse
ar.unshift(string)
end
- return ar
+ ar
end
- def dn_comp(name,offset,compnames)
+ def dn_comp(name, offset, compnames)
names = {}
ptr = 0
str = ""
arr = names_array(name)
arr.each do |entry|
- if compnames.has_key?(entry)
+ if compnames.key?(entry)
ptr = 0xC000 | compnames[entry]
str += [ptr].pack("n")
offset += INT16SZ
break
else
len = entry.unpack("C")[0]
elem = entry[1..len]
- str += [len,elem].pack("Ca*")
- names.update({"#{entry}" => offset})
+ str += [len, elem].pack("Ca*")
+ names.update(entry.to_s => offset)
offset += len
end
end
- return str,offset,names
+ [str, offset, names]
end
def valid?(name)
if name =~ /^([a-z0-9]([-a-z0-9]*[a-z0-9])?\.)+((a[cdefgilmnoqrstuwxz]|aero|arpa)|(b[abdefghijmnorstvwyz]|biz)|(c[acdfghiklmnorsuvxyz]|cat|com|coop)|d[ejkmoz]|(e[ceghrstu]|edu)|f[ijkmor]|(g[abdefghilmnpqrstuwy]|gov)|h[kmnrtu]|(i[delmnoqrst]|info|int)|(j[emop]|jobs)|k[eghimnprwyz]|l[abcikrstuvy]|(m[acdghklmnopqrstuvwxyz]|mil|mobi|museum)|(n[acefgilopruz]|name|net)|(om|org)|(p[aefghklmnrstwy]|pro)|qa|r[eouw]|s[abcdeghijklmnortvyz]|(t[cdfghjklmnoprtvwz]|travel)|u[agkmsyz]|v[aceginu]|w[fs]|y[etu]|z[amw])$/i
- return name
+ name
else
raise ArgumentError, "Invalid FQDN: #{name}"
end
end
-
end
end
end