81 lines
3.5 KiB
Java
81 lines
3.5 KiB
Java
package org.gcube.portal.oidc.lr62;
|
|
|
|
import java.io.IOException;
|
|
import java.net.URLDecoder;
|
|
|
|
import javax.servlet.http.HttpServletRequest;
|
|
import javax.servlet.http.HttpServletResponse;
|
|
import javax.servlet.http.HttpSession;
|
|
|
|
import org.gcube.common.portal.PortalContext;
|
|
import org.gcube.oidc.rest.JWTToken;
|
|
|
|
import com.liferay.portal.kernel.events.Action;
|
|
import com.liferay.portal.kernel.events.ActionException;
|
|
import com.liferay.portal.kernel.log.Log;
|
|
import com.liferay.portal.kernel.log.LogFactoryUtil;
|
|
import com.liferay.portal.kernel.util.WebKeys;
|
|
import com.liferay.portal.model.User;
|
|
|
|
public class PostLoginAction extends Action {
|
|
|
|
protected static final Log log = LogFactoryUtil.getLog(PostLoginAction.class);
|
|
|
|
public static boolean REQUEST_UMA_ALSO_WITH_REDIRECT = true;
|
|
|
|
@Override
|
|
public void run(HttpServletRequest request, HttpServletResponse response) throws ActionException {
|
|
if (log.isInfoEnabled()) {
|
|
log.info("PostLoginAction invoked");
|
|
}
|
|
JWTToken token = JWTTokenUtil.getOIDCFromRequest(request);
|
|
HttpSession session = request.getSession(false);
|
|
String redirect = (String) request.getAttribute(OpenIdConnectLoginFilter.REDIRECT_ATTRIBUTE);;
|
|
if (token != null && session != null) {
|
|
User user = (User) session.getAttribute(WebKeys.USER);
|
|
if (user != null) {
|
|
log.info("Setting OIDC token in proxy for user " + user.getScreenName() + " and session "
|
|
+ session.getId());
|
|
|
|
JWTCacheProxy.getInstance().setOIDCToken(user, session.getId(), token);
|
|
} else {
|
|
log.error("User object not found in session " + session.getId() + " ["
|
|
+ Integer.toHexString(session.hashCode()) + "]");
|
|
}
|
|
if (redirect == null || REQUEST_UMA_ALSO_WITH_REDIRECT) {
|
|
if (log.isDebugEnabled()) {
|
|
log.debug("Getting current infrastructure context via portal context class");
|
|
}
|
|
String currentContext = "/" + PortalContext.getConfiguration().getInfrastructureName();
|
|
OIDCUmaUtil.checkUMATicketAndProvideInThreadLocal(request, response, user, session, currentContext);
|
|
} else if (log.isDebugEnabled()) {
|
|
log.debug("UMA token will be set by the valve after the redirection to: " + redirect);
|
|
}
|
|
} else {
|
|
if (token == null) {
|
|
log.error("OIDC token object is null in request");
|
|
}
|
|
if (session == null) {
|
|
log.error("Session is null");
|
|
}
|
|
}
|
|
|
|
if (redirect != null) {
|
|
if (log.isDebugEnabled()) {
|
|
log.debug("Redirecting to the original requested URI: " + redirect);
|
|
}
|
|
try {
|
|
// I'm not sure I can use this LR facility since it's used also by landing-page-hook.
|
|
// Indeed perhaps it should also be discussed if it takes precedence over this redirect in the case.
|
|
// session.setAttribute(WebKeys.LAST_PATH, new LastPath(null, URLDecoder.decode(redirect, "UTF-8"))
|
|
response.sendRedirect(URLDecoder.decode(redirect, "UTF-8"));
|
|
} catch (IOException e) {
|
|
new ActionException("Redirecting to original requested URI: " + redirect, e);
|
|
}
|
|
} else if (log.isDebugEnabled()) {
|
|
log.debug("No original requested URI has been found in session");
|
|
}
|
|
}
|
|
|
|
}
|