<?php
namespace Plugin\SSRecaptchaV342;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Eccube\Event\TemplateEvent;
use Plugin\SSRecaptchaV342\Repository\ConfigRepository;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpFoundation\RedirectResponse;
use ReCaptcha\ReCaptcha;
use Symfony\Component\Routing\RouterInterface;
class Event implements EventSubscriberInterface
{
/**
* @var Config
*/
private $Config;
/**
* @var RouterInterface
*/
private $router;
public function __construct(ConfigRepository $configRepository, RouterInterface $router)
{
$this->Config = $configRepository->get();
$this->router = $router;
}
/**
* @return array
*/
public static function getSubscribedEvents()
{
return [
'Mypage/login.twig' => 'onRenderMypageLogin',
'Shopping/login.twig' => 'onRenderShoppingLogin',
'Entry/index.twig' => 'onRenderEntryIndex',
'Mypage/change.twig' => 'onRenderMypageChange',
'Forgot/index.twig' => 'onRenderForgotIndex',
'Contact/index.twig' => 'onRenderContactIndex',
'Shopping/index.twig' => 'onRenderShoppingIndex',
'Shopping/nonmember.twig' => 'onRenderShoppingNonmember',
KernelEvents::REQUEST => ['onRequest', 9]
];
}
/**
* @param TemplateEvent $event
*/
public function onRenderMypageLogin(TemplateEvent $event)
{
if(is_null($this->Config) || !$this->Config->getIsLogin()) return;
$parameters = $event->getParameters();
$event->setParameter('site_key',$this->Config->getSiteKey());
$event->setParameter('is_hide_badge',!$this->Config->getIsBadge());
$event->addSnippet('@SSRecaptchaV342/Mypage/login.twig');
}
/**
* @param TemplateEvent $event
*/
public function onRenderShoppingLogin(TemplateEvent $event)
{
if(is_null($this->Config) || !$this->Config->getIsLogin()) return;
$parameters = $event->getParameters();
$event->setParameter('site_key',$this->Config->getSiteKey());
$event->setParameter('is_hide_badge',!$this->Config->getIsBadge());
$event->addSnippet('@SSRecaptchaV342/Shopping/login.twig');
}
/**
* @param TemplateEvent $event
*/
public function onRenderEntryIndex(TemplateEvent $event)
{
if(is_null($this->Config) || !$this->Config->getIsEntryCustomer()) return;
$parameters = $event->getParameters();
$event->setParameter('site_key',$this->Config->getSiteKey());
$event->setParameter('is_hide_badge',!$this->Config->getIsBadge());
$event->addSnippet('@SSRecaptchaV342/Entry/index.twig');
}
/**
* @param TemplateEvent $event
*/
public function onRenderMypageChange(TemplateEvent $event)
{
if(is_null($this->Config) || !$this->Config->getIsChangeCustomer()) return;
$parameters = $event->getParameters();
$event->setParameter('site_key',$this->Config->getSiteKey());
$event->setParameter('is_hide_badge',!$this->Config->getIsBadge());
$event->addSnippet('@SSRecaptchaV342/Mypage/change.twig');
}
/**
* @param TemplateEvent $event
*/
public function onRenderForgotIndex(TemplateEvent $event)
{
if(is_null($this->Config) || !$this->Config->getIsForgot()) return;
$parameters = $event->getParameters();
$event->setParameter('site_key',$this->Config->getSiteKey());
$event->setParameter('is_hide_badge',!$this->Config->getIsBadge());
$event->addSnippet('@SSRecaptchaV342/Forgot/index.twig');
}
/**
* @param TemplateEvent $event
*/
public function onRenderContactIndex(TemplateEvent $event)
{
if(is_null($this->Config) || !$this->Config->getIsContact()) return;
$parameters = $event->getParameters();
$event->setParameter('site_key',$this->Config->getSiteKey());
$event->setParameter('is_hide_badge',!$this->Config->getIsBadge());
$event->addSnippet('@SSRecaptchaV342/Contact/index.twig');
}
/**
* @param TemplateEvent $event
*/
public function onRenderShoppingIndex(TemplateEvent $event)
{
if(is_null($this->Config) || !$this->Config->getIsShopping()) return;
$parameters = $event->getParameters();
$event->setParameter('site_key',$this->Config->getSiteKey());
$event->setParameter('is_hide_badge',!$this->Config->getIsBadge());
$event->addSnippet('@SSRecaptchaV342/Shopping/index.twig');
}
/**
* @param TemplateEvent $event
*/
public function onRenderShoppingNonmember(TemplateEvent $event)
{
if(is_null($this->Config) || !$this->Config->getIsShoppingNonmember()) return;
$parameters = $event->getParameters();
$event->setParameter('site_key',$this->Config->getSiteKey());
$event->setParameter('is_hide_badge',!$this->Config->getIsBadge());
$event->addSnippet('@SSRecaptchaV342/Shopping/nonmember.twig');
}
public function onRequest(RequestEvent $event)
{
if(is_null($this->Config)) return;
$pageName = $event->getRequest()->attributes->get('_route');
$action = '';
$response = null;
$isMode = false;
if($event->getRequest()->getMethod() !== 'POST') return;
switch($pageName){
case 'mypage_login':
case 'shopping_login':
$action = 'login';
if(!$this->Config->getIsLogin()) return;
break;
case 'entry':
$action = 'entry';
if(!$this->Config->getIsEntryCustomer()) return;
$isMode = true;
break;
case 'mypage_change':
$action = 'mypage_change';
if(!$this->Config->getIsChangeCustomer()) return;
break;
case 'forgot':
$action = 'forgot';
if(!$this->Config->getIsForgot()) return;
break;
case 'contact':
$action = 'contact';
if(!$this->Config->getIsContact()) return;
$isMode = true;
break;
case 'shopping_confirm':
$action = 'shopping';
$response = new RedirectResponse($this->router->generate('shopping'));
if(!$this->Config->getIsShopping()) return;
$isMode = true;
break;
case 'shopping_nonmember':
$action = 'shopping_nonmember';
if(!$this->Config->getIsShoppingNonmember()) return;
break;
default:
return;
}
$flashBag = $event->getRequest()->getSession()->getFlashBag();
$token = $event->getRequest()->get('ss_recaptcha_v342_token');
if(!empty($token)){
$recaptcha = new ReCaptcha($this->Config->getSecKey());
$res = $recaptcha
->setExpectedHostname($event->getRequest()->server->get('SERVER_NAME'))
->setExpectedAction($action)
->setScoreThreshold($this->Config->getScore())
->verify($token, $event->getRequest()->server->get('REMOTE_ADDR'))
;
if(!$res->isSuccess()){
$errors = $res->getErrorCodes();
$flashBag->add(
'ss_recaptcha_v342_error',
'ロボットからのアクセスの可能性がある為、処理を中断しました。'
);
if(is_null($response)) $response = new RedirectResponse($event->getRequest()->getRequestUri());
$event->setResponse($response);
}
}
elseif($isMode && !empty($event->getRequest()->get('mode')) && $event->getRequest()->get('mode') !== 'confirm') return;
else{
$flashBag->add(
'ss_recaptcha_v342_error',
'reCAPTCHAの検証が出来なかった為、処理を中断しました。'
);
if(is_null($response)) $response = new RedirectResponse($event->getRequest()->getRequestUri());
$event->setResponse($response);
}
if($event->getRequest()->request->has('ss_recaptcha_v342_token')) $event->getRequest()->request->remove('ss_recaptcha_v342_token');
}
}