diff --git a/.classpath b/.classpath
index d45d644..dfe5f96 100644
--- a/.classpath
+++ b/.classpath
@@ -1,12 +1,12 @@
-
+
-
+
@@ -38,5 +38,5 @@
-
+
diff --git a/distro/changelog.xml b/distro/changelog.xml
index 616e64e..81143e4 100644
--- a/distro/changelog.xml
+++ b/distro/changelog.xml
@@ -1,23 +1,35 @@
-
+
+ Fix for bug not allowing to click on vre missing logos
+ Adapted so support VRE selection upon authorisation requests
+
+
Removed ASL Session
- Implemented Feature #4877 remove VRE association to single Category constraint
+ Implemented Feature #4877 remove VRE association to single
+ Category constraint
-
- Shows only the virtual groups available in the Site it is deployed on
- VRE was not updated in the portlet due to liferay versioning of Document Library
+
+ Shows only the virtual groups available in the Site it is
+ deployed on
+ VRE was not updated in the portlet due to liferay versioning
+ of Document Library
-
+
Ported to Liferay 6.2
-
- Bug #1855, does not show join welcome message to new users anymore
+ Bug #1855, does not show join welcome message to new users
+ anymore
Feature #861, categorized VREs by virtualGroups
-
+
diff --git a/pom.xml b/pom.xml
index 5a9cf7a..e38af73 100644
--- a/pom.xml
+++ b/pom.xml
@@ -13,7 +13,7 @@
org.gcube.portlets.user
my-vres
war
- 2.2.0-SNAPSHOT
+ 2.3.0-SNAPSHOT
My VREs Portlet
gCube My VREs Portlet shows only the VO and VREs a user is member of, divided by category.
@@ -65,6 +65,21 @@
org.gcube.dvos
usermanagement-core
+
+
+ org.gcube.resources.discovery
+ ic-client
+
+
+ org.gcube.core
+ common-scope-maps
+ provided
+
+
+ org.gcube.core
+ common-encryption
+ provided
+
com.liferay.portal
portal-service
diff --git a/src/main/java/org/gcube/portlet/user/my_vres/client/GetParameters.java b/src/main/java/org/gcube/portlet/user/my_vres/client/GetParameters.java
index 44c9e1e..40f0387 100644
--- a/src/main/java/org/gcube/portlet/user/my_vres/client/GetParameters.java
+++ b/src/main/java/org/gcube/portlet/user/my_vres/client/GetParameters.java
@@ -4,13 +4,20 @@ public class GetParameters {
String redirectURI;
String state;
String context;
- public GetParameters(String redirectURI, String state, String context) {
+ String clientId;
+ String clientSecret;
+
+
+
+ public GetParameters(String redirectURI, String state, String context, String clientId, String clientSecret) {
super();
this.redirectURI = redirectURI;
this.state = state;
this.context = context;
+ this.clientId = clientId;
+ this.clientSecret = clientSecret;
}
-
+
public String getRedirectURI() {
return redirectURI;
}
@@ -23,10 +30,20 @@ public class GetParameters {
return context;
}
+ public String getClientId() {
+ return clientId;
+ }
+
+ public String getClientSecret() {
+ return clientSecret;
+ }
+
@Override
public String toString() {
- return "GetParameters [redirectURI=" + redirectURI + ", state=" + state + ", context=" + context + "]";
+ return "GetParameters [redirectURI=" + redirectURI + ", state=" + state + ", context=" + context + ", clientId="
+ + clientId + ", clientSecret=" + clientSecret + "]";
}
-
+
+
}
diff --git a/src/main/java/org/gcube/portlet/user/my_vres/client/MyVREs.java b/src/main/java/org/gcube/portlet/user/my_vres/client/MyVREs.java
index f3214d6..72be32b 100644
--- a/src/main/java/org/gcube/portlet/user/my_vres/client/MyVREs.java
+++ b/src/main/java/org/gcube/portlet/user/my_vres/client/MyVREs.java
@@ -19,6 +19,8 @@ public class MyVREs implements EntryPoint {
public static final String GET_REDIRECTURI_PARAMETER = "redirect_uri";
public static final String GET_STATE_PARAMETER = "state";
public static final String GET_CONTEXT_PARAMETER = "context";
+ public static final String GET_CLIENT_ID_PARAMETER = "client_id";
+ public static final String GET_CLIENT_SECRET_PARAMETER = "client_secret";
public static final String GET_AUTH_TOKEN_PARAMETER = "gcube-token";
@@ -47,20 +49,23 @@ public class MyVREs implements EntryPoint {
RootPanel.get("myVREsDIV").add(new VresPanel(params));
}
else {
- myVREsService.getUserToken(params.context, params.state, new AsyncCallback() {
+ myVREsService.getUserToken(params.context, params.state, params.clientId, params.clientSecret, new AsyncCallback() {
@Override
public void onSuccess(AuthorizationBean result) {
if (result.isSuccess()) {
Location.assign(params.redirectURI+"?"+GET_AUTH_TOKEN_PARAMETER+"="+result.getToken()+"&"+GET_STATE_PARAMETER+"="+result.getState());
} else {
- RootPanel.get("myVREsDIV").add(new HTML("There were issues in managing this request: " + result.getErrorDescription()));
+ HTML message = new HTML("There were issues in managing this request: " + result.getErrorDescription());
+ message.setStyleName("portlet-msg-error");
+ RootPanel.get("myVREsDIV").insert(message, 0);
}
}
@Override
public void onFailure(Throwable caught) {
- RootPanel.get("myVREsDIV").add(new HTML("An error occurred in the server: " + caught.getMessage()));
-
+ HTML message = new HTML("An error occurred in the server: " + caught.getMessage());
+ message.setStyleName("portlet-msg-error");
+ RootPanel.get("myVREsDIV").insert(message, 0);
}
});
}
@@ -74,6 +79,9 @@ public class MyVREs implements EntryPoint {
String redirectURI = Window.Location.getParameter(GET_REDIRECTURI_PARAMETER);
String state = Window.Location.getParameter(GET_STATE_PARAMETER);
String context = Window.Location.getParameter(GET_CONTEXT_PARAMETER);
- return new GetParameters(redirectURI, state, context);
+ String clientId = Window.Location.getParameter(GET_CLIENT_ID_PARAMETER);
+ String clientSecret = Window.Location.getParameter(GET_CLIENT_SECRET_PARAMETER);
+
+ return new GetParameters(redirectURI, state, context, clientId, clientSecret);
}
}
diff --git a/src/main/java/org/gcube/portlet/user/my_vres/client/MyVREsService.java b/src/main/java/org/gcube/portlet/user/my_vres/client/MyVREsService.java
index 174de0c..c277bd2 100644
--- a/src/main/java/org/gcube/portlet/user/my_vres/client/MyVREsService.java
+++ b/src/main/java/org/gcube/portlet/user/my_vres/client/MyVREsService.java
@@ -18,5 +18,5 @@ public interface MyVREsService extends RemoteService {
String getSiteLandingPagePath();
- AuthorizationBean getUserToken(String context, String state);
+ AuthorizationBean getUserToken(String context, String state, String clientId, String clientSecret);
}
diff --git a/src/main/java/org/gcube/portlet/user/my_vres/client/MyVREsServiceAsync.java b/src/main/java/org/gcube/portlet/user/my_vres/client/MyVREsServiceAsync.java
index 8ac5a2e..e495187 100644
--- a/src/main/java/org/gcube/portlet/user/my_vres/client/MyVREsServiceAsync.java
+++ b/src/main/java/org/gcube/portlet/user/my_vres/client/MyVREsServiceAsync.java
@@ -15,6 +15,7 @@ public interface MyVREsServiceAsync {
void getSiteLandingPagePath(AsyncCallback callback);
- void getUserToken(String context, String state, AsyncCallback callback);
+ void getUserToken(String context, String state, String clientId, String clientSecret,
+ AsyncCallback callback);
}
diff --git a/src/main/java/org/gcube/portlet/user/my_vres/client/widgets/ClickableVRE.java b/src/main/java/org/gcube/portlet/user/my_vres/client/widgets/ClickableVRE.java
index 8bf3694..68bda49 100644
--- a/src/main/java/org/gcube/portlet/user/my_vres/client/widgets/ClickableVRE.java
+++ b/src/main/java/org/gcube/portlet/user/my_vres/client/widgets/ClickableVRE.java
@@ -11,6 +11,7 @@ import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.MouseOverEvent;
import com.google.gwt.event.dom.client.MouseOverHandler;
+import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.Window.Location;
import com.google.gwt.user.client.rpc.AsyncCallback;
@@ -33,8 +34,8 @@ public class ClickableVRE extends HTML {
public static final String LOADING_IMAGE = GWT.getModuleBaseURL() + "../images/loading.gif";
public static final String VLAB_IMAGE = GWT.getModuleBaseURL() + "../images/vlab.png";
- private String html = "";
-
+ private String html = "";
+ private HandlerRegistration handleReg;
public ClickableVRE(final MyVREsServiceAsync myVREsService, final VRE vre, final boolean showImage, final GetParameters params) {
super.setPixelSize(WIDTH, HEIGHT);
@@ -61,13 +62,15 @@ public class ClickableVRE extends HTML {
if (params != null) {
addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
- myVREsService.getUserToken(vre.getContext(), params.getState(), new AsyncCallback() {
+ myVREsService.getUserToken(vre.getContext(), params.getState(), params.getClientId(), params.getClientSecret(), new AsyncCallback() {
@Override
public void onSuccess(AuthorizationBean result) {
if (result.isSuccess()) {
Location.assign(params.getRedirectURI()+"?"+MyVREs.GET_AUTH_TOKEN_PARAMETER+"="+result.getToken()+"&"+MyVREs.GET_STATE_PARAMETER+"="+result.getState());
} else {
- RootPanel.get("myVREsDIV").add(new HTML("There were issues in managing this request: " + result.getErrorDescription()));
+ HTML message = new HTML("There were issues in managing this request: " + result.getErrorDescription());
+ message.setStyleName("portlet-msg-error");
+ RootPanel.get("myVREsDIV").insert(message, 0);
}
}
@@ -99,7 +102,7 @@ public class ClickableVRE extends HTML {
});
}
- addMouseOverHandler(new MouseOverHandler() {
+ handleReg = addMouseOverHandler(new MouseOverHandler() {
@Override
public void onMouseOver(MouseOverEvent event) {
if (!showImage) {
@@ -112,10 +115,14 @@ public class ClickableVRE extends HTML {
"" +
"";
setHTML(html);
+ GWT.log("Show");
+ handleReg.removeHandler();
}
}
});
+
+
}
}
diff --git a/src/main/java/org/gcube/portlet/user/my_vres/server/MyVREsServiceImpl.java b/src/main/java/org/gcube/portlet/user/my_vres/server/MyVREsServiceImpl.java
index 1f94e9b..be4dac1 100644
--- a/src/main/java/org/gcube/portlet/user/my_vres/server/MyVREsServiceImpl.java
+++ b/src/main/java/org/gcube/portlet/user/my_vres/server/MyVREsServiceImpl.java
@@ -1,5 +1,8 @@
package org.gcube.portlet.user.my_vres.server;
+import static org.gcube.resources.discovery.icclient.ICFactory.clientFor;
+import static org.gcube.resources.discovery.icclient.ICFactory.queryFor;
+
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashMap;
@@ -7,12 +10,19 @@ import java.util.List;
import javax.servlet.http.HttpServletRequest;
+import org.gcube.common.encryption.StringEncrypter;
import org.gcube.common.portal.GCubePortalConstants;
import org.gcube.common.portal.PortalContext;
+import org.gcube.common.resources.gcore.ServiceEndpoint;
+import org.gcube.common.resources.gcore.ServiceEndpoint.AccessPoint;
+import org.gcube.common.resources.gcore.utils.Group;
+import org.gcube.common.scope.api.ScopeProvider;
import org.gcube.portlet.user.my_vres.client.MyVREsService;
import org.gcube.portlet.user.my_vres.shared.AuthorizationBean;
import org.gcube.portlet.user.my_vres.shared.UserBelonging;
import org.gcube.portlet.user.my_vres.shared.VRE;
+import org.gcube.resources.discovery.client.api.DiscoveryClient;
+import org.gcube.resources.discovery.client.queries.api.SimpleQuery;
import org.gcube.vomanagement.usermanagement.GroupManager;
import org.gcube.vomanagement.usermanagement.exception.GroupRetrievalFault;
import org.gcube.vomanagement.usermanagement.exception.UserManagementSystemException;
@@ -44,7 +54,7 @@ public class MyVREsServiceImpl extends RemoteServiceServlet implements MyVREsSer
public static final String ADD_MORE_CATEGORY = "Add More";
public static final String ADD_MORE_IMAGE_PATH= "images/More.png";
-
+ private static final String SERVICE_ENDPOINT_CATEGORY = "Portal";
@Override
public String getSiteLandingPagePath() {
@@ -247,7 +257,20 @@ public class MyVREsServiceImpl extends RemoteServiceServlet implements MyVREsSer
}
@Override
- public AuthorizationBean getUserToken( String context, String state) {
+ public AuthorizationBean getUserToken(String context, String state, String clientId, String clientSecret) {
+ if (clientId == null || clientId.compareTo("")== 0) {
+ return new AuthorizationBean(null, null, false, "client_id is null, you MUST register your application to allow users connect with their D4Science Credentials");
+ }
+ if (clientSecret == null || clientSecret.compareTo("")== 0) {
+ return new AuthorizationBean(null, null, false, "client_secret is null, you MUST pass the clientSecret related to your client_id registered application to allow users connect with their D4Science Credentials");
+ }
+ String registeredClientSecret = getClientSecretFromIs(clientId);
+ if (registeredClientSecret == null) {
+ return new AuthorizationBean(null, null, false, "Your client_id ("+ clientId +") is not registered in the infrastructure, you MUST register your client_id to allow users connect with their D4Science Credentials");
+ }
+ if (registeredClientSecret.compareTo(clientSecret)!=0) {
+ return new AuthorizationBean(null, null, false, "The client_secret for clientId ("+ clientId +"), does not match");
+ }
if (state == null || state.compareTo("")== 0) {
return new AuthorizationBean(null, null, false, "State is null, please use a unique string value of your choice that is hard to guess (e.g. state=7d12bf13-111c-4f46-ab06-9e9e08ad377b). Used to prevent CSRF attacks");
}
@@ -288,5 +311,65 @@ public class MyVREsServiceImpl extends RemoteServiceServlet implements MyVREsSer
return new AuthorizationBean(token, state, true, null);
}
+//TODO: check the query, it doesn work
+ private List getPortalConfigurationFromIS(String infrastructureName, String gatewayName) throws Exception {
+ String scope = "/" + infrastructureName;
+ String currScope = ScopeProvider.instance.get();
+ ScopeProvider.instance.set(scope);
+ SimpleQuery query = queryFor(ServiceEndpoint.class);
+ query.addCondition("$resource/Profile/Category/text() eq '"+ SERVICE_ENDPOINT_CATEGORY +"'");
+ query.addCondition("$resource/Profile/Name/text() eq '"+ gatewayName +"'");
+ DiscoveryClient client = clientFor(ServiceEndpoint.class);
+ List toReturn = client.submit(query);
+ ScopeProvider.instance.set(currScope);
+ return toReturn;
+ }
+ /**
+ * look for the clientId AccessEndpoint passes as parameter
+ * @param gatewayName
+ * @param clientId
+ * @return the client secret related to the id, or null if non existent
+ */
+ private String getClientSecretFromIs(String clientId) {
+ PortalContext pContext = PortalContext.getConfiguration();
+ String gatewayName = pContext.getGatewayName(getThreadLocalRequest());
+ String scope = "/"+pContext.getInfrastructureName();
+ try {
+ List list = getPortalConfigurationFromIS(pContext.getInfrastructureName(), gatewayName);
+ if (list.size() > 1) {
+ _log.error("Too many Service Endpoints having name " + gatewayName +" in this scope having Category " + SERVICE_ENDPOINT_CATEGORY);
+ }
+ else if (list.size() == 0){
+ _log.warn("There is no Service Endpoint having name " + gatewayName +" and Category " + SERVICE_ENDPOINT_CATEGORY + " in this scope: " + scope);
+ }
+ else {
+ for (ServiceEndpoint res : list) {
+ Group apGroup = res.profile().accessPoints();
+ AccessPoint[] accessPoints = (AccessPoint[]) apGroup.toArray(new AccessPoint[apGroup.size()]);
+ for (int i = 0; i < accessPoints.length; i++) {
+ if (accessPoints[i].name().compareTo(clientId) == 0) {
+ _log.info("Found credentials for " + clientId);
+ AccessPoint found = accessPoints[i];
+ //String thumbnailURL = found.address();
+ String encrPassword = found.password();
+ String clientSecret = "";
+ try {
+ clientSecret = StringEncrypter.getEncrypter().decrypt( encrPassword);
+ _log.debug("clientSecret for " + clientId + " found");
+ return clientSecret;
+ } catch (Exception e) {
+ _log.error("Something went wrong while decrypting password for " + clientId);
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ return null;
+ }
+ return null;
+ }
}
\ No newline at end of file