From 66b42cab91b6f30a6fa33a0ddbc0a24551698df2 Mon Sep 17 00:00:00 2001 From: Giancarlo Panichi Date: Thu, 16 May 2019 10:56:38 +0000 Subject: [PATCH] Fixed Get Info for shared Folder git-svn-id: https://svn.d4science.research-infrastructures.eu/gcube/trunk/portlets/widgets/workspace-sharing-widget@179445 82a268e6-3cf1-43bd-a215-b396298e98cf --- .../server/GWTWorkspaceSharingBuilder.java | 55 +++- .../server/WorkspaceSharingServiceImpl.java | 302 ++++++++++++------ .../shared/ACL_TYPE.java | 1 + 3 files changed, 254 insertions(+), 104 deletions(-) diff --git a/src/main/java/org/gcube/portlets/widgets/workspacesharingwidget/server/GWTWorkspaceSharingBuilder.java b/src/main/java/org/gcube/portlets/widgets/workspacesharingwidget/server/GWTWorkspaceSharingBuilder.java index cb77216..359f5be 100644 --- a/src/main/java/org/gcube/portlets/widgets/workspacesharingwidget/server/GWTWorkspaceSharingBuilder.java +++ b/src/main/java/org/gcube/portlets/widgets/workspacesharingwidget/server/GWTWorkspaceSharingBuilder.java @@ -550,7 +550,7 @@ public class GWTWorkspaceSharingBuilder { } /** - * Gets the workspace acl from ac ls. + * Gets the workspace acl from list of acl. * * @param listACL * the types @@ -568,8 +568,9 @@ public class GWTWorkspaceSharingBuilder { switch (accessType) { case ADMINISTRATOR: // acls.add(new WorkspaceACL(acl.toString(), - // ACL_TYPE.ADMINISTRATOR, "Admin", false, - // USER_TYPE.ADMINISTRATOR, "")); + // ACL_TYPE.ADMINISTRATOR, "Administrator", false, + // USER_TYPE.ADMINISTRATOR, "Users are administrator and can + // update/delete any file")); break; case READ_ONLY: acls.add(new WorkspaceACL(acl.toString(), ACL_TYPE.READ_ONLY, "Read Only", false, USER_TYPE.OTHER, @@ -600,6 +601,54 @@ public class GWTWorkspaceSharingBuilder { } + /** + * Gets the workspace acl from list of acl. + * + * @param acl + * the types + * @return the workspace acl from acl + * @throws Exception + * the exception + */ + public List getWorkspaceACLForUser(ACL acl) throws Exception { + + List acls = new ArrayList(); + + List listAccessType = acl.getAccessTypes(); + for (AccessType accessType : listAccessType) { + switch (accessType) { + case ADMINISTRATOR: + acls.add(new WorkspaceACL(acl.toString(), ACL_TYPE.ADMINISTRATOR, "Admin", false, + USER_TYPE.ADMINISTRATOR, "Users are administrator and can update/delete any file")); + break; + case READ_ONLY: + acls.add(new WorkspaceACL(acl.toString(), ACL_TYPE.READ_ONLY, "Read Only", false, USER_TYPE.OTHER, + "Users can read any file but cannot update/delete")); + break; + case WRITE_OWNER: + acls.add(new WorkspaceACL(acl.toString(), ACL_TYPE.WRITE_OWNER, "Write Own", true, USER_TYPE.OTHER, + "Users can update/delete only their files")); + break; + + case WRITE_ALL: + acls.add(new WorkspaceACL(acl.toString(), ACL_TYPE.WRITE_ANY, "Write Any", false, USER_TYPE.OTHER, + "Any user can update/delete any file")); + break; + default: + // acls.add(new WorkspaceACL(acl.toString(), + // ACL_TYPE.WRITE_OWNER, + // acl.toString(), false, USER_TYPE.OTHER, "")); + break; + } + } + + if (acls.size() == 0) + throw new Exception("No ACLs rules found!"); + + return acls; + + } + /** * Gets the formatted html acl from ac ls. * diff --git a/src/main/java/org/gcube/portlets/widgets/workspacesharingwidget/server/WorkspaceSharingServiceImpl.java b/src/main/java/org/gcube/portlets/widgets/workspacesharingwidget/server/WorkspaceSharingServiceImpl.java index b7ec121..12f472b 100644 --- a/src/main/java/org/gcube/portlets/widgets/workspacesharingwidget/server/WorkspaceSharingServiceImpl.java +++ b/src/main/java/org/gcube/portlets/widgets/workspacesharingwidget/server/WorkspaceSharingServiceImpl.java @@ -11,10 +11,12 @@ import javax.servlet.http.HttpServletRequest; import org.gcube.common.homelibary.model.items.type.WorkspaceItemType; import org.gcube.common.homelibrary.home.HomeLibrary; +import org.gcube.common.homelibrary.home.exceptions.HomeNotFoundException; import org.gcube.common.homelibrary.home.workspace.Workspace; import org.gcube.common.homelibrary.home.workspace.WorkspaceItem; import org.gcube.common.homelibrary.home.workspace.WorkspaceSharedFolder; import org.gcube.common.homelibrary.home.workspace.accessmanager.ACLType; +import org.gcube.common.portal.PortalContext; import org.gcube.common.scope.api.ScopeProvider; import org.gcube.common.storagehub.client.dsl.FileContainer; import org.gcube.common.storagehub.client.dsl.FolderContainer; @@ -47,6 +49,11 @@ import org.gcube.portlets.widgets.workspacesharingwidget.shared.InfoContactModel import org.gcube.portlets.widgets.workspacesharingwidget.shared.ReportAssignmentACL; import org.gcube.portlets.widgets.workspacesharingwidget.shared.SessionExpiredException; import org.gcube.portlets.widgets.workspacesharingwidget.shared.WorkspaceACL; +import org.gcube.vomanagement.usermanagement.GroupManager; +import org.gcube.vomanagement.usermanagement.impl.LiferayGroupManager; +import org.gcube.vomanagement.usermanagement.impl.LiferayUserManager; +import org.gcube.vomanagement.usermanagement.model.GCubeGroup; +import org.gcube.vomanagement.usermanagement.model.GCubeUser; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -93,6 +100,36 @@ public class WorkspaceSharingServiceImpl extends RemoteServiceServlet implements return !WsUtil.isWithinPortal(); // IS NOT INTO PORTAL } + private Workspace getWorkspace(HttpServletRequest httpServletRequest) + throws org.gcube.common.homelibrary.home.workspace.exceptions.WorkspaceFolderNotFoundException, + org.gcube.common.homelibrary.home.exceptions.InternalErrorException, HomeNotFoundException { + + logger.trace("Get Workspace"); + PortalContext pContext = PortalContext.getConfiguration(); + // USER + GCubeUser user = pContext.getCurrentUser(httpServletRequest); + String username = user.getUsername(); + String fullName = user.getFullname(); + String email = user.getEmail(); + String avatarID = user.getUserAvatarId(); + String avatarURL = user.getUserAvatarURL(); + // SESSION + String currentScope = pContext.getCurrentScope(httpServletRequest); + String userToken = pContext.getCurrentUserToken(httpServletRequest); + long currGroupId = pContext.getCurrentGroupId(httpServletRequest); + + PortalContextInfo info = new PortalContextInfo(username, fullName, email, avatarID, avatarURL, currentScope, + userToken, currGroupId); + + logger.trace("PortalContextInfo: " + info); + + ScopeProvider.instance.set(info.getCurrentScope()); + logger.trace("Scope provider instancied"); + + Workspace workspace = HomeLibrary.getUserWorkspace(info.getUsername()); + return workspace; + } + /* * (non-Javadoc) * @@ -655,68 +692,94 @@ public class WorkspaceSharingServiceImpl extends RemoteServiceServlet implements try { logger.info("Call addAdministratorsByFolderId(): [itemId=" + itemId + ", listContactLogins" + listContactLogins + "]"); - logger.info("This function is not available in StorageHub!"); - return false; - // if(folderId==null || listContactLogins==null || - // listContactLogins.size()==0) - // return false; - // Workspace workspace = getWorkspace(); - // WorkspaceItem item = workspace.getItem(folderId); - // workspaceLogger.info("Adding administator/s to folder: - // "+folderId); - // - // if(item!=null && - // item.getType().equals(WorkspaceItemType.SHARED_FOLDER)){ - // WorkspaceSharedFolder sharedFolder = (WorkspaceSharedFolder) - // item; - // - // //retrieving old administrators list - // GWTWorkspaceBuilder builder = getGWTWorkspaceBuilder(); - // workspaceLogger.info("Retrieving old administator/s.."); - // List oldAdmins = - // builder.buildGxtInfoContactsFromPortalLogins(sharedFolder.getAdministrators()); - // workspaceLogger.info("Retrieving old administator/s are/is: - // "+oldAdmins.size()); - // - // workspaceLogger.info("Setting administators:"); - // printList(listContactLogins); - // sharedFolder.setAdmins(listContactLogins); - // - // workspaceLogger.info("Converting new administator/s.."); - // List newAdmins = - // builder.buildGxtInfoContactsFromPortalLogins(listContactLogins); - // NotificationsProducer np = getNotificationProducer(); - // - // workspaceLogger.info("Sending notifications downgrade/upgrade - // administator/s.."); - // DifferenceBetweenInfoContactModel diff1 = new - // DifferenceBetweenInfoContactModel(oldAdmins, newAdmins); - // List contactsDowngrade = - // diff1.getDifferentsContacts(); - // - // for (InfoContactModel infoContactModel : contactsDowngrade) { - // np.notifyAdministratorDowngrade(infoContactModel, sharedFolder); - // } - // - // DifferenceBetweenInfoContactModel diff2 = new - // DifferenceBetweenInfoContactModel(newAdmins, oldAdmins); - // List contactsUpgrade = - // diff2.getDifferentsContacts(); - // - // for (InfoContactModel infoContactModel : contactsUpgrade) { - // np.notifyAdministratorUpgrade(infoContactModel, sharedFolder); - // } - // - // return true; - // - // }else - // throw new Exception("The item is null or not instanceof - // "+WorkspaceItemType.SHARED_FOLDER); + // logger.info("This function is not available in StorageHub!"); + if (itemId == null || listContactLogins == null || listContactLogins.size() == 0) + return false; + + StorageHubClient shc = new StorageHubClient(); + OpenResolver openResolverForItem = shc.open(itemId); + FolderContainer folderContainer = openResolverForItem.asFolder(); + FolderItem folderItem = folderContainer.get(); + if (folderItem.isShared()) { + if (folderItem instanceof SharedFolder) { + return addAdminstratorByWorkspace(folderItem.getId(), listContactLogins); + + } else { + String error = "Attention, the set administrators operation can only be done on the root shared folder. " + + "Please, select the root shared folder if you want to set the administrators."; + logger.error(error); + throw new Exception(error); + + } + } else { + logger.error("The item requested is not a valid shared folder : [itemId=" + itemId + "]"); + throw new Exception("The item requested is not a valid shared folder. Impossible set the administrators."); + } } catch (Exception e) { logger.error("Error in addAdministratorsByFolderId(): " + e.getLocalizedMessage(), e); - String error = "Attention, administrators can not be added by StorageHub."; - throw new Exception(error); + throw e; + } + + } + + private boolean addAdminstratorByWorkspace(String itemId, List listContactLogins) throws Exception { + try { + Workspace workspace = getWorkspace(this.getThreadLocalRequest()); + WorkspaceItem item = workspace.getItem(itemId); + logger.info("Adding administator/s to folder: " + itemId); + + if (item != null && item.getType().equals(WorkspaceItemType.SHARED_FOLDER)) { + WorkspaceSharedFolder sharedFolder = (WorkspaceSharedFolder) item; + + // retrieving old administrators list + // GWTWorkspaceSharingBuilder builder = new + // GWTWorkspaceSharingBuilder(); + // logger.info("Retrieving old administator/s.."); + // List oldAdmins = builder + // .buildGxtInfoContactsFromPortalLogins(sharedFolder.getAdministrators()); + // logger.info("Retrieving old administator/s are/is:" + + // oldAdmins.size()); + + logger.info("Setting administators:"); + sharedFolder.setAdmins(listContactLogins); + + /* + * logger.info("Converting new administator/s.."); + * List newAdmins = + * builder.buildGxtInfoContactsFromPortalLogins( + * listContactLogins); NotificationsProducer np = + * getNotificationProducer(); + * + * logger. + * info("Sending notifications downgrade/upgrade administator/s.." + * ); DifferenceBetweenInfoContactModel diff1 = new + * DifferenceBetweenInfoContactModel(oldAdmins, newAdmins); + * List contactsDowngrade = + * diff1.getDifferentsContacts(); + * + * for (InfoContactModel infoContactModel : contactsDowngrade) { + * np.notifyAdministratorDowngrade(infoContactModel, + * sharedFolder); } + * + * DifferenceBetweenInfoContactModel diff2 = new + * DifferenceBetweenInfoContactModel(newAdmins, oldAdmins); + * List contactsUpgrade = + * diff2.getDifferentsContacts(); + * + * for (InfoContactModel infoContactModel : contactsUpgrade) { + * np.notifyAdministratorUpgrade(infoContactModel, + * sharedFolder); } + */ + + return true; + + } else + throw new Exception("The item is null or not instanceof " + WorkspaceItemType.SHARED_FOLDER); + + } catch (Exception e) { + logger.error("Error in addAdminstratorByWorkspace() : " + e.getLocalizedMessage(), e); + throw new Exception("Error in set administrators operation for this item."); } } @@ -749,38 +812,6 @@ public class WorkspaceSharingServiceImpl extends RemoteServiceServlet implements } } - // /** - // * DEBUG. - // * - // * @return the fake groups - // */ - // private List getFakeGroups() { - // - // List listContactsModel = new - // ArrayList(); - // - // PortalContext context = PortalContext.getConfiguration(); - // System.out.println("context.getInfrastructureName(): " + - // context.getInfrastructureName()); - // // System.out.println("context.getVOsAsString(): - // // "+context.getVOsAsString()); - // List vos = - // WsUtil.getVresFromInfrastructure(context.getInfrastructureName(), - // "devsec"); - // - // for (VO vo : vos) { - // System.out.println("vo name " + vo.getName()); - // - // for (VRE vre : vo.getVres()) { - // System.out.println("vre name " + vre.getName()); - // listContactsModel.add(new InfoContactModel(vre.getName(), vre.getName(), - // vre.getName(), true)); - // } - // } - // - // return listContactsModel; - // } - /* * (non-Javadoc) * @@ -1086,7 +1117,7 @@ public class WorkspaceSharingServiceImpl extends RemoteServiceServlet implements if (folderItem.isShared()) { if (folderItem instanceof SharedFolder) { logger.debug("Is a shared folder search ACL in it"); - List acls = retrieveACLsFromFolderContainer(folderContainer); + List acls = retrieveUserACLsFromFolderContainer(folderContainer); List listEACL = new ArrayList(acls.size()); for (WorkspaceACL workspaceACL : acls) { boolean isBaseSharedFolder = true; @@ -1103,7 +1134,7 @@ public class WorkspaceSharingServiceImpl extends RemoteServiceServlet implements FolderContainer rootSharedFolderContainer = folderContainer.getRootSharedFolder(); FolderItem rootSharedFolder = rootSharedFolderContainer.get(); if (rootSharedFolder instanceof SharedFolder) { - List acls = retrieveACLsFromFolderContainer(rootSharedFolderContainer); + List acls = retrieveUserACLsFromFolderContainer(rootSharedFolderContainer); List listEACL = new ArrayList(acls.size()); for (WorkspaceACL workspaceACL : acls) { boolean isBaseSharedFolder = true; @@ -1133,18 +1164,87 @@ public class WorkspaceSharingServiceImpl extends RemoteServiceServlet implements } } - private List retrieveACLsFromFolderContainer(FolderContainer folderContainer) throws Exception { + // TODO + private List retrieveUserACLsFromFolderContainer(FolderContainer folderContainer) throws Exception { + String currentUser = getMyLogin(); + logger.debug("Current User: " + currentUser); List acls = folderContainer.getAcls(); logger.debug("Retrieved acls: " + acls); - GWTWorkspaceSharingBuilder builder = new GWTWorkspaceSharingBuilder(); - List wsAcls = builder.getWorkspaceACLFromACLs(acls); - if (wsAcls == null || wsAcls.isEmpty()) { - logger.info("Converted ACLBySharedFolderId is null or empty, returning null"); - return null; + ACL currentUserACL = null; + for (ACL acl : acls) { + if (acl.getPricipal().compareTo(currentUser) == 0) { + currentUserACL = acl; + break; + } } - logger.info("Returning first acl with id: " + wsAcls.get(0).getId()); - return wsAcls; + List wsAcls = null; + if (currentUserACL == null) { + List listVRE = retrieveCurrentUserACLFromGroup(currentUser); + int i = 0; + while (currentUserACL == null && i < listVRE.size()) { + GCubeGroup vre = listVRE.get(i); + String vreName = vre.getGroupName(); + for (ACL acl : acls) { + String principal = acl.getPricipal(); + String rootVO = PortalContext.getConfiguration().getInfrastructureName(); + if (principal.startsWith(rootVO)) { + int voIndex = principal.indexOf("-"); + if (voIndex != -1) { + String tempScope = principal.substring(voIndex + 1); + int vreIndex = tempScope.indexOf("-"); + if (vreIndex != -1) { + tempScope = tempScope.substring(vreIndex + 1); + if (tempScope.compareTo(vreName) == 0) { + currentUserACL = acl; + break; + } + } + } + } + } + i++; + } + if (currentUserACL != null) { + GWTWorkspaceSharingBuilder builder = new GWTWorkspaceSharingBuilder(); + wsAcls = builder.getWorkspaceACLForUser(currentUserACL); + } + } else { + GWTWorkspaceSharingBuilder builder = new GWTWorkspaceSharingBuilder(); + wsAcls = builder.getWorkspaceACLForUser(currentUserACL); + } + + if (wsAcls == null || wsAcls.isEmpty()) { + logger.info("List of ACL is null or empty, returning null"); + return null; + } else { + logger.info("List of ACL is retrieved. Use first acl with id: " + wsAcls.get(0).getId()); + return wsAcls; + } + } + + private List retrieveCurrentUserACLFromGroup(String userName) throws Exception { + try { + // Instanciate the manager + GroupManager groupManager = new LiferayGroupManager(); + // retrieve the groups to whom a given user belongs (given the user + // identifier) + long userId; + + userId = new LiferayUserManager().getUserId(userName); + + List listOfGroups = groupManager.listGroupsByUser(userId); + List vres = new ArrayList(); + for (GCubeGroup g : listOfGroups) { + if (groupManager.isVRE(g.getGroupId())) + vres.add(g); + } + logger.debug("Current User VREs: " + vres); + return vres; + } catch (Throwable e) { + logger.error("Error retrieving User group: " + e.getLocalizedMessage(), e); + throw new Exception("Error retrieving User group: " + e.getLocalizedMessage(), e); + } } /** diff --git a/src/main/java/org/gcube/portlets/widgets/workspacesharingwidget/shared/ACL_TYPE.java b/src/main/java/org/gcube/portlets/widgets/workspacesharingwidget/shared/ACL_TYPE.java index 2f5b279..0dfeab9 100644 --- a/src/main/java/org/gcube/portlets/widgets/workspacesharingwidget/shared/ACL_TYPE.java +++ b/src/main/java/org/gcube/portlets/widgets/workspacesharingwidget/shared/ACL_TYPE.java @@ -10,6 +10,7 @@ package org.gcube.portlets.widgets.workspacesharingwidget.shared; */ public enum ACL_TYPE { + ADMINISTRATOR, // "Users are administrators" READ_ONLY, // "Users can read any file but cannot update/delete" WRITE_OWNER, //"Users can update/delete only their files" WRITE_ANY; //"Any user can update/delete any file"