Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

net_test.go 6.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. // Copyright (c) 2012-2014 Jeremy Latt
  2. // Copyright (c) 2016 Daniel Oaks <daniel@danieloaks.net>
  3. // released under the MIT license
  4. package utils
  5. import "net"
  6. import "reflect"
  7. import "testing"
  8. func assertEqual(supplied, expected interface{}, t *testing.T) {
  9. if !reflect.DeepEqual(supplied, expected) {
  10. t.Errorf("expected %v but got %v", expected, supplied)
  11. }
  12. }
  13. // hostnames from https://github.com/DanielOaks/irc-parser-tests
  14. var (
  15. goodHostnames = []string{
  16. "irc.example.com",
  17. "i.coolguy.net",
  18. "irc-srv.net.uk",
  19. "iRC.CooLguY.NeT",
  20. "gsf.ds342.co.uk",
  21. "324.net.uk",
  22. "xn--bcher-kva.ch",
  23. "pentos",
  24. "pentos.",
  25. "www.google.com.",
  26. }
  27. badHostnames = []string{
  28. "-lol-.net.uk",
  29. "-lol.net.uk",
  30. "_irc._sctp.lol.net.uk",
  31. "irc.l%l.net.uk",
  32. "irc..net.uk",
  33. ".",
  34. "",
  35. }
  36. )
  37. func TestIsHostname(t *testing.T) {
  38. for _, name := range goodHostnames {
  39. if !IsHostname(name) {
  40. t.Error(
  41. "Expected to pass, but could not validate hostname",
  42. name,
  43. )
  44. }
  45. }
  46. for _, name := range badHostnames {
  47. if IsHostname(name) {
  48. t.Error(
  49. "Expected to fail, but successfully validated hostname",
  50. name,
  51. )
  52. }
  53. }
  54. }
  55. func TestIsServerName(t *testing.T) {
  56. if IsServerName("pentos") {
  57. t.Error("irc server names must contain a period")
  58. }
  59. if !IsServerName("darwin.network") {
  60. t.Error("failed to validate a perfectly good server name")
  61. }
  62. }
  63. func TestNormalizeToNet(t *testing.T) {
  64. a := net.ParseIP("8.8.8.8")
  65. b := net.ParseIP("8.8.4.4")
  66. if a == nil || b == nil {
  67. panic("something has gone very wrong")
  68. }
  69. aNetwork := NormalizeIPToNet(a)
  70. bNetwork := NormalizeIPToNet(b)
  71. assertEqual(aNetwork.Contains(a), true, t)
  72. assertEqual(bNetwork.Contains(b), true, t)
  73. assertEqual(aNetwork.Contains(b), false, t)
  74. assertEqual(bNetwork.Contains(a), false, t)
  75. c := net.ParseIP("2001:4860:4860::8888")
  76. d := net.ParseIP("2001:db8::1")
  77. if c == nil || d == nil {
  78. panic("something has gone very wrong")
  79. }
  80. cNetwork := NormalizeIPToNet(c)
  81. dNetwork := NormalizeIPToNet(d)
  82. assertEqual(cNetwork.Contains(c), true, t)
  83. assertEqual(dNetwork.Contains(d), true, t)
  84. assertEqual(dNetwork.Contains(c), false, t)
  85. assertEqual(dNetwork.Contains(a), false, t)
  86. assertEqual(cNetwork.Contains(b), false, t)
  87. assertEqual(aNetwork.Contains(c), false, t)
  88. assertEqual(bNetwork.Contains(c), false, t)
  89. assertEqual(NetToNormalizedString(aNetwork), "8.8.8.8", t)
  90. assertEqual(NetToNormalizedString(bNetwork), "8.8.4.4", t)
  91. assertEqual(NetToNormalizedString(cNetwork), "2001:4860:4860::8888", t)
  92. assertEqual(NetToNormalizedString(dNetwork), "2001:db8::1", t)
  93. }
  94. func TestNormalizedNetToString(t *testing.T) {
  95. _, network, err := net.ParseCIDR("8.8.0.0/16")
  96. if err != nil {
  97. panic(err)
  98. }
  99. assertEqual(NetToNormalizedString(*network), "8.8.0.0/16", t)
  100. normalized := NormalizeNet(*network)
  101. assertEqual(normalized.Contains(net.ParseIP("8.8.4.4")), true, t)
  102. assertEqual(normalized.Contains(net.ParseIP("1.1.1.1")), false, t)
  103. assertEqual(NetToNormalizedString(normalized), "8.8.0.0/16", t)
  104. _, network, err = net.ParseCIDR("8.8.4.4/32")
  105. if err != nil {
  106. panic(err)
  107. }
  108. assertEqual(NetToNormalizedString(*network), "8.8.4.4", t)
  109. normalized = NormalizeNet(*network)
  110. assertEqual(normalized.Contains(net.ParseIP("8.8.4.4")), true, t)
  111. assertEqual(normalized.Contains(net.ParseIP("8.8.8.8")), false, t)
  112. assertEqual(NetToNormalizedString(normalized), "8.8.4.4", t)
  113. }
  114. func TestNormalizedNet(t *testing.T) {
  115. _, network, err := net.ParseCIDR("::ffff:8.8.4.4/128")
  116. assertEqual(err, nil, t)
  117. assertEqual(NetToNormalizedString(*network), "8.8.4.4", t)
  118. normalizedNet := NormalizeIPToNet(net.ParseIP("8.8.4.4"))
  119. assertEqual(NetToNormalizedString(normalizedNet), "8.8.4.4", t)
  120. _, network, err = net.ParseCIDR("::ffff:8.8.0.0/112")
  121. assertEqual(err, nil, t)
  122. assertEqual(NetToNormalizedString(*network), "8.8.0.0/16", t)
  123. _, v4Network, err := net.ParseCIDR("8.8.0.0/16")
  124. assertEqual(err, nil, t)
  125. normalizedNet = NormalizeNet(*v4Network)
  126. assertEqual(NetToNormalizedString(normalizedNet), "8.8.0.0/16", t)
  127. }
  128. func TestNormalizedNetFromString(t *testing.T) {
  129. network, err := NormalizedNetFromString("8.8.4.4/16")
  130. assertEqual(err, nil, t)
  131. assertEqual(NetToNormalizedString(network), "8.8.0.0/16", t)
  132. assertEqual(network.Contains(net.ParseIP("8.8.8.8")), true, t)
  133. network, err = NormalizedNetFromString("2001:0db8::1")
  134. assertEqual(err, nil, t)
  135. assertEqual(NetToNormalizedString(network), "2001:db8::1", t)
  136. assertEqual(network.Contains(net.ParseIP("2001:0db8::1")), true, t)
  137. }
  138. func checkXFF(remoteAddr, forwardedHeader string, expectedStr string, t *testing.T) {
  139. whitelistCIDRs := []string{"10.0.0.0/8", "127.0.0.1/8"}
  140. var whitelist []net.IPNet
  141. for _, str := range whitelistCIDRs {
  142. _, wlNet, err := net.ParseCIDR(str)
  143. if err != nil {
  144. panic(err)
  145. }
  146. whitelist = append(whitelist, *wlNet)
  147. }
  148. expected := net.ParseIP(expectedStr)
  149. actual := HandleXForwardedFor(remoteAddr, forwardedHeader, whitelist)
  150. if !actual.Equal(expected) {
  151. t.Errorf("handling %s and %s, expected %s, got %s", remoteAddr, forwardedHeader, expected, actual)
  152. }
  153. }
  154. func TestXForwardedFor(t *testing.T) {
  155. checkXFF("8.8.4.4:9999", "", "8.8.4.4", t)
  156. // forged XFF header from untrustworthy external IP, should be ignored:
  157. checkXFF("8.8.4.4:9999", "1.1.1.1", "8.8.4.4", t)
  158. checkXFF("10.0.0.4:28432", "", "10.0.0.4", t)
  159. checkXFF("10.0.0.4:28432", "8.8.4.4", "8.8.4.4", t)
  160. checkXFF("10.0.0.4:28432", "10.0.0.3", "10.0.0.3", t)
  161. checkXFF("10.0.0.4:28432", "1.1.1.1, 8.8.4.4", "8.8.4.4", t)
  162. checkXFF("10.0.0.4:28432", "1.1.1.1,8.8.4.4", "8.8.4.4", t)
  163. checkXFF("10.0.0.4:28432", "8.8.4.4, 1.1.1.1, 10.0.0.3", "1.1.1.1", t)
  164. checkXFF("10.0.0.4:28432", "10.0.0.1, 10.0.0.2, 10.0.0.3", "10.0.0.1", t)
  165. checkXFF("10.0.0.4:28432", "10.0.0.1, 10.0.0.2,10.0.0.3", "10.0.0.1", t)
  166. checkXFF("@", "8.8.4.4, 1.1.1.1, 10.0.0.3", "1.1.1.1", t)
  167. // invalid IP tests:
  168. checkXFF("8.8.4.4:9999", "not_an_ip", "8.8.4.4", t)
  169. checkXFF("10.0.0.4:28432", "not_an_ip", "10.0.0.4", t)
  170. checkXFF("10.0.0.4:28432", "not_an_ip, 1.1.1.1, 10.0.0.3", "1.1.1.1", t)
  171. checkXFF("10.0.0.4:28432", "8.8.4.4, not_an_ip, 10.0.0.3", "10.0.0.3", t)
  172. checkXFF("10.0.0.4:28432", "8.8.4.4, not_an_ip", "10.0.0.4", t)
  173. }