|
|
<?php |
|
|
|
|
|
namespace Kanboard\Subscriber; |
|
|
|
|
|
use Symfony\Component\EventDispatcher\EventSubscriberInterface; |
|
|
use Kanboard\Core\Security\AuthenticationManager; |
|
|
use Kanboard\Core\Session\SessionManager; |
|
|
use Kanboard\Event\AuthSuccessEvent; |
|
|
use Kanboard\Event\AuthFailureEvent; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class AuthSubscriber extends BaseSubscriber implements EventSubscriberInterface |
|
|
{ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static function getSubscribedEvents() |
|
|
{ |
|
|
return array( |
|
|
AuthenticationManager::EVENT_SUCCESS => 'afterLogin', |
|
|
AuthenticationManager::EVENT_FAILURE => 'onLoginFailure', |
|
|
SessionManager::EVENT_DESTROY => 'afterLogout', |
|
|
); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function afterLogin(AuthSuccessEvent $event) |
|
|
{ |
|
|
$this->logger->debug('Subscriber executed: '.__METHOD__); |
|
|
|
|
|
$userAgent = $this->request->getUserAgent(); |
|
|
$ipAddress = $this->request->getIpAddress(); |
|
|
|
|
|
$this->userLockingModel->resetFailedLogin($this->userSession->getUsername()); |
|
|
|
|
|
$this->lastLoginModel->create( |
|
|
$event->getAuthType(), |
|
|
$this->userSession->getId(), |
|
|
$ipAddress, |
|
|
$userAgent |
|
|
); |
|
|
|
|
|
if ($event->getAuthType() === 'RememberMe') { |
|
|
$this->userSession->setPostAuthenticationAsValidated(); |
|
|
} |
|
|
|
|
|
if (session_is_true('hasRememberMe') && ! $this->userSession->hasPostAuthentication()) { |
|
|
$session = $this->rememberMeSessionModel->create($this->userSession->getId(), $ipAddress, $userAgent); |
|
|
$this->rememberMeCookie->write($session['token'], $session['sequence'], $session['expiration']); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function afterLogout() |
|
|
{ |
|
|
$this->logger->debug('Subscriber executed: '.__METHOD__); |
|
|
$credentials = $this->rememberMeCookie->read(); |
|
|
|
|
|
if ($credentials !== false) { |
|
|
$session = $this->rememberMeSessionModel->find($credentials['token'], $credentials['sequence']); |
|
|
|
|
|
if (! empty($session)) { |
|
|
$this->rememberMeSessionModel->remove($session['id']); |
|
|
} |
|
|
|
|
|
$this->rememberMeCookie->remove(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function onLoginFailure(AuthFailureEvent $event) |
|
|
{ |
|
|
$this->logger->debug('Subscriber executed: '.__METHOD__); |
|
|
$username = $event->getUsername(); |
|
|
$ipAddress = $this->request->getIpAddress(); |
|
|
|
|
|
if (! empty($username)) { |
|
|
|
|
|
error_log('Kanboard: user '.$username.' authentication failure with IP address: '.$ipAddress); |
|
|
$this->userLockingModel->incrementFailedLogin($username); |
|
|
|
|
|
if ($this->userLockingModel->getFailedLogin($username) > BRUTEFORCE_LOCKDOWN) { |
|
|
$this->userLockingModel->lock($username, BRUTEFORCE_LOCKDOWN_DURATION); |
|
|
} |
|
|
} |
|
|
else { |
|
|
|
|
|
error_log('Kanboard: user Unknown authentication failure with IP address: '.$ipAddress); |
|
|
} |
|
|
} |
|
|
} |
|
|
|