| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 | package securityimport (	"testing"	"github.com/imgproxy/imgproxy/v3/config"	"github.com/stretchr/testify/require")func TestVerifySourceNetwork(t *testing.T) {	testCases := []struct {		name           string		addr           string		allowLoopback  bool		allowLinkLocal bool		allowPrivate   bool		expectErr      bool	}{		{			name:           "Invalid IP address",			addr:           "not-an-ip",			allowLoopback:  true,			allowLinkLocal: true,			allowPrivate:   true,			expectErr:      true,		},		{			name:           "Loopback local not allowed",			addr:           "127.0.0.1",			allowLoopback:  false,			allowLinkLocal: true,			allowPrivate:   true,			expectErr:      true,		},		{			name:           "Loopback local allowed",			addr:           "127.0.0.1",			allowLoopback:  true,			allowLinkLocal: true,			allowPrivate:   true,			expectErr:      false,		},		{			name:           "Unspecified (0.0.0.0) not allowed",			addr:           "0.0.0.0",			allowLoopback:  false,			allowLinkLocal: true,			allowPrivate:   true,			expectErr:      true,		},		{			name:           "Link local unicast not allowed",			addr:           "169.254.0.1",			allowLoopback:  true,			allowLinkLocal: false,			allowPrivate:   true,			expectErr:      true,		},		{			name:           "Link local unicast allowed",			addr:           "169.254.0.1",			allowLoopback:  true,			allowLinkLocal: true,			allowPrivate:   true,			expectErr:      false,		},		{			name:           "Private address not allowed",			addr:           "192.168.0.1",			allowLoopback:  true,			allowLinkLocal: true,			allowPrivate:   false,			expectErr:      true,		},		{			name:           "Private address allowed",			addr:           "192.168.0.1",			allowLoopback:  true,			allowLinkLocal: true,			allowPrivate:   true,			expectErr:      false,		},		{			name:           "Global unicast should be allowed",			addr:           "8.8.8.8",			allowLoopback:  false,			allowLinkLocal: false,			allowPrivate:   false,			expectErr:      false,		},		{			name:           "Port in address with global IP",			addr:           "8.8.8.8:8080",			allowLoopback:  false,			allowLinkLocal: false,			allowPrivate:   false,			expectErr:      false,		},	}	for _, tc := range testCases {		t.Run(tc.name, func(t *testing.T) {			// Backup original config			originalLoopback := config.AllowLoopbackSourceAddresses			originalLinkLocal := config.AllowLinkLocalSourceAddresses			originalPrivate := config.AllowPrivateSourceAddresses			// Restore original config after test			defer func() {				config.AllowLoopbackSourceAddresses = originalLoopback				config.AllowLinkLocalSourceAddresses = originalLinkLocal				config.AllowPrivateSourceAddresses = originalPrivate			}()			// Override config for the test			config.AllowLoopbackSourceAddresses = tc.allowLoopback			config.AllowLinkLocalSourceAddresses = tc.allowLinkLocal			config.AllowPrivateSourceAddresses = tc.allowPrivate			err := VerifySourceNetwork(tc.addr)			if tc.expectErr {				require.Error(t, err)			} else {				require.NoError(t, err)			}		})	}}
 |