diff --git a/.settings/org.eclipse.wst.common.component b/.settings/org.eclipse.wst.common.component index 336593c..5fe3680 100644 --- a/.settings/org.eclipse.wst.common.component +++ b/.settings/org.eclipse.wst.common.component @@ -4,9 +4,6 @@ - - uses - diff --git a/pom.xml b/pom.xml index 24b27a5..e958be2 100644 --- a/pom.xml +++ b/pom.xml @@ -99,13 +99,11 @@ org.gcube.common authorization-client - [1.0.0-SNAPSHOT, 2.0.0-SNAPSHOT) provided org.gcube.common common-authorization - [1.0.0-SNAPSHOT, 2.0.0-SNAPSHOT) provided diff --git a/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/GcubeCkanDataCatalogService.java b/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/GcubeCkanDataCatalogService.java index 0f2bbc3..849dfd1 100644 --- a/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/GcubeCkanDataCatalogService.java +++ b/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/GcubeCkanDataCatalogService.java @@ -18,11 +18,28 @@ import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; public interface GcubeCkanDataCatalogService extends RemoteService { + /** + * Get the ckan connector access point + * @param pathInfoParameters + * @param queryStringParameters + * @param currentUrl + * @return + * @throws Exception + */ CkanConnectorAccessPoint getCKanConnector( String pathInfoParameters, String queryStringParameters, String currentUrl) throws Exception; + /** + * Get the current role in CKAN for this user + * @return + * @throws Exception + */ CkanRole getMyRole() throws Exception; + /** + * Get the current user's username + * @return + */ String getUser(); /** @@ -31,9 +48,13 @@ public interface GcubeCkanDataCatalogService extends RemoteService { */ Map getCkanOrganizationsNamesAndUrlsForUser(); + /** + * Logout from ckan + */ void logoutFromCkan(); /** + * Remove auth cookie for ckan of this user * @return */ String logoutURIFromCkan(); diff --git a/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/view/CkanFramePanel.java b/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/view/CkanFramePanel.java index e6c03a5..5ebad21 100644 --- a/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/view/CkanFramePanel.java +++ b/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/view/CkanFramePanel.java @@ -5,14 +5,17 @@ package org.gcube.portlets.gcubeckan.gcubeckandatacatalog.client.view; import org.gcube.portlets.gcubeckan.gcubeckandatacatalog.client.GCubeCkanDataCatalog; import org.gcube.portlets.gcubeckan.gcubeckandatacatalog.client.event.IFrameInstanciedEvent; +import org.gcube.portlets.gcubeckan.gcubeckandatacatalog.client.resource.CkanPortletResources; import com.google.gwt.core.shared.GWT; +import com.google.gwt.dom.client.Style.Display; import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.event.dom.client.LoadEvent; import com.google.gwt.event.dom.client.LoadHandler; import com.google.gwt.event.shared.HandlerManager; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.Frame; +import com.google.gwt.user.client.ui.Image; /** @@ -25,6 +28,7 @@ public class CkanFramePanel extends FlowPanel{ private Frame frame; private HandlerManager eventBus; + private Image loading = new Image(CkanPortletResources.ICONS.loading()); /** @@ -34,7 +38,9 @@ public class CkanFramePanel extends FlowPanel{ */ public CkanFramePanel(HandlerManager eventBus) { this.eventBus = eventBus; - + this.add(loading); + loading.getElement().getStyle().setProperty("margin", "auto"); + loading.getElement().getStyle().setDisplay(Display.BLOCK); } /** @@ -64,14 +70,17 @@ public class CkanFramePanel extends FlowPanel{ frame = new Frame(ckanUrlConnector); frame.getElement().setId(GCubeCkanDataCatalog.GCUBE_CKAN_IFRAME); frame.setWidth("100%"); -// frame.setHeight("100%"); -// frame.getElement().getStyle().setOverflow(Overflow.HIDDEN); -// frame.getElement().setAttribute("scrolling", "no"); + // frame.setHeight("100%"); + // frame.getElement().getStyle().setOverflow(Overflow.HIDDEN); + // frame.getElement().setAttribute("scrolling", "no"); frame.getElement().getStyle().setBorderWidth(0, Unit.PX); frame.addLoadHandler(new LoadHandler() { @Override public void onLoad(LoadEvent arg0) { + + CkanFramePanel.this.remove(loading); + } }); add(frame); diff --git a/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/view/CkanMetadataManagementPanel.java b/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/view/CkanMetadataManagementPanel.java index baa21ee..cbf4d6a 100644 --- a/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/view/CkanMetadataManagementPanel.java +++ b/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/view/CkanMetadataManagementPanel.java @@ -175,7 +175,7 @@ public class CkanMetadataManagementPanel extends FlowPanel{ } /** - * Those buttons can be only visible when the logged user has role editr/admin/sysadmin + * Those buttons can be only visible when the logged user has role edit/admin/sysadmin * @param show */ public void showInsertAndEditProductButtons(boolean show){ diff --git a/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/view/CkanOrganizationsPanel.java b/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/view/CkanOrganizationsPanel.java index 2de27c2..f14b581 100644 --- a/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/view/CkanOrganizationsPanel.java +++ b/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/view/CkanOrganizationsPanel.java @@ -32,7 +32,7 @@ public class CkanOrganizationsPanel extends VerticalPanel{ } /** - * Set the organizations to show + * Set the organizations to show. If a null list is passed, it is an error * @param result */ public void setOrganizations(Map result) { @@ -47,7 +47,13 @@ public class CkanOrganizationsPanel extends VerticalPanel{ this.organizations = result; //generate the list of organizations - if(result == null || result.isEmpty()){ + if(result == null){ + Paragraph p = new Paragraph("There was an error while retrieving your organizations, sorry."); + p.setStyleName("no-organizations-found-paragraph"); + p.getElement().getStyle().setColor("#aaaaaa"); + vPanel.add(p); + } + else if(result.isEmpty()){ Paragraph p = new Paragraph("You are not a member of any organizations."); p.setStyleName("no-organizations-found-paragraph"); @@ -85,6 +91,7 @@ public class CkanOrganizationsPanel extends VerticalPanel{ vPanel.add(list); } + // add the footer String html = "Powered by gCube | CKAN"; Footer footer = new Footer(html); footer.setStyleName("footer-organizations"); diff --git a/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/view/GCubeCkanDataCatalogPanel.java b/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/view/GCubeCkanDataCatalogPanel.java index 903d7f1..fa41111 100644 --- a/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/view/GCubeCkanDataCatalogPanel.java +++ b/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/view/GCubeCkanDataCatalogPanel.java @@ -64,8 +64,11 @@ public class GCubeCkanDataCatalogPanel extends BaseViewTemplate { String queryParameter = Window.Location.getParameter(GCubeCkanDataCatalog.GET_QUERY_PARAMETER); + String currentPortletUrl = Window.Location.getHref(); + currentPortletUrl = currentPortletUrl.split("\\?")[0]; // ignore get parameters + GCubeCkanDataCatalog.service.getCKanConnector( - pathParameter, queryParameter, Window.Location.getHref(), + pathParameter, queryParameter, currentPortletUrl, new AsyncCallback() { @Override @@ -83,11 +86,11 @@ public class GCubeCkanDataCatalogPanel extends BaseViewTemplate { if (result) { // the portlet is outside the portal and no user is logged - // in - // show only home and statistics + // in show only home and statistics managementPanel.doNotShowUserRelatedInfo(); } else { + // polling for session expired check CheckSession.getInstance().startPolling(); @@ -97,13 +100,15 @@ public class GCubeCkanDataCatalogPanel extends BaseViewTemplate { @Override public void onSuccess(Map result) { - if (result != null) ckanOrganizationsPanel.setOrganizations(result); } @Override public void onFailure(Throwable caught) { - + + // an error message will be displayed + ckanOrganizationsPanel.setOrganizations(null); + } }); @@ -122,7 +127,7 @@ public class GCubeCkanDataCatalogPanel extends BaseViewTemplate { showEditInsertButtons(true); break; case EDITOR: - showEditInsertButtons(false); // because the editor has some limitations TODO + showEditInsertButtons(true); break; case MEMBER: showEditInsertButtons(false); diff --git a/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/server/GcubeCkanDataCatalogServiceImpl.java b/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/server/GcubeCkanDataCatalogServiceImpl.java index 3ffd2d1..4cde739 100644 --- a/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/server/GcubeCkanDataCatalogServiceImpl.java +++ b/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/server/GcubeCkanDataCatalogServiceImpl.java @@ -19,10 +19,10 @@ import org.apache.commons.codec.binary.Base64; import org.apache.http.HttpStatus; import org.gcube.application.framework.core.session.ASLSession; import org.gcube.application.framework.core.session.SessionManager; -import org.gcube.common.scope.api.ScopeProvider; +import org.gcube.common.authorization.library.provider.UserInfo; +import org.gcube.datacatalogue.ckanutillibrary.ApplicationProfileScopePerUrlReader; import org.gcube.datacatalogue.ckanutillibrary.CKanUtils; import org.gcube.datacatalogue.ckanutillibrary.CkanUtilsFactory; -import org.gcube.datacatalogue.ckanutillibrary.utils.ApplicationProfileScopePerUrlReader; import org.gcube.portal.custom.scopemanager.scopehelper.ScopeHelper; import org.gcube.portlets.gcubeckan.gcubeckandatacatalog.client.GcubeCkanDataCatalogService; import org.gcube.portlets.gcubeckan.gcubeckandatacatalog.shared.CkanConnectorAccessPoint; @@ -56,7 +56,6 @@ public class GcubeCkanDataCatalogServiceImpl extends RemoteServiceServlet implem public static String CKANCONNECTORLOGOUT = "CkanConnectorLogout"; public static final String USERNAME_ATTRIBUTE = ScopeHelper.USERNAME_ATTRIBUTE; private static Logger logger = LoggerFactory.getLogger(GcubeCkanDataCatalogServiceImpl.class); - private final static String DEFAULT_ROLE = "OrganizationMember"; public final static String TEST_USER = "test.user"; public final static String TEST_SCOPE = "/gcube/devsec/devVRE"; @@ -68,8 +67,8 @@ public class GcubeCkanDataCatalogServiceImpl extends RemoteServiceServlet implem private static final String CKAN_HIGHEST_ROLE = "ckanHighestRole"; // editor, member, admin (this information is retrieved according the scope) private static final String CKAN_ORGANIZATIONS_PUBLISH_KEY = "ckanOrganizationsPublish"; // here he can publish (admin role) - // THIS IS NEEDED TO HANDLE SPECIAL CASES (e.g. for a certain portlet url we want to discover in another scope) - private final static String CLIENT_PORTLET_URL = "currentClientUrlPortlet"; + // THIS IS NEEDED TO HANDLE SPECIAL CASES (e.g. for a certain portlet url we want to discover in another scope the ckan instance information) + private final static String SCOPE_CLIENT_PORTLET_URL = "currentClientUrlPortletScope"; /** * Instanciate the ckan util library. @@ -82,13 +81,14 @@ public class GcubeCkanDataCatalogServiceImpl extends RemoteServiceServlet implem HttpSession httpSession = getThreadLocalRequest().getSession(); ASLSession aslSession = getASLSession(httpSession); String currentScope = aslSession.getScope(); - String user = aslSession.getUsername(); CKanUtils instance = null; try{ + String scopeInWhichDiscover = (discoverScope != null && !discoverScope.isEmpty()) ? discoverScope : currentScope; logger.debug("Discovering ckan utils library into scope " + scopeInWhichDiscover); instance = CkanUtilsFactory.getFactory().getUtilsPerScope(scopeInWhichDiscover); + }catch(Exception e){ logger.error("Unable to retrieve ckan utils", e); } @@ -99,18 +99,18 @@ public class GcubeCkanDataCatalogServiceImpl extends RemoteServiceServlet implem * @see org.gcube.portlets.gcubeckan.gcubeckandatacatalog.client.GcubeCkanDataCatalogService#getCKanConnector(java.lang.String, java.lang.String) */ @Override - public CkanConnectorAccessPoint getCKanConnector(String pathInfoParameter, String queryStringParameters, String currentUrl) throws Exception { - logger.info("getCKanConnector [pathInfo: "+pathInfoParameter + ", query: "+queryStringParameters+"], current url is " + currentUrl); + public CkanConnectorAccessPoint getCKanConnector(String pathInfoParameter, String queryStringParameters, String currentPortletUrl) throws Exception { + logger.info("getCKanConnector [pathInfo: "+pathInfoParameter + ", query: "+queryStringParameters+"], current url is " + currentPortletUrl); try{ // call asl session otherwise ScopeProvider.instance.get(); returns null ASLSession aslSession = getASLSession(this.getThreadLocalRequest().getSession()); // retrieve scope per current portlet url - String scopePerCurrentUrl = new ApplicationProfileScopePerUrlReader().getScopePerUrl(currentUrl); + String scopePerCurrentUrl = new ApplicationProfileScopePerUrlReader().getScopePerUrl(currentPortletUrl); // save it - this.getThreadLocalRequest().getSession().setAttribute(CLIENT_PORTLET_URL, currentUrl); + this.getThreadLocalRequest().getSession().setAttribute(SCOPE_CLIENT_PORTLET_URL, scopePerCurrentUrl); if(queryStringParameters!=null && Base64.isBase64(queryStringParameters.getBytes())){ byte[] valueDecoded=Base64.decodeBase64(queryStringParameters.getBytes()); @@ -177,12 +177,13 @@ public class GcubeCkanDataCatalogServiceImpl extends RemoteServiceServlet implem //GET TOKEN String gcubeTokenValue = null; if(SessionUtil.isIntoPortal()){ - gcubeTokenValue = getGcubeSecurityToken(); + gcubeTokenValue = getGcubeSecurityToken(scopePerCurrentUrl); }else{ logger.warn("******** Using TEST_USER security token!!!"); gcubeTokenValue = TEST_SEC_TOKEN; } + // set the token into the CkanConnectorAccessPoint ckan.addGubeToken(gcubeTokenValue); //ADDING LIST OF VRE TO WHICH USER BELONGS @@ -190,6 +191,7 @@ public class GcubeCkanDataCatalogServiceImpl extends RemoteServiceServlet implem return ckan; } + // retrieve the list of VREs to whom the user belongs List listVres = UserUtil.getListVreForUser(session.getUserEmailAddress()); ckan.addListOfVREs(listVres); @@ -197,43 +199,41 @@ public class GcubeCkanDataCatalogServiceImpl extends RemoteServiceServlet implem } /** - * Gets the gcube security token. + * Gets the gcube security token for the user in current session and for a given scope * * @return the gcube security token + * @throws Exception */ - protected String getGcubeSecurityToken() { - HttpSession httpSession = this.getThreadLocalRequest().getSession(); - ASLSession session = getASLSession(httpSession); - logger.debug("Get security token return: "+session.getSecurityToken()); + protected String getGcubeSecurityToken(String scope) throws Exception { - if(session.getSecurityToken()==null || session.getSecurityToken().isEmpty()){ - logger.warn("Security token retured from ASL is null or empty, I'm setting security token..."); - setAuthorizationToken(session); - } - - return session.getSecurityToken(); - } - - - /** - * Temporary method to set the authorization token. - * - * @param session the new authorization token - */ - private static void setAuthorizationToken(ASLSession session) { + // ask it directly to the auth service + ASLSession session = getASLSession(this.getThreadLocalRequest().getSession()); String username = session.getUsername(); - String scope = session.getScope(); - ScopeProvider.instance.set(scope); - logger.debug("calling service token on scope " + scope); - List userRoles = new ArrayList(); - userRoles.add(DEFAULT_ROLE); - session.setSecurityToken(null); - String token = authorizationService().build().generate(session.getUsername(), userRoles); - logger.debug("received token: "+token); - session.setSecurityToken(token); - logger.info("Security token set in session for: "+username + " on " + scope); + String token = authorizationService().generateUserToken(new UserInfo(username, new ArrayList()), scope); + return token; + } + // /** + // * Temporary method to set the authorization token. + // * + // * @param session the new authorization token + // * @throws Exception + // */ + // private static void setAuthorizationToken(ASLSession session) throws Exception { + // String username = session.getUsername(); + // String scope = session.getScope(); + // ScopeProvider.instance.set(scope); + // logger.debug("calling service token on scope " + scope); + // List userRoles = new ArrayList(); + // userRoles.add(DEFAULT_ROLE); + // session.setSecurityToken(null); + // String token = authorizationService().generateUserToken(new UserInfo(username, userRoles), scope); + // logger.debug("received token: "+token); + // session.setSecurityToken(token); + // logger.info("Security token set in session for: "+username + " on " + scope); + // } + /** * Gets the ASL session. * @@ -285,11 +285,8 @@ public class GcubeCkanDataCatalogServiceImpl extends RemoteServiceServlet implem }else{ - // save it - String currentUrl = (String)this.getThreadLocalRequest().getSession().getAttribute(CLIENT_PORTLET_URL); - - // retrieve scope per current portlet url - String scopePerCurrentUrl = new ApplicationProfileScopePerUrlReader().getScopePerUrl(currentUrl); + // get the scope + String scopePerCurrentUrl = (String)this.getThreadLocalRequest().getSession().getAttribute(SCOPE_CLIENT_PORTLET_URL); // get key per scope String keyPerScope = UserUtil.concatenateSessionKeyScope(CKAN_HIGHEST_ROLE, scopePerCurrentUrl); @@ -306,21 +303,22 @@ public class GcubeCkanDataCatalogServiceImpl extends RemoteServiceServlet implem GroupManager gm = new LiferayGroupManager(); String groupName = gm.getGroup(gm.getGroupIdFromInfrastructureScope(scopePerCurrentUrl)).getGroupName(); - // we build up also a list that keeps track of the scopes (orgs) in which the user has role ADMIN - List orgsInWhichAdminRole = new ArrayList(); - toReturn = UserUtil.getHighestRole(scopePerCurrentUrl, username, groupName, this, orgsInWhichAdminRole); + // we build up also a list that keeps track of the scopes (orgs) in which the user has at least role EDITOR + List orgsInWhichAtLeastEditorRole = new ArrayList(); + toReturn = UserUtil.getHighestRole(scopePerCurrentUrl, username, groupName, this, orgsInWhichAtLeastEditorRole); + + // put role in session httpSession.setAttribute(keyPerScope, toReturn); - logger.info("Set role " + toReturn + " into session for user " + username); - // if he is an admin preload: + // if he is an admin/editor preload: // 1) organizations in which he can publish (the widget will find these info in session) - if(toReturn.equals(CkanRole.ADMIN)){ - httpSession.setAttribute(UserUtil.concatenateSessionKeyScope(CKAN_ORGANIZATIONS_PUBLISH_KEY, scopePerCurrentUrl), orgsInWhichAdminRole); - logger.info("Set organizations in which he can publish to " + orgsInWhichAdminRole + " into session for user " + username); + if(toReturn.equals(CkanRole.ADMIN) || toReturn.equals(CkanRole.EDITOR)){ + httpSession.setAttribute(UserUtil.concatenateSessionKeyScope(CKAN_ORGANIZATIONS_PUBLISH_KEY, scopePerCurrentUrl), orgsInWhichAtLeastEditorRole); + logger.info("Set organizations in which he can publish to " + orgsInWhichAtLeastEditorRole + " into session for user " + username); } }catch(Exception e){ - logger.error("Error while retreving roles... returning MEMBER", e); + logger.error("Error while retreving roles... returning " + toReturn, e); } } } @@ -337,9 +335,9 @@ public class GcubeCkanDataCatalogServiceImpl extends RemoteServiceServlet implem public String getUser() { HttpSession httpSession = this.getThreadLocalRequest().getSession(); - - logger.debug("User in session is " + getASLSession(httpSession).getUsername()); - return getASLSession(httpSession).getUsername(); + String username = getASLSession(httpSession).getUsername(); + logger.debug("User in session is " + username); + return username; } @@ -348,8 +346,11 @@ public class GcubeCkanDataCatalogServiceImpl extends RemoteServiceServlet implem HttpSession httpSession = this.getThreadLocalRequest().getSession(); ASLSession session = getASLSession(httpSession); String username = session.getUsername(); - CkanConnectorAccessPoint ckanAP = SessionUtil.getCkanAccessPoint(this.getThreadLocalRequest().getSession(), session.getScope()); - // String token = getGcubeSecurityToken(); + + // get the scope from session + String scopePerCurrentUrl = (String)this.getThreadLocalRequest().getSession().getAttribute(SCOPE_CLIENT_PORTLET_URL); + + CkanConnectorAccessPoint ckanAP = SessionUtil.getCkanAccessPoint(this.getThreadLocalRequest().getSession(), scopePerCurrentUrl); logger.info("Logout from CKAN for: "+username +" by token: "+ckanAP.getGcubeTokenValue()); String ckanConnectorLogut = getServletContext().getInitParameter(CKANCONNECTORLOGOUT); @@ -369,7 +370,9 @@ public class GcubeCkanDataCatalogServiceImpl extends RemoteServiceServlet implem HttpSession httpSession = this.getThreadLocalRequest().getSession(); ASLSession session = getASLSession(httpSession); String username = session.getUsername(); - CkanConnectorAccessPoint ckanAP = SessionUtil.getCkanAccessPoint(this.getThreadLocalRequest().getSession(), session.getScope()); + // get the scope from session + String scopePerCurrentUrl = (String)this.getThreadLocalRequest().getSession().getAttribute(SCOPE_CLIENT_PORTLET_URL); + CkanConnectorAccessPoint ckanAP = SessionUtil.getCkanAccessPoint(this.getThreadLocalRequest().getSession(), scopePerCurrentUrl); // String token = getGcubeSecurityToken(); logger.info("Logout from CKAN for: "+username +" by token: "+ckanAP.getGcubeTokenValue()); @@ -441,12 +444,8 @@ public class GcubeCkanDataCatalogServiceImpl extends RemoteServiceServlet implem ASLSession session = getASLSession(httpSession); String username = session.getUsername(); - // get it - String currentUrl = (String)this.getThreadLocalRequest().getSession().getAttribute(CLIENT_PORTLET_URL); - // retrieve scope per current portlet url - String scopePerCurrentUrl = new ApplicationProfileScopePerUrlReader().getScopePerUrl(currentUrl); - + String scopePerCurrentUrl = (String)this.getThreadLocalRequest().getSession().getAttribute(SCOPE_CLIENT_PORTLET_URL); String keyPerScope = UserUtil.concatenateSessionKeyScope(CKAN_ORGS_USER_KEY, scopePerCurrentUrl); if(!username.equals(TEST_USER)){ @@ -475,7 +474,7 @@ public class GcubeCkanDataCatalogServiceImpl extends RemoteServiceServlet implem if(!SessionUtil.isIntoPortal()){ - logger.warn("You are not into the portal"); + logger.warn("You are in DEV mode"); return false; }else{ @@ -483,11 +482,8 @@ public class GcubeCkanDataCatalogServiceImpl extends RemoteServiceServlet implem HttpSession httpSession = this.getThreadLocalRequest().getSession(); ASLSession session = getASLSession(httpSession); String username = session.getUsername(); + return username.equals(TEST_USER); - if(username.equals(TEST_USER)) - return true; - - return false; } } } diff --git a/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/server/SessionUtil.java b/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/server/SessionUtil.java index b889ab2..94bfda7 100644 --- a/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/server/SessionUtil.java +++ b/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/server/SessionUtil.java @@ -96,7 +96,5 @@ public class SessionUtil { public static CkanConnectorAccessPoint getCkanAccessPoint(HttpSession session, String scope) { String key = getKeyForSession(CKAN_ACCESS_POINT, scope); return (CkanConnectorAccessPoint) session.getAttribute(key); - - } } diff --git a/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/server/UserUtil.java b/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/server/UserUtil.java index bb983a6..65fc275 100644 --- a/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/server/UserUtil.java +++ b/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/server/UserUtil.java @@ -79,7 +79,7 @@ public class UserUtil { } /** - * Retrieve the highest ckan role the user has and also retrieve the list of organizations (scopes) in which the user has the ckan-admin role + * Retrieve the highest ckan role the user has and also retrieve the list of organizations (scopes) in which the user has the ckan-admin or ckan-editor role * @param currentScope the current scope * @param username the current username * @param groupName the current groupName @@ -87,7 +87,7 @@ public class UserUtil { * @param orgsInWhichAdminRole * @param ckanUtils ckanUtils */ - public static CkanRole getHighestRole(String currentScope, String username, String groupName, GcubeCkanDataCatalogServiceImpl gcubeCkanDataCatalogServiceImpl, List orgsInWhichAdminRole){ + public static CkanRole getHighestRole(String currentScope, String username, String groupName, GcubeCkanDataCatalogServiceImpl gcubeCkanDataCatalogServiceImpl, List orgsInWhichAtLeastEditorRole){ // base role as default value CkanRole toReturn = CkanRole.MEMBER; @@ -129,8 +129,16 @@ public class UserUtil { if(correspondentRoleToCheck.equals(RolesIntoOrganization.MEMBER)) continue; + // admin or editor case checkIfRoleIsSetInCkanInstance(username, gCubeGroupName, gCubeGroup.getGroupId(), - correspondentRoleToCheck, groupManager, gcubeCkanDataCatalogServiceImpl, orgsInWhichAdminRole); + correspondentRoleToCheck, groupManager, gcubeCkanDataCatalogServiceImpl, orgsInWhichAtLeastEditorRole); + + if(toReturn.equals(CkanRole.ADMIN)) + continue; + else if(toReturn.equals(CkanRole.EDITOR) && correspondentRoleToCheck.equals(RolesIntoOrganization.ADMIN)) + toReturn = CkanRole.ADMIN; + else // it was MEMBER + toReturn = mapRolesIntoOrganizationToCkanRole(correspondentRoleToCheck); } @@ -156,7 +164,14 @@ public class UserUtil { continue; checkIfRoleIsSetInCkanInstance(username, gCubeGroupName, gCubeGroup.getGroupId(), - correspondentRoleToCheck, groupManager, gcubeCkanDataCatalogServiceImpl, orgsInWhichAdminRole); + correspondentRoleToCheck, groupManager, gcubeCkanDataCatalogServiceImpl, orgsInWhichAtLeastEditorRole); + + if(toReturn.equals(CkanRole.ADMIN)) + continue; + else if(toReturn.equals(CkanRole.EDITOR) && correspondentRoleToCheck.equals(RolesIntoOrganization.ADMIN)) + toReturn = CkanRole.ADMIN; + else + toReturn = mapRolesIntoOrganizationToCkanRole(correspondentRoleToCheck); } }else if(groupManager.isVRE(currentGroupId)){ @@ -167,11 +182,11 @@ public class UserUtil { // get highest role RolesIntoOrganization correspondentRoleToCheck = getLiferayHighestRoleInOrg(roles); - // if it the role is ADMIN we have to be sure to set it - if(correspondentRoleToCheck.equals(RolesIntoOrganization.ADMIN)){ + // if it the role is ADMIN/EDITOR we have to be sure to set it + if(correspondentRoleToCheck.equals(RolesIntoOrganization.ADMIN) || correspondentRoleToCheck.equals(RolesIntoOrganization.EDITOR)){ checkIfRoleIsSetInCkanInstance(username, groupName, currentGroupId, - correspondentRoleToCheck, groupManager, gcubeCkanDataCatalogServiceImpl, orgsInWhichAdminRole); + correspondentRoleToCheck, groupManager, gcubeCkanDataCatalogServiceImpl, orgsInWhichAtLeastEditorRole); } } }catch(Exception e){ @@ -179,17 +194,13 @@ public class UserUtil { return CkanRole.MEMBER; } - // check the list - if(orgsInWhichAdminRole.size() > 0) - toReturn = CkanRole.ADMIN; - // return the role logger.debug("Returning role " + toReturn + " for user " + username); return toReturn; } /** - * Check if the role admin is set or must be set into the ckan instance at this scope + * Check if the role admin/editor is set or must be set into the ckan instance at this scope * @param username * @param gCubeGroupName * @param groupId @@ -204,7 +215,7 @@ public class UserUtil { String gCubeGroupName, long groupId, RolesIntoOrganization correspondentRoleToCheck, GroupManager groupManager, - GcubeCkanDataCatalogServiceImpl gcubeCkanDataCatalogServiceImpl, List orgsInWhichAdminRole) throws UserManagementSystemException, GroupRetrievalFault { + GcubeCkanDataCatalogServiceImpl gcubeCkanDataCatalogServiceImpl, List orgsInWhichAtLeastEditorRole) throws UserManagementSystemException, GroupRetrievalFault { // with this invocation, we check if the role is present in ckan and if it is not it will be added CKanUtils ckanUtils = gcubeCkanDataCatalogServiceImpl.getCkanUtilsObj(groupManager.getInfrastructureScope(groupId)); @@ -213,11 +224,11 @@ public class UserUtil { if(ckanUtils != null){ boolean res = ckanUtils.checkRole(username, gCubeGroupName, correspondentRoleToCheck); if(res){ - // get the orgs of the user + // get the orgs of the user and retrieve its title and name List ckanOrgs = ckanUtils.getOrganizationsByUser(username); for (CkanOrganization ckanOrganization : ckanOrgs) { if(ckanOrganization.getName().equals(gCubeGroupName.toLowerCase()) || ckanOrganization.getName().equals(CKanUtilsImpl.PRODUCTION_CKAN_ORGNAME_ROOT)){ - orgsInWhichAdminRole.add(new OrganizationBean(ckanOrganization.getTitle(), ckanOrganization.getName())); + orgsInWhichAtLeastEditorRole.add(new OrganizationBean(ckanOrganization.getTitle(), ckanOrganization.getName())); break; } } @@ -228,21 +239,42 @@ public class UserUtil { } /** - * Retrieve the ckan roles among a list of liferay roles + * Retrieve the ckan role among a list of liferay roles * @param roles - * @return + * @return MEMBER/EDITOR/ADMIN role */ private static RolesIntoOrganization getLiferayHighestRoleInOrg( List roles) { + // NOTE: it is supposed that there is just one role for this person correspondent to the one in the catalog for (GCubeRole gCubeRole : roles) { if(gCubeRole.getRoleName().equalsIgnoreCase(GatewayRolesNames.CATALOGUE_ADMIN.getRoleName())){ return RolesIntoOrganization.ADMIN; } + if(gCubeRole.getRoleName().equalsIgnoreCase(GatewayRolesNames.CATALOGUE_EDITOR.getRoleName())){ + return RolesIntoOrganization.EDITOR; + } } return RolesIntoOrganization.MEMBER; } + /** + * Return the correspondent CkanRole + * @param correspondentRoleToCheck + * @return + */ + private static CkanRole mapRolesIntoOrganizationToCkanRole( + RolesIntoOrganization correspondentRoleToCheck) { + switch(correspondentRoleToCheck){ + + case ADMIN: return CkanRole.ADMIN; + case EDITOR: return CkanRole.EDITOR; + case MEMBER: return CkanRole.MEMBER; + default:return null; + + } + } + /** * Builds a string made of key + scope * @param key