TrafficLimiterTest.php 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. <?php
  2. use PHPUnit\Framework\TestCase;
  3. use PrivateBin\Data\Filesystem;
  4. use PrivateBin\Persistence\ServerSalt;
  5. use PrivateBin\Persistence\TrafficLimiter;
  6. class TrafficLimiterTest extends TestCase
  7. {
  8. private $_path;
  9. public function setUp(): void
  10. {
  11. /* Setup Routine */
  12. $this->_path = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'trafficlimit';
  13. $store = Filesystem::getInstance(array('dir' => $this->_path));
  14. ServerSalt::setStore($store);
  15. TrafficLimiter::setStore($store);
  16. }
  17. public function tearDown(): void
  18. {
  19. /* Tear Down Routine */
  20. Helper::rmDir($this->_path . DIRECTORY_SEPARATOR);
  21. }
  22. public function testHtaccess()
  23. {
  24. $htaccess = $this->_path . DIRECTORY_SEPARATOR . '.htaccess';
  25. @unlink($htaccess);
  26. $_SERVER['REMOTE_ADDR'] = 'foobar';
  27. TrafficLimiter::canPass();
  28. $this->assertFileExists($htaccess, 'htaccess recreated');
  29. }
  30. public function testTrafficGetsLimited()
  31. {
  32. TrafficLimiter::setLimit(4);
  33. $_SERVER['REMOTE_ADDR'] = '127.0.0.1';
  34. $this->assertTrue(TrafficLimiter::canPass(), 'first request may pass');
  35. sleep(1);
  36. $this->assertFalse(TrafficLimiter::canPass(), 'second request is to fast, may not pass');
  37. sleep(4);
  38. $this->assertTrue(TrafficLimiter::canPass(), 'third request waited long enough and may pass');
  39. $_SERVER['REMOTE_ADDR'] = '2001:1620:2057:dead:beef::cafe:babe';
  40. $this->assertTrue(TrafficLimiter::canPass(), 'fourth request has different ip and may pass');
  41. $_SERVER['REMOTE_ADDR'] = '127.0.0.1';
  42. $this->assertFalse(TrafficLimiter::canPass(), 'fifth request is to fast, may not pass');
  43. // exempted IPs configuration
  44. TrafficLimiter::setExemptedIp('1.2.3.4,10.10.10.0/24,2001:1620:2057::/48');
  45. $this->assertFalse(TrafficLimiter::canPass(), 'still too fast and not exempted');
  46. $_SERVER['REMOTE_ADDR'] = '10.10.10.10';
  47. $this->assertTrue(TrafficLimiter::canPass(), 'IPv4 in exempted range');
  48. $this->assertTrue(TrafficLimiter::canPass(), 'request is to fast, but IPv4 in exempted range');
  49. $_SERVER['REMOTE_ADDR'] = '2001:1620:2057:dead:beef::cafe:babe';
  50. $this->assertTrue(TrafficLimiter::canPass(), 'IPv6 in exempted range');
  51. $this->assertTrue(TrafficLimiter::canPass(), 'request is to fast, but IPv6 in exempted range');
  52. TrafficLimiter::setExemptedIp('127.*,foobar');
  53. $this->assertFalse(TrafficLimiter::canPass(), 'request is to fast, invalid range');
  54. $_SERVER['REMOTE_ADDR'] = 'foobar';
  55. $this->assertTrue(TrafficLimiter::canPass(), 'non-IP address');
  56. $this->assertTrue(TrafficLimiter::canPass(), 'request is to fast, but non-IP address matches exempted range');
  57. }
  58. }