feat(admin_audit): write admin audit log for AnyLoginFailedEvent

Signed-off-by: Luka Trovic <luka@nextcloud.com>
pull/50710/head
Luka Trovic 2025-02-06 14:36:11 +07:00 committed by backportbot[bot]
parent 0f96d72e14
commit 57971afad5
3 changed files with 27 additions and 1 deletions

@ -34,6 +34,7 @@ use OCP\AppFramework\App;
use OCP\AppFramework\Bootstrap\IBootContext;
use OCP\AppFramework\Bootstrap\IBootstrap;
use OCP\AppFramework\Bootstrap\IRegistrationContext;
use OCP\Authentication\Events\AnyLoginFailedEvent;
use OCP\Authentication\TwoFactorAuth\TwoFactorProviderChallengeFailed;
use OCP\Authentication\TwoFactorAuth\TwoFactorProviderChallengePassed;
use OCP\Console\ConsoleEvent;
@ -105,6 +106,7 @@ class Application extends App implements IBootstrap {
$context->registerEventListener(UserLoggedInWithCookieEvent::class, AuthEventListener::class);
$context->registerEventListener(UserLoggedInEvent::class, AuthEventListener::class);
$context->registerEventListener(BeforeUserLoggedOutEvent::class, AuthEventListener::class);
$context->registerEventListener(AnyLoginFailedEvent::class, AuthEventListener::class);
// File events
$context->registerEventListener(BeforePreviewFetchedEvent::class, FileEventListener::class);

@ -10,6 +10,7 @@ declare(strict_types=1);
namespace OCA\AdminAudit\Listener;
use OCA\AdminAudit\Actions\Action;
use OCP\Authentication\Events\AnyLoginFailedEvent;
use OCP\EventDispatcher\Event;
use OCP\EventDispatcher\IEventListener;
use OCP\User\Events\BeforeUserLoggedInEvent;
@ -18,7 +19,7 @@ use OCP\User\Events\UserLoggedInEvent;
use OCP\User\Events\UserLoggedInWithCookieEvent;
/**
* @template-implements IEventListener<BeforeUserLoggedInEvent|UserLoggedInWithCookieEvent|UserLoggedInEvent|BeforeUserLoggedOutEvent>
* @template-implements IEventListener<BeforeUserLoggedInEvent|UserLoggedInWithCookieEvent|UserLoggedInEvent|BeforeUserLoggedOutEvent|AnyLoginFailedEvent>
*/
class AuthEventListener extends Action implements IEventListener {
public function handle(Event $event): void {
@ -28,6 +29,8 @@ class AuthEventListener extends Action implements IEventListener {
$this->userLoggedIn($event);
} elseif ($event instanceof BeforeUserLoggedOutEvent) {
$this->beforeUserLogout($event);
} elseif ($event instanceof AnyLoginFailedEvent) {
$this->anyLoginFailed($event);
}
}
@ -64,4 +67,17 @@ class AuthEventListener extends Action implements IEventListener {
[]
);
}
private function anyLoginFailed(AnyLoginFailedEvent $event): void {
$this->log(
'Login failed: "%s"',
[
'loginName' => $event->getLoginName()
],
[
'loginName',
],
true
);
}
}

@ -31,11 +31,19 @@ class AnyLoginFailedEvent extends Event {
/**
* @since 26.0.0
* @deprecated 31.0.0 Use getLoginName() instead
*/
public function geLoginName(): string {
return $this->loginName;
}
/**
* @since 31.0.0
*/
public function getLoginName(): string {
return $this->loginName;
}
/**
* @since 26.0.0
*/