123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- <?php
- /**
- * @package Grav\Plugin\Login
- *
- * @copyright Copyright (C) 2014 - 2021 RocketTheme, LLC. All rights reserved.
- * @license MIT License; see LICENSE file for details.
- */
- namespace Grav\Plugin\Login;
- /**
- * Class RateLimiter
- * @package Grav\Plugin\Login\RateLimiter
- */
- class RateLimiter
- {
- /** @var LoginCache */
- protected $cache;
- /** @var int */
- protected $maxCount;
- /** @var int */
- protected $interval;
- /**
- * RateLimiter constructor.
- * @param string $context
- * @param int $maxCount
- * @param int|null $interval
- */
- public function __construct($context, $maxCount, $interval)
- {
- $this->cache = new LoginCache($context, (int)$interval * 60);
- $this->maxCount = (int) $maxCount;
- $this->interval = (int) $interval;
- }
- /**
- * @return int
- */
- public function getInterval()
- {
- return $this->interval;
- }
- /**
- * Check if user has hit rate limiter. Remember to use registerRateLimitedAction() before doing the check.
- *
- * @param string $key
- * @param string $type
- * @return bool
- */
- public function isRateLimited($key, $type = 'username')
- {
- if (!$key || !$this->interval) {
- return false;
- }
- return $this->maxCount && \count($this->getAttempts($key, $type)) > $this->maxCount;
- }
- /**
- *
- *
- * @param string $key
- * @param string $type
- * @return array
- */
- public function getAttempts($key, $type = 'username')
- {
- return (array) $this->cache->get($type . $key, []);
- }
- /**
- * Register rate limited action.
- *
- * @param string $key
- * @param string $type
- * @return $this
- */
- public function registerRateLimitedAction($key, $type = 'username')
- {
- if ($key && $this->interval) {
- $tries = (array)$this->cache->get($type . $key, []);
- $tries[] = time();
- $this->cache->set($type . $key, $tries);
- }
- return $this;
- }
- /**
- * Reset the user rate limit counter.
- *
- * @param string $key
- * @param string $type
- * @return $this
- */
- public function resetRateLimit($key, $type = 'username')
- {
- if ($key) {
- $this->cache->delete($type . $key);
- }
- return $this;
- }
- }
|