diff --git a/pom.xml b/pom.xml index 0914765..61da039 100644 --- a/pom.xml +++ b/pom.xml @@ -42,7 +42,7 @@ org.gcube.distribution maven-portal-bom - 3.6.0 + 3.6.1 pom import @@ -88,6 +88,13 @@ [1.0.0, 2.0.0-SNAPSHOT) + + org.gcube.portal + oidc-library-portal + [1.0.0, 2.0.0-SNAPSHOT) + provided + + diff --git a/src/main/java/org/gcube/portlets/widgets/wsthreddssync/server/BeanConverter.java b/src/main/java/org/gcube/portlets/widgets/wsthreddssync/server/BeanConverter.java index 5fa7a67..3593a6f 100644 --- a/src/main/java/org/gcube/portlets/widgets/wsthreddssync/server/BeanConverter.java +++ b/src/main/java/org/gcube/portlets/widgets/wsthreddssync/server/BeanConverter.java @@ -14,6 +14,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +// TODO: Auto-generated Javadoc /** * The Class BeanConverter. * @@ -36,7 +37,7 @@ public class BeanConverter { public static WsThreddsSynchFolderDescriptor toWsThreddsFolderConfig(ThSyncFolderDescriptor t, Sync_Status theStatus) { - if (t == null) + if (t == null || t.getConfiguration()==null) return null; WsThreddsSynchFolderDescriptor ws = new WsThreddsSynchFolderDescriptor(); @@ -45,16 +46,16 @@ public class BeanConverter { // FROM TARGET TOKEN TO SCOPE // t.getConfiguration().getTargetToken() + + String targetContext = t.getConfiguration().getTargetContext(); - if (t.getConfiguration().getTargetToken() != null) { + if (targetContext != null) { try { - AuthorizationEntry entry = authorizationService().get(t.getConfiguration().getTargetToken()); - String scope = entry.getContext(); - GcubeScope selectedScope = new GcubeScope(toScopeTitle(scope), scope, toGcubeScope(scope)); + GcubeScope selectedScope = new GcubeScope(toScopeTitle(targetContext), targetContext, toGcubeScope(targetContext)); ws.setSelectedScope(selectedScope); - logger.debug("Resolved SCOPE: " + selectedScope + " from token"); + logger.debug("Got target SCOPE: " + selectedScope + " from configuration"); } catch (Exception e) { - logger.error("I cannot resolve the scope for the token: "+t.getConfiguration().getTargetToken()); + logger.error("I cannot read the scope for: "+targetContext); } } @@ -104,16 +105,17 @@ public class BeanConverter { } } + /** * To th synch folder configuration. * - * @param t the t - * @param rootFolderId the root folder id - * @param targetScopeUserToken the target scope user token + * @param t the t + * @param rootFolderId the root folder id + * @param targetContext the target context * @return the th synch folder configuration */ public static ThSynchFolderConfiguration toThSynchFolderConfiguration(WsThreddsSynchFolderConfiguration t, - String rootFolderId, String targetScopeUserToken) { + String rootFolderId, String targetContext) { if (t == null) return null; @@ -121,7 +123,7 @@ public class BeanConverter { ThSynchFolderConfiguration ts = new ThSynchFolderConfiguration(); ts.setFilter(t.getFilter()); ts.setRemotePath(t.getRemotePath()); - ts.setTargetToken(targetScopeUserToken); + ts.setTargetContext(targetContext); ts.setToCreateCatalogName(t.getCatalogName()); ts.setRootFolderId(rootFolderId); return ts; diff --git a/src/main/java/org/gcube/portlets/widgets/wsthreddssync/server/SyncronizeWithThredds.java b/src/main/java/org/gcube/portlets/widgets/wsthreddssync/server/SyncronizeWithThredds.java index c6bd2be..5ca8e2c 100644 --- a/src/main/java/org/gcube/portlets/widgets/wsthreddssync/server/SyncronizeWithThredds.java +++ b/src/main/java/org/gcube/portlets/widgets/wsthreddssync/server/SyncronizeWithThredds.java @@ -5,8 +5,14 @@ package org.gcube.portlets.widgets.wsthreddssync.server; import java.util.List; +import javax.servlet.http.HttpServletRequest; + import org.gcube.common.authorization.library.provider.SecurityTokenProvider; +import org.gcube.common.authorization.library.provider.UmaJWTProvider; +import org.gcube.common.portal.PortalContext; import org.gcube.common.scope.api.ScopeProvider; +import org.gcube.oidc.rest.JWTToken; +import org.gcube.portal.oidc.lr62.OIDCUmaUtil; import org.gcube.portal.wssynclibrary.shared.ItemNotSynched; import org.gcube.portal.wssynclibrary.shared.WorkspaceFolderLocked; import org.gcube.portal.wssynclibrary.shared.thredds.Sync_Status; @@ -15,9 +21,11 @@ import org.gcube.portal.wssynclibrary.shared.thredds.ThSyncFolderDescriptor; import org.gcube.portal.wssynclibrary.shared.thredds.ThSyncStatus; import org.gcube.portal.wssynclibrary.shared.thredds.ThSynchFolderConfiguration; import org.gcube.portal.wssynclibrary.thredds.WorkspaceThreddsSynchronize; +import org.gcube.vomanagement.usermanagement.model.GCubeUser; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +// TODO: Auto-generated Javadoc /** * The Class SyncronizeWithThredds. * @@ -61,6 +69,54 @@ public class SyncronizeWithThredds { SecurityTokenProvider.instance.set(userToken); } + + /** + * Change context for UMA. + * + * @param httpRequest the http request + * @param user the user + * @param targetScope the target scope + * @return the string representing the previous UMA Token read from {@link UmaJWTProvider#get()} + */ + private String changeContextForUMA(HttpServletRequest httpRequest, GCubeUser user, String targetScope) { + logger.debug("Setting UMA context with target scope: "+targetScope +", user: "+user.getUsername()); + String previousUMAToken = null; + try { + previousUMAToken=UmaJWTProvider.instance.get(); + JWTToken umaToken = OIDCUmaUtil.getUMAToken(httpRequest, user.getUsername(), targetScope); + setContextForUMA(umaToken.getRaw()); + }catch (Exception e) { + logger.warn("Error on set context for UMA: ",e); + if(previousUMAToken!=null) { + logger.info("Setting previous UMA Token: "+previousUMAToken.substring(0,10)+"-MASKED-TOKEN"); + setContextForUMA(previousUMAToken); + } + } + + return previousUMAToken; + } + + /** + * Reset context for UMA. + * + * @param umaToken the uma token + * @return the string + */ + private void setContextForUMA(String umaToken) { + logger.info("called set context for UMA"); + + if(umaToken==null || umaToken.isEmpty()) { + logger.info("Uma Token is null or empty, skipping operation"); + return; + } + + logger.info("Going to set UMA Token: "+umaToken.substring(0,10)+"-MASKED-TOKEN"); + UmaJWTProvider.instance.set(umaToken); + logger.debug("UmaJWTProvider instance set performed to : "+umaToken.substring(0,10)+"-MASKED-TOKEN"); + + } + + /** * Do sync folder. @@ -225,19 +281,57 @@ public class SyncronizeWithThredds { } - /** - * Gets the available catalogues by token. + * Gets the available catalogues. * - * @param scope the scope - * @param userToken the user token - * @param targetToken the target token - * @return the available catalogues by token + * @param httpRequest the http request + * @param user the user + * @param targetScope the target scope + * @return the available catalogues * @throws Exception the exception */ - public List getAvailableCataloguesByToken(String scope, String userToken, String targetToken) throws Exception { - setContextParameters(scope, userToken); - return workspaceThreddsSynchronize.getAvailableCataloguesByToken(targetToken); + public List getAvailableCatalogues(HttpServletRequest httpRequest, GCubeUser user, + String targetScope) throws Exception { + String originalScope = null; + String originalToken = null; + String previousUmaToken = null; + List listCatalogues = null; + try { + // context switch for Uma token + previousUmaToken = changeContextForUMA(httpRequest, user, targetScope); + + // context switch for gcube-token and scope + PortalContext pConfig = PortalContext.getConfiguration(); + String wsScope = pConfig.getCurrentScope(httpRequest); + String wsUserToken = pConfig.getCurrentUserToken(wsScope, user.getUsername()); + // Thread Local contexts + originalScope = wsScope; + originalToken = wsUserToken; + // getting token into target scope + String targetScopeUserToken = PortalContext.getConfiguration().getCurrentUserToken(targetScope, + user.getUsername()); + setContextParameters(targetScope, targetScopeUserToken); + + // calling the engine + listCatalogues = workspaceThreddsSynchronize.getAvailableCatalogues(); + } catch (Exception e) { + logger.error("Error on getting available Catalogues in the scope: " + targetScope, e); + } finally { + + // resetting UMA token in the WS scope + setContextForUMA(previousUmaToken); + + if (originalScope != null && originalScope.compareTo(targetScope) != 0) { + logger.info("Resetting the scope: " + originalScope + " which was original WS context"); + ScopeProvider.instance.set(originalScope); + if (originalToken != null) { + logger.info("Resetting the user token: " + originalToken.substring(0, 10) + + "-MASKED-TOKEN which was original WS context"); + SecurityTokenProvider.instance.set(originalToken); + } + } + } + return listCatalogues; } } diff --git a/src/main/java/org/gcube/portlets/widgets/wsthreddssync/server/ThreddsWorkspaceSyncServiceImpl.java b/src/main/java/org/gcube/portlets/widgets/wsthreddssync/server/ThreddsWorkspaceSyncServiceImpl.java index 373e869..9125512 100644 --- a/src/main/java/org/gcube/portlets/widgets/wsthreddssync/server/ThreddsWorkspaceSyncServiceImpl.java +++ b/src/main/java/org/gcube/portlets/widgets/wsthreddssync/server/ThreddsWorkspaceSyncServiceImpl.java @@ -82,6 +82,40 @@ public class ThreddsWorkspaceSyncServiceImpl extends RemoteServiceServlet implem return false; } } + + //MOVED + + /** + * Gets the available THREDDS catalogues for target scope. + * + * @param targetFullScope the target scope + * @return the available catalogues for scope + * @throws Exception the exception + */ + @Override + public List getAvailableCataloguesForScope(String targetFullScope) throws Exception { + + if(targetFullScope==null) + throw new Exception("Invalid scope null"); + + List listCtlgs = null; + try { + GCubeUser user = PortalContext.getConfiguration().getCurrentUser(this.getThreadLocalRequest()); + listCtlgs = getSyncService().getAvailableCatalogues(this.getThreadLocalRequest(), user, targetFullScope); + + logger.debug("Retuning "+listCtlgs.size()+" Catalogues for scope: "+targetFullScope); + if(logger.isDebugEnabled()){ + for (ThCatalogueBean thCatalogueBean : listCtlgs) { + logger.debug(thCatalogueBean.toString()); + } + } + }catch (Exception e) { + logger.error("Error on checking available Catalogue in the scope: "+targetFullScope, e); + } + + return listCtlgs; + } + @@ -102,12 +136,11 @@ public class ThreddsWorkspaceSyncServiceImpl extends RemoteServiceServlet implem try { GCubeUser user = PortalContext.getConfiguration().getCurrentUser(this.getThreadLocalRequest()); - String targetScopeUserToken = null; ThSynchFolderConfiguration config = null; - if(clientConfig!=null) { - targetScopeUserToken = PortalContext.getConfiguration().getCurrentUserToken(clientConfig.getSelectedScope().getScopeName(), user.getUsername()); - config = BeanConverter.toThSynchFolderConfiguration(clientConfig, folderId, targetScopeUserToken); - logger.debug("Creating server config "+config); + if (clientConfig != null && clientConfig.getSelectedScope() != null) { + config = BeanConverter.toThSynchFolderConfiguration(clientConfig, folderId, + clientConfig.getSelectedScope().getScopeName()); + logger.debug("Creating server config " + config); } logger.info("Calling doSyncFolder on folderId: "+folderId +", config: "+config); @@ -125,58 +158,6 @@ public class ThreddsWorkspaceSyncServiceImpl extends RemoteServiceServlet implem } - - /** - * Gets the available THREDDS catalogues for target scope. - * - * @param targetFullScope the target scope - * @return the available catalogues for scope - * @throws Exception the exception - */ - @Override - public List getAvailableCataloguesForScope(String targetFullScope) throws Exception { - - if(targetFullScope==null) - throw new Exception("Invalid scope null"); - - String originalScope = null; - String originalToken = null; - List listCtlgs = null; - try { - GCubeUser user = PortalContext.getConfiguration().getCurrentUser(this.getThreadLocalRequest()); - String wsScope = PortalContext.getConfiguration().getCurrentScope(this.getThreadLocalRequest()); - String wsUserToken = PortalContext.getConfiguration().getCurrentUserToken(wsScope, user.getUsername()); - //Thread Local contexts - originalScope = wsScope; - originalToken = wsUserToken; - - String targetScopeUserToken = PortalContext.getConfiguration().getCurrentUserToken(targetFullScope, user.getUsername()); - listCtlgs = getSyncService().getAvailableCataloguesByToken(targetFullScope, wsUserToken, targetScopeUserToken); - - logger.debug("Retuning "+listCtlgs.size()+" Catalogues for scope: "+targetFullScope); - if(logger.isDebugEnabled()){ - for (ThCatalogueBean thCatalogueBean : listCtlgs) { - logger.debug(thCatalogueBean.toString()); - } - } - }catch (Exception e) { - logger.error("Error on checking available Catalogue in the scope: "+targetFullScope, e); - }finally { - - if(originalScope!=null && originalScope.compareTo(targetFullScope)!=0) { - logger.info("Resetting the scope: "+originalScope + " which was original WS context"); - ScopeProvider.instance.set(originalScope); - if(originalToken!=null) { - logger.info("Resetting the user token: "+originalToken.substring(0,10)+"-MASKED-TOKEN which was original WS context"); - SecurityTokenProvider.instance.set(originalToken); - } - - } - } - - return listCtlgs; - } - /** * Gets the list of Scopes (Root-VO, VOs and VREs) for user and the Thredds roles that user has in them.