vendor/sindrive/sindrive/IpsetBundle/Listener/BanListener.php line 62

Open in your IDE?
  1. <?php
  2. /**
  3.  * Created by PhpStorm.
  4.  * User: bumz
  5.  * Date: 7/8/14
  6.  * Time: 2:49 PM
  7.  */
  8. namespace Sindrive\IpsetBundle\Listener;
  9. use Sindrive\IpsetBundle\Event\BanEvent;
  10. use Sindrive\IpsetBundle\Service\Ban;
  11. use Sindrive\MemcachedBundle\Services\SindriveMemcached;
  12. class BanListener
  13. {
  14.     /**
  15.      * @var string
  16.      */
  17.     private $banKey;
  18.     /**
  19.      * @var \Sindrive\IpsetBundle\Service\Ban
  20.      */
  21.     private $banService;
  22.     /**
  23.      * @var \Memcached|SindriveMemcached
  24.      */
  25.     private $memcached;
  26.     /**
  27.      * @param SindriveMemcached $memcached
  28.      * @param \Sindrive\IpsetBundle\Service\Ban $banService
  29.      * @param string $banKey
  30.      */
  31.     public function __construct(SindriveMemcached $memcachedBan $banServicestring $banKey 'sindrive-ips-ban-listener')
  32.     {
  33.         $this->memcached $memcached;
  34.         $this->banService $banService;
  35.         $this->banKey $banKey;
  36.     }
  37.     public function banByCount(BanEvent $event): void
  38.     {
  39.         $banKey sprintf('%s-%s-%s'$this->banKey'count'$event->getIp());
  40.         $result $this->memcached->increment($banKey);
  41.         if (false === $result && $this->memcached->getResultCode() == \Memcached::RES_NOTFOUND) {
  42.             $this->memcached->add($banKey1time() + 30 24 60 60);
  43.             $result 1;
  44.         }
  45.         if ($result $event->getCount()) {
  46.             $this->banService->add($event->getIp());
  47.         }
  48.     }
  49.     public function banByTimeSpanCount(BanEvent $event): bool
  50.     {
  51.         $banKey sprintf('%s-%s-%s'$this->banKey'count-time'$event->getIp());
  52.         do {
  53.             $resultStore $this->memcached->getCas($banKey);
  54.             $result $resultStore['value'];
  55.             $cas $resultStore['cas'];
  56.             $currentTime time();
  57.             $time $currentTime $event->getTimeOffset();
  58.             if ($this->memcached->getResultCode() == \Memcached::RES_NOTFOUND) {
  59.                 $result = array($event->getTimeOffset() => array($time));
  60.                 $this->memcached->add($banKey$result$time);
  61.             } elseif ($this->memcached->getResultCode() == \Memcached::RES_SUCCESS) {
  62.                 if (isset($result[$event->getTimeOffset()])) {
  63.                     $result[$event->getTimeOffset()] = array_filter($result[$event->getTimeOffset()], function($item) use ($currentTime) {
  64.                         return $item $currentTime;
  65.                     });
  66.                     // need a clean indexed array
  67.                     $result[$event->getTimeOffset()] = array_values($result[$event->getTimeOffset()]);
  68.                 }
  69.                 $result[$event->getTimeOffset()][] = $time;
  70.                 $this->memcached->cas($cas$banKey$result$time);
  71.             } else {
  72.                 return false;
  73.             }
  74.         } while ($this->memcached->getResultCode() != \Memcached::RES_SUCCESS);
  75.         if (count($result[$event->getTimeOffset()]) > $event->getCount()) {
  76.             $this->banService->add($event->getIp());
  77.         }
  78.         return true;
  79.     }
  80.     public function banImmediately(BanEvent $event): void
  81.     {
  82.         $this->banService->add($event->getIp());
  83.     }
  84. }