@@ -361,8 +361,15 @@ public static function isInNetmask($ip, $netmask, $bits=null)
361
361
362
362
if (2 == count ($ elements )) {
363
363
364
- $ netmask = $ elements [0 ];
365
- $ bits = $ elements [1 ];
364
+ $ netmask = $ elements [0 ];
365
+ $ bits = $ elements [1 ];
366
+ // Correctly uncompress netmasks with prefixes, ie ::FFFF/96 == 0:0:0:0:0:FFFF:0:0/96
367
+ // Need only for xxx::yyy/zz and ::yyy/zz
368
+ if (preg_match ('/^(\:\:[a-f\d]{1,4}|[a-f\d]{1,4}.*\:\:.*[a-f\d]{1,4})$/ ' , $ netmask ) &&
369
+ !preg_match ('/\:0+$/ ' , $ netmask )) {
370
+ $ c_bits = intval ((128 - $ bits ) / 16 );
371
+ $ netmask .= str_repeat (':0 ' , $ c_bits );
372
+ }
366
373
367
374
}
368
375
@@ -537,7 +544,7 @@ public static function uncompress($ip, $leadingZeros = false)
537
544
538
545
} else {
539
546
540
- $ ip = Net_IPv6::removePrefixLength ($ ip );
547
+ $ ip = Net_IPv6::removeNetmaskSpec ($ ip );
541
548
$ prefix = '/ ' .$ prefix ;
542
549
543
550
}
@@ -697,7 +704,7 @@ public static function compress($ip, $force = false)
697
704
698
705
} else {
699
706
700
- $ ip = Net_IPv6::removePrefixLength ($ ip );
707
+ $ ip = Net_IPv6::removeNetmaskSpec ($ ip );
701
708
$ prefix = '/ ' .$ prefix ;
702
709
703
710
}
@@ -1052,7 +1059,16 @@ protected static function _ip2Bin($ip)
1052
1059
$ binstr = '' ;
1053
1060
1054
1061
$ ip = Net_IPv6::removeNetmaskSpec ($ ip );
1055
- $ ip = Net_IPv6::Uncompress ($ ip );
1062
+
1063
+ // Correctly convert IPv4 mapped addresses (::ffff:x.x.x.x)
1064
+ list (, $ ipv4 ) = Net_IPv6::SplitV64 ($ ip , FALSE );
1065
+ if (strlen ($ ipv4 )) {
1066
+ $ ipv4map = explode ('. ' , $ ipv4 , 4 );
1067
+ $ ipv4replace = dechex ($ ipv4map [0 ] * 256 + $ ipv4map [1 ]) . ': ' . dechex ($ ipv4map [2 ] * 256 + $ ipv4map [3 ]);
1068
+ $ ip = str_replace ($ ipv4 , $ ipv4replace , $ ip );
1069
+ }
1070
+
1071
+ $ ip = Net_IPv6::uncompress ($ ip );
1056
1072
1057
1073
$ parts = explode (': ' , $ ip );
1058
1074
0 commit comments