diff --git a/model/infinispan/src/main/java/org/keycloak/models/sessions/infinispan/entities/AuthenticationSessionEntity.java b/model/infinispan/src/main/java/org/keycloak/models/sessions/infinispan/entities/AuthenticationSessionEntity.java
index 8dcac43..be21ef6 100644
--- a/model/infinispan/src/main/java/org/keycloak/models/sessions/infinispan/entities/AuthenticationSessionEntity.java
+++ b/model/infinispan/src/main/java/org/keycloak/models/sessions/infinispan/entities/AuthenticationSessionEntity.java
@@ -17,6 +17,7 @@
package org.keycloak.models.sessions.infinispan.entities;
+import org.keycloak.models.sessions.infinispan.util.KeycloakMarshallUtil;
import java.io.Serializable;
import java.util.Map;
import java.util.Set;
@@ -24,10 +25,18 @@ import java.util.concurrent.ConcurrentHashMap;
import org.infinispan.util.concurrent.ConcurrentHashSet;
import org.keycloak.sessions.AuthenticationSessionModel;
+import org.keycloak.sessions.CommonClientSessionModel.ExecutionStatus;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import org.infinispan.commons.marshall.Externalizer;
+import org.infinispan.commons.marshall.MarshallUtil;
+import org.infinispan.commons.marshall.SerializeWith;
/**
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
*/
+@SerializeWith(AuthenticationSessionEntity.ExternalizerImpl.class)
public class AuthenticationSessionEntity implements Serializable {
private String clientUUID;
@@ -47,6 +56,33 @@ public class AuthenticationSessionEntity implements Serializable {
private Set<String> requiredActions = new ConcurrentHashSet<>();
private Map<String, String> userSessionNotes;
+ public AuthenticationSessionEntity() {
+ }
+
+ public AuthenticationSessionEntity(
+ String clientUUID,
+ String authUserId,
+ String redirectUri, String action, Set<String> roles, Set<String> protocolMappers,
+ Map<String, AuthenticationSessionModel.ExecutionStatus> executionStatus, String protocol,
+ Map<String, String> clientNotes, Map<String, String> authNotes, Set<String> requiredActions, Map<String, String> userSessionNotes) {
+ this.clientUUID = clientUUID;
+
+ this.authUserId = authUserId;
+
+ this.redirectUri = redirectUri;
+ this.action = action;
+ this.roles = roles;
+ this.protocolMappers = protocolMappers;
+
+ this.executionStatus = executionStatus;
+ this.protocol = protocol;
+
+ this.clientNotes = clientNotes;
+ this.authNotes = authNotes;
+ this.requiredActions = requiredActions;
+ this.userSessionNotes = userSessionNotes;
+ }
+
public String getClientUUID() {
return clientUUID;
}
@@ -143,4 +179,83 @@ public class AuthenticationSessionEntity implements Serializable {
this.authNotes = authNotes;
}
+ public static class ExternalizerImpl implements Externalizer<AuthenticationSessionEntity> {
+
+ private static final int VERSION_1 = 1;
+
+ public static final ExternalizerImpl INSTANCE = new ExternalizerImpl();
+
+ private static AuthenticationSessionModel.ExecutionStatus fromOrdinal(int ordinal) {
+ ExecutionStatus[] values = AuthenticationSessionModel.ExecutionStatus.values();
+ return (ordinal < 0 || ordinal >= values.length)
+ ? null
+ : values[ordinal];
+ }
+
+ public static final Externalizer<AuthenticationSessionModel.ExecutionStatus> EXECUTION_STATUS_EXT = new Externalizer<AuthenticationSessionModel.ExecutionStatus>() {
+
+ @Override
+ public void writeObject(ObjectOutput output, AuthenticationSessionModel.ExecutionStatus e) throws IOException {
+ MarshallUtil.marshallEnum(e, output);
+ }
+
+ @Override
+ public AuthenticationSessionModel.ExecutionStatus readObject(ObjectInput input) throws IOException, ClassNotFoundException {
+ return MarshallUtil.unmarshallEnum(input, ExternalizerImpl::fromOrdinal);
+ }
+ };
+
+ @Override
+ public void writeObject(ObjectOutput output, AuthenticationSessionEntity value) throws IOException {
+ output.writeByte(VERSION_1);
+
+ MarshallUtil.marshallString(value.clientUUID, output);
+
+ MarshallUtil.marshallString(value.authUserId, output);
+
+ MarshallUtil.marshallString(value.redirectUri, output);
+ MarshallUtil.marshallString(value.action, output);
+ KeycloakMarshallUtil.writeCollection(value.roles, KeycloakMarshallUtil.STRING_EXT, output);
+ KeycloakMarshallUtil.writeCollection(value.protocolMappers, KeycloakMarshallUtil.STRING_EXT, output);
+
+ KeycloakMarshallUtil.writeMap(value.executionStatus, KeycloakMarshallUtil.STRING_EXT, EXECUTION_STATUS_EXT, output);
+ MarshallUtil.marshallString(value.protocol, output);
+
+ KeycloakMarshallUtil.writeMap(value.clientNotes, KeycloakMarshallUtil.STRING_EXT, KeycloakMarshallUtil.STRING_EXT, output);
+ KeycloakMarshallUtil.writeMap(value.authNotes, KeycloakMarshallUtil.STRING_EXT, KeycloakMarshallUtil.STRING_EXT, output);
+ KeycloakMarshallUtil.writeCollection(value.requiredActions, KeycloakMarshallUtil.STRING_EXT, output);
+ KeycloakMarshallUtil.writeMap(value.userSessionNotes, KeycloakMarshallUtil.STRING_EXT, KeycloakMarshallUtil.STRING_EXT, output);
+ }
+
+ @Override
+ public AuthenticationSessionEntity readObject(ObjectInput input) throws IOException, ClassNotFoundException {
+ switch (input.readByte()) {
+ case VERSION_1:
+ return readObjectVersion1(input);
+ default:
+ throw new IOException("Unknown version");
+ }
+ }
+
+ public AuthenticationSessionEntity readObjectVersion1(ObjectInput input) throws IOException, ClassNotFoundException {
+ return new AuthenticationSessionEntity(
+ MarshallUtil.unmarshallString(input), // clientUUID
+
+ MarshallUtil.unmarshallString(input), // authUserId
+
+ MarshallUtil.unmarshallString(input), // redirectUri
+ MarshallUtil.unmarshallString(input), // action
+ KeycloakMarshallUtil.readCollection(input, KeycloakMarshallUtil.STRING_EXT, size -> new ConcurrentHashSet<>()), // roles
+ KeycloakMarshallUtil.readCollection(input, KeycloakMarshallUtil.STRING_EXT, size -> new ConcurrentHashSet<>()), // protocolMappers
+
+ KeycloakMarshallUtil.readMap(input, KeycloakMarshallUtil.STRING_EXT, EXECUTION_STATUS_EXT, size -> new ConcurrentHashMap<>(size)), // executionStatus
+ MarshallUtil.unmarshallString(input), // protocol
+
+ KeycloakMarshallUtil.readMap(input, KeycloakMarshallUtil.STRING_EXT, KeycloakMarshallUtil.STRING_EXT, size -> new ConcurrentHashMap<>(size)), // clientNotes
+ KeycloakMarshallUtil.readMap(input, KeycloakMarshallUtil.STRING_EXT, KeycloakMarshallUtil.STRING_EXT, size -> new ConcurrentHashMap<>(size)), // authNotes
+ KeycloakMarshallUtil.readCollection(input, KeycloakMarshallUtil.STRING_EXT, size -> new ConcurrentHashSet<>()), // requiredActions
+ KeycloakMarshallUtil.readMap(input, KeycloakMarshallUtil.STRING_EXT, KeycloakMarshallUtil.STRING_EXT, size -> new ConcurrentHashMap<>(size)) // userSessionNotes
+ );
+ }
+ }
}
diff --git a/model/infinispan/src/main/java/org/keycloak/models/sessions/infinispan/entities/RootAuthenticationSessionEntity.java b/model/infinispan/src/main/java/org/keycloak/models/sessions/infinispan/entities/RootAuthenticationSessionEntity.java
index 751b6f0..dd9cbcc 100644
--- a/model/infinispan/src/main/java/org/keycloak/models/sessions/infinispan/entities/RootAuthenticationSessionEntity.java
+++ b/model/infinispan/src/main/java/org/keycloak/models/sessions/infinispan/entities/RootAuthenticationSessionEntity.java
@@ -17,18 +17,36 @@
package org.keycloak.models.sessions.infinispan.entities;
+import org.keycloak.models.sessions.infinispan.util.KeycloakMarshallUtil;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
+import org.infinispan.commons.marshall.Externalizer;
+import org.infinispan.commons.marshall.MarshallUtil;
+import org.infinispan.commons.marshall.SerializeWith;
/**
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
*/
+@SerializeWith(RootAuthenticationSessionEntity.ExternalizerImpl.class)
public class RootAuthenticationSessionEntity extends SessionEntity {
private String id;
private int timestamp;
private Map<String, AuthenticationSessionEntity> authenticationSessions = new ConcurrentHashMap<>();
+ public RootAuthenticationSessionEntity() {
+ }
+
+ protected RootAuthenticationSessionEntity(String realmId, String id, int timestamp, Map<String, AuthenticationSessionEntity> authenticationSessions) {
+ super(realmId);
+ this.id = id;
+ this.timestamp = timestamp;
+ this.authenticationSessions = authenticationSessions;
+ }
+
public String getId() {
return id;
}
@@ -74,4 +92,42 @@ public class RootAuthenticationSessionEntity extends SessionEntity {
public String toString() {
return String.format("RootAuthenticationSessionEntity [ id=%s, realm=%s ]", getId(), getRealmId());
}
+
+ public static class ExternalizerImpl implements Externalizer<RootAuthenticationSessionEntity> {
+
+ private static final int VERSION_1 = 1;
+
+ @Override
+ public void writeObject(ObjectOutput output, RootAuthenticationSessionEntity value) throws IOException {
+ output.writeByte(VERSION_1);
+
+ MarshallUtil.marshallString(value.getRealmId(), output);
+
+ MarshallUtil.marshallString(value.id, output);
+ output.writeInt(value.timestamp);
+
+ KeycloakMarshallUtil.writeMap(value.authenticationSessions, KeycloakMarshallUtil.STRING_EXT, AuthenticationSessionEntity.ExternalizerImpl.INSTANCE, output);
+ }
+
+ @Override
+ public RootAuthenticationSessionEntity readObject(ObjectInput input) throws IOException, ClassNotFoundException {
+ switch (input.readByte()) {
+ case VERSION_1:
+ return readObjectVersion1(input);
+ default:
+ throw new IOException("Unknown version");
+ }
+ }
+
+ public RootAuthenticationSessionEntity readObjectVersion1(ObjectInput input) throws IOException, ClassNotFoundException {
+ return new RootAuthenticationSessionEntity(
+ MarshallUtil.unmarshallString(input), // realmId
+
+ MarshallUtil.unmarshallString(input), // id
+ input.readInt(), // timestamp
+
+ KeycloakMarshallUtil.readMap(input, KeycloakMarshallUtil.STRING_EXT, AuthenticationSessionEntity.ExternalizerImpl.INSTANCE, size -> new ConcurrentHashMap<>(size)) // authenticationSessions
+ );
+ }
+ }
}