123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- package security
- import (
- "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)
- }
- })
- }
- }
|