@@ -1163,27 +1163,37 @@ func TestEvaluateDispatchRule_RespectsRuleMediaTimeout(t *testing.T) {
11631163 require .Equal (t , 5 * time .Minute , res .Media .MediaTimeout .AsDuration ())
11641164}
11651165
1166- func TestMatchIP (t * testing.T ) {
1166+ func TestParseIPMask (t * testing.T ) {
11671167 cases := []struct {
1168- addr string
1169- mask string
1170- valid bool
1171- exp bool
1168+ mask string
1169+ exp string // empty if not an IP mask
11721170 }{
1173- {addr : "192.168.0.10" , mask : "192.168.0.10" , valid : true , exp : true },
1174- {addr : "192.168.0.10" , mask : "192.168.0.11" , valid : true , exp : false },
1175- {addr : "192.168.0.10" , mask : "192.168.0.0/24" , valid : true , exp : true },
1176- {addr : "192.168.0.10" , mask : "192.168.0.10/0" , valid : true , exp : true },
1177- {addr : "192.168.0.10" , mask : "192.170.0.0/24" , valid : true , exp : false },
1171+ {mask : "192.168.0.10" , exp : "192.168.0.10/32" },
1172+ {mask : "192.168.0.0/24" , exp : "192.168.0.0/24" },
1173+ {mask : "2001:db8::1" , exp : "2001:db8::1/128" },
1174+ {mask : "[2001:db8::1]" , exp : "2001:db8::1/128" },
1175+ {mask : "[2001:db8::]/32" , exp : "2001:db8::/32" },
1176+ {mask : "[::]" , exp : "::/128" },
1177+ {mask : "[::]/0" , exp : "::/0" },
1178+
1179+ // Not IP masks: treated as hostnames.
1180+ {mask : "sip.example.com" },
1181+ {mask : "sip.example.com/24" },
1182+ {mask : "192.168.0.10/33" },
1183+ {mask : "192.168.0.10/" },
1184+ {mask : "[192.168.0.10" },
1185+ {mask : "[2001:db8::1]:5060" },
1186+ {mask : "[[2001:db8::1]]" },
11781187 }
11791188 for _ , c := range cases {
11801189 t .Run (c .mask , func (t * testing.T ) {
1181- ip , err := netip .ParseAddr (c .addr )
1182- require .NoError (t , err )
1183- got := isValidMask (c .mask )
1184- require .Equal (t , c .valid , got )
1185- got = matchAddrMask (ip , c .mask )
1186- require .Equal (t , c .exp , got )
1190+ pref , ok := parseIPMask (c .mask )
1191+ if c .exp == "" {
1192+ require .False (t , ok )
1193+ return
1194+ }
1195+ require .True (t , ok )
1196+ require .Equal (t , netip .MustParsePrefix (c .exp ), pref )
11871197 })
11881198 }
11891199}
@@ -1281,6 +1291,59 @@ func TestMatchMasks(t *testing.T) {
12811291 },
12821292 exp : true ,
12831293 },
1294+ {
1295+ name : "ip spoofed in from host" ,
1296+ addr : "203.0.113.5" ,
1297+ host : "192.168.0.10" ,
1298+ masks : []string {
1299+ "192.168.0.10" ,
1300+ },
1301+ exp : false ,
1302+ },
1303+ {
1304+ name : "ip range spoofed in from host" ,
1305+ addr : "203.0.113.5" ,
1306+ host : "192.168.0.0/24" ,
1307+ masks : []string {
1308+ "192.168.0.0/24" ,
1309+ },
1310+ exp : false ,
1311+ },
1312+ {
1313+ name : "ipv6 spoofed in from host" ,
1314+ addr : "203.0.113.5" ,
1315+ host : "[2001:db8::1]" ,
1316+ masks : []string {
1317+ "[2001:db8::1]" ,
1318+ },
1319+ exp : false ,
1320+ },
1321+ {
1322+ name : "ipv6 bracketed" ,
1323+ addr : "2001:db8::1" ,
1324+ host : "sip.example.com" ,
1325+ masks : []string {
1326+ "[2001:db8::1]" ,
1327+ },
1328+ exp : true ,
1329+ },
1330+ {
1331+ name : "ipv6 bracketed range" ,
1332+ addr : "2001:db8::1" ,
1333+ masks : []string {
1334+ "[2001:db8::]/32" ,
1335+ },
1336+ exp : true ,
1337+ },
1338+ {
1339+ name : "ip matches source, from host differs" ,
1340+ addr : "192.168.0.10" ,
1341+ host : "sip.example.com" ,
1342+ masks : []string {
1343+ "192.168.0.10" ,
1344+ },
1345+ exp : true ,
1346+ },
12841347 }
12851348 for _ , c := range cases {
12861349 t .Run (c .name , func (t * testing.T ) {
0 commit comments