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

@ -10,6 +10,7 @@ declare(strict_types=1);
namespace OCA\AdminAudit\Listener; namespace OCA\AdminAudit\Listener;
use OCA\AdminAudit\Actions\Action; use OCA\AdminAudit\Actions\Action;
use OCP\Authentication\Events\AnyLoginFailedEvent;
use OCP\EventDispatcher\Event; use OCP\EventDispatcher\Event;
use OCP\EventDispatcher\IEventListener; use OCP\EventDispatcher\IEventListener;
use OCP\User\Events\BeforeUserLoggedInEvent; use OCP\User\Events\BeforeUserLoggedInEvent;
@ -18,7 +19,7 @@ use OCP\User\Events\UserLoggedInEvent;
use OCP\User\Events\UserLoggedInWithCookieEvent; 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 { class AuthEventListener extends Action implements IEventListener {
public function handle(Event $event): void { public function handle(Event $event): void {
@ -28,6 +29,8 @@ class AuthEventListener extends Action implements IEventListener {
$this->userLoggedIn($event); $this->userLoggedIn($event);
} elseif ($event instanceof BeforeUserLoggedOutEvent) { } elseif ($event instanceof BeforeUserLoggedOutEvent) {
$this->beforeUserLogout($event); $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 * @since 26.0.0
* @deprecated 31.0.0 Use getLoginName() instead
*/ */
public function geLoginName(): string { public function geLoginName(): string {
return $this->loginName; return $this->loginName;
} }
/**
* @since 31.0.0
*/
public function getLoginName(): string {
return $this->loginName;
}
/** /**
* @since 26.0.0 * @since 26.0.0
*/ */