| | 258 | |
| | 259 | /** |
| | 260 | * Test that get_unsafe_client_ip() properly anonymizes all possible address formats |
| | 261 | * |
| | 262 | * @dataProvider data_get_unsafe_client_ip_anonymization |
| | 263 | * |
| | 264 | * @ticket 41083 |
| | 265 | */ |
| | 266 | public function test_get_unsafe_client_ip_anonymization( $raw_ip, $expected_result ) { |
| | 267 | $_SERVER['REMOTE_ADDR'] = $raw_ip; |
| | 268 | $actual_result = WP_Community_Events::get_unsafe_client_ip(); |
| | 269 | |
| | 270 | $this->assertEquals( $expected_result, $actual_result ); |
| | 271 | } |
| | 272 | |
| | 273 | public function data_get_unsafe_client_ip_anonymization() { |
| | 274 | return array( |
| | 275 | // Invalid IP. |
| | 276 | array( |
| | 277 | '', // Raw IP address |
| | 278 | false, // Expected result |
| | 279 | ), |
| | 280 | // Invalid IP. Sometimes proxies add things like this, or other arbitrary strings. |
| | 281 | array( |
| | 282 | 'unknown', |
| | 283 | false, |
| | 284 | ), |
| | 285 | // IPv4, no port |
| | 286 | array( |
| | 287 | '10.20.30.45', |
| | 288 | '10.20.30.0', |
| | 289 | ), |
| | 290 | // IPv4, port |
| | 291 | array( |
| | 292 | '10.20.30.45:20000', |
| | 293 | '10.20.30.0', |
| | 294 | ), |
| | 295 | // IPv6, no port |
| | 296 | array( |
| | 297 | '2a03:2880:2110:df07:face:b00c::1', |
| | 298 | '2a03:2880:2110:df07::', |
| | 299 | ), |
| | 300 | // IPv6, port |
| | 301 | array( |
| | 302 | '[2a03:2880:2110:df07:face:b00c::1]:20000', |
| | 303 | '2a03:2880:2110:df07::', |
| | 304 | ), |
| | 305 | // IPv6, no port, reducible representation |
| | 306 | array( |
| | 307 | '0000:0000:0000:0000:0000:0000:0000:0001', |
| | 308 | '::', |
| | 309 | ), |
| | 310 | // IPv6, no port, partially reducible representation |
| | 311 | array( |
| | 312 | '1000:0000:0000:0000:0000:0000:0000:0001', |
| | 313 | '1000::', |
| | 314 | ), |
| | 315 | // IPv6, port, reducible representation |
| | 316 | array( |
| | 317 | '[0000:0000:0000:0000:0000:0000:0000:0001]:1234', |
| | 318 | '::', |
| | 319 | ), |
| | 320 | // IPv6, port, partially reducible representation |
| | 321 | array( |
| | 322 | '[1000:0000:0000:0000:0000:0000:0000:0001]:5678', |
| | 323 | '1000::', |
| | 324 | ), |
| | 325 | // IPv6, no port, reduced representation |
| | 326 | array( |
| | 327 | '::', |
| | 328 | '::', |
| | 329 | ), |
| | 330 | // IPv6, no port, reduced representation |
| | 331 | array( |
| | 332 | '::1', |
| | 333 | '::', |
| | 334 | ), |
| | 335 | // IPv6, port, reduced representation |
| | 336 | array( |
| | 337 | '[::]:20000', |
| | 338 | '::', |
| | 339 | ), |
| | 340 | // IPv6, address brackets without port delimiter and number, reduced representation |
| | 341 | array( |
| | 342 | '[::1]', |
| | 343 | '::', |
| | 344 | ), |
| | 345 | // IPv6, no port, compatibility mode |
| | 346 | array( |
| | 347 | '::ffff:10.15.20.25', |
| | 348 | '::ffff:10.15.20.0', |
| | 349 | ), |
| | 350 | // IPv6, port, compatibility mode |
| | 351 | array( |
| | 352 | '[::ffff:10.15.20.25]:30000', |
| | 353 | '::ffff:10.15.20.0', |
| | 354 | ), |
| | 355 | // IPv6, no port, compatibility mode shorthand |
| | 356 | array( |
| | 357 | '::127.0.0.1', |
| | 358 | '::ffff:127.0.0.0', |
| | 359 | ), |
| | 360 | // IPv6, port, compatibility mode shorthand |
| | 361 | array( |
| | 362 | '[::127.0.0.1]:30000', |
| | 363 | '::ffff:127.0.0.0', |
| | 364 | ), |
| | 365 | ); |
| | 366 | } |