blob: c0eb9cd10b77f41f8af8c6dd121ffa79cbaad770 [file] [log] [blame]
package de.ids_mannheim.korap.authentication;
import de.ids_mannheim.korap.config.KustvaktConfiguration;
import de.ids_mannheim.korap.exceptions.KustvaktException;
import de.ids_mannheim.korap.exceptions.StatusCodes;
import de.ids_mannheim.korap.interfaces.AuthenticationIface;
import de.ids_mannheim.korap.interfaces.EncryptionIface;
import de.ids_mannheim.korap.config.Attributes;
import de.ids_mannheim.korap.config.AuthenticationType;
import de.ids_mannheim.korap.user.TokenContext;
import de.ids_mannheim.korap.user.User;
import de.ids_mannheim.korap.utils.TimeUtils;
import org.joda.time.DateTime;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Map;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
* implementation of the AuthenticationIface to handle korap
* authentication
* internals
*
* @author hanl
*/
public class SessionAuthentication implements AuthenticationIface {
private static final Logger jlog = LoggerFactory
.getLogger(SessionAuthentication.class);
public static SessionFactory sessions;
private ScheduledThreadPoolExecutor scheduled;
private EncryptionIface crypto;
private KustvaktConfiguration config;
public SessionAuthentication (KustvaktConfiguration config,
EncryptionIface crypto) {
jlog.info("initialize session authentication handler");
this.crypto = crypto;
this.config = config;
this.scheduled = new ScheduledThreadPoolExecutor(1);
this.sessions = new SessionFactory(this.config.isAllowMultiLogIn(),
this.config.getInactiveTime());
this.scheduled.scheduleAtFixedRate(this.sessions,
this.config.getInactiveTime() / 2,
this.config.getInactiveTime(), TimeUnit.SECONDS);
}
@Override
public TokenContext getTokenContext(String authenticationToken)
throws KustvaktException {
jlog.debug("retrieving user session for user '{}'", authenticationToken);
return this.sessions.getSession(authenticationToken);
}
@Override
public TokenContext createTokenContext(User user, Map<String, Object> attr)
throws KustvaktException {
DateTime now = TimeUtils.getNow();
DateTime ex = TimeUtils.getExpiration(now.getMillis(),
config.getShortTokenTTL());
String token = crypto.createToken(true, user.getUsername(),
now.getMillis());
TokenContext ctx = new TokenContext();
ctx.setUsername(user.getUsername());
ctx.setAuthenticationType(AuthenticationType.SESSION);
ctx.setToken(token);
ctx.setExpirationTime(ex.getMillis()+(1000));
ctx.setHostAddress(attr.get(Attributes.HOST).toString());
ctx.setUserAgent(attr.get(Attributes.USER_AGENT).toString());
jlog.debug(ctx.toJson());
this.sessions.putSession(token, ctx);
jlog.debug("session " +sessions.getSession(token).toString());
jlog.info("create session for user: " + user.getUsername());
return ctx;
}
@Override
public void removeUserSession (String token) {
this.sessions.removeSession(token);
}
@Override
public TokenContext refresh (TokenContext context) throws KustvaktException {
throw new UnsupportedOperationException("method not supported");
}
@Override
public AuthenticationType getIdentifier () {
return AuthenticationType.OPENID;
}
}