source_test.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. package security
  2. import (
  3. "testing"
  4. "github.com/imgproxy/imgproxy/v3/config"
  5. "github.com/stretchr/testify/require"
  6. )
  7. func TestVerifySourceNetwork(t *testing.T) {
  8. testCases := []struct {
  9. name string
  10. addr string
  11. allowLoopback bool
  12. allowLinkLocal bool
  13. allowPrivate bool
  14. expectErr bool
  15. }{
  16. {
  17. name: "Invalid IP address",
  18. addr: "not-an-ip",
  19. allowLoopback: true,
  20. allowLinkLocal: true,
  21. allowPrivate: true,
  22. expectErr: true,
  23. },
  24. {
  25. name: "Loopback local not allowed",
  26. addr: "127.0.0.1",
  27. allowLoopback: false,
  28. allowLinkLocal: true,
  29. allowPrivate: true,
  30. expectErr: true,
  31. },
  32. {
  33. name: "Loopback local allowed",
  34. addr: "127.0.0.1",
  35. allowLoopback: true,
  36. allowLinkLocal: true,
  37. allowPrivate: true,
  38. expectErr: false,
  39. },
  40. {
  41. name: "Unspecified (0.0.0.0) not allowed",
  42. addr: "0.0.0.0",
  43. allowLoopback: false,
  44. allowLinkLocal: true,
  45. allowPrivate: true,
  46. expectErr: true,
  47. },
  48. {
  49. name: "Link local unicast not allowed",
  50. addr: "169.254.0.1",
  51. allowLoopback: true,
  52. allowLinkLocal: false,
  53. allowPrivate: true,
  54. expectErr: true,
  55. },
  56. {
  57. name: "Link local unicast allowed",
  58. addr: "169.254.0.1",
  59. allowLoopback: true,
  60. allowLinkLocal: true,
  61. allowPrivate: true,
  62. expectErr: false,
  63. },
  64. {
  65. name: "Private address not allowed",
  66. addr: "192.168.0.1",
  67. allowLoopback: true,
  68. allowLinkLocal: true,
  69. allowPrivate: false,
  70. expectErr: true,
  71. },
  72. {
  73. name: "Private address allowed",
  74. addr: "192.168.0.1",
  75. allowLoopback: true,
  76. allowLinkLocal: true,
  77. allowPrivate: true,
  78. expectErr: false,
  79. },
  80. {
  81. name: "Global unicast should be allowed",
  82. addr: "8.8.8.8",
  83. allowLoopback: false,
  84. allowLinkLocal: false,
  85. allowPrivate: false,
  86. expectErr: false,
  87. },
  88. {
  89. name: "Port in address with global IP",
  90. addr: "8.8.8.8:8080",
  91. allowLoopback: false,
  92. allowLinkLocal: false,
  93. allowPrivate: false,
  94. expectErr: false,
  95. },
  96. }
  97. for _, tc := range testCases {
  98. t.Run(tc.name, func(t *testing.T) {
  99. // Backup original config
  100. originalLoopback := config.AllowLoopbackSourceAddresses
  101. originalLinkLocal := config.AllowLinkLocalSourceAddresses
  102. originalPrivate := config.AllowPrivateSourceAddresses
  103. // Restore original config after test
  104. defer func() {
  105. config.AllowLoopbackSourceAddresses = originalLoopback
  106. config.AllowLinkLocalSourceAddresses = originalLinkLocal
  107. config.AllowPrivateSourceAddresses = originalPrivate
  108. }()
  109. // Override config for the test
  110. config.AllowLoopbackSourceAddresses = tc.allowLoopback
  111. config.AllowLinkLocalSourceAddresses = tc.allowLinkLocal
  112. config.AllowPrivateSourceAddresses = tc.allowPrivate
  113. err := VerifySourceNetwork(tc.addr)
  114. if tc.expectErr {
  115. require.Error(t, err)
  116. } else {
  117. require.NoError(t, err)
  118. }
  119. })
  120. }
  121. }