package org.pac4j.vertx.handler.impl;
import io.vertx.core.Handler;
import io.vertx.core.Vertx;
import io.vertx.ext.web.RoutingContext;
import org.pac4j.core.config.Config;
import org.pac4j.core.context.session.SessionStore;
import org.pac4j.core.engine.DefaultLogoutLogic;
import org.pac4j.core.engine.LogoutLogic;
import org.pac4j.core.exception.TechnicalException;
import org.pac4j.core.http.HttpActionAdapter;
import org.pac4j.vertx.VertxProfileManager;
import org.pac4j.vertx.VertxWebContext;
import org.pac4j.vertx.http.DefaultHttpActionAdapter;
import static org.pac4j.core.util.CommonHelper.assertNotNull;
/**
* Implementation of a handler for handling pac4j user logout
* @author Jeremy Prime
* @since 2.0.0
*/
public class LogoutHandler implements Handler<RoutingContext> {
protected final String defaultUrl;
protected final String logoutUrlPattern;
protected final Config config;
private final LogoutLogic<Void, VertxWebContext> logoutLogic;
private final Vertx vertx;
private final SessionStore<VertxWebContext> sessionStore;
private final boolean localLogout;
private final boolean destroySession;
private final boolean centralLogout;
protected HttpActionAdapter<Void, VertxWebContext> httpActionAdapter = new DefaultHttpActionAdapter();
/**
* Construct based on the option values provided
*
* @param options - the options to configure this handler
*/
public LogoutHandler(final Vertx vertx,
final SessionStore<VertxWebContext> sessionStore ,
final LogoutHandlerOptions options, final Config config) {
final DefaultLogoutLogic<Void, VertxWebContext> defaultApplicationLogoutLogic =
new DefaultLogoutLogic<>();
defaultApplicationLogoutLogic.setProfileManagerFactory(VertxProfileManager::new);
logoutLogic = defaultApplicationLogoutLogic;
this.defaultUrl = options.getDefaultUrl();
this.logoutUrlPattern = options.getLogoutUrlPattern();
this.config = config;
this.vertx = vertx;
this.sessionStore = sessionStore;
this.localLogout = options.isLocalLogout();
this.destroySession = options.isDestroySession();
this.centralLogout = options.isCentralLogout();
}
@Override
public void handle(final RoutingContext routingContext) {
assertNotNull("applicationLogoutLogic", logoutLogic);
assertNotNull("config", config);
final VertxWebContext webContext = new VertxWebContext(routingContext, sessionStore);
vertx.executeBlocking(future -> {
logoutLogic.perform(webContext, config, httpActionAdapter, defaultUrl, logoutUrlPattern, localLogout,
destroySession, centralLogout);
future.complete(null);
},
false,
asyncResult -> {
// If we succeeded we're all good here, the job is done either through approving, or redirect, or
// forbidding
// However, if an error occurred we need to handle this here
if (asyncResult.failed()) {
routingContext.fail(new TechnicalException(asyncResult.cause()));
}
});
}
}