blob: 10b60ee2eba25cf7925f3d66b4e74f241adcb561 [file] [log] [blame]
package de.ids_mannheim.korap.security.context;
import java.io.Serializable;
import java.time.ZonedDateTime;
import java.util.HashMap;
import java.util.Map;
import com.fasterxml.jackson.databind.JsonNode;
import de.ids_mannheim.korap.config.Attributes;
import de.ids_mannheim.korap.constant.TokenType;
import de.ids_mannheim.korap.exceptions.KustvaktException;
import de.ids_mannheim.korap.user.User;
import de.ids_mannheim.korap.utils.JsonUtils;
import de.ids_mannheim.korap.utils.TimeUtils;
import lombok.AccessLevel;
import lombok.Data;
import lombok.Setter;
/**
* EM:
* - change datatype of tokenType from string to enum
* - added authenticationTime
*
* @author hanl
* @date 27/01/2014
*/
@Data
public class TokenContext implements java.security.Principal, Serializable {
private ZonedDateTime authenticationTime;
/**
* session relevant data. Are never persisted into a database
*/
private String username;
private long expirationTime;
// either "session_token " / "api_token
private TokenType tokenType;
private String token;
private boolean secureRequired;
// @Getter(AccessLevel.PRIVATE)
@Setter(AccessLevel.PRIVATE)
private Map<String, Object> parameters;
private String hostAddress;
private String userAgent;
public TokenContext () {
this.parameters = new HashMap<>();
this.setUsername("");
this.setToken("");
this.setSecureRequired(false);
this.setExpirationTime(-1);
}
private Map statusMap () {
Map m = new HashMap();
if (username != null && !username.isEmpty())
m.put(Attributes.USERNAME, username);
m.put(Attributes.TOKEN_EXPIRATION,
TimeUtils.format(this.expirationTime));
m.put(Attributes.TOKEN, this.token);
m.put(Attributes.TOKEN_TYPE, this.tokenType);
return m;
}
public Map<String, Object> params () {
return new HashMap<>(parameters);
}
public boolean match (TokenContext other) {
if (other.getToken().equals(this.token))
if (this.getHostAddress().equals(this.hostAddress))
// user agent should be irrelvant -- what about os
// system version?
// if (other.getUserAgent().equals(this.userAgent))
return true;
return false;
}
public void addContextParameter (String key, String value) {
this.parameters.put(key, value);
}
public void addParams (Map<String, Object> map) {
for (Map.Entry<String, Object> e : map.entrySet())
this.parameters.put(e.getKey(), String.valueOf(e.getValue()));
}
public void removeContextParameter (String key) {
this.parameters.remove(key);
}
public void setExpirationTime (long date) {
this.expirationTime = date;
}
// todo: complete
public static TokenContext fromJSON (String s) throws KustvaktException {
JsonNode node = JsonUtils.readTree(s);
TokenContext c = new TokenContext();
if (node != null) {
c.setUsername(node.path(Attributes.USERNAME).asText());
c.setToken(node.path(Attributes.TOKEN).asText());
}
return c;
}
public static TokenContext fromOAuth2 (String s) throws KustvaktException {
JsonNode node = JsonUtils.readTree(s);
TokenContext c = new TokenContext();
if (node != null) {
c.setToken(node.path("token").asText());
c.setTokenType(TokenType.valueOf(node.path("token_type").asText()));
c.setExpirationTime(node.path("expires_in").asLong());
c.addContextParameter("refresh_token",
node.path("refresh_token").asText());
}
return c;
}
public boolean isValid () {
return (this.username != null && !this.username.isEmpty())
&& (this.token != null && !this.token.isEmpty())
&& (this.tokenType != null);
}
public String getToken () {
return token;
}
public String toJson () throws KustvaktException {
return JsonUtils.toJSON(this.statusMap());
}
public boolean isDemo () {
return User.UserFactory.isDemo(this.username);
}
@Override
public String getName () {
return this.getUsername();
}
public ZonedDateTime getAuthenticationTime () {
return authenticationTime;
}
public void setAuthenticationTime (ZonedDateTime authTime) {
this.authenticationTime = authTime;
}
}