diff --git a/CHANGELOG.md b/CHANGELOG.md index d736f2d..0b74765 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [v1.3.0-SNAPSHOT] - 2021-03-03 + +[#20847] Support the roles of THREDDS Admin and THREDDS Publisher + ## [v1.2.0] - 2020-07-21 [#19676] Migrated to git/jenkins diff --git a/pom.xml b/pom.xml index eeac454..9556869 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,7 @@ org.gcube.portlets.widgets ws-thredds-sync-widget jar - 1.2.0 + 1.3.0-SNAPSHOT ws-thredds-sync-widget gCube ws-thredds-sync-widget is a widget to use and interact with ws-thredds facility in order to syncronize the Workspace folders with Thredds Reporitory folders diff --git a/src/main/java/org/gcube/portlets/widgets/wsthreddssync/client/WsThreddsWidget.java b/src/main/java/org/gcube/portlets/widgets/wsthreddssync/client/WsThreddsWidget.java index 3ce54c1..9347724 100644 --- a/src/main/java/org/gcube/portlets/widgets/wsthreddssync/client/WsThreddsWidget.java +++ b/src/main/java/org/gcube/portlets/widgets/wsthreddssync/client/WsThreddsWidget.java @@ -50,6 +50,10 @@ public class WsThreddsWidget implements HasWsSyncNotificationListner { private WsThreddsWidgetViewManager viewManager = new WsThreddsWidgetViewManager(); private final List syncEventsListeners = new ArrayList(); + + public static final String MISSING_THREDDS_ADMIN_RIGHTS = "It seems you are not authorized to create a configuration with Thredds Catalogue. Request it to the VRE manager or the portal administrator."; + + public static final String MISSING_THREDDS_PUBLISHER_RIGHTS = "It seems you are not authorized to run a syncronization task with Thredds Catalogue. Request it to the VRE manager or the portal administrator."; /** * This is the entry point method. diff --git a/src/main/java/org/gcube/portlets/widgets/wsthreddssync/server/GenericUtils.java b/src/main/java/org/gcube/portlets/widgets/wsthreddssync/server/GenericUtils.java new file mode 100644 index 0000000..380b54d --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/wsthreddssync/server/GenericUtils.java @@ -0,0 +1,46 @@ +package org.gcube.portlets.widgets.wsthreddssync.server; + +import java.net.MalformedURLException; +import java.net.URL; + +import javax.servlet.http.HttpServletRequest; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +/** + * The Class GenericUtils. + * + * @author Francesco Mangiacrapa at ISTI-CNR (francesco.mangiacrapa@isti.cnr.it) + * + * Mar 3, 2021 + */ +public class GenericUtils { + + public static Logger LOG = LoggerFactory.getLogger(GenericUtils.class); + + /** + * Gets the gateway client hostname. + * + * @param httpServletRequest the http servlet request + * @return the gateway client hostname + */ + public static String getGatewayClientHostname(HttpServletRequest httpServletRequest) { + try { + String clientURL = httpServletRequest.getRequestURL().toString(); + URL gURL = new URL(clientURL); + StringBuilder theURL = new StringBuilder(); +// theURL.append(gURL.getProtocol()); +// theURL.append("://"); + theURL.append(gURL.getHost()); + return theURL.toString(); + } catch (MalformedURLException e) { + LOG.warn("Failed to determine the gateway from the client url: "+httpServletRequest.getRequestURL()); + return null; + } + } + + + +} 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 580de0a..ee5255f 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 @@ -3,6 +3,7 @@ package org.gcube.portlets.widgets.wsthreddssync.server; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Set; import org.gcube.common.portal.PortalContext; import org.gcube.portal.wssynclibrary.shared.ItemNotSynched; @@ -12,7 +13,9 @@ import org.gcube.portal.wssynclibrary.shared.thredds.ThCatalogueBean; 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.portlets.widgets.ckandatapublisherwidget.server.utils.GenericUtils; import org.gcube.portlets.widgets.wsthreddssync.client.rpc.ThreddsWorkspaceSyncService; +import org.gcube.portlets.widgets.wsthreddssync.shared.GatewayRolesThredds; import org.gcube.portlets.widgets.wsthreddssync.shared.GcubeScope; import org.gcube.portlets.widgets.wsthreddssync.shared.GcubeScopeType; import org.gcube.portlets.widgets.wsthreddssync.shared.WsThreddsSynchFolderConfiguration; @@ -156,7 +159,7 @@ public class ThreddsWorkspaceSyncServiceImpl extends RemoteServiceServlet implem */ @Override public List getListOfScopesForLoggedUser() throws Exception{ - logger.debug("getListOfVREsForLoggedUser...: "); + logger.info("getListOfVREsForLoggedUser...: "); GCubeUser user = PortalContext.getConfiguration().getCurrentUser(this.getThreadLocalRequest()); long userId = user.getUserId(); @@ -176,7 +179,13 @@ public class ThreddsWorkspaceSyncServiceImpl extends RemoteServiceServlet implem try { - List listOfGroups = groupManager.listGroupsByUser(userId); + String gatewayHostname = GenericUtils.getGatewayClientHostname(getThreadLocalRequest()); + //list of Scopes filtered for gateway + Set filteredGroupsForGatw = groupManager.listGroupsByUserAndSite(userId, gatewayHostname); + + //List listOfGroups = groupManager.listGroupsByUser(userId); + List listOfGroups = new ArrayList(filteredGroupsForGatw); + logger.info("list of VREs in the gateway "+gatewayHostname+" are "+listOfGroups.size()); for (GCubeGroup gCubeGroup : listOfGroups) { GcubeScopeType scopeType=null; if(groupManager.isVRE(gCubeGroup.getGroupId())){ @@ -189,16 +198,39 @@ public class ThreddsWorkspaceSyncServiceImpl extends RemoteServiceServlet implem // } if(scopeType!=null){ - GcubeScope gcubeVRE = new GcubeScope(gCubeGroup.getGroupName(), groupManager.getInfrastructureScope(gCubeGroup.getGroupId()), scopeType); - listOfScopes.add(gcubeVRE); + List roles = WsUtil.getThreddsRoleFor(user, gCubeGroup); + //Adding only the scope where the user has the (GatewayRolesThredds.THREDDS_ADMIN role + /*if(roles!=null && roles.size()>0 && roles.contains(GatewayRolesThredds.THREDDS_ADMIN)) { + GcubeScope gcubeScope = new GcubeScope(gCubeGroup.getGroupName(), groupManager.getInfrastructureScope(gCubeGroup.getGroupId()), scopeType); + listOfScopes.add(gcubeScope); + }*/ + + //Adding only the scope where the user has the THREDDS_ADMIN role + GcubeScope gcubeScope = availableScopeForRole(roles, gCubeGroup, groupManager, scopeType); + if(gcubeScope!=null) { + listOfScopes.add(gcubeScope); + } } - + } + + GCubeGroup theRootVO = groupManager.getRootVO(); + List roles = WsUtil.getThreddsRoleFor(user, theRootVO); + //ADDING THE ROOT SCOPE + /*if(roles!=null && roles.size()>0 && roles.contains(GatewayRolesThredds.THREDDS_ADMIN)) { + GcubeScope gcubeScope = new GcubeScope(theRootVO.getGroupName(), groupManager.getInfrastructureScope(theRootVO.getGroupId()), GcubeScopeType.ROOT); + listOfScopes.add(gcubeScope); + }*/ + + ///ADDING THE ROOT SCOPE if the user has the THREDDS_ADMIN role in the scope + GcubeScope gcubeScope = availableScopeForRole(roles, theRootVO, groupManager, GcubeScopeType.ROOT); + if(gcubeScope!=null) { + listOfScopes.add(gcubeScope); } //ADDING THE ROOT SCOPE - String infraName = PortalContext.getConfiguration().getInfrastructureName(); + /*String infraName = PortalContext.getConfiguration().getInfrastructureName(); GcubeScope gcubeRoot = new GcubeScope(infraName, "/"+infraName, GcubeScopeType.ROOT); - listOfScopes.add(gcubeRoot); + listOfScopes.add(gcubeRoot)*/ } @@ -207,15 +239,72 @@ public class ThreddsWorkspaceSyncServiceImpl extends RemoteServiceServlet implem logger.error("Error occurred server-side getting VRE folders: ", e); throw new Exception("Sorry, an error occurred server-side getting VRE folders, try again later"); } + + if(listOfScopes.isEmpty()) { + throw new Exception("No scope detected with the needed role: "+GatewayRolesThredds.THREDDS_ADMIN.getRoleName()+". Contact the VRE manager or the portal administrator"); + } Collections.sort(listOfScopes); logger.info("Returning list of VREs: "+listOfScopes); return listOfScopes; } + + + /** + * Available scope for role and catalogue, checks if for the input scope: + * - the user has the role {@link GatewayRolesThredds.#THREDDS_ADMIN}alid catalogue configured for thredds + * - the scope has an available thredds catalogue configured (by calling the service) + * + * @param roles the roles + * @param scope the scope + * @param groupManager the group manager + * @param scopeType the scope type + * @return the gcube scope {@link GcubeScope} if the two conditions (see description) are satisfied, null otherwise + * @throws Exception the exception + */ + private GcubeScope availableScopeForRoleAndCatalogue(List roles, GCubeGroup scope, GroupManager groupManager, GcubeScopeType scopeType) throws Exception { + + if(roles!=null && roles.size()>0 && roles.contains(GatewayRolesThredds.THREDDS_ADMIN)) { + try { + List list = getAvailableCataloguesForScope(scope.getGroupName()); + if(list!=null && list.size()>0) { + return new GcubeScope(scope.getGroupName(), groupManager.getInfrastructureScope(scope.getGroupId()), scopeType); + } + }catch (Exception e) { + logger.error("Error on checking available catalogue for scope: "+scope.getGroupName(), e); + } + } + return null; + } + + + /** + * Available scope for role , checks if for the input scope the user has the role of {@link GatewayRolesThredds.#THREDDS_ADMIN} + * + * @param roles the roles + * @param scope the scope + * @param groupManager the group manager + * @param scopeType the scope type + * @return the gcube scope {@link GcubeScope} if the user has the role of {@link GatewayRolesThredds.#THREDDS_ADMIN}, null otherwise + * @throws Exception the exception + */ + private GcubeScope availableScopeForRole(List roles, GCubeGroup scope, GroupManager groupManager, GcubeScopeType scopeType) throws Exception { + + if(roles!=null && roles.size()>0 && roles.contains(GatewayRolesThredds.THREDDS_ADMIN)) { + return new GcubeScope(scope.getGroupName(), groupManager.getInfrastructureScope(scope.getGroupId()), scopeType); + } + return null; + } - - + /** + * Checks if is item synched. + * + * @param folderId the folder id + * @return the ws thredds synch folder descriptor + * @throws WorkspaceFolderLocked the workspace folder locked + * @throws Exception the exception + */ /* (non-Javadoc) * @see org.gcube.portlets.widgets.wsthreddssync.client.rpc.ThreddsWorkspaceSyncService#isItemSynched(java.lang.String) */ @@ -271,6 +360,14 @@ public class ThreddsWorkspaceSyncServiceImpl extends RemoteServiceServlet implem } + /** + * Monitor sync status. + * + * @param folderId the folder id + * @return the th sync status + * @throws ItemNotSynched the item not synched + * @throws Exception the exception + */ /* (non-Javadoc) * @see org.gcube.portlets.widgets.wsthreddssync.client.rpc.ThreddsWorkspaceSyncService#monitorSyncStatus(java.lang.String) */ @@ -287,7 +384,6 @@ public class ThreddsWorkspaceSyncServiceImpl extends RemoteServiceServlet implem * Do sync folder. * * @param folderId the folder id - * @param clientConfig the th config * @return the th sync status * @throws Exception the exception */ diff --git a/src/main/java/org/gcube/portlets/widgets/wsthreddssync/server/WsUtil.java b/src/main/java/org/gcube/portlets/widgets/wsthreddssync/server/WsUtil.java index 2315ec7..26c7479 100644 --- a/src/main/java/org/gcube/portlets/widgets/wsthreddssync/server/WsUtil.java +++ b/src/main/java/org/gcube/portlets/widgets/wsthreddssync/server/WsUtil.java @@ -3,7 +3,15 @@ */ package org.gcube.portlets.widgets.wsthreddssync.server; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; //import org.gcube.common.homelibrary.home.HomeLibrary; //import org.gcube.common.homelibrary.home.exceptions.HomeNotFoundException; @@ -14,6 +22,17 @@ import org.gcube.common.portal.PortalContext; import org.gcube.common.scope.api.ScopeProvider; import org.gcube.common.storagehubwrapper.server.StorageHubWrapper; import org.gcube.common.storagehubwrapper.server.tohl.Workspace; +import org.gcube.portlets.widgets.ckandatapublisherwidget.server.utils.the; +import org.gcube.portlets.widgets.wsthreddssync.shared.GatewayRolesThredds; +import org.gcube.vomanagement.usermanagement.GroupManager; +import org.gcube.vomanagement.usermanagement.RoleManager; +import org.gcube.vomanagement.usermanagement.exception.GroupRetrievalFault; +import org.gcube.vomanagement.usermanagement.exception.UserManagementSystemException; +import org.gcube.vomanagement.usermanagement.exception.UserRetrievalFault; +import org.gcube.vomanagement.usermanagement.impl.LiferayGroupManager; +import org.gcube.vomanagement.usermanagement.impl.LiferayRoleManager; +import org.gcube.vomanagement.usermanagement.model.GCubeGroup; +import org.gcube.vomanagement.usermanagement.model.GCubeRole; //import org.gcube.portlets.user.workspace.server.util.WsUtil; import org.gcube.vomanagement.usermanagement.model.GCubeUser; import org.slf4j.Logger; @@ -21,7 +40,6 @@ import org.slf4j.LoggerFactory; import com.liferay.portal.service.UserLocalServiceUtil; - /** * The Class WsUtil. * @@ -29,7 +47,10 @@ import com.liferay.portal.service.UserLocalServiceUtil; * Nov 25, 2016 */ public class WsUtil { + + + /** The logger. */ private static Logger logger = LoggerFactory.getLogger(WsUtil.class); @@ -96,4 +117,70 @@ public class WsUtil { } } + /** + * Gets the list of Scopes (Root-VO, VOs and VREs) for user and the thredds roles the user has in them. + * retrieve the VREs to whom a given user + * + * @param user the user + * @return the list vre for user + */ + public static Map> getScopesThreddsRolesForUser(GCubeUser user){ + logger.info("called getScopesThreddsRolesForUser user: "+user+", in all contexts"); + + GroupManager groupManager = new LiferayGroupManager(); + Map> mapRoleByGroupSingleVre = new HashMap>(); + //GCubeUser user; + try { + + //Retrieving the list of VOs and VREs + List listOfGroups = groupManager.listGroupsByUser(user.getUserId()); + //adding also the ROOT-VO + listOfGroups.add(groupManager.getRootVO()); + for (GCubeGroup gCubeGroup : listOfGroups) { + List threddsRoles = getThreddsRoleFor(user, gCubeGroup); + if(threddsRoles.size()>0) { + mapRoleByGroupSingleVre.put(gCubeGroup.getGroupName(), threddsRoles); + } + } + + logger.info("For user: "+user+", returning Map (VRE, ThreddsRoles) " + mapRoleByGroupSingleVre); + return mapRoleByGroupSingleVre; + }catch (UserManagementSystemException | UserRetrievalFault | GroupRetrievalFault e) { + logger.error("An error occurred during geThreddsVreRolesForUser: "+user, e); + return null; + } + } + + + /** + * Gets the thredds role for the user in the vre + * + * @param user the user + * @param vre the vre + * @return the thredds role for + */ + public static List getThreddsRoleFor(GCubeUser user, GCubeGroup vre){ + logger.info("called getThreddsRoleFor user: "+user+", in the scope: "+vre.getGroupName()); + try { + RoleManager roleManager = new LiferayRoleManager(); + List roles = roleManager.listRolesByUserAndGroup(user.getUserId(), vre.getGroupId()); + List threddsRoles = new ArrayList(); + for (GCubeRole gCubeRole : roles) { + if(gCubeRole.getRoleName().equalsIgnoreCase(GatewayRolesThredds.THREDDS_ADMIN.getRoleName())){ + threddsRoles.add(GatewayRolesThredds.THREDDS_ADMIN); + } + if(gCubeRole.getRoleName().equalsIgnoreCase(GatewayRolesThredds.THREDDS_PUBLISHER.getRoleName())){ + threddsRoles.add(GatewayRolesThredds.THREDDS_PUBLISHER); + } + } + + logger.info("For user: "+user+" in the scope: "+vre.getGroupName()+" returning roles: " + threddsRoles); + return threddsRoles; + }catch (UserRetrievalFault | GroupRetrievalFault e) { + logger.error("An error occurred during getVreRoleForUser: "+user, e); + return null; + } + } + + } diff --git a/src/main/java/org/gcube/portlets/widgets/wsthreddssync/shared/GatewayRolesThredds.java b/src/main/java/org/gcube/portlets/widgets/wsthreddssync/shared/GatewayRolesThredds.java new file mode 100644 index 0000000..2fa7f1c --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/wsthreddssync/shared/GatewayRolesThredds.java @@ -0,0 +1,18 @@ +package org.gcube.portlets.widgets.wsthreddssync.shared; + + public enum GatewayRolesThredds { + + THREDDS_ADMIN("Thredds-Admin"), + THREDDS_PUBLISHER("Thredds-Publisher"); + + private String name; + + private GatewayRolesThredds(String name) { + this.name = name; + } + + public String getRoleName() { + return this.name; + } + +}