rpt-token-portlet/src/main/java/org/gcube/portlets/admin/RPTTokenReader.java

217 lines
7.8 KiB
Java
Raw Normal View History

2021-04-08 11:05:40 +02:00
package org.gcube.portlets.admin;
import java.io.IOException;
2023-04-27 16:29:17 +02:00
import java.io.UnsupportedEncodingException;
2024-03-25 16:46:58 +01:00
import java.net.URL;
2023-04-27 16:29:17 +02:00
import java.net.URLEncoder;
2021-04-08 11:05:40 +02:00
import java.util.ArrayList;
import java.util.List;
import javax.portlet.PortletException;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
import javax.portlet.ResourceRequest;
import javax.portlet.ResourceResponse;
import javax.servlet.http.HttpServletRequest;
2024-03-05 18:04:16 +01:00
import java.util.Base64;
2021-04-08 11:05:40 +02:00
import org.gcube.common.portal.PortalContext;
2022-05-25 18:05:24 +02:00
import org.gcube.common.scope.impl.ScopeBean;
import org.gcube.common.scope.impl.ScopeBean.Type;
import org.gcube.oidc.rest.JWTToken;
import org.gcube.oidc.rest.OpenIdConnectConfiguration;
import org.gcube.oidc.rest.OpenIdConnectRESTHelper;
2024-03-25 16:46:58 +01:00
//import org.gcube.oidc.rest.OpenIdConnectRESTHelper;
2024-03-05 18:04:16 +01:00
import org.gcube.oidc.rest.OpenIdConnectRESTHelperException;
2023-04-27 16:29:17 +02:00
import org.gcube.portal.oidc.lr62.JWTCacheProxy;
import org.gcube.portal.oidc.lr62.LiferayOpenIdConnectConfiguration;
2021-04-08 11:05:40 +02:00
import org.gcube.vomanagement.usermanagement.GroupManager;
import org.gcube.vomanagement.usermanagement.impl.LiferayGroupManager;
import org.gcube.vomanagement.usermanagement.model.GCubeGroup;
2021-04-08 11:05:40 +02:00
import com.liferay.portal.kernel.json.JSONFactoryUtil;
import com.liferay.portal.kernel.json.JSONObject;
2024-03-05 18:04:16 +01:00
import com.liferay.portal.kernel.json.JSONArray;
import com.liferay.portal.kernel.log.LogFactoryUtil;
2021-04-08 11:05:40 +02:00
import com.liferay.portal.kernel.util.ParamUtil;
import com.liferay.portal.model.User;
import com.liferay.portal.util.PortalUtil;
import com.liferay.util.bridges.mvc.MVCPortlet;
/**
* Portlet implementation class RPTTokenReader
*/
public class RPTTokenReader extends MVCPortlet {
private static com.liferay.portal.kernel.log.Log log = LogFactoryUtil.getLog(RPTTokenReader.class);
2021-04-08 11:05:40 +02:00
@Override
2024-03-25 16:46:58 +01:00
public void render(RenderRequest renderRequest, RenderResponse renderResponse)
throws PortletException, IOException {
2021-04-08 11:05:40 +02:00
GroupManager gm = new LiferayGroupManager();
2024-03-25 16:46:58 +01:00
try {
2021-04-08 11:05:40 +02:00
User theUser = PortalUtil.getUser(renderRequest);
2022-05-25 18:05:24 +02:00
String currentContext = getCurrentContext(renderRequest);
ScopeBean bean = new ScopeBean(currentContext);
2021-04-08 11:05:40 +02:00
List<String> userContexts = new ArrayList<String>();
2024-03-25 16:46:58 +01:00
List<String> vreContexts = new ArrayList<String>();
2022-05-25 18:05:24 +02:00
List<GCubeGroup> userGroups = gm.listGroupsByUser(theUser.getUserId());
if (bean.is(Type.VRE)) {
userContexts.add(currentContext);
2024-03-25 16:46:58 +01:00
vreContexts.add(currentContext);
} else {
2022-05-25 18:05:24 +02:00
for (GCubeGroup g : userGroups) {
2024-03-25 16:46:58 +01:00
// skipping these sites
if (!(g.getFriendlyURL().equals("/guest") || g.getFriendlyURL().equals("/global"))) {
2022-05-25 18:05:24 +02:00
if (g.getGroupName().equals(PortalContext.getConfiguration().getInfrastructureName())) {
String context = gm.getInfrastructureScope(g.getGroupId());
userContexts.add(context);
2024-03-25 16:46:58 +01:00
if (context.split("/").length == 4){
vreContexts.add(context);
}
2022-05-25 18:05:24 +02:00
}
if (g.getParentGroupId() > 0) {
String context = gm.getInfrastructureScope(g.getGroupId());
userContexts.add(context);
2024-03-25 16:46:58 +01:00
if (context.split("/").length == 4){
vreContexts.add(context);
}
2022-05-25 18:05:24 +02:00
}
}
2021-04-08 11:05:40 +02:00
}
}
renderRequest.setAttribute("userGroups", userGroups);
renderRequest.setAttribute("userContexts", userContexts);
2024-03-25 16:46:58 +01:00
renderRequest.setAttribute("vreContexts", vreContexts);
2021-04-08 11:05:40 +02:00
} catch (Exception e) {
e.printStackTrace();
}
2024-03-25 16:46:58 +01:00
super.render(renderRequest, renderResponse);
2021-04-08 11:05:40 +02:00
}
2024-03-25 16:46:58 +01:00
public void serveResource(ResourceRequest resourceRequest, ResourceResponse resourceResponse)
throws IOException, PortletException {
2021-04-08 11:05:40 +02:00
String context = ParamUtil.getString(resourceRequest, "context", null);
2024-03-25 16:46:58 +01:00
System.out.println("Selected context=" + context);
HttpServletRequest httpReq = PortalUtil
.getOriginalServletRequest(PortalUtil.getHttpServletRequest(resourceRequest));
2021-04-08 11:05:40 +02:00
JWTToken umaToken = null;
2024-03-25 16:46:58 +01:00
JWTToken exchangedToken = null;
GroupManager gm = new LiferayGroupManager();
2024-03-05 18:04:16 +01:00
resourceResponse.setContentType("application/json");
JSONObject jsonObject = JSONFactoryUtil.createJSONObject();
2021-04-08 11:05:40 +02:00
try {
2023-04-27 16:29:17 +02:00
User theUser = PortalUtil.getUser(resourceRequest);
OpenIdConnectConfiguration configuration = LiferayOpenIdConnectConfiguration.getConfiguration(httpReq);
2024-03-25 16:46:58 +01:00
2024-03-05 18:04:16 +01:00
jsonObject.put("token_url", configuration.getTokenURL().toString());
2023-04-27 16:29:17 +02:00
JWTCacheProxy jwtCacheProxy = JWTCacheProxy.getInstance();
2024-03-25 16:46:58 +01:00
String sessionId = httpReq.getSession().getId();
2023-04-27 16:29:17 +02:00
String urlEncodedContext = null;
try {
urlEncodedContext = URLEncoder.encode(context, "UTF-8");
} catch (UnsupportedEncodingException e) {
// Almost impossible
log.error("Cannot URL encode context", e);
}
2024-03-25 16:46:58 +01:00
2023-04-27 16:29:17 +02:00
JWTToken authToken = jwtCacheProxy.getOIDCToken(theUser, sessionId);
2024-03-25 16:46:58 +01:00
umaToken = OpenIdConnectRESTHelper.queryUMAToken(configuration.getTokenURL(),
authToken.getAccessTokenAsBearer(), urlEncodedContext, null);
// URL auth_url = configuration.getTokenURL();
// log.info("auth_url " + auth_url);
// log.info("authToken " + authToken.getAccessTokenString());
// log.info("umaToken " + umaToken.getAccessTokenString());
// log.info("context " + context);
// log.info("encoded_context " + urlEncodedContext);
// log.info("client_id " + configuration.getPortalClientId());
// log.info("client_secret " + configuration.getPortalClientSecret());
exchangedToken = OpenIdConnectRESTHelperExtended.queryExchangeToken(
configuration.getTokenURL(),
umaToken.getAccessTokenString(),
urlEncodedContext,
configuration.getPortalClientId(),
configuration.getPortalClientSecret(),
null);
// log.info("exchangedToken " + exchangedToken.getAccessTokenString());
// log.debug("Got a new UMA token " + exchangedToken.getTokenEssentials());
2024-03-05 18:04:16 +01:00
} catch (OpenIdConnectRESTHelperException e) {
resourceResponse.setProperty(ResourceResponse.HTTP_STATUS_CODE, "" + e.getStatus());
2024-03-25 16:46:58 +01:00
2024-03-05 18:04:16 +01:00
e.printStackTrace();
jsonObject.put("success", false);
jsonObject.put("comment", e.getMessage());
2024-03-25 16:46:58 +01:00
resourceResponse.getWriter().println(jsonObject);
2024-03-05 18:04:16 +01:00
super.serveResource(resourceRequest, resourceResponse);
return;
2021-04-08 11:05:40 +02:00
} catch (Exception e) {
e.printStackTrace();
jsonObject.put("success", false);
jsonObject.put("comment", e.getMessage());
2024-03-25 16:46:58 +01:00
resourceResponse.getWriter().println(jsonObject);
2021-04-08 11:05:40 +02:00
super.serveResource(resourceRequest, resourceResponse);
2024-03-05 18:04:16 +01:00
return;
2021-04-08 11:05:40 +02:00
}
2024-03-05 18:04:16 +01:00
// } catch (Exception e) {
2024-03-25 16:46:58 +01:00
// e.printStackTrace();
// JSONObject jsonObject = JSONFactoryUtil.createJSONObject();
// jsonObject.put("success", false);
// jsonObject.put("comment", e.getMessage());
// resourceResponse.getWriter().println(jsonObject);
// super.serveResource(resourceRequest, resourceResponse);
// }
2024-03-05 18:04:16 +01:00
2021-04-08 11:05:40 +02:00
jsonObject.put("success", true);
2024-03-25 16:46:58 +01:00
jsonObject.put("access_token", exchangedToken.getAccessTokenString());
jsonObject.put("refresh_token", exchangedToken.getRefreshTokenString());
2024-03-05 18:04:16 +01:00
2024-03-25 16:46:58 +01:00
jsonObject.put("raw_token", exchangedToken.getRaw());
jsonObject.put("access_token_exp", exchangedToken.getExp());
jsonObject.put("essential", exchangedToken.getTokenEssentials());
2024-03-05 18:04:16 +01:00
jsonObject.put("client_id", umaToken.getAzp());
2024-03-25 16:46:58 +01:00
JSONArray audiences = JSONFactoryUtil.createJSONArray();
List<String> list_audiences = exchangedToken.getAud();
2024-03-05 18:04:16 +01:00
for (int i = 0; i < list_audiences.size(); i++) {
audiences.put((String) list_audiences.get(i));
}
jsonObject.put("audience", audiences);
2024-03-25 16:46:58 +01:00
resourceResponse.getWriter().println(jsonObject);
2021-04-08 11:05:40 +02:00
super.serveResource(resourceRequest, resourceResponse);
}
2022-05-25 18:05:24 +02:00
private String getCurrentContext(RenderRequest request) {
long groupId = -1;
try {
groupId = PortalUtil.getScopeGroupId(request);
return getCurrentContext(groupId);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
2024-03-25 16:46:58 +01:00
private String getCurrentContext(long groupId) {
2022-05-25 18:05:24 +02:00
try {
2024-03-25 16:46:58 +01:00
PortalContext pContext = PortalContext.getConfiguration();
return pContext.getCurrentScope("" + groupId);
2022-05-25 18:05:24 +02:00
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
2021-04-08 11:05:40 +02:00
}