/** * Hook which sends a notification on a published notification failure * * @param AuthenticationAttemptEvent $event */ public function onAuthenticationFailure(AuthenticationAttemptEvent $event) { $user = $event->getUser(); $report = $event->getReport(); $defaultParameters = ['user' => $user, 'override_locale' => true]; if (1 < ($attempts = $report->getAttempts())) { $defaultParameters['content'] = 'notification.auth.failures'; $defaultParameters['parameters'] = ['translation_defaults' => ['%times%' => $attempts]]; } else { $defaultParameters['content'] = 'notification.auth.single_failure'; } $this->publisher->createAndPublish('sen_mailer', $defaultParameters); }
public function testSendNotification() { DomainEvents::setEventDispatcher(new EventDispatcher()); $user = User::fromDTO(new CreateUserDTO('Ma27', 'test-password', '*****@*****.**')); $publisher = $this->getMock(BackendInterface::class); $publisher->expects($this->once())->method('createAndPublish')->with('sen_mailer', ['override_locale' => true, 'user' => $user, 'content' => 'notification.auth.failures', 'parameters' => ['translation_defaults' => ['%times%' => 2]]]); $hook = new AuthenticationReportListener($publisher); $entity = new AuthenticationFailure($user); $entity->updateReport(); $entity->updateReport(); $entityReport = $entity->createReport(); $event = new AuthenticationAttemptEvent($user); $event->setReport($entityReport); $hook->onAuthenticationFailure($event); }
/** * Updates the failure report */ public function updateReport() { if (null === $this->start) { $this->start = new \DateTime(); $this->attemptCount++; $event = new AuthenticationAttemptEvent($this->relatedUser); $event->setReport($this->createReport()); DomainEvents::raise($event); } else { $intervalTimestamp = $this->start->getTimestamp(); if (time() - $intervalTimestamp > 86400) { $this->start = new \DateTime(); $this->attemptCount = 1; } else { $this->attemptCount++; if (time() - $intervalTimestamp >= 21600) { $event = new AuthenticationAttemptEvent($this->relatedUser); $event->setReport($this->createReport()); DomainEvents::raise($event); } } } }