Check whether realm has store enabled for immediately sent events

Closes #21698

Signed-off-by: Michal Hajas <mhajas@redhat.com>
(cherry picked from commit 07c27336aa71a6a39e9df42bc8e18cfa1d2bb154)
This commit is contained in:
Michal Hajas 2023-07-14 14:47:16 +02:00 committed by Alexander Schwartz
parent 5489ab8f58
commit 6d28c31c93
2 changed files with 26 additions and 9 deletions

View File

@ -50,6 +50,7 @@ public class EventBuilder {
private RealmModel realm;
private Event event;
private Boolean storeImmediately;
private final boolean isEventsEnabled;
public EventBuilder(RealmModel realm, KeycloakSession session, ClientConnection clientConnection) {
this(realm, session);
@ -59,19 +60,25 @@ public class EventBuilder {
public EventBuilder(RealmModel realm, KeycloakSession session) {
this.session = session;
this.realm = realm;
this.isEventsEnabled = realm.isEventsEnabled();
event = new Event();
this.store = realm.isEventsEnabled() ? session.getProvider(EventStoreProvider.class) : null;
if (realm.isEventsEnabled() && this.store == null) {
log.error("Events enabled, but no event store provider configured");
}
this.store = this.isEventsEnabled ? getEventStoreProvider(session) : null;
this.listeners = getEventListeners(session, realm);
realm(realm);
}
private static EventStoreProvider getEventStoreProvider(KeycloakSession session) {
EventStoreProvider store = session.getProvider(EventStoreProvider.class);
if (store == null) {
log.error("Events enabled, but no event store provider configured");
}
return store;
}
private static List<EventListenerProvider> getEventListeners(KeycloakSession session, RealmModel realm) {
return realm.getEventsListenersStream().map(id -> {
EventListenerProvider listener = session.getProvider(EventListenerProvider.class, id);
@ -92,6 +99,7 @@ public class EventBuilder {
this.event = event;
this.session = session;
this.store = store;
this.isEventsEnabled = realm.isEventsEnabled();
}
public EventBuilder realm(RealmModel realm) {
@ -235,9 +243,9 @@ public class EventBuilder {
Set<String> eventTypes = realm.getEnabledEventTypesStream().collect(Collectors.toSet());
if (sendImmediately) {
KeycloakModelUtils.runJobInTransaction(session.getKeycloakSessionFactory(), session.getContext(), session -> {
EventStoreProvider store = session.getProvider(EventStoreProvider.class);
List<EventListenerProvider> listeners = getEventListeners(session, realm);
KeycloakModelUtils.runJobInTransaction(session.getKeycloakSessionFactory(), session.getContext(), innerSession -> {
EventStoreProvider store = this.isEventsEnabled ? getEventStoreProvider(innerSession) : null;
List<EventListenerProvider> listeners = getEventListeners(innerSession, realm);
sendNow(store, eventTypes, listeners);
});

View File

@ -53,7 +53,7 @@ public class LoginEventsTest extends AbstractEventTest {
}
private void badLogin() {
driver.navigate().to(oauth.getLoginFormUrl());
oauth.openLoginForm();
loginPage.form().login("bad", "user");
}
@ -166,6 +166,15 @@ public class LoginEventsTest extends AbstractEventTest {
}
@Test
public void testErrorEventsAreNotStoredWhenDisabled() {
configRep.setEventsEnabled(false);
saveConfig();
badLogin();
assertEquals(0, events().size());
}
/*
Removed this test because it takes too long. The default interval for
event cleanup is 15 minutes (900 seconds). I don't have time to figure out