[ruby/ipaddr] Consider IPv4-mapped IPv6 addresses link local/loopback if IPV4 address is private
Same as #57 https://github.com/ruby/ipaddr/commit/d56acecb80
This commit is contained in:
parent
da77c79d80
commit
86fa418dea
@ -252,12 +252,17 @@ class IPAddr
|
|||||||
end
|
end
|
||||||
|
|
||||||
# Returns true if the ipaddr is a loopback address.
|
# Returns true if the ipaddr is a loopback address.
|
||||||
|
# Loopback IPv4 addresses in the IPv4-mapped IPv6
|
||||||
|
# address range are also considered as loopback addresses.
|
||||||
def loopback?
|
def loopback?
|
||||||
case @family
|
case @family
|
||||||
when Socket::AF_INET
|
when Socket::AF_INET
|
||||||
@addr & 0xff000000 == 0x7f000000
|
@addr & 0xff000000 == 0x7f000000 # 127.0.0.1/8
|
||||||
when Socket::AF_INET6
|
when Socket::AF_INET6
|
||||||
@addr == 1
|
@addr == 1 || # ::1
|
||||||
|
(@addr & 0xffff_0000_0000 == 0xffff_0000_0000 && (
|
||||||
|
@addr & 0xff000000 == 0x7f000000 # ::ffff:127.0.0.1/8
|
||||||
|
))
|
||||||
else
|
else
|
||||||
raise AddressFamilyError, "unsupported address family"
|
raise AddressFamilyError, "unsupported address family"
|
||||||
end
|
end
|
||||||
@ -287,15 +292,19 @@ class IPAddr
|
|||||||
end
|
end
|
||||||
|
|
||||||
# Returns true if the ipaddr is a link-local address. IPv4
|
# Returns true if the ipaddr is a link-local address. IPv4
|
||||||
# addresses in 169.254.0.0/16 reserved by RFC 3927 and Link-Local
|
# addresses in 169.254.0.0/16 reserved by RFC 3927 and link-local
|
||||||
# IPv6 Unicast Addresses in fe80::/10 reserved by RFC 4291 are
|
# IPv6 Unicast Addresses in fe80::/10 reserved by RFC 4291 are
|
||||||
# considered link-local.
|
# considered link-local. Link-local IPv4 addresses in the
|
||||||
|
# IPv4-mapped IPv6 address range are also considered link-local.
|
||||||
def link_local?
|
def link_local?
|
||||||
case @family
|
case @family
|
||||||
when Socket::AF_INET
|
when Socket::AF_INET
|
||||||
@addr & 0xffff0000 == 0xa9fe0000 # 169.254.0.0/16
|
@addr & 0xffff0000 == 0xa9fe0000 # 169.254.0.0/16
|
||||||
when Socket::AF_INET6
|
when Socket::AF_INET6
|
||||||
@addr & 0xffc0_0000_0000_0000_0000_0000_0000_0000 == 0xfe80_0000_0000_0000_0000_0000_0000_0000
|
@addr & 0xffc0_0000_0000_0000_0000_0000_0000_0000 == 0xfe80_0000_0000_0000_0000_0000_0000_0000 || # fe80::/10
|
||||||
|
(@addr & 0xffff_0000_0000 == 0xffff_0000_0000 && (
|
||||||
|
@addr & 0xffff0000 == 0xa9fe0000 # ::ffff:169.254.0.0/16
|
||||||
|
))
|
||||||
else
|
else
|
||||||
raise AddressFamilyError, "unsupported address family"
|
raise AddressFamilyError, "unsupported address family"
|
||||||
end
|
end
|
||||||
|
@ -415,6 +415,12 @@ class TC_Operator < Test::Unit::TestCase
|
|||||||
assert_equal(true, IPAddr.new('::1').loopback?)
|
assert_equal(true, IPAddr.new('::1').loopback?)
|
||||||
assert_equal(false, IPAddr.new('::').loopback?)
|
assert_equal(false, IPAddr.new('::').loopback?)
|
||||||
assert_equal(false, IPAddr.new('3ffe:505:2::1').loopback?)
|
assert_equal(false, IPAddr.new('3ffe:505:2::1').loopback?)
|
||||||
|
|
||||||
|
assert_equal(true, IPAddr.new('::ffff:127.0.0.1').loopback?)
|
||||||
|
assert_equal(true, IPAddr.new('::ffff:127.127.1.1').loopback?)
|
||||||
|
assert_equal(false, IPAddr.new('::ffff:0.0.0.0').loopback?)
|
||||||
|
assert_equal(false, IPAddr.new('::ffff:192.168.2.0').loopback?)
|
||||||
|
assert_equal(false, IPAddr.new('::ffff:255.0.0.0').loopback?)
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_private?
|
def test_private?
|
||||||
@ -482,6 +488,15 @@ class TC_Operator < Test::Unit::TestCase
|
|||||||
assert_equal(false, IPAddr.new('fb84:8bf7:e905::1').link_local?)
|
assert_equal(false, IPAddr.new('fb84:8bf7:e905::1').link_local?)
|
||||||
|
|
||||||
assert_equal(true, IPAddr.new('fe80::dead:beef:cafe:1234').link_local?)
|
assert_equal(true, IPAddr.new('fe80::dead:beef:cafe:1234').link_local?)
|
||||||
|
|
||||||
|
assert_equal(false, IPAddr.new('::ffff:0.0.0.0').link_local?)
|
||||||
|
assert_equal(false, IPAddr.new('::ffff:127.0.0.1').link_local?)
|
||||||
|
assert_equal(false, IPAddr.new('::ffff:10.0.0.0').link_local?)
|
||||||
|
assert_equal(false, IPAddr.new('::ffff:172.16.0.0').link_local?)
|
||||||
|
assert_equal(false, IPAddr.new('::ffff:192.168.0.0').link_local?)
|
||||||
|
|
||||||
|
assert_equal(true, IPAddr.new('::ffff:169.254.1.1').link_local?)
|
||||||
|
assert_equal(true, IPAddr.new('::ffff:169.254.254.255').link_local?)
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_hash
|
def test_hash
|
||||||
|
Loading…
x
Reference in New Issue
Block a user