diff --git a/broker/oidc/src/main/java/org/keycloak/broker/oidc/OIDCIdentityProvider.java b/broker/oidc/src/main/java/org/keycloak/broker/oidc/OIDCIdentityProvider.java index e712dd4bd1..b4058b1409 100755 --- a/broker/oidc/src/main/java/org/keycloak/broker/oidc/OIDCIdentityProvider.java +++ b/broker/oidc/src/main/java/org/keycloak/broker/oidc/OIDCIdentityProvider.java @@ -25,6 +25,7 @@ import org.keycloak.broker.provider.FederatedIdentity; import org.keycloak.broker.provider.IdentityBrokerException; import org.keycloak.events.Errors; import org.keycloak.events.EventBuilder; +import org.keycloak.events.EventGroup; import org.keycloak.events.EventType; import org.keycloak.jose.jws.JWSInput; import org.keycloak.models.RealmModel; @@ -32,7 +33,6 @@ import org.keycloak.models.UserSessionModel; import org.keycloak.representations.AccessTokenResponse; import org.keycloak.representations.IDToken; import org.keycloak.services.managers.AuthenticationManager; -import org.keycloak.services.managers.EventsManager; import org.keycloak.services.messages.Messages; import org.keycloak.services.resources.IdentityBrokerService; import org.keycloak.services.resources.RealmsResource; @@ -88,14 +88,14 @@ public class OIDCIdentityProvider extends AbstractOAuth2IdentityProvider - @@ -197,12 +196,6 @@ - - - - - - @@ -412,7 +405,6 @@ - diff --git a/connections/jpa-liquibase/src/main/resources/META-INF/jpa-changelog-1.2.0.Beta1.xml b/connections/jpa-liquibase/src/main/resources/META-INF/jpa-changelog-1.2.0.Beta1.xml index b8d20a5f3d..54f7e08e3c 100755 --- a/connections/jpa-liquibase/src/main/resources/META-INF/jpa-changelog-1.2.0.Beta1.xml +++ b/connections/jpa-liquibase/src/main/resources/META-INF/jpa-changelog-1.2.0.Beta1.xml @@ -161,5 +161,18 @@ + + + + + + + + + + + + + diff --git a/events/api/src/main/java/org/keycloak/events/Details.java b/events/api/src/main/java/org/keycloak/events/Details.java index 75c71ff722..e0a3fc6fa0 100755 --- a/events/api/src/main/java/org/keycloak/events/Details.java +++ b/events/api/src/main/java/org/keycloak/events/Details.java @@ -13,10 +13,7 @@ public interface Details { String RESPONSE_TYPE = "response_type"; String AUTH_METHOD = "auth_method"; String IDENTITY_PROVIDER = "identity_provider"; - String IDENTITY_PROVIDER_IDENTITY = "identity_provider_identity"; - String IDENTITY_PROVIDER_ALIAS = "identity_provider_alias"; - String IDENTITY_PROVIDER_FACTORY = "identity_provider_factory"; - String IDENTITY_PROVIDER_FACTORY_IDENTITY = "identity_provider_factory_identity"; + String IDENTITY_PROVIDER_USERNAME = "identity_provider_identity"; String REGISTER_METHOD = "register_method"; String USERNAME = "username"; String REMEMBER_ME = "remember_me"; @@ -26,20 +23,10 @@ public interface Details { String UPDATED_REFRESH_TOKEN_ID = "updated_refresh_token_id"; String NODE_HOST = "node_host"; String REASON = "reason"; - - String REALM_ID = "realm_id"; - String REALM_NAME = "realm_name"; - String REALM_REQUIRED_SSL = "realm_required_ssl"; - + + String REALM = "realm"; + String REPRESENTATION = "representation"; + String APPLICATION_CLUSTER_NODE = "application_cluster_node"; - - String ROLE_ID = "role_id"; - String ROLE_NAME = "role_name"; - - String PROVIDER_ID = "provider_id"; - String PROVIDER_NAME = "provider_name"; - - String SERVER_VERSION = "server_version"; - String SERVER_TIME = "server_time"; - + } diff --git a/events/api/src/main/java/org/keycloak/events/Event.java b/events/api/src/main/java/org/keycloak/events/Event.java index cebd418305..af603339b3 100644 --- a/events/api/src/main/java/org/keycloak/events/Event.java +++ b/events/api/src/main/java/org/keycloak/events/Event.java @@ -12,7 +12,7 @@ public class Event { private EventType type; - private EventGroup eventGroup; + private EventGroup group; private String realmId; @@ -26,6 +26,8 @@ public class Event { private String error; + private String representation; + private Map details; public long getTime() { @@ -44,12 +46,12 @@ public class Event { this.type = type; } - public EventGroup getEventGroup() { - return eventGroup; + public EventGroup getGroup() { + return group; } - public void setEventGroup(EventGroup group) { - this.eventGroup = group; + public void setGroup(EventGroup group) { + this.group = group; } public String getRealmId() { @@ -100,6 +102,14 @@ public class Event { this.error = error; } + public String getRepresentation() { + return representation; + } + + public void setRepresentation(String representation) { + this.representation = representation; + } + public Map getDetails() { return details; } @@ -112,14 +122,15 @@ public class Event { Event clone = new Event(); clone.time = time; clone.type = type; - clone.eventGroup = eventGroup; + clone.group = group; clone.realmId = realmId; clone.clientId = clientId; clone.userId = userId; clone.sessionId = sessionId; clone.ipAddress = ipAddress; clone.error = error; - clone.details = details != null ? new HashMap(details) : null; + clone.details = details != null ? new HashMap<>(details) : null; + clone.representation = representation; return clone; } diff --git a/events/api/src/main/java/org/keycloak/events/EventBuilder.java b/events/api/src/main/java/org/keycloak/events/EventBuilder.java index 0ad60acb12..de8fcc8c67 100644 --- a/events/api/src/main/java/org/keycloak/events/EventBuilder.java +++ b/events/api/src/main/java/org/keycloak/events/EventBuilder.java @@ -1,16 +1,18 @@ package org.keycloak.events; -import java.util.Arrays; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - import org.jboss.logging.Logger; +import org.keycloak.ClientConnection; import org.keycloak.models.ClientModel; +import org.keycloak.models.KeycloakSession; import org.keycloak.models.RealmModel; import org.keycloak.models.UserModel; import org.keycloak.models.UserSessionModel; +import org.keycloak.util.JsonSerialization; + +import java.io.IOException; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; /** * @author Stian Thorgersen @@ -18,30 +20,48 @@ import org.keycloak.models.UserSessionModel; public class EventBuilder { private static final Logger log = Logger.getLogger(EventBuilder.class); - - // These events are excluded by default and not persisted. - private EventType[] events = {EventType.VIEW_REALM, - EventType.VIEW_REALM_APPLICATIONS, EventType.VIEW_APPLICATION, EventType.VIEW_APPLICATION_USER_SESSIONS, - EventType.VIEW_IDENTITY_PROVIDER, EventType.VIEW_IDENTITY_PROVIDERS, EventType.VIEW_OAUTH_CLIENT, - EventType.VIEW_OAUTH_CLIENTS, EventType.VIEW_PROVIDER, EventType.VIEW_PROVIDER_FACTORIES, EventType.VIEW_USER, - EventType.VIEW_USER_SESSIONS, EventType.VIEW_USER_SOCIAL_LOGINS, EventType.VIEW_ROLE, EventType.VIEW_ROLES, - EventType.VIEW_CLIENT_CERTIFICATE, EventType.VIEW_SERVER_INFO }; - - private Event event; - private List listeners; - private Set enabledEventTypes; - private Set excludedEvents = new HashSet(Arrays.asList(events));; - public EventBuilder(List listeners, Set enabledEventTypes, RealmModel realm, String ipAddress) { - this.listeners = listeners; - this.enabledEventTypes = enabledEventTypes; - this.event = new Event(); + private EventStoreProvider store; + private List listeners; + private RealmModel realm; + private Event event; + + public EventBuilder(EventGroup group, RealmModel realm, KeycloakSession session, ClientConnection clientConnection) { + this.realm = realm; + + event = new Event(); + event.setGroup(group); + + if (realm.isEventsEnabled()) { + EventStoreProvider store = session.getProvider(EventStoreProvider.class); + if (store != null) { + this.store = store; + } else { + log.error("Events enabled, but no event store provider configured"); + } + } + + if (realm.getEventsListeners() != null && !realm.getEventsListeners().isEmpty()) { + this.listeners = new LinkedList<>(); + for (String id : realm.getEventsListeners()) { + EventListenerProvider listener = session.getProvider(EventListenerProvider.class, id); + if (listener != null) { + listeners.add(listener); + } else { + log.error("Event listener '" + id + "' registered, but provider not found"); + } + } + } realm(realm); - ipAddress(ipAddress); + ipAddress(clientConnection.getRemoteAddr()); } - EventBuilder() { + private EventBuilder(EventStoreProvider store, List listeners, RealmModel realm, Event event) { + this.store = store; + this.listeners = listeners; + this.realm = realm; + this.event = event; } public EventBuilder realm(RealmModel realm) { @@ -94,11 +114,6 @@ public class EventBuilder { return this; } - public EventBuilder eventGroup(EventGroup e) { - event.setEventGroup(e); - return this; - } - public EventBuilder detail(String key, String value) { if (value == null || value.equals("")) { return this; @@ -107,9 +122,18 @@ public class EventBuilder { if (event.getDetails() == null) { event.setDetails(new HashMap()); } + event.getDetails().put(key, value); + return this; + } - if (value != null && !value.isEmpty()) { - event.getDetails().put(key, value); + public EventBuilder representation(Object value) { + if (value == null || value.equals("")) { + return this; + } + try { + event.setRepresentation(JsonSerialization.writeValueAsPrettyString(value)); + } catch (IOException e) { + throw new RuntimeException(e); } return this; } @@ -136,37 +160,26 @@ public class EventBuilder { } public EventBuilder clone() { - EventBuilder clone = new EventBuilder(); - clone.listeners = listeners; - clone.event = event.clone(); - return clone; - } - - public EventBuilder reset() { - Event old = event; - - event = new Event(); - event.setRealmId(old.getRealmId()); - event.setIpAddress(old.getIpAddress()); - event.setClientId(old.getClientId()); - event.setUserId(old.getUserId()); - - return this; + return new EventBuilder(store, listeners, realm, event.clone()); } private void send() { event.setTime(System.currentTimeMillis()); + if (store != null) { + if (realm.getEnabledEventTypes() != null && !realm.getEnabledEventTypes().isEmpty() ? realm.getEnabledEventTypes().contains(event.getType().name()) : event.getType().isSaveByDefault()) { + try { + store.onEvent(event); + } catch (Throwable t) { + log.error("Failed to save event", t); + } + } + } + if (listeners != null) { for (EventListenerProvider l : listeners) { try { - if (enabledEventTypes != null && enabledEventTypes.size() > 0) { - if (enabledEventTypes.contains(event.getType())) { - l.onEvent(event); - } - } else if (!excludedEvents.contains(event.getType())) { - l.onEvent(event); - } + l.onEvent(event); } catch (Throwable t) { log.error("Failed to send type to " + l, t); } diff --git a/events/api/src/main/java/org/keycloak/events/EventGroup.java b/events/api/src/main/java/org/keycloak/events/EventGroup.java index fccdb27921..f4ce2d38ee 100644 --- a/events/api/src/main/java/org/keycloak/events/EventGroup.java +++ b/events/api/src/main/java/org/keycloak/events/EventGroup.java @@ -6,7 +6,6 @@ package org.keycloak.events; public enum EventGroup { ADMIN, - USER, - EMAIL, + USER } diff --git a/events/api/src/main/java/org/keycloak/events/EventType.java b/events/api/src/main/java/org/keycloak/events/EventType.java index 3a0dc5eef5..d4638c2eb4 100755 --- a/events/api/src/main/java/org/keycloak/events/EventType.java +++ b/events/api/src/main/java/org/keycloak/events/EventType.java @@ -5,119 +5,125 @@ package org.keycloak.events; */ public enum EventType { - LOGIN, - LOGIN_ERROR, - REGISTER, - REGISTER_ERROR, - LOGOUT, - LOGOUT_ERROR, - CODE_TO_TOKEN, - CODE_TO_TOKEN_ERROR, - REFRESH_TOKEN, - VALIDATE_ACCESS_TOKEN, - VALIDATE_ACCESS_TOKEN_ERROR, - REFRESH_TOKEN_ERROR, - SOCIAL_LINK, - SOCIAL_LINK_ERROR, - REMOVE_FEDERATED_IDENTITY, - REMOVE_SOCIAL_LINK_ERROR, + LOGIN(true), + LOGIN_ERROR(true), + REGISTER(true), + REGISTER_ERROR(true), + LOGOUT(true), + LOGOUT_ERROR(true), - UPDATE_EMAIL, - UPDATE_EMAIL_ERROR, - UPDATE_PROFILE, - UPDATE_PROFILE_ERROR, - UPDATE_PASSWORD, - UPDATE_PASSWORD_ERROR, - UPDATE_TOTP, - UPDATE_TOTP_ERROR, - VERIFY_EMAIL, - VERIFY_EMAIL_ERROR, + CODE_TO_TOKEN(true), + CODE_TO_TOKEN_ERROR(true), - REMOVE_TOTP, - REMOVE_TOTP_ERROR, + REFRESH_TOKEN(false), + REFRESH_TOKEN_ERROR(false), + VALIDATE_ACCESS_TOKEN(false), + VALIDATE_ACCESS_TOKEN_ERROR(false), - SEND_VERIFY_EMAIL, - SEND_VERIFY_EMAIL_ERROR, - SEND_RESET_PASSWORD, - SEND_RESET_PASSWORD_ERROR, - RESET_PASSWORD, - RESET_PASSWORD_ERROR, + FEDERATED_IDENTITY_LINK(true), + FEDERATED_IDENTITY_LINK_ERROR(true), + REMOVE_FEDERATED_IDENTITY(true), + REMOVE_FEDERATED_IDENTITY_ERROR(true), - INVALID_SIGNATURE_ERROR, - REGISTER_NODE, - UNREGISTER_NODE, + UPDATE_EMAIL(true), + UPDATE_EMAIL_ERROR(true), + UPDATE_PROFILE(true), + UPDATE_PROFILE_ERROR(true), + UPDATE_PASSWORD(true), + UPDATE_PASSWORD_ERROR(true), + UPDATE_TOTP(true), + UPDATE_TOTP_ERROR(true), + VERIFY_EMAIL(true), + VERIFY_EMAIL_ERROR(true), - USER_INFO_REQUEST, - USER_INFO_REQUEST_ERROR, + REMOVE_TOTP(true), + REMOVE_TOTP_ERROR(true), - IDENTITY_PROVIDER_LOGIN, - IDENTITY_PROVIDER_LOGIN_ERROR, - IDENTITY_PROVIDER_RESPONSE, - IDENTITY_PROVIDER_RESPONSE_ERROR, - IDENTITY_PROVIDER_RETRIEVE_TOKEN, - IDENTITY_PROVIDER_RETRIEVE_TOKEN_ERROR, - IDENTITY_PROVIDER_ACCCOUNT_LINKING, - IDENTITY_PROVIDER_ACCCOUNT_LINKING_ERROR, + SEND_VERIFY_EMAIL(true), + SEND_VERIFY_EMAIL_ERROR(true), + SEND_RESET_PASSWORD(true), + SEND_RESET_PASSWORD_ERROR(true), + RESET_PASSWORD(true), + RESET_PASSWORD_ERROR(true), + + INVALID_SIGNATURE_ERROR(false), + REGISTER_NODE(false), + UNREGISTER_NODE(false), + + USER_INFO_REQUEST(false), + USER_INFO_REQUEST_ERROR(false), + + IDENTITY_PROVIDER_LOGIN(false), + IDENTITY_PROVIDER_LOGIN_ERROR(false), + IDENTITY_PROVIDER_RESPONSE(false), + IDENTITY_PROVIDER_RESPONSE_ERROR(false), + IDENTITY_PROVIDER_RETRIEVE_TOKEN(false), + IDENTITY_PROVIDER_RETRIEVE_TOKEN_ERROR(false), + IDENTITY_PROVIDER_ACCCOUNT_LINKING(false), + IDENTITY_PROVIDER_ACCCOUNT_LINKING_ERROR(false), - VIEW_REALM, - UPDATE_REALM, - DELETE_REALM, - IMPORT_REALM, - UPLOAD_REALM, - VIEW_REALM_APPLICATIONS, - SET_REALM_USER_PERMISSIONS, - SET_REALM_ADAPTER_CONFIGURATION, + VIEW_REALM(false), + CREATE_REALM(false), + UPDATE_REALM(false), + DELETE_REALM(false), + + VIEW_APPLICATIONS(false), + VIEW_APPLICATION(false), + CREATE_APPLICATION(false), + UPDATE_APPLICATION(false), + DELETE_APPLICATION(false), - CREATE_APPLICATION, - UPDATE_APPLICATION, - VIEW_APPLICATION, - DELETE_APPLICATION, - - VIEW_APPLICATION_USER_SESSIONS, - INVALIDATE_APPLICATION_USER_SESSIONS, - INVALIDATE_APPLICATION_USER_SESSION, - REGISTER_APPLICATION_CLUSTER_NODE, - UNREGISTER_APPLICATION_CLUSTER_NODE, - - VIEW_CLIENT_CERTIFICATE, - GENERATE_CLIENT_CERTIFICATE, - UPLOAD_CLIENT_CERTIFICATE, - DOWNLOAD_CLIENT_CERTIFICATE, - - VIEW_IDENTITY_PROVIDER, - VIEW_IDENTITY_PROVIDERS, - IMPORT_IDENTITY_PROVIDER_CONFIG, - CREATE_IDENTITY_PROVIDER, - UPDATE_IDENTITY_PROVIDER, - DELETE_IDENTITY_PROVIDER, - - CREATE_OAUTH_CLIENT, - UPDATE_OAUTH_CLIENT, - VIEW_OAUTH_CLIENT, - VIEW_OAUTH_CLIENTS, - DELETE_OAUTH_CLIENT, - - VIEW_ROLE, - VIEW_ROLES, - CREATE_ROLE, - UPDATE_ROLE, - DELETE_ROLE, - MAKE_ROLE_COMPOSITE, - - UPDATE_USER, - CREATE_USER, - VIEW_USER, - DELETE_USER, - VIEW_USER_SESSIONS, - VIEW_USER_SOCIAL_LOGINS, - INVALIDATE_USER_SESSIONS, - - CREATE_PROVIDER, - VIEW_PROVIDER, - VIEW_PROVIDER_FACTORIES, - UPDATE_PROVIDER, - DELETE_PROVIDER, - - VIEW_SERVER_INFO, + VIEW_APPLICATION_USER_SESSIONS(false), + LOGOUT_APPLICATION_USERS(false), + LOGOUT_USER(false), + + REGISTER_APPLICATION_CLUSTER_NODE(false), + UNREGISTER_APPLICATION_CLUSTER_NODE(false), + VIEW_CLIENT_CERTIFICATE(false), + UPDATE_CLIENT_CERTIFICATE(false), + + VIEW_IDENTITY_PROVIDERS(false), + VIEW_IDENTITY_PROVIDER(false), + CREATE_IDENTITY_PROVIDER(false), + UPDATE_IDENTITY_PROVIDER(false), + DELETE_IDENTITY_PROVIDER(false), + + VIEW_OAUTH_CLIENTS(false), + VIEW_OAUTH_CLIENT(false), + CREATE_OAUTH_CLIENT(false), + UPDATE_OAUTH_CLIENT(false), + DELETE_OAUTH_CLIENT(false), + + VIEW_ROLES(false), + VIEW_ROLE(false), + CREATE_ROLE(false), + UPDATE_ROLE(false), + DELETE_ROLE(false), + + VIEW_USERS(false), + VIEW_USER(false), + CREATE_USER(false), + UPDATE_USER(false), + DELETE_USER(false), + + VIEW_USER_SESSIONS(false), + LOGOUT_USER_SESSIONS(false), + + VIEW_FEDERATION_PROVIDERS(false), + VIEW_FEDERATION_PROVIDER(false), + CREATE_FEDERATION_PROVIDER(false), + UPDATE_FEDERATION_PROVIDER(false), + DELETE_FEDERATION_PROVIDER(false); + + private boolean saveByDefault; + + EventType(boolean saveByDefault) { + this.saveByDefault = saveByDefault; + } + + public boolean isSaveByDefault() { + return saveByDefault; + } + } diff --git a/events/jpa/src/main/java/org/keycloak/events/jpa/EventEntity.java b/events/jpa/src/main/java/org/keycloak/events/jpa/EventEntity.java index 9f0aec251f..e6ca8777c0 100644 --- a/events/jpa/src/main/java/org/keycloak/events/jpa/EventEntity.java +++ b/events/jpa/src/main/java/org/keycloak/events/jpa/EventEntity.java @@ -3,6 +3,7 @@ package org.keycloak.events.jpa; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; +import javax.persistence.Lob; import javax.persistence.Table; /** @@ -23,7 +24,7 @@ public class EventEntity { private String type; @Column(name="EVENT_GROUP") - private String eventGroup; + private String group; @Column(name="REALM_ID") private String realmId; @@ -46,6 +47,10 @@ public class EventEntity { @Column(name="DETAILS_JSON", length = 2550) private String detailsJson; + @Column(name="REPRESENTATION") + @Lob + private String representation; + public String getId() { return id; } @@ -70,12 +75,12 @@ public class EventEntity { this.type = type; } - public String getEventGroup() { - return eventGroup; + public String getGroup() { + return group; } - public void setEventGroup(String eventGroup) { - this.eventGroup = eventGroup; + public void setGroup(String group) { + this.group = group; } public String getRealmId() { @@ -134,4 +139,11 @@ public class EventEntity { this.detailsJson = detailsJson; } + public String getRepresentation() { + return representation; + } + + public void setRepresentation(String representation) { + this.representation = representation; + } } diff --git a/events/jpa/src/main/java/org/keycloak/events/jpa/JpaEventStoreProvider.java b/events/jpa/src/main/java/org/keycloak/events/jpa/JpaEventStoreProvider.java index c604426adb..08b432e693 100755 --- a/events/jpa/src/main/java/org/keycloak/events/jpa/JpaEventStoreProvider.java +++ b/events/jpa/src/main/java/org/keycloak/events/jpa/JpaEventStoreProvider.java @@ -10,11 +10,9 @@ import org.keycloak.events.EventStoreProvider; import org.keycloak.events.EventType; import javax.persistence.EntityManager; -import javax.persistence.EntityTransaction; import java.io.IOException; import java.util.Map; -import java.util.Set; import java.util.UUID; /** @@ -28,12 +26,9 @@ public class JpaEventStoreProvider implements EventStoreProvider { private static final Logger logger = Logger.getLogger(JpaEventStoreProvider.class); private EntityManager em; - private EntityTransaction tx; - private Set includedEvents; - public JpaEventStoreProvider(EntityManager em, Set includedEvents) { + public JpaEventStoreProvider(EntityManager em) { this.em = em; - this.includedEvents = includedEvents; } @Override @@ -58,9 +53,7 @@ public class JpaEventStoreProvider implements EventStoreProvider { @Override public void onEvent(Event event) { - if (includedEvents.contains(event.getType())) { - em.persist(convert(event)); - } + em.persist(convert(event)); } @Override @@ -72,13 +65,14 @@ public class JpaEventStoreProvider implements EventStoreProvider { e.setId(UUID.randomUUID().toString()); e.setTime(o.getTime()); e.setType(o.getType().toString()); - e.setEventGroup(o.getEventGroup().toString()); + e.setGroup(o.getGroup().toString()); e.setRealmId(o.getRealmId()); e.setClientId(o.getClientId()); e.setUserId(o.getUserId()); e.setSessionId(o.getSessionId()); e.setIpAddress(o.getIpAddress()); e.setError(o.getError()); + e.setRepresentation(o.getRepresentation()); try { e.setDetailsJson(mapper.writeValueAsString(o.getDetails())); } catch (IOException ex) { @@ -91,13 +85,14 @@ public class JpaEventStoreProvider implements EventStoreProvider { Event e = new Event(); e.setTime(o.getTime()); e.setType(EventType.valueOf(o.getType())); - e.setEventGroup(EventGroup.valueOf(o.getEventGroup())); + e.setGroup(EventGroup.valueOf(o.getGroup())); e.setRealmId(o.getRealmId()); e.setClientId(o.getClientId()); e.setUserId(o.getUserId()); e.setSessionId(o.getSessionId()); e.setIpAddress(o.getIpAddress()); e.setError(o.getError()); + e.setRepresentation(o.getRepresentation()); try { Map details = mapper.readValue(o.getDetailsJson(), mapType); e.setDetails(details); diff --git a/events/jpa/src/main/java/org/keycloak/events/jpa/JpaEventStoreProviderFactory.java b/events/jpa/src/main/java/org/keycloak/events/jpa/JpaEventStoreProviderFactory.java index 819c58f1dc..0d95457b0f 100755 --- a/events/jpa/src/main/java/org/keycloak/events/jpa/JpaEventStoreProviderFactory.java +++ b/events/jpa/src/main/java/org/keycloak/events/jpa/JpaEventStoreProviderFactory.java @@ -18,33 +18,14 @@ public class JpaEventStoreProviderFactory implements EventStoreProviderFactory { public static final String ID = "jpa"; - private Set includedEvents = new HashSet(); - @Override public EventStoreProvider create(KeycloakSession session) { JpaConnectionProvider connection = session.getProvider(JpaConnectionProvider.class); - return new JpaEventStoreProvider(connection.getEntityManager(), includedEvents); + return new JpaEventStoreProvider(connection.getEntityManager()); } @Override public void init(Config.Scope config) { - String[] include = config.getArray("include-events"); - if (include != null) { - for (String i : include) { - includedEvents.add(EventType.valueOf(i.toUpperCase())); - } - } else { - for (EventType i : EventType.values()) { - includedEvents.add(i); - } - } - - String[] exclude = config.getArray("exclude-events"); - if (exclude != null) { - for (String e : exclude) { - includedEvents.remove(EventType.valueOf(e.toUpperCase())); - } - } } @Override diff --git a/events/mongo/src/main/java/org/keycloak/events/mongo/MongoEventStoreProvider.java b/events/mongo/src/main/java/org/keycloak/events/mongo/MongoEventStoreProvider.java index 81181893ce..50de4d7bba 100755 --- a/events/mongo/src/main/java/org/keycloak/events/mongo/MongoEventStoreProvider.java +++ b/events/mongo/src/main/java/org/keycloak/events/mongo/MongoEventStoreProvider.java @@ -12,7 +12,6 @@ import org.keycloak.events.EventType; import java.util.HashMap; import java.util.Map; -import java.util.Set; /** * @author Stian Thorgersen @@ -20,11 +19,9 @@ import java.util.Set; public class MongoEventStoreProvider implements EventStoreProvider { private DBCollection events; - private Set includedEvents; - public MongoEventStoreProvider(DBCollection events, Set includedEvents) { + public MongoEventStoreProvider(DBCollection events) { this.events = events; - this.includedEvents = includedEvents; } @Override @@ -52,9 +49,7 @@ public class MongoEventStoreProvider implements EventStoreProvider { @Override public void onEvent(Event event) { - if (includedEvents.contains(event.getType())) { - events.insert(convert(event)); - } + events.insert(convert(event)); } @Override @@ -65,13 +60,14 @@ public class MongoEventStoreProvider implements EventStoreProvider { BasicDBObject e = new BasicDBObject(); e.put("time", o.getTime()); e.put("type", o.getType().toString()); - e.put("group", o.getEventGroup().toString()); + e.put("group", o.getGroup().toString()); e.put("realmId", o.getRealmId()); e.put("clientId", o.getClientId()); e.put("userId", o.getUserId()); e.put("sessionId", o.getSessionId()); e.put("ipAddress", o.getIpAddress()); e.put("error", o.getError()); + e.put("representation", o.getRepresentation()); BasicDBObject details = new BasicDBObject(); if (o.getDetails() != null) { @@ -88,13 +84,14 @@ public class MongoEventStoreProvider implements EventStoreProvider { Event e = new Event(); e.setTime(o.getLong("time")); e.setType(EventType.valueOf(o.getString("type"))); - e.setEventGroup(EventGroup.valueOf(o.getString("group"))); + e.setGroup(EventGroup.valueOf(o.getString("group"))); e.setRealmId(o.getString("realmId")); e.setClientId(o.getString("clientId")); e.setUserId(o.getString("userId")); e.setSessionId(o.getString("sessionId")); e.setIpAddress(o.getString("ipAddress")); e.setError(o.getString("error")); + e.setRepresentation(o.getString("representation")); BasicDBObject d = (BasicDBObject) o.get("details"); if (d != null) { diff --git a/events/mongo/src/main/java/org/keycloak/events/mongo/MongoEventStoreProviderFactory.java b/events/mongo/src/main/java/org/keycloak/events/mongo/MongoEventStoreProviderFactory.java index 517bad6c20..ecf21a4eba 100755 --- a/events/mongo/src/main/java/org/keycloak/events/mongo/MongoEventStoreProviderFactory.java +++ b/events/mongo/src/main/java/org/keycloak/events/mongo/MongoEventStoreProviderFactory.java @@ -23,8 +23,6 @@ public class MongoEventStoreProviderFactory implements EventStoreProviderFactory public static final String ID = "mongo"; - private Set includedEvents = new HashSet(); - @Override public EventStoreProvider create(KeycloakSession session) { MongoConnectionProvider connection = session.getProvider(MongoConnectionProvider.class); @@ -32,28 +30,11 @@ public class MongoEventStoreProviderFactory implements EventStoreProviderFactory DBCollection collection = connection.getDB().getCollection("events"); collection.setWriteConcern(WriteConcern.UNACKNOWLEDGED); - return new MongoEventStoreProvider(collection, includedEvents); + return new MongoEventStoreProvider(collection); } @Override public void init(Config.Scope config) { - String[] include = config.getArray("include-events"); - if (include != null) { - for (String i : include) { - includedEvents.add(EventType.valueOf(i.toUpperCase())); - } - } else { - for (EventType i : EventType.values()) { - includedEvents.add(i); - } - } - - String[] exclude = config.getArray("exclude-events"); - if (exclude != null) { - for (String e : exclude) { - includedEvents.remove(EventType.valueOf(e.toUpperCase())); - } - } } @Override diff --git a/examples/providers/event-store-mem/src/main/java/org/keycloak/examples/providers/events/MemEventStoreProvider.java b/examples/providers/event-store-mem/src/main/java/org/keycloak/examples/providers/events/MemEventStoreProvider.java index efe716f296..d980af3d33 100755 --- a/examples/providers/event-store-mem/src/main/java/org/keycloak/examples/providers/events/MemEventStoreProvider.java +++ b/examples/providers/event-store-mem/src/main/java/org/keycloak/examples/providers/events/MemEventStoreProvider.java @@ -24,7 +24,7 @@ public class MemEventStoreProvider implements EventStoreProvider { @Override public EventQuery createQuery() { - return new MemEventQuery(new LinkedList(events)); + return new MemEventQuery(new LinkedList<>(events)); } @Override @@ -59,7 +59,9 @@ public class MemEventStoreProvider implements EventStoreProvider { @Override public void onEvent(Event event) { - events.add(0, event); + if (!excludedEvents.contains(event.getType())) { + events.add(0, event); + } } @Override diff --git a/examples/providers/event-store-mem/src/main/java/org/keycloak/examples/providers/events/MemEventStoreProviderFactory.java b/examples/providers/event-store-mem/src/main/java/org/keycloak/examples/providers/events/MemEventStoreProviderFactory.java index a7dd5b3ddc..83fd80e1f8 100755 --- a/examples/providers/event-store-mem/src/main/java/org/keycloak/examples/providers/events/MemEventStoreProviderFactory.java +++ b/examples/providers/event-store-mem/src/main/java/org/keycloak/examples/providers/events/MemEventStoreProviderFactory.java @@ -34,7 +34,7 @@ public class MemEventStoreProviderFactory implements EventStoreProviderFactory { String excludes = config.get("excludes"); if (excludes != null) { - excludedEvents = new HashSet(); + excludedEvents = new HashSet<>(); for (String e : excludes.split(",")) { excludedEvents.add(EventType.valueOf(e)); } diff --git a/forms/common-themes/src/main/resources/theme/base/admin/resources/js/app.js b/forms/common-themes/src/main/resources/theme/base/admin/resources/js/app.js index fc0ac6d7a1..e38c29cf75 100755 --- a/forms/common-themes/src/main/resources/theme/base/admin/resources/js/app.js +++ b/forms/common-themes/src/main/resources/theme/base/admin/resources/js/app.js @@ -244,6 +244,9 @@ module.config([ '$routeProvider', function($routeProvider) { resolve : { realm : function(RealmLoader) { return RealmLoader(); + }, + serverInfo : function(ServerInfoLoader) { + return ServerInfoLoader(); } }, controller : 'RealmEventsCtrl' diff --git a/forms/common-themes/src/main/resources/theme/base/admin/resources/js/controllers/realm.js b/forms/common-themes/src/main/resources/theme/base/admin/resources/js/controllers/realm.js index 3aa8fb1ed7..bb7620e9e6 100755 --- a/forms/common-themes/src/main/resources/theme/base/admin/resources/js/controllers/realm.js +++ b/forms/common-themes/src/main/resources/theme/base/admin/resources/js/controllers/realm.js @@ -1238,19 +1238,12 @@ module.controller('RealmEventsConfigCtrl', function($scope, eventsConfig, RealmE }); $scope.eventListeners = serverInfo.eventListeners; - - // Admin can choose any number of these eventTypes for persistence. - // By default, admin view events are not persisted. - $scope.enabledEventTypes = [{tag:'LOGIN'}, {tag:'REGISTER'}, {tag:'LOGOUT'}, {tag:'CODE_TO_TOKEN'}, - {tag:'REFRESH_TOKEN'}, {tag:'VALIDATE_ACCESS_TOKEN'}, {tag:'LOGIN_ERROR'}, {tag:'REGISTER_ERROR'}, - {tag:'LOGOUT_ERROR'}, {tag:'CODE_TO_TOKEN_ERROR'}, {tag:'REFRESH_TOKEN_ERROR'}, {tag:'VALIDATE_ACCESS_TOKEN_ERROR'}, - {tag:'UPDATE_EMAIL'}, {tag:'UPDATE_PROFILE'}, {tag:'UPDATE_PASSWORD'}, {tag:'UPDATE_TOTP'}, - {tag:'UPLOAD_REALM'}, {tag:'IMPORT_REALM'}, {tag:'UPDATE_REALM'}, {tag:'DELETE_REALM'}, - {tag:'CREATE_USER'}, {tag:'UPDATE_USER'}, {tag:'DELETE_USER'}, {tag:'VIEW_USER_SESSIONS'}, - {tag:'CREATE_APPLICATION'}, {tag:'UPDATE_APPLICATION'}, {tag:'DELETE_APPLICATION'}, {tag:'VIEW_APPLICATION'}, - {tag:'CREATE_OAUTH_CLIENT'}, {tag:'UPDATE_OAUTH_CLIENT'}, {tag:'VIEW_OAUTH_CLIENT'}, {tag:'DELETE_OAUTH_CLIENT'}, - {tag:'CREATE_PROVIDER'}, {tag:'UPDATE_PROVIDER'}, {tag:'DELETE_PROVIDER'}, {tag:'VIEW_ROLE'}, - {tag:'CREATE_ROLE'}, {tag:'UPDATE_ROLE'}, {tag:'DELETE_ROLE'}, {tag:'VIEW_SERVER_INFO'}] + + $scope.eventSelectOptions = { + 'multiple': true, + 'simple_tags': true, + 'tags': serverInfo.eventTypes + }; var oldCopy = angular.copy($scope.eventsConfig); $scope.changed = false; @@ -1291,22 +1284,15 @@ module.controller('RealmEventsConfigCtrl', function($scope, eventsConfig, RealmE }; }); -module.controller('RealmEventsCtrl', function($scope, RealmEvents, realm) { +module.controller('RealmEventsCtrl', function($scope, RealmEvents, realm, serverInfo) { $scope.realm = realm; $scope.page = 0; - // Admin can filter events view by selecting any one or multiple of these events. - $scope.eventTypes = [{tag:'LOGIN'}, {tag:'REGISTER'}, {tag:'LOGOUT'}, {tag:'CODE_TO_TOKEN'}, - {tag:'REFRESH_TOKEN'}, {tag:'LOGIN_ERROR'}, {tag:'REGISTER_ERROR'}, {tag:'LOGOUT_ERROR'}, - {tag:'CODE_TO_TOKEN_ERROR'}, {tag:'REFRESH_TOKEN_ERROR'}, {tag:'VALIDATE_ACCESS_TOKEN'}, {tag:'VALIDATE_ACCESS_TOKEN_ERROR'}, - {tag:'SOCIAL_LINK'}, {tag:'SOCIAL_LINK_ERROR'}, {tag:'REMOVE_FEDERATED_IDENTITY'}, {tag:'REMOVE_SOCIAL_LINK_ERROR'}, - {tag:'UPDATE_EMAIL'}, {tag:'UPDATE_PROFILE'}, {tag:'UPDATE_PASSWORD'}, {tag:'UPDATE_TOTP'}, - {tag:'UPLOAD_REALM'}, {tag:'IMPORT_REALM'}, {tag:'UPDATE_REALM'}, {tag:'DELETE_REALM'}, - {tag:'CREATE_USER'}, {tag:'UPDATE_USER'}, {tag:'DELETE_USER'}, {tag:'VIEW_USER_SESSIONS'}, - {tag:'CREATE_APPLICATION'}, {tag:'UPDATE_APPLICATION'}, {tag:'DELETE_APPLICATION'}, {tag:'VIEW_APPLICATION'}, - {tag:'CREATE_OAUTH_CLIENT'}, {tag:'UPDATE_OAUTH_CLIENT'}, {tag:'VIEW_OAUTH_CLIENT'}, {tag:'DELETE_OAUTH_CLIENT'}, - {tag:'CREATE_PROVIDER'}, {tag:'UPDATE_PROVIDER'}, {tag:'DELETE_PROVIDER'}, {tag:'VIEW_ROLE'}, - {tag:'CREATE_ROLE'}, {tag:'UPDATE_ROLE'}, {tag:'DELETE_ROLE'}, {tag:'VIEW_SERVER_INFO'}]; + $scope.eventSelectOptions = { + 'multiple': true, + 'simple_tags': true, + 'tags': serverInfo.eventTypes + }; $scope.query = { id : realm.realm, diff --git a/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/realm-events-config.html b/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/realm-events-config.html index 38d586454a..3575e5bbbe 100755 --- a/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/realm-events-config.html +++ b/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/realm-events-config.html @@ -18,6 +18,17 @@ + +
+ + +
+ +
+ + +
+
@@ -52,19 +63,6 @@
- -
- - -
- -
- - -
-
diff --git a/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/realm-events.html b/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/realm-events.html index b7437523ed..b6379c6a93 100755 --- a/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/realm-events.html +++ b/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/realm-events.html @@ -31,13 +31,11 @@
- +
- -
-
+ +
+
@@ -58,7 +56,7 @@
- +
@@ -109,6 +107,16 @@ + + Representation + + +
{{event.representation}}
+ + diff --git a/model/file/src/main/java/org/keycloak/models/file/adapter/RealmAdapter.java b/model/file/src/main/java/org/keycloak/models/file/adapter/RealmAdapter.java index 975bf2924f..448871b452 100755 --- a/model/file/src/main/java/org/keycloak/models/file/adapter/RealmAdapter.java +++ b/model/file/src/main/java/org/keycloak/models/file/adapter/RealmAdapter.java @@ -46,7 +46,6 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; - import org.keycloak.connections.file.InMemoryModel; import org.keycloak.models.ModelDuplicateException; import org.keycloak.models.UserModel; diff --git a/model/jpa/src/main/java/org/keycloak/models/jpa/RealmAdapter.java b/model/jpa/src/main/java/org/keycloak/models/jpa/RealmAdapter.java index 9a0111994f..9f6245abcf 100755 --- a/model/jpa/src/main/java/org/keycloak/models/jpa/RealmAdapter.java +++ b/model/jpa/src/main/java/org/keycloak/models/jpa/RealmAdapter.java @@ -23,7 +23,6 @@ import org.keycloak.models.utils.KeycloakModelUtils; import javax.persistence.EntityManager; import javax.persistence.TypedQuery; - import java.security.Key; import java.security.PrivateKey; import java.security.PublicKey; diff --git a/model/mongo/src/main/java/org/keycloak/models/mongo/keycloak/adapters/RealmAdapter.java b/model/mongo/src/main/java/org/keycloak/models/mongo/keycloak/adapters/RealmAdapter.java index 12f9e7724e..cff2ae58be 100755 --- a/model/mongo/src/main/java/org/keycloak/models/mongo/keycloak/adapters/RealmAdapter.java +++ b/model/mongo/src/main/java/org/keycloak/models/mongo/keycloak/adapters/RealmAdapter.java @@ -2,7 +2,6 @@ package org.keycloak.models.mongo.keycloak.adapters; import com.mongodb.DBObject; import com.mongodb.QueryBuilder; - import org.keycloak.connections.mongo.api.context.MongoStoreInvocationContext; import org.keycloak.enums.SslRequired; import org.keycloak.models.ApplicationModel; diff --git a/services/src/main/java/org/keycloak/protocol/oidc/OIDCLoginProtocol.java b/services/src/main/java/org/keycloak/protocol/oidc/OIDCLoginProtocol.java index 3b528e2604..581503718b 100755 --- a/services/src/main/java/org/keycloak/protocol/oidc/OIDCLoginProtocol.java +++ b/services/src/main/java/org/keycloak/protocol/oidc/OIDCLoginProtocol.java @@ -26,7 +26,6 @@ import org.jboss.resteasy.client.core.executors.ApacheHttpClient4Executor; import org.keycloak.OAuth2Constants; import org.keycloak.events.Details; import org.keycloak.events.EventBuilder; -import org.keycloak.events.EventGroup; import org.keycloak.events.EventType; import org.keycloak.models.ApplicationModel; import org.keycloak.models.ClientSessionModel; @@ -186,7 +185,7 @@ public class OIDCLoginProtocol implements LoginProtocol { public Response finishLogout(UserSessionModel userSession) { String redirectUri = userSession.getNote(OIDCLoginProtocol.LOGOUT_REDIRECT_URI); String state = userSession.getNote(OIDCLoginProtocol.LOGOUT_STATE_PARAM); - event.eventGroup(EventGroup.USER).event(EventType.LOGOUT); + event.event(EventType.LOGOUT); if (redirectUri != null) { event.detail(Details.REDIRECT_URI, redirectUri); } diff --git a/services/src/main/java/org/keycloak/protocol/oidc/OIDCLoginProtocolService.java b/services/src/main/java/org/keycloak/protocol/oidc/OIDCLoginProtocolService.java index 431d05ecec..6c327b1a67 100755 --- a/services/src/main/java/org/keycloak/protocol/oidc/OIDCLoginProtocolService.java +++ b/services/src/main/java/org/keycloak/protocol/oidc/OIDCLoginProtocolService.java @@ -4,7 +4,6 @@ import org.jboss.logging.Logger; import org.jboss.resteasy.spi.ResteasyProviderFactory; import org.keycloak.OAuth2Constants; import org.keycloak.events.EventBuilder; -import org.keycloak.events.EventGroup; import org.keycloak.jose.jwk.JWK; import org.keycloak.jose.jwk.JWKBuilder; import org.keycloak.login.LoginFormsProvider; @@ -59,7 +58,7 @@ public class OIDCLoginProtocolService { public OIDCLoginProtocolService(RealmModel realm, EventBuilder event, AuthenticationManager authManager) { this.realm = realm; this.tokenManager = new TokenManager(); - this.event = event.eventGroup(EventGroup.USER); + this.event = event; this.authManager = authManager; } diff --git a/services/src/main/java/org/keycloak/protocol/oidc/endpoints/AuthorizationEndpoint.java b/services/src/main/java/org/keycloak/protocol/oidc/endpoints/AuthorizationEndpoint.java index 9cb6c0e278..66197b7faf 100755 --- a/services/src/main/java/org/keycloak/protocol/oidc/endpoints/AuthorizationEndpoint.java +++ b/services/src/main/java/org/keycloak/protocol/oidc/endpoints/AuthorizationEndpoint.java @@ -9,7 +9,6 @@ import org.keycloak.constants.AdapterConstants; import org.keycloak.events.Details; import org.keycloak.events.Errors; import org.keycloak.events.EventBuilder; -import org.keycloak.events.EventGroup; import org.keycloak.events.EventType; import org.keycloak.login.LoginFormsProvider; import org.keycloak.models.ApplicationModel; @@ -36,7 +35,6 @@ import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.core.Response; import javax.ws.rs.core.UriInfo; - import java.util.List; /** @@ -90,7 +88,7 @@ public class AuthorizationEndpoint { this.authManager = authManager; this.realm = realm; this.event = event; - event.eventGroup(EventGroup.USER).event(EventType.LOGIN); + event.event(EventType.LOGIN); } @GET diff --git a/services/src/main/java/org/keycloak/protocol/oidc/endpoints/LogoutEndpoint.java b/services/src/main/java/org/keycloak/protocol/oidc/endpoints/LogoutEndpoint.java index eb27a275ea..a61c8112e7 100755 --- a/services/src/main/java/org/keycloak/protocol/oidc/endpoints/LogoutEndpoint.java +++ b/services/src/main/java/org/keycloak/protocol/oidc/endpoints/LogoutEndpoint.java @@ -9,7 +9,6 @@ import org.keycloak.OAuthErrorException; import org.keycloak.events.Details; import org.keycloak.events.Errors; import org.keycloak.events.EventBuilder; -import org.keycloak.events.EventGroup; import org.keycloak.events.EventType; import org.keycloak.models.ApplicationModel; import org.keycloak.models.ClientModel; @@ -71,7 +70,7 @@ public class LogoutEndpoint { this.tokenManager = tokenManager; this.authManager = authManager; this.realm = realm; - this.event = event.eventGroup(EventGroup.USER); + this.event = event; } /** diff --git a/services/src/main/java/org/keycloak/protocol/oidc/endpoints/TokenEndpoint.java b/services/src/main/java/org/keycloak/protocol/oidc/endpoints/TokenEndpoint.java index cbeca604c3..bd211e4e95 100755 --- a/services/src/main/java/org/keycloak/protocol/oidc/endpoints/TokenEndpoint.java +++ b/services/src/main/java/org/keycloak/protocol/oidc/endpoints/TokenEndpoint.java @@ -9,7 +9,6 @@ import org.keycloak.constants.AdapterConstants; import org.keycloak.events.Details; import org.keycloak.events.Errors; import org.keycloak.events.EventBuilder; -import org.keycloak.events.EventGroup; import org.keycloak.events.EventType; import org.keycloak.models.ApplicationModel; import org.keycloak.models.ClientModel; @@ -41,7 +40,6 @@ import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.core.Response; import javax.ws.rs.core.UriInfo; - import java.util.Map; /** @@ -87,7 +85,7 @@ public class TokenEndpoint { this.tokenManager = tokenManager; this.authManager = authManager; this.realm = realm; - this.event = event.eventGroup(EventGroup.USER); + this.event = event; } @POST diff --git a/services/src/main/java/org/keycloak/protocol/oidc/endpoints/UserInfoEndpoint.java b/services/src/main/java/org/keycloak/protocol/oidc/endpoints/UserInfoEndpoint.java index bdb807b919..c600df720b 100755 --- a/services/src/main/java/org/keycloak/protocol/oidc/endpoints/UserInfoEndpoint.java +++ b/services/src/main/java/org/keycloak/protocol/oidc/endpoints/UserInfoEndpoint.java @@ -20,7 +20,6 @@ package org.keycloak.protocol.oidc.endpoints; import org.jboss.resteasy.annotations.cache.NoCache; import org.jboss.resteasy.spi.HttpRequest; import org.jboss.resteasy.spi.HttpResponse; -import org.jboss.resteasy.spi.UnauthorizedException; import org.keycloak.ClientConnection; import org.keycloak.OAuthErrorException; import org.keycloak.RSATokenVerifier; @@ -37,8 +36,6 @@ import org.keycloak.protocol.oidc.TokenManager; import org.keycloak.representations.AccessToken; import org.keycloak.services.ErrorResponseException; import org.keycloak.services.managers.AppAuthManager; -import org.keycloak.services.managers.AuthenticationManager; -import org.keycloak.services.managers.EventsManager; import org.keycloak.services.resources.Cors; import org.keycloak.services.resources.flows.Urls; @@ -55,7 +52,6 @@ import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; import javax.ws.rs.core.UriInfo; - import java.util.HashMap; import java.util.Map; @@ -115,8 +111,7 @@ public class UserInfoEndpoint { } private Response issueUserInfo(String tokenString) { - EventBuilder event = new EventsManager(realm, session, clientConnection).createEventBuilder() - .eventGroup(EventGroup.USER) + EventBuilder event = new EventBuilder(EventGroup.USER, realm, session, clientConnection) .event(EventType.USER_INFO_REQUEST) .detail(Details.AUTH_METHOD, Details.VALIDATE_ACCESS_TOKEN); diff --git a/services/src/main/java/org/keycloak/protocol/oidc/endpoints/ValidateTokenEndpoint.java b/services/src/main/java/org/keycloak/protocol/oidc/endpoints/ValidateTokenEndpoint.java index a3258a680f..31499d1bd1 100644 --- a/services/src/main/java/org/keycloak/protocol/oidc/endpoints/ValidateTokenEndpoint.java +++ b/services/src/main/java/org/keycloak/protocol/oidc/endpoints/ValidateTokenEndpoint.java @@ -9,7 +9,6 @@ import org.keycloak.RSATokenVerifier; import org.keycloak.events.Details; import org.keycloak.events.Errors; import org.keycloak.events.EventBuilder; -import org.keycloak.events.EventGroup; import org.keycloak.events.EventType; import org.keycloak.models.KeycloakSession; import org.keycloak.models.RealmModel; @@ -23,7 +22,6 @@ import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.core.*; - import java.util.HashMap; import java.util.Map; @@ -53,7 +51,7 @@ public class ValidateTokenEndpoint { public ValidateTokenEndpoint(TokenManager tokenManager, RealmModel realm, EventBuilder event) { this.tokenManager = tokenManager; this.realm = realm; - this.event = event.eventGroup(EventGroup.USER); + this.event = event; } /** diff --git a/services/src/main/java/org/keycloak/services/managers/AuthenticationManager.java b/services/src/main/java/org/keycloak/services/managers/AuthenticationManager.java index 53012e862a..023dd3d7b7 100755 --- a/services/src/main/java/org/keycloak/services/managers/AuthenticationManager.java +++ b/services/src/main/java/org/keycloak/services/managers/AuthenticationManager.java @@ -44,7 +44,6 @@ import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.core.NewCookie; import javax.ws.rs.core.Response; import javax.ws.rs.core.UriInfo; - import java.net.URI; import java.util.HashSet; import java.util.LinkedList; @@ -183,7 +182,7 @@ public class AuthenticationManager { expireRememberMeCookie(realm, uriInfo, connection); userSession.setState(UserSessionModel.State.LOGGED_OUT); String method = userSession.getNote(KEYCLOAK_LOGOUT_PROTOCOL); - EventBuilder event = new EventsManager(realm, session, connection).createEventBuilder(); + EventBuilder event = new EventBuilder(EventGroup.USER, realm, session, connection); LoginProtocol protocol = session.getProvider(LoginProtocol.class, method); protocol.setRealm(realm) .setHttpHeaders(headers) @@ -376,7 +375,7 @@ public class AuthenticationManager { logger.debugv("processAccessCode: go to oauth page?: {0}", !isResource); - event.eventGroup(EventGroup.USER).detail(Details.CODE_ID, clientSession.getId()); + event.detail(Details.CODE_ID, clientSession.getId()); Set requiredActions = user.getRequiredActions(); if (!requiredActions.isEmpty()) { diff --git a/services/src/main/java/org/keycloak/services/managers/EventsManager.java b/services/src/main/java/org/keycloak/services/managers/EventsManager.java deleted file mode 100755 index 0bd5e5a0ef..0000000000 --- a/services/src/main/java/org/keycloak/services/managers/EventsManager.java +++ /dev/null @@ -1,65 +0,0 @@ -package org.keycloak.services.managers; - -import org.jboss.logging.Logger; -import org.keycloak.ClientConnection; -import org.keycloak.events.EventBuilder; -import org.keycloak.events.EventListenerProvider; -import org.keycloak.events.EventStoreProvider; -import org.keycloak.events.EventType; -import org.keycloak.models.KeycloakSession; -import org.keycloak.models.RealmModel; - -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import java.util.Set; - -/** - * @author Stian Thorgersen - */ -public class EventsManager { - - private Logger log = Logger.getLogger(EventsManager.class); - - private RealmModel realm; - private KeycloakSession session; - private ClientConnection clientConnection; - - public EventsManager(RealmModel realm, KeycloakSession session, ClientConnection clientConnection) { - this.realm = realm; - this.session = session; - this.clientConnection = clientConnection; - } - - public EventBuilder createEventBuilder() { - List listeners = new LinkedList(); - - if (realm.isEventsEnabled()) { - EventStoreProvider eventStore = session.getProvider(EventStoreProvider.class); - if (eventStore != null) { - listeners.add(eventStore); - } else { - log.error("Events enabled, but no event store provider configured"); - } - } - - if (realm.getEventsListeners() != null) { - for (String id : realm.getEventsListeners()) { - EventListenerProvider listener = session.getProvider(EventListenerProvider.class, id); - if (listener != null) { - listeners.add(listener); - } else { - log.error("Event listener '" + id + "' registered, but provider not found"); - } - } - } - - Set enabledEventTypes = new HashSet(); - for(String type : realm.getEnabledEventTypes()) { - enabledEventTypes.add(EventType.valueOf(type)); - } - - return new EventBuilder(listeners, enabledEventTypes, realm, clientConnection.getRemoteAddr()); - } - -} diff --git a/services/src/main/java/org/keycloak/services/resources/AccountService.java b/services/src/main/java/org/keycloak/services/resources/AccountService.java index f8cc72aed4..6a0e0b5895 100755 --- a/services/src/main/java/org/keycloak/services/resources/AccountService.java +++ b/services/src/main/java/org/keycloak/services/resources/AccountService.java @@ -25,13 +25,11 @@ import org.jboss.logging.Logger; import org.jboss.resteasy.spi.BadRequestException; import org.jboss.resteasy.spi.HttpRequest; import org.keycloak.ClientConnection; -import org.keycloak.OAuth2Constants; import org.keycloak.account.AccountPages; import org.keycloak.account.AccountProvider; import org.keycloak.events.Details; import org.keycloak.events.Event; import org.keycloak.events.EventBuilder; -import org.keycloak.events.EventGroup; import org.keycloak.events.EventStoreProvider; import org.keycloak.events.EventType; import org.keycloak.models.*; @@ -47,7 +45,6 @@ import org.keycloak.services.managers.AppAuthManager; import org.keycloak.services.managers.Auth; import org.keycloak.services.managers.AuthenticationManager; import org.keycloak.services.managers.ClientSessionCode; -import org.keycloak.services.managers.ResourceAdminManager; import org.keycloak.services.messages.Messages; import org.keycloak.services.resources.flows.Flows; import org.keycloak.services.resources.flows.OAuthRedirect; @@ -72,7 +69,6 @@ import javax.ws.rs.core.Response; import javax.ws.rs.core.UriBuilder; import javax.ws.rs.core.UriInfo; import javax.ws.rs.core.Variant; - import java.lang.reflect.Method; import java.net.URI; import java.util.HashSet; @@ -100,7 +96,7 @@ public class AccountService { } private static final EventType[] LOG_EVENTS = {EventType.LOGIN, EventType.LOGOUT, EventType.REGISTER, EventType.REMOVE_FEDERATED_IDENTITY, EventType.REMOVE_TOTP, EventType.SEND_RESET_PASSWORD, - EventType.SEND_VERIFY_EMAIL, EventType.SOCIAL_LINK, EventType.UPDATE_EMAIL, EventType.UPDATE_PASSWORD, EventType.UPDATE_PROFILE, EventType.UPDATE_TOTP, EventType.VERIFY_EMAIL}; + EventType.SEND_VERIFY_EMAIL, EventType.FEDERATED_IDENTITY_LINK, EventType.UPDATE_EMAIL, EventType.UPDATE_PASSWORD, EventType.UPDATE_PROFILE, EventType.UPDATE_TOTP, EventType.VERIFY_EMAIL}; private static final Set LOG_DETAILS = new HashSet(); static { @@ -143,7 +139,7 @@ public class AccountService { public AccountService(RealmModel realm, ApplicationModel application, EventBuilder event) { this.realm = realm; this.application = application; - this.event = event.eventGroup(EventGroup.USER); + this.event = event; this.authManager = new AppAuthManager(); } diff --git a/services/src/main/java/org/keycloak/services/resources/IdentityBrokerService.java b/services/src/main/java/org/keycloak/services/resources/IdentityBrokerService.java index 251130d587..3f4180186e 100755 --- a/services/src/main/java/org/keycloak/services/resources/IdentityBrokerService.java +++ b/services/src/main/java/org/keycloak/services/resources/IdentityBrokerService.java @@ -46,7 +46,6 @@ import org.keycloak.services.managers.AppAuthManager; import org.keycloak.services.managers.AuthenticationManager; import org.keycloak.services.managers.AuthenticationManager.AuthResult; import org.keycloak.services.managers.ClientSessionCode; -import org.keycloak.services.managers.EventsManager; import org.keycloak.services.messages.Messages; import org.keycloak.services.resources.flows.Flows; import org.keycloak.services.resources.flows.Urls; @@ -62,7 +61,6 @@ import javax.ws.rs.PathParam; import javax.ws.rs.QueryParam; import javax.ws.rs.core.*; import javax.ws.rs.core.Response.Status; - import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -111,7 +109,7 @@ public class IdentityBrokerService implements IdentityProvider.AuthenticationCal } public void init() { - this.event = new EventsManager(this.realmModel, this.session, this.clientConnection).createEventBuilder().event(EventType.IDENTITY_PROVIDER_LOGIN).eventGroup(EventGroup.USER); + this.event = new EventBuilder(EventGroup.USER, realmModel, session, clientConnection).event(EventType.IDENTITY_PROVIDER_LOGIN); } @GET @@ -256,7 +254,7 @@ public class IdentityBrokerService implements IdentityProvider.AuthenticationCal this.event.event(EventType.IDENTITY_PROVIDER_LOGIN) .detail(Details.REDIRECT_URI, clientSession.getRedirectUri()) - .detail(Details.IDENTITY_PROVIDER_IDENTITY, federatedIdentity.getUsername()); + .detail(Details.IDENTITY_PROVIDER_USERNAME, federatedIdentity.getUsername()); UserModel federatedUser = this.session.users().getUserByFederatedIdentity(federatedIdentityModel, this.realmModel); @@ -516,7 +514,7 @@ public class IdentityBrokerService implements IdentityProvider.AuthenticationCal this.event.clone().user(federatedUser).event(EventType.REGISTER) .detail(Details.IDENTITY_PROVIDER, federatedIdentityModel.getIdentityProvider()) - .detail(Details.IDENTITY_PROVIDER_IDENTITY, updatedIdentity.getUsername()) + .detail(Details.IDENTITY_PROVIDER_USERNAME, updatedIdentity.getUsername()) .removeDetail("auth_method") .success(); diff --git a/services/src/main/java/org/keycloak/services/resources/LoginActionsService.java b/services/src/main/java/org/keycloak/services/resources/LoginActionsService.java index a8021821de..186c0685b1 100755 --- a/services/src/main/java/org/keycloak/services/resources/LoginActionsService.java +++ b/services/src/main/java/org/keycloak/services/resources/LoginActionsService.java @@ -64,7 +64,6 @@ import javax.ws.rs.core.Response; import javax.ws.rs.core.UriBuilder; import javax.ws.rs.core.UriInfo; import javax.ws.rs.ext.Providers; - import java.util.LinkedList; import java.util.List; import java.util.concurrent.TimeUnit; @@ -134,7 +133,7 @@ public class LoginActionsService { public LoginActionsService(RealmModel realm, AuthenticationManager authManager, EventBuilder event) { this.realm = realm; this.authManager = authManager; - this.event = event.eventGroup(EventGroup.USER); + this.event = event; } private boolean checkSsl() { @@ -539,7 +538,7 @@ public class LoginActionsService { AttributeFormDataProcessor.process(formData, realm, user); event.user(user).success(); - event.reset(); + event = new EventBuilder(EventGroup.USER, realm, session, clientConnection); return processLogin(code, formData); } diff --git a/services/src/main/java/org/keycloak/services/resources/RealmsResource.java b/services/src/main/java/org/keycloak/services/resources/RealmsResource.java index 22aab14900..a28839cd36 100755 --- a/services/src/main/java/org/keycloak/services/resources/RealmsResource.java +++ b/services/src/main/java/org/keycloak/services/resources/RealmsResource.java @@ -16,7 +16,6 @@ import org.keycloak.protocol.oidc.OIDCLoginProtocol; import org.keycloak.protocol.oidc.OIDCLoginProtocolService; import org.keycloak.services.managers.AuthenticationManager; import org.keycloak.services.managers.BruteForceProtector; -import org.keycloak.services.managers.EventsManager; import org.keycloak.services.managers.RealmManager; import org.keycloak.wellknown.WellKnownProvider; @@ -92,7 +91,7 @@ public class RealmsResource { // backward compatibility RealmManager realmManager = new RealmManager(session); RealmModel realm = locateRealm(name, realmManager); - EventBuilder event = new EventsManager(realm, session, clientConnection).createEventBuilder(); + EventBuilder event = new EventBuilder(EventGroup.USER, realm, session, clientConnection); AuthenticationManager authManager = new AuthenticationManager(protector); LoginProtocolFactory factory = (LoginProtocolFactory)session.getKeycloakSessionFactory().getProviderFactory(LoginProtocol.class, OIDCLoginProtocol.LOGIN_PROTOCOL); @@ -108,7 +107,7 @@ public class RealmsResource { final @PathParam("protocol") String protocol) { RealmManager realmManager = new RealmManager(session); RealmModel realm = locateRealm(name, realmManager); - EventBuilder event = new EventsManager(realm, session, clientConnection).createEventBuilder(); + EventBuilder event = new EventBuilder(EventGroup.USER, realm, session, clientConnection); AuthenticationManager authManager = new AuthenticationManager(protector); LoginProtocolFactory factory = (LoginProtocolFactory)session.getKeycloakSessionFactory().getProviderFactory(LoginProtocol.class, protocol); @@ -130,8 +129,7 @@ public class RealmsResource { public LoginActionsService getLoginActionsService(final @PathParam("realm") String name) { RealmManager realmManager = new RealmManager(session); RealmModel realm = locateRealm(name, realmManager); - EventBuilder event = new EventsManager(realm, session, clientConnection).createEventBuilder(); - event.eventGroup(EventGroup.USER); + EventBuilder event = new EventBuilder(EventGroup.USER, realm, session, clientConnection); AuthenticationManager authManager = new AuthenticationManager(protector); LoginActionsService service = new LoginActionsService(realm, authManager, event); ResteasyProviderFactory.getInstance().injectProperties(service); @@ -144,8 +142,7 @@ public class RealmsResource { public ClientsManagementService getClientsManagementService(final @PathParam("realm") String name) { RealmManager realmManager = new RealmManager(session); RealmModel realm = locateRealm(name, realmManager); - EventBuilder event = new EventsManager(realm, session, clientConnection).createEventBuilder(); - event.eventGroup(EventGroup.USER); + EventBuilder event = new EventBuilder(EventGroup.USER, realm, session, clientConnection); ClientsManagementService service = new ClientsManagementService(realm, event); ResteasyProviderFactory.getInstance().injectProperties(service); return service; @@ -171,8 +168,7 @@ public class RealmsResource { throw new NotFoundException("account management not enabled"); } - EventBuilder event = new EventsManager(realm, session, clientConnection).createEventBuilder(); - event.eventGroup(EventGroup.USER); + EventBuilder event = new EventBuilder(EventGroup.USER, realm, session, clientConnection); AccountService accountService = new AccountService(realm, application, event); ResteasyProviderFactory.getInstance().injectProperties(accountService); //resourceContext.initResource(accountService); diff --git a/services/src/main/java/org/keycloak/services/resources/admin/AdminConsole.java b/services/src/main/java/org/keycloak/services/resources/admin/AdminConsole.java index 19c876f4c3..8ed297ad8a 100755 --- a/services/src/main/java/org/keycloak/services/resources/admin/AdminConsole.java +++ b/services/src/main/java/org/keycloak/services/resources/admin/AdminConsole.java @@ -6,11 +6,8 @@ import org.jboss.resteasy.annotations.cache.NoCache; import org.jboss.resteasy.spi.HttpRequest; import org.jboss.resteasy.spi.HttpResponse; import org.jboss.resteasy.spi.NotFoundException; -import org.keycloak.ClientConnection; -import org.keycloak.Version; -import org.keycloak.events.Details; -import org.keycloak.events.EventBuilder; -import org.keycloak.events.EventType; +import org.keycloak.ClientConnection; +import org.keycloak.Version; import org.keycloak.freemarker.BrowserSecurityHeaderSetup; import org.keycloak.freemarker.FreeMarkerException; import org.keycloak.freemarker.FreeMarkerUtil; @@ -40,7 +37,6 @@ import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.UriInfo; import javax.ws.rs.ext.Providers; - import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; @@ -72,11 +68,6 @@ public class AdminConsole { @Context protected KeycloakSession session; - /* - @Context - protected ResourceContext resourceContext; - */ - @Context protected Providers providers; @@ -85,11 +76,9 @@ public class AdminConsole { protected AppAuthManager authManager; protected RealmModel realm; - private EventBuilder event; - public AdminConsole(RealmModel realm, EventBuilder event) { + public AdminConsole(RealmModel realm) { this.realm = realm; - this.event = event.detail(Details.REALM_NAME, realm.getName()); this.authManager = new AppAuthManager(); } @@ -169,12 +158,6 @@ public class AdminConsole { if (consoleApp == null) { throw new NotFoundException("Could not find admin console application"); } - - event.event(EventType.SET_REALM_ADAPTER_CONFIGURATION) - .client(consoleApp) - .detail(Details.REALM_REQUIRED_SSL, realm.getSslRequired().name().toLowerCase()) - .success(); - return new ApplicationManager().toInstallationRepresentation(realm, consoleApp, keycloak.getBaseUri(uriInfo)); } @@ -219,8 +202,6 @@ public class AdminConsole { logger.debug("setting up realm access for a realm user"); addRealmAccess(realm, user, realmAccess); } - - event.event(EventType.SET_REALM_USER_PERMISSIONS).user(user).success(); return Response.ok(new WhoAmI(user.getId(), realm.getName(), displayName, createRealm, realmAccess)).build(); } @@ -264,14 +245,12 @@ public class AdminConsole { @NoCache public Response logout() { URI redirect = AdminRoot.adminConsoleUrl(uriInfo).build(realm.getName()); - - event.event(EventType.LOGOUT).detail(Details.REDIRECT_URI, redirect.toString()).success(); - + return Response.status(302).location( OIDCLoginProtocolService.logoutUrl(uriInfo).queryParam("redirect_uri", redirect.toString()).build(realm.getName()) ).build(); } - + protected RealmModel getAdminstrationRealm(RealmManager realmManager) { return realmManager.getKeycloakAdminstrationRealm(); } diff --git a/services/src/main/java/org/keycloak/services/resources/admin/AdminRoot.java b/services/src/main/java/org/keycloak/services/resources/admin/AdminRoot.java index f50bcd5915..01ad41f76f 100755 --- a/services/src/main/java/org/keycloak/services/resources/admin/AdminRoot.java +++ b/services/src/main/java/org/keycloak/services/resources/admin/AdminRoot.java @@ -8,7 +8,6 @@ import org.jboss.resteasy.spi.NotFoundException; import org.jboss.resteasy.spi.ResteasyProviderFactory; import org.jboss.resteasy.spi.UnauthorizedException; import org.keycloak.ClientConnection; -import org.keycloak.events.Details; import org.keycloak.events.EventBuilder; import org.keycloak.events.EventGroup; import org.keycloak.jose.jws.JWSInput; @@ -19,7 +18,6 @@ import org.keycloak.protocol.oidc.TokenManager; import org.keycloak.representations.AccessToken; import org.keycloak.services.managers.AppAuthManager; import org.keycloak.services.managers.AuthenticationManager; -import org.keycloak.services.managers.EventsManager; import org.keycloak.services.managers.RealmManager; import org.keycloak.services.resources.Cors; @@ -126,9 +124,7 @@ public class AdminRoot { public AdminConsole getAdminConsole(final @PathParam("realm") String name) { RealmManager realmManager = new RealmManager(session); RealmModel realm = locateRealm(name, realmManager); - EventBuilder event = new EventsManager(realm, session, clientConnection).createEventBuilder(); - event.eventGroup(EventGroup.ADMIN).detail(Details.REALM_NAME, realm.getName()); - AdminConsole service = new AdminConsole(realm, event); + AdminConsole service = new AdminConsole(realm); ResteasyProviderFactory.getInstance().injectProperties(service); return service; } @@ -191,11 +187,11 @@ public class AdminRoot { Cors.add(request).allowedOrigins(auth.getToken()).allowedMethods("GET", "PUT", "POST", "DELETE").auth().build(response); - EventBuilder event = new EventsManager(auth.getRealm(), session, clientConnection).createEventBuilder(); - event.eventGroup(EventGroup.ADMIN); + EventBuilder event = new EventBuilder(EventGroup.ADMIN, auth.getRealm(), session, clientConnection); + event.user(auth.getUser()).client(auth.getClient()); + RealmsAdminResource adminResource = new RealmsAdminResource(auth, tokenManager, event); ResteasyProviderFactory.getInstance().injectProperties(adminResource); - //resourceContext.initResource(adminResource); return adminResource; } @@ -214,12 +210,9 @@ public class AdminRoot { logger.debug("authenticated admin access for: " + auth.getUser().getUsername()); } Cors.add(request).allowedOrigins(auth.getToken()).allowedMethods("GET", "PUT", "POST", "DELETE").auth().build(response); - - EventBuilder event = new EventsManager(auth.getRealm(), session, clientConnection).createEventBuilder(); - event.eventGroup(EventGroup.ADMIN); - ServerInfoAdminResource adminResource = new ServerInfoAdminResource(event); + + ServerInfoAdminResource adminResource = new ServerInfoAdminResource(); ResteasyProviderFactory.getInstance().injectProperties(adminResource); - //resourceContext.initResource(adminResource); return adminResource; } diff --git a/services/src/main/java/org/keycloak/services/resources/admin/ApplicationResource.java b/services/src/main/java/org/keycloak/services/resources/admin/ApplicationResource.java index 9ec26ee734..0c8e21fe1a 100755 --- a/services/src/main/java/org/keycloak/services/resources/admin/ApplicationResource.java +++ b/services/src/main/java/org/keycloak/services/resources/admin/ApplicationResource.java @@ -81,7 +81,7 @@ public class ApplicationResource { this.application = applicationModel; this.session = session; this.event = event; - + auth.init(RealmAuth.Resource.APPLICATION); } @@ -106,7 +106,7 @@ public class ApplicationResource { try { RepresentationToModel.updateApplication(rep, application); - event.event(EventType.UPDATE_APPLICATION).client(application).success(); + event.event(EventType.UPDATE_APPLICATION).representation(rep).success(); return Response.noContent().build(); } catch (ModelDuplicateException e) { @@ -125,10 +125,12 @@ public class ApplicationResource { @Produces(MediaType.APPLICATION_JSON) public ApplicationRepresentation getApplication() { auth.requireView(); - - event.event(EventType.VIEW_APPLICATION).client(application).success(); - return ModelToRepresentation.toRepresentation(application); + ApplicationRepresentation rep = ModelToRepresentation.toRepresentation(application); + + event.event(EventType.VIEW_APPLICATION).representation(rep).success(); + + return rep; } /** @@ -187,8 +189,9 @@ public class ApplicationResource { @NoCache public void deleteApplication() { auth.requireManage(); - - event.event(EventType.DELETE_APPLICATION).client(application).success(); + + ApplicationRepresentation rep = getApplication(); + event.event(EventType.DELETE_APPLICATION).representation(rep).success(); new ApplicationManager(new RealmManager(session)).removeApplication(realm, application); } @@ -346,7 +349,7 @@ public class ApplicationResource { sessions.add(rep); } - event.event(EventType.VIEW_APPLICATION_USER_SESSIONS).client(application).success(); + event.event(EventType.VIEW_APPLICATION_USER_SESSIONS).representation(sessions).success(); return sessions; } @@ -360,7 +363,7 @@ public class ApplicationResource { public GlobalRequestResult logoutAll() { auth.requireManage(); - event.event(EventType.INVALIDATE_APPLICATION_USER_SESSIONS).client(application).success(); + event.event(EventType.LOGOUT_APPLICATION_USERS).success(); return new ResourceAdminManager().logoutApplication(uriInfo.getRequestUri(), realm, application); } @@ -378,7 +381,7 @@ public class ApplicationResource { throw new NotFoundException("User not found"); } - event.event(EventType.INVALIDATE_APPLICATION_USER_SESSION).client(application).user(user).success(); + event.event(EventType.LOGOUT_USER).success(); new ResourceAdminManager().logoutUserFromApplication(uriInfo.getRequestUri(), realm, application, user, session); } @@ -401,7 +404,7 @@ public class ApplicationResource { if (logger.isDebugEnabled()) logger.debug("Register node: " + node); application.registerNode(node, Time.currentTime()); - event.event(EventType.REGISTER_APPLICATION_CLUSTER_NODE).client(application) + event.event(EventType.REGISTER_APPLICATION_CLUSTER_NODE) .detail(Details.APPLICATION_CLUSTER_NODE, node) .success(); } @@ -425,7 +428,7 @@ public class ApplicationResource { application.unregisterNode(node); - event.event(EventType.UNREGISTER_APPLICATION_CLUSTER_NODE).client(application) + event.event(EventType.UNREGISTER_APPLICATION_CLUSTER_NODE) .detail(Details.APPLICATION_CLUSTER_NODE, node) .success(); } diff --git a/services/src/main/java/org/keycloak/services/resources/admin/ApplicationsResource.java b/services/src/main/java/org/keycloak/services/resources/admin/ApplicationsResource.java index f907a04453..6bc6c2b249 100755 --- a/services/src/main/java/org/keycloak/services/resources/admin/ApplicationsResource.java +++ b/services/src/main/java/org/keycloak/services/resources/admin/ApplicationsResource.java @@ -4,7 +4,6 @@ import org.jboss.logging.Logger; import org.jboss.resteasy.annotations.cache.NoCache; import org.jboss.resteasy.spi.NotFoundException; import org.jboss.resteasy.spi.ResteasyProviderFactory; -import org.keycloak.events.Details; import org.keycloak.events.EventBuilder; import org.keycloak.events.EventType; import org.keycloak.models.ApplicationModel; @@ -78,7 +77,7 @@ public class ApplicationsResource { } } - event.event(EventType.VIEW_REALM_APPLICATIONS).success(); + event.event(EventType.VIEW_APPLICATIONS).representation(rep).success(); return rep; } @@ -94,16 +93,16 @@ public class ApplicationsResource { @Consumes(MediaType.APPLICATION_JSON) public Response createApplication(final @Context UriInfo uriInfo, final ApplicationRepresentation rep) { auth.requireManage(); - + try { ApplicationModel applicationModel = RepresentationToModel.createApplication(session, realm, rep, true); - - event.event(EventType.CREATE_APPLICATION).client(applicationModel).success(); + + event.event(EventType.CREATE_APPLICATION).representation(rep).success(); + return Response.created(uriInfo.getAbsolutePathBuilder().path(getApplicationPath(applicationModel)).build()).build(); } catch (ModelDuplicateException e) { return Flows.errors().exists("Application " + rep.getName() + " already exists"); } - } protected String getApplicationPath(ApplicationModel applicationModel) { diff --git a/services/src/main/java/org/keycloak/services/resources/admin/ClientAttributeCertificateResource.java b/services/src/main/java/org/keycloak/services/resources/admin/ClientAttributeCertificateResource.java index 670f671e11..e2f01e5a36 100755 --- a/services/src/main/java/org/keycloak/services/resources/admin/ClientAttributeCertificateResource.java +++ b/services/src/main/java/org/keycloak/services/resources/admin/ClientAttributeCertificateResource.java @@ -6,7 +6,6 @@ import org.jboss.resteasy.plugins.providers.multipart.MultipartFormDataInput; import org.jboss.resteasy.spi.BadRequestException; import org.jboss.resteasy.spi.NotAcceptableException; import org.jboss.resteasy.spi.NotFoundException; -import org.keycloak.events.Details; import org.keycloak.events.EventBuilder; import org.keycloak.events.EventType; import org.keycloak.models.ClientModel; @@ -101,7 +100,7 @@ public class ClientAttributeCertificateResource { info.setCertificate(client.getAttribute(certificateAttribute)); info.setPrivateKey(client.getAttribute(privateAttribute)); - event.event(EventType.VIEW_CLIENT_CERTIFICATE).client(client).success(); + event.event(EventType.VIEW_CLIENT_CERTIFICATE).representation(info).success(); return info; } @@ -142,7 +141,7 @@ public class ClientAttributeCertificateResource { info.setCertificate(client.getAttribute(certificateAttribute)); info.setPrivateKey(client.getAttribute(privateAttribute)); - event.event(EventType.GENERATE_CLIENT_CERTIFICATE).client(client).success(); + event.event(EventType.UPDATE_CLIENT_CERTIFICATE).representation(info).success(); return info; } @@ -200,9 +199,9 @@ public class ClientAttributeCertificateResource { client.setAttribute(certificateAttribute, certPem); info.setCertificate(certPem); } - - event.event(EventType.UPLOAD_CLIENT_CERTIFICATE).client(client).success(); - + + event.event(EventType.UPDATE_CLIENT_CERTIFICATE).representation(info).success(); + return info; } @@ -329,7 +328,7 @@ public class ClientAttributeCertificateResource { stream.close(); byte[] rtn = stream.toByteArray(); - event.event(EventType.DOWNLOAD_CLIENT_CERTIFICATE).client(client).success(); + event.event(EventType.VIEW_CLIENT_CERTIFICATE).representation(rtn).success(); return rtn; } catch (Exception e) { diff --git a/services/src/main/java/org/keycloak/services/resources/admin/IdentityProviderResource.java b/services/src/main/java/org/keycloak/services/resources/admin/IdentityProviderResource.java index de931b5c2b..85726126e5 100755 --- a/services/src/main/java/org/keycloak/services/resources/admin/IdentityProviderResource.java +++ b/services/src/main/java/org/keycloak/services/resources/admin/IdentityProviderResource.java @@ -4,7 +4,6 @@ import org.jboss.logging.Logger; import org.jboss.resteasy.annotations.cache.NoCache; import org.keycloak.broker.provider.IdentityProvider; import org.keycloak.broker.provider.IdentityProviderFactory; -import org.keycloak.events.Details; import org.keycloak.events.EventBuilder; import org.keycloak.events.EventType; import org.keycloak.models.ClientIdentityProviderMappingModel; @@ -61,29 +60,31 @@ public class IdentityProviderResource { @NoCache @Produces("application/json") public IdentityProviderRepresentation getIdentityProvider() { - + IdentityProviderRepresentation rep = ModelToRepresentation.toRepresentation(this.identityProviderModel); + event.event(EventType.VIEW_IDENTITY_PROVIDER) - .detail(Details.IDENTITY_PROVIDER, identityProviderModel.getProviderId()) - .detail(Details.IDENTITY_PROVIDER_ALIAS, identityProviderModel.getAlias()) + .representation(rep) .success(); - - return ModelToRepresentation.toRepresentation(this.identityProviderModel); + + return rep; } @DELETE @NoCache public Response delete() { this.auth.requireManage(); + + IdentityProviderRepresentation rep = getIdentityProvider(); + removeClientIdentityProviders(this.realm.getApplications(), this.identityProviderModel); removeClientIdentityProviders(this.realm.getOAuthClients(), this.identityProviderModel); - - this.realm.removeIdentityProviderByAlias(this.identityProviderModel.getAlias()); + + this.realm.removeIdentityProviderByAlias(this.identityProviderModel.getAlias()); event.event(EventType.DELETE_IDENTITY_PROVIDER) - .detail(Details.IDENTITY_PROVIDER, identityProviderModel.getProviderId()) - .detail(Details.IDENTITY_PROVIDER_ALIAS, identityProviderModel.getAlias()) + .representation(rep) .success(); - + return Response.noContent().build(); } @@ -110,8 +111,7 @@ public class IdentityProviderResource { } event.event(EventType.UPDATE_IDENTITY_PROVIDER) - .detail(Details.IDENTITY_PROVIDER, identityProviderModel.getProviderId()) - .detail(Details.IDENTITY_PROVIDER_ALIAS, identityProviderModel.getAlias()) + .representation(providerRep) .success(); return Response.noContent().build(); diff --git a/services/src/main/java/org/keycloak/services/resources/admin/IdentityProvidersResource.java b/services/src/main/java/org/keycloak/services/resources/admin/IdentityProvidersResource.java index 19ec30140a..95dd7d4089 100755 --- a/services/src/main/java/org/keycloak/services/resources/admin/IdentityProvidersResource.java +++ b/services/src/main/java/org/keycloak/services/resources/admin/IdentityProvidersResource.java @@ -8,7 +8,6 @@ import org.jboss.resteasy.spi.NotFoundException; import org.jboss.resteasy.spi.ResteasyProviderFactory; import org.keycloak.broker.provider.IdentityProvider; import org.keycloak.broker.provider.IdentityProviderFactory; -import org.keycloak.events.Details; import org.keycloak.events.EventBuilder; import org.keycloak.events.EventType; import org.keycloak.models.IdentityProviderModel; @@ -70,8 +69,7 @@ public class IdentityProvidersResource { if (providerFactory != null) { event.event(EventType.VIEW_IDENTITY_PROVIDERS) - .detail(Details.IDENTITY_PROVIDER_FACTORY, providerFactory.getId()) - .detail(Details.IDENTITY_PROVIDER_FACTORY_IDENTITY, providerFactory.getName()) + .representation(providerFactory) .success(); return Response.ok(providerFactory).build(); @@ -93,9 +91,8 @@ public class IdentityProvidersResource { IdentityProviderFactory providerFactory = getProviderFactorytById(providerId); Map config = providerFactory.parseConfig(inputStream); - event.event(EventType.IMPORT_IDENTITY_PROVIDER_CONFIG) - .detail(Details.IDENTITY_PROVIDER_FACTORY, providerFactory.getId()) - .detail(Details.IDENTITY_PROVIDER_FACTORY_IDENTITY, providerFactory.getName()) + event.event(EventType.CREATE_IDENTITY_PROVIDER) + .representation(config) .success(); return config; @@ -120,9 +117,8 @@ public class IdentityProvidersResource { IdentityProviderFactory providerFactory = getProviderFactorytById(providerId); Map config = providerFactory.parseConfig(inputStream); - event.event(EventType.IMPORT_IDENTITY_PROVIDER_CONFIG) - .detail(Details.IDENTITY_PROVIDER_FACTORY, providerFactory.getId()) - .detail(Details.IDENTITY_PROVIDER_FACTORY_IDENTITY, providerFactory.getName()) + event.event(EventType.CREATE_IDENTITY_PROVIDER) + .representation(config) .success(); return config; @@ -141,7 +137,7 @@ public class IdentityProvidersResource { representations.add(ModelToRepresentation.toRepresentation(identityProviderModel)); } - event.event(EventType.VIEW_IDENTITY_PROVIDERS).success(); + event.event(EventType.VIEW_IDENTITY_PROVIDERS).representation(representations).success(); return representations; } @@ -156,8 +152,7 @@ public class IdentityProvidersResource { this.realm.addIdentityProvider(RepresentationToModel.toModel(representation)); event.event(EventType.CREATE_IDENTITY_PROVIDER) - .detail(Details.IDENTITY_PROVIDER, representation.getProviderId()) - .detail(Details.IDENTITY_PROVIDER_ALIAS, representation.getAlias()) + .representation(representation) .success(); return Response.created(uriInfo.getAbsolutePathBuilder().path(representation.getProviderId()).build()).build(); @@ -181,13 +176,12 @@ public class IdentityProvidersResource { if (identityProviderModel == null) { throw new NotFoundException("Could not find identity provider: " + alias); } - + IdentityProviderResource identityProviderResource = new IdentityProviderResource(this.auth, realm, session, identityProviderModel, event); ResteasyProviderFactory.getInstance().injectProperties(identityProviderResource); event.event(EventType.VIEW_IDENTITY_PROVIDER) - .detail(Details.IDENTITY_PROVIDER, identityProviderModel.getProviderId()) - .detail(Details.IDENTITY_PROVIDER_ALIAS, identityProviderModel.getAlias()) + .representation(identityProviderResource) .success(); return identityProviderResource; diff --git a/services/src/main/java/org/keycloak/services/resources/admin/OAuthClientResource.java b/services/src/main/java/org/keycloak/services/resources/admin/OAuthClientResource.java index ea9a69afc5..cc455c4ce1 100755 --- a/services/src/main/java/org/keycloak/services/resources/admin/OAuthClientResource.java +++ b/services/src/main/java/org/keycloak/services/resources/admin/OAuthClientResource.java @@ -4,7 +4,6 @@ import org.jboss.logging.Logger; import org.jboss.resteasy.annotations.cache.NoCache; import org.jboss.resteasy.spi.NotFoundException; import org.jboss.resteasy.spi.ResteasyProviderFactory; -import org.keycloak.events.Details; import org.keycloak.events.EventBuilder; import org.keycloak.events.EventType; import org.keycloak.models.KeycloakSession; @@ -108,7 +107,7 @@ public class OAuthClientResource { try { RepresentationToModel.updateOAuthClient(session, rep, oauthClient); - event.event(EventType.UPDATE_OAUTH_CLIENT).client(oauthClient).success(); + event.event(EventType.UPDATE_OAUTH_CLIENT).representation(rep).success(); return Response.noContent().build(); } catch (ModelDuplicateException e) { @@ -126,10 +125,12 @@ public class OAuthClientResource { @Produces(MediaType.APPLICATION_JSON) public OAuthClientRepresentation getOAuthClient() { auth.requireView(); - - event.event(EventType.VIEW_OAUTH_CLIENT).client(oauthClient).success(); - - return ModelToRepresentation.toRepresentation(oauthClient); + + OAuthClientRepresentation rep = ModelToRepresentation.toRepresentation(oauthClient); + + event.event(EventType.VIEW_OAUTH_CLIENT).representation(rep).success(); + + return rep; } /** @@ -160,8 +161,10 @@ public class OAuthClientResource { @NoCache public void deleteOAuthClient() { auth.requireManage(); - - event.event(EventType.DELETE_OAUTH_CLIENT).client(oauthClient).success(); + + OAuthClientRepresentation rep = getOAuthClient(); + + event.event(EventType.DELETE_OAUTH_CLIENT).representation(rep).success(); new OAuthClientManager(new RealmManager(session)).removeClient(realm, oauthClient); } diff --git a/services/src/main/java/org/keycloak/services/resources/admin/OAuthClientsResource.java b/services/src/main/java/org/keycloak/services/resources/admin/OAuthClientsResource.java index f76e002bab..4cd0ad1789 100755 --- a/services/src/main/java/org/keycloak/services/resources/admin/OAuthClientsResource.java +++ b/services/src/main/java/org/keycloak/services/resources/admin/OAuthClientsResource.java @@ -4,7 +4,6 @@ import org.jboss.logging.Logger; import org.jboss.resteasy.annotations.cache.NoCache; import org.jboss.resteasy.spi.NotFoundException; import org.jboss.resteasy.spi.ResteasyProviderFactory; -import org.keycloak.events.Details; import org.keycloak.events.EventBuilder; import org.keycloak.events.EventType; import org.keycloak.models.KeycloakSession; @@ -52,7 +51,7 @@ public class OAuthClientsResource { this.realm = realm; this.session = session; this.event = event; - + auth.init(RealmAuth.Resource.CLIENT); } @@ -79,7 +78,7 @@ public class OAuthClientsResource { } } - event.event(EventType.VIEW_OAUTH_CLIENTS).success(); + event.event(EventType.VIEW_OAUTH_CLIENTS).representation(rep).success(); return rep; } @@ -98,13 +97,12 @@ public class OAuthClientsResource { try { OAuthClientModel oauth = RepresentationToModel.createOAuthClient(session, rep, realm); - event.event(EventType.CREATE_OAUTH_CLIENT).client(oauth).success(); + event.event(EventType.CREATE_OAUTH_CLIENT).representation(rep).success(); return Response.created(uriInfo.getAbsolutePathBuilder().path(getClientPath(oauth)).build()).build(); } catch (ModelDuplicateException e) { return Flows.errors().exists("Client " + rep.getName() + " already exists"); } - } protected String getClientPath(OAuthClientModel oauth) { diff --git a/services/src/main/java/org/keycloak/services/resources/admin/RealmAdminResource.java b/services/src/main/java/org/keycloak/services/resources/admin/RealmAdminResource.java index 75a5416be8..59b4d0b007 100755 --- a/services/src/main/java/org/keycloak/services/resources/admin/RealmAdminResource.java +++ b/services/src/main/java/org/keycloak/services/resources/admin/RealmAdminResource.java @@ -77,13 +77,13 @@ public class RealmAdminResource { @Context protected HttpHeaders headers; - + public RealmAdminResource(RealmAuth auth, RealmModel realm, TokenManager tokenManager, EventBuilder event) { this.auth = auth; this.realm = realm; this.tokenManager = tokenManager; this.event = event; - + auth.init(RealmAuth.Resource.REALM); } @@ -181,7 +181,7 @@ public class RealmAdminResource { rep.setUserCacheEnabled(cache.isEnabled()); } - event.event(EventType.VIEW_REALM).success(); + event.event(EventType.VIEW_REALM).representation(rep).success(); return rep; } else { @@ -189,9 +189,9 @@ public class RealmAdminResource { RealmRepresentation rep = new RealmRepresentation(); rep.setRealm(realm.getName()); - - event.event(EventType.VIEW_REALM).success(); - + + event.event(EventType.VIEW_REALM).representation(rep).success(); + return rep; } } @@ -226,9 +226,9 @@ public class RealmAdminResource { for (final UserFederationProviderModel fedProvider : federationProviders) { usersSyncManager.refreshPeriodicSyncForProvider(session.getKeycloakSessionFactory(), session.getProvider(TimerProvider.class), fedProvider, realm.getId()); } - - event.event(EventType.UPDATE_REALM).success(); - + + event.event(EventType.UPDATE_REALM).representation(rep).success(); + return Response.noContent().build(); } catch (ModelDuplicateException e) { return Flows.errors().exists("Realm " + rep.getRealm() + " already exists"); @@ -243,11 +243,13 @@ public class RealmAdminResource { public void deleteRealm() { auth.requireManage(); + RealmRepresentation rep = getRealm(); + if (!new RealmManager(session).removeRealm(realm)) { throw new NotFoundException("Realm doesn't exist"); } - event.event(EventType.DELETE_REALM).success(); + event.event(EventType.DELETE_REALM).representation(rep).success(); } /** diff --git a/services/src/main/java/org/keycloak/services/resources/admin/RealmsAdminResource.java b/services/src/main/java/org/keycloak/services/resources/admin/RealmsAdminResource.java index 947e732140..5bf3120e38 100755 --- a/services/src/main/java/org/keycloak/services/resources/admin/RealmsAdminResource.java +++ b/services/src/main/java/org/keycloak/services/resources/admin/RealmsAdminResource.java @@ -8,7 +8,6 @@ import org.jboss.resteasy.spi.NotFoundException; import org.jboss.resteasy.spi.ResteasyProviderFactory; import org.keycloak.events.Details; import org.keycloak.events.EventBuilder; -import org.keycloak.events.EventGroup; import org.keycloak.events.EventType; import org.keycloak.models.AdminRoles; import org.keycloak.models.ApplicationModel; @@ -142,7 +141,9 @@ public class RealmsAdminResource { URI location = AdminRoot.realmsUrl(uriInfo).path(realm.getName()).build(); logger.debugv("imported realm success, sending back: {0}", location.toString()); - event.event(EventType.IMPORT_REALM).detail(Details.REALM_NAME, realm.getName()).success(); + event.event(EventType.CREATE_REALM) + .representation(rep) + .success(); return Response.created(location).build(); } catch (ModelDuplicateException e) { @@ -191,9 +192,9 @@ public class RealmsAdminResource { return Response.created(location).build(); } - event.event(EventType.UPLOAD_REALM).detail(Details.REALM_NAME, realm.getName()).success(); + event.event(EventType.CREATE_REALM).representation(rep).success(); } - + return Response.noContent().build(); } @@ -235,8 +236,8 @@ public class RealmsAdminResource { } else { realmAuth = new RealmAuth(auth, realm.getApplicationByName(realmManager.getRealmAdminApplicationName(auth.getRealm()))); } - - event.detail(Details.REALM_NAME, realm.getName()); + + event.detail(Details.REALM, realm.getName()); RealmAdminResource adminResource = new RealmAdminResource(realmAuth, realm, tokenManager, event); ResteasyProviderFactory.getInstance().injectProperties(adminResource); //resourceContext.initResource(adminResource); diff --git a/services/src/main/java/org/keycloak/services/resources/admin/RoleByIdResource.java b/services/src/main/java/org/keycloak/services/resources/admin/RoleByIdResource.java index 07759769ae..bab2f7ef80 100755 --- a/services/src/main/java/org/keycloak/services/resources/admin/RoleByIdResource.java +++ b/services/src/main/java/org/keycloak/services/resources/admin/RoleByIdResource.java @@ -3,7 +3,6 @@ package org.keycloak.services.resources.admin; import org.jboss.logging.Logger; import org.jboss.resteasy.annotations.cache.NoCache; import org.jboss.resteasy.spi.NotFoundException; -import org.keycloak.events.Details; import org.keycloak.events.EventBuilder; import org.keycloak.events.EventType; import org.keycloak.models.ApplicationModel; @@ -63,13 +62,14 @@ public class RoleByIdResource extends RoleResource { public RoleRepresentation getRole(final @PathParam("role-id") String id) { RoleModel roleModel = getRoleModel(id); auth.requireView(); - + + RoleRepresentation rep = getRole(roleModel); + event.event(EventType.VIEW_ROLE) - .detail(Details.ROLE_ID, roleModel.getId()) - .detail(Details.ROLE_NAME, roleModel.getName()) + .representation(rep) .success(); - return getRole(roleModel); + return rep; } protected RoleModel getRoleModel(String id) { @@ -102,13 +102,13 @@ public class RoleByIdResource extends RoleResource { @DELETE @NoCache public void deleteRole(final @PathParam("role-id") String id) { + RoleRepresentation rep = getRole(id); RoleModel role = getRoleModel(id); auth.requireManage(); deleteRole(role); event.event(EventType.DELETE_ROLE) - .detail(Details.ROLE_ID, role.getId()) - .detail(Details.ROLE_NAME, role.getName()) + .representation(rep) .success(); } @@ -127,8 +127,7 @@ public class RoleByIdResource extends RoleResource { updateRole(rep, role); event.event(EventType.UPDATE_ROLE) - .detail(Details.ROLE_ID, role.getId()) - .detail(Details.ROLE_NAME, role.getName()) + .representation(rep) .success(); } @@ -145,10 +144,11 @@ public class RoleByIdResource extends RoleResource { RoleModel role = getRoleModel(id); auth.requireManage(); addComposites(roles, role); - - event.event(EventType.MAKE_ROLE_COMPOSITE) - .detail(Details.ROLE_ID, role.getId()) - .detail(Details.ROLE_NAME, role.getName()) + + RoleRepresentation rep = getRole(id); + + event.event(EventType.UPDATE_ROLE) + .representation(rep) .success(); } diff --git a/services/src/main/java/org/keycloak/services/resources/admin/RoleContainerResource.java b/services/src/main/java/org/keycloak/services/resources/admin/RoleContainerResource.java index f01841ddf8..9293d5c862 100755 --- a/services/src/main/java/org/keycloak/services/resources/admin/RoleContainerResource.java +++ b/services/src/main/java/org/keycloak/services/resources/admin/RoleContainerResource.java @@ -2,7 +2,6 @@ package org.keycloak.services.resources.admin; import org.jboss.resteasy.annotations.cache.NoCache; import org.jboss.resteasy.spi.NotFoundException; -import org.keycloak.events.Details; import org.keycloak.events.EventBuilder; import org.keycloak.events.EventType; import org.keycloak.models.ApplicationModel; @@ -65,7 +64,7 @@ public class RoleContainerResource extends RoleResource { roles.add(ModelToRepresentation.toRepresentation(roleModel)); } - event.event(EventType.VIEW_ROLES).success(); + event.event(EventType.VIEW_ROLES).representation(roles).success(); return roles; } @@ -87,8 +86,7 @@ public class RoleContainerResource extends RoleResource { role.setDescription(rep.getDescription()); event.event(EventType.CREATE_ROLE) - .detail(Details.ROLE_ID, role.getId()) - .detail(Details.ROLE_NAME, role.getName()) + .representation(rep) .success(); return Response.created(uriInfo.getAbsolutePathBuilder().path(role.getName()).build()).build(); @@ -114,13 +112,14 @@ public class RoleContainerResource extends RoleResource { if (roleModel == null) { throw new NotFoundException("Could not find role: " + roleName); } - + + RoleRepresentation rep = getRole(roleModel); + event.event(EventType.VIEW_ROLE) - .detail(Details.ROLE_ID, roleModel.getId()) - .detail(Details.ROLE_NAME, roleModel.getName()) + .representation(rep) .success(); - - return getRole(roleModel); + + return rep; } /** @@ -134,6 +133,7 @@ public class RoleContainerResource extends RoleResource { public void deleteRole(final @PathParam("role-name") String roleName) { auth.requireManage(); + RoleRepresentation rep = getRole(roleName); RoleModel role = roleContainer.getRole(roleName); if (role == null) { throw new NotFoundException("Could not find role: " + roleName); @@ -141,8 +141,7 @@ public class RoleContainerResource extends RoleResource { deleteRole(role); event.event(EventType.DELETE_ROLE) - .detail(Details.ROLE_ID, role.getId()) - .detail(Details.ROLE_NAME, role.getName()) + .representation(rep) .success(); } @@ -167,8 +166,7 @@ public class RoleContainerResource extends RoleResource { updateRole(rep, role); event.event(EventType.UPDATE_ROLE) - .detail(Details.ROLE_ID, role.getId()) - .detail(Details.ROLE_NAME, role.getName()) + .representation(rep) .success(); return Response.noContent().build(); diff --git a/services/src/main/java/org/keycloak/services/resources/admin/ServerInfoAdminResource.java b/services/src/main/java/org/keycloak/services/resources/admin/ServerInfoAdminResource.java index df75c51724..ec72cc146f 100755 --- a/services/src/main/java/org/keycloak/services/resources/admin/ServerInfoAdminResource.java +++ b/services/src/main/java/org/keycloak/services/resources/admin/ServerInfoAdminResource.java @@ -3,8 +3,6 @@ package org.keycloak.services.resources.admin; import org.keycloak.Version; import org.keycloak.broker.provider.IdentityProvider; import org.keycloak.broker.provider.IdentityProviderFactory; -import org.keycloak.events.Details; -import org.keycloak.events.EventBuilder; import org.keycloak.events.EventListenerProvider; import org.keycloak.events.EventType; import org.keycloak.exportimport.ApplicationImporter; @@ -19,16 +17,13 @@ import org.keycloak.protocol.LoginProtocolFactory; import org.keycloak.protocol.ProtocolMapper; import org.keycloak.provider.ProviderFactory; import org.keycloak.provider.Spi; -import org.keycloak.representations.idm.IdentityProviderRepresentation; import org.keycloak.representations.idm.ProtocolMapperRepresentation; import org.keycloak.representations.idm.ProtocolMapperTypeRepresentation; import org.keycloak.social.SocialIdentityProvider; import javax.ws.rs.GET; import javax.ws.rs.core.Context; - import java.util.Collections; -import java.util.Comparator; import java.util.Date; import java.util.HashMap; import java.util.LinkedList; @@ -44,13 +39,7 @@ public class ServerInfoAdminResource { @Context private KeycloakSession session; - - private EventBuilder event; - - public ServerInfoAdminResource(EventBuilder event) { - this.event = event; - } - + /** * Returns a list of themes, social providers, auth providers, and event listeners available on this server * @@ -70,12 +59,7 @@ public class ServerInfoAdminResource { setProviders(info); setProtocolMapperTypes(info); setBuiltinProtocolMappers(info); - - event.event(EventType.VIEW_SERVER_INFO) - .detail(Details.SERVER_VERSION, info.version) - .detail(Details.SERVER_TIME, info.serverTime) - .success(); - + setEventTypes(info); return info; } @@ -194,6 +178,15 @@ public class ServerInfoAdminResource { } } + private void setEventTypes(ServerInfoRepresentation info) { + List eventTypes = new LinkedList<>(); + for (EventType t : EventType.values()) { + eventTypes.add(t.name()); + } + Collections.sort(eventTypes); + info.setEventTypes(eventTypes); + } + public static class ServerInfoRepresentation { private String version; @@ -213,6 +206,8 @@ public class ServerInfoAdminResource { private Map> protocolMapperTypes; private Map> builtinProtocolMappers; + private List eventTypes; + public ServerInfoRepresentation() { } @@ -263,6 +258,14 @@ public class ServerInfoAdminResource { public void setBuiltinProtocolMappers(Map> builtinProtocolMappers) { this.builtinProtocolMappers = builtinProtocolMappers; } + + public List getEventTypes() { + return eventTypes; + } + + public void setEventTypes(List eventTypes) { + this.eventTypes = eventTypes; + } } } diff --git a/services/src/main/java/org/keycloak/services/resources/admin/UserFederationResource.java b/services/src/main/java/org/keycloak/services/resources/admin/UserFederationResource.java index 1dad039a2c..06a852316d 100755 --- a/services/src/main/java/org/keycloak/services/resources/admin/UserFederationResource.java +++ b/services/src/main/java/org/keycloak/services/resources/admin/UserFederationResource.java @@ -11,7 +11,6 @@ import org.keycloak.models.UserFederationProvider; import org.keycloak.models.UserFederationProviderFactory; import org.keycloak.models.UserFederationProviderModel; import org.keycloak.constants.KerberosConstants; -import org.keycloak.events.Details; import org.keycloak.events.EventBuilder; import org.keycloak.events.EventType; import org.keycloak.models.utils.ModelToRepresentation; @@ -49,12 +48,12 @@ public class UserFederationResource { protected RealmModel realm; protected RealmAuth auth; - + private EventBuilder event; - + @Context protected UriInfo uriInfo; - + @Context protected KeycloakSession session; @@ -85,13 +84,13 @@ public class UserFederationResource { providers.add(rep); } - event.event(EventType.VIEW_PROVIDER_FACTORIES).success(); + event.event(EventType.VIEW_FEDERATION_PROVIDERS).representation(providers).success(); return providers; } /** - * Get a provider + * Get List of available provider factories * * @return */ @@ -109,7 +108,7 @@ public class UserFederationResource { rep.setId(factory.getId()); rep.setOptions(((UserFederationProviderFactory)factory).getConfigurationOptions()); - event.event(EventType.VIEW_PROVIDER).detail(Details.PROVIDER_ID, rep.getId()).success(); + event.event(EventType.VIEW_FEDERATION_PROVIDER).representation(rep).success(); return rep; } @@ -135,12 +134,11 @@ public class UserFederationResource { rep.getFullSyncPeriod(), rep.getChangedSyncPeriod(), rep.getLastSync()); new UsersSyncManager().refreshPeriodicSyncForProvider(session.getKeycloakSessionFactory(), session.getProvider(TimerProvider.class), model, realm.getId()); checkKerberosCredential(model); - - event.event(EventType.CREATE_PROVIDER) - .detail(Details.PROVIDER_ID, model.getId()) - .detail(Details.PROVIDER_NAME, model.getProviderName()) + + event.event(EventType.CREATE_FEDERATION_PROVIDER) + .representation(rep) .success(); - + return Response.created(uriInfo.getAbsolutePathBuilder().path(model.getId()).build()).build(); } @@ -164,10 +162,9 @@ public class UserFederationResource { realm.updateUserFederationProvider(model); new UsersSyncManager().refreshPeriodicSyncForProvider(session.getKeycloakSessionFactory(), session.getProvider(TimerProvider.class), model, realm.getId()); checkKerberosCredential(model); - - event.event(EventType.UPDATE_PROVIDER) - .detail(Details.PROVIDER_ID, model.getId()) - .detail(Details.PROVIDER_NAME, model.getProviderName()) + + event.event(EventType.UPDATE_FEDERATION_PROVIDER) + .representation(rep) .success(); } @@ -184,13 +181,13 @@ public class UserFederationResource { auth.requireView(); for (UserFederationProviderModel model : realm.getUserFederationProviders()) { if (model.getId().equals(id)) { - - event.event(EventType.VIEW_PROVIDER) - .detail(Details.PROVIDER_ID, model.getId()) - .detail(Details.PROVIDER_NAME, model.getProviderName()) + UserFederationProviderRepresentation rep = ModelToRepresentation.toRepresentation(model); + + event.event(EventType.VIEW_FEDERATION_PROVIDER) + .representation(rep) .success(); - return ModelToRepresentation.toRepresentation(model); + return rep; } } @@ -206,13 +203,14 @@ public class UserFederationResource { @Path("instances/{id}") public void deleteProviderInstance(@PathParam("id") String id) { auth.requireManage(); + + UserFederationProviderRepresentation rep = getProviderInstance(id); UserFederationProviderModel model = new UserFederationProviderModel(id, null, null, -1, null, -1, -1, 0); realm.removeUserFederationProvider(model); new UsersSyncManager().removePeriodicSyncForProvider(session.getProvider(TimerProvider.class), model); - event.event(EventType.DELETE_PROVIDER) - .detail(Details.PROVIDER_ID, model.getId()) - .detail(Details.PROVIDER_NAME, model.getProviderName()) + event.event(EventType.DELETE_FEDERATION_PROVIDER) + .representation(rep) .success(); } diff --git a/services/src/main/java/org/keycloak/services/resources/admin/UsersResource.java b/services/src/main/java/org/keycloak/services/resources/admin/UsersResource.java index f66ec2e21c..3cc0895eed 100755 --- a/services/src/main/java/org/keycloak/services/resources/admin/UsersResource.java +++ b/services/src/main/java/org/keycloak/services/resources/admin/UsersResource.java @@ -39,7 +39,6 @@ import org.keycloak.representations.idm.UserSessionRepresentation; import org.keycloak.services.managers.AuthenticationManager; import org.keycloak.services.managers.ClientSessionCode; import org.keycloak.services.managers.RealmManager; -import org.keycloak.services.managers.ResourceAdminManager; import org.keycloak.services.managers.UserManager; import org.keycloak.services.resources.flows.Flows; import org.keycloak.services.resources.flows.Urls; @@ -96,7 +95,7 @@ public class UsersResource { @Context protected HttpHeaders headers; - + public UsersResource(RealmModel realm, RealmAuth auth, TokenManager tokenManager, EventBuilder event) { this.auth = auth; this.realm = realm; @@ -127,14 +126,13 @@ public class UsersResource { updateUserFromRep(user, rep); event.event(EventType.UPDATE_USER) - .user(user) - .detail(Details.USERNAME, user.getUsername()) + .representation(rep) .success(); if (session.getTransaction().isActive()) { session.getTransaction().commit(); } - + return Response.noContent().build(); } catch (ModelDuplicateException e) { return Flows.errors().exists("User exists with same username or email"); @@ -166,16 +164,15 @@ public class UsersResource { try { UserModel user = session.users().addUser(realm, rep.getUsername()); updateUserFromRep(user, rep); - + event.event(EventType.CREATE_USER) - .user(user) - .detail(Details.USERNAME, user.getUsername()) + .representation(rep) .success(); - + if (session.getTransaction().isActive()) { session.getTransaction().commit(); } - + return Response.created(uriInfo.getAbsolutePathBuilder().path(user.getUsername()).build()).build(); } catch (ModelDuplicateException e) { if (session.getTransaction().isActive()) { @@ -236,13 +233,14 @@ public class UsersResource { if (user == null) { throw new NotFoundException("User not found"); } - + + UserRepresentation rep = ModelToRepresentation.toRepresentation(user); + event.event(EventType.VIEW_USER) - .user(user) - .detail(Details.USERNAME, user.getUsername()) + .representation(rep) .success(); - - return ModelToRepresentation.toRepresentation(user); + + return rep; } /** @@ -269,8 +267,7 @@ public class UsersResource { } event.event(EventType.VIEW_USER_SESSIONS) - .user(user) - .detail(Details.USERNAME, user.getUsername()) + .representation(reps) .success(); return reps; @@ -305,9 +302,8 @@ public class UsersResource { } } - event.event(EventType.VIEW_USER_SOCIAL_LOGINS) - .user(user) - .detail(Details.USERNAME, user.getUsername()) + event.event(EventType.VIEW_USER) + .representation(result) .success(); return result; @@ -366,9 +362,7 @@ public class UsersResource { AuthenticationManager.backchannelLogout(session, realm, userSession, uriInfo, clientConnection, headers); } - event.event(EventType.INVALIDATE_USER_SESSIONS) - .user(user) - .detail(Details.USERNAME, user.getUsername()) + event.event(EventType.LOGOUT_USER_SESSIONS) .success(); } @@ -383,6 +377,7 @@ public class UsersResource { public Response deleteUser(final @PathParam("username") String username) { auth.requireManage(); + UserRepresentation rep = getUser(username); UserModel user = session.users().getUserByUsername(username, realm); if (user == null) { throw new NotFoundException("User not found"); @@ -392,8 +387,7 @@ public class UsersResource { if (removed) { event.event(EventType.DELETE_USER) - .user(user) - .detail(Details.USERNAME, user.getUsername()) + .representation(rep) .success(); return Response.noContent().build(); diff --git a/social/twitter/src/main/java/org/keycloak/social/twitter/TwitterIdentityProvider.java b/social/twitter/src/main/java/org/keycloak/social/twitter/TwitterIdentityProvider.java index e9ced5f4cd..2e908541ec 100755 --- a/social/twitter/src/main/java/org/keycloak/social/twitter/TwitterIdentityProvider.java +++ b/social/twitter/src/main/java/org/keycloak/social/twitter/TwitterIdentityProvider.java @@ -29,6 +29,7 @@ import org.keycloak.broker.provider.AuthenticationRequest; import org.keycloak.broker.provider.FederatedIdentity; import org.keycloak.broker.provider.IdentityBrokerException; import org.keycloak.events.EventBuilder; +import org.keycloak.events.EventGroup; import org.keycloak.events.EventType; import org.keycloak.models.ClientModel; import org.keycloak.models.ClientSessionModel; @@ -36,7 +37,6 @@ import org.keycloak.models.FederatedIdentityModel; import org.keycloak.models.KeycloakSession; import org.keycloak.models.RealmModel; import org.keycloak.services.managers.ClientSessionCode; -import org.keycloak.services.managers.EventsManager; import org.keycloak.services.messages.Messages; import org.keycloak.services.resources.flows.Flows; import org.keycloak.social.SocialIdentityProvider; @@ -156,7 +156,7 @@ public class TwitterIdentityProvider extends AbstractIdentityProvider