123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\Security\Model\SecurityChecker;
- use Magento\Framework\Exception\SecurityViolationException;
- use Magento\Framework\HTTP\PhpEnvironment\RemoteAddress;
- use Magento\Security\Model\Config\Source\ResetMethod;
- use Magento\Security\Model\ConfigInterface;
- use Magento\Security\Model\ResourceModel\PasswordResetRequestEvent\CollectionFactory;
- /**
- * Checker by frequency requests
- */
- class Frequency implements SecurityCheckerInterface
- {
- /**
- * @var \Magento\Framework\Stdlib\DateTime\DateTime
- */
- private $dateTime;
- /**
- * @var \Magento\Security\Model\ResourceModel\PasswordResetRequestEvent\CollectionFactory
- */
- private $collectionFactory;
- /**
- * @var ConfigInterface
- */
- private $securityConfig;
- /**
- * @var RemoteAddress
- */
- private $remoteAddress;
- /**
- * @param ConfigInterface $securityConfig
- * @param CollectionFactory $collectionFactory
- * @param \Magento\Framework\Stdlib\DateTime\DateTime $dateTime
- * @param RemoteAddress $remoteAddress
- */
- public function __construct(
- ConfigInterface $securityConfig,
- CollectionFactory $collectionFactory,
- \Magento\Framework\Stdlib\DateTime\DateTime $dateTime,
- RemoteAddress $remoteAddress
- ) {
- $this->securityConfig = $securityConfig;
- $this->collectionFactory = $collectionFactory;
- $this->dateTime = $dateTime;
- $this->remoteAddress = $remoteAddress;
- }
- /**
- * {@inheritdoc}
- */
- public function check($securityEventType, $accountReference = null, $longIp = null)
- {
- $isEnabled = $this->securityConfig->getPasswordResetProtectionType() != ResetMethod::OPTION_NONE;
- $limitTimeBetweenRequests = $this->securityConfig->getMinTimeBetweenPasswordResetRequests();
- if ($isEnabled && $limitTimeBetweenRequests) {
- if (null === $longIp) {
- $longIp = $this->remoteAddress->getRemoteAddress();
- }
- $lastRecordCreationTimestamp = $this->loadLastRecordCreationTimestamp(
- $securityEventType,
- $accountReference,
- $longIp
- );
- if ($lastRecordCreationTimestamp && (
- $limitTimeBetweenRequests >
- ($this->dateTime->gmtTimestamp() - $lastRecordCreationTimestamp)
- )) {
- throw new SecurityViolationException(
- __(
- 'We received too many requests for password resets. '
- . 'Please wait and try again later or contact %1.',
- $this->securityConfig->getCustomerServiceEmail()
- )
- );
- }
- }
- }
- /**
- * Load last record creation timestamp
- *
- * @param int $securityEventType
- * @param string $accountReference
- * @param int $longIp
- * @return int
- */
- private function loadLastRecordCreationTimestamp($securityEventType, $accountReference, $longIp)
- {
- $collection = $this->collectionFactory->create($securityEventType, $accountReference, $longIp);
- /** @var \Magento\Security\Model\PasswordResetRequestEvent $record */
- $record = $collection->filterLastItem()->getFirstItem();
- return (int) strtotime($record->getCreatedAt());
- }
- }
|