Logout from ckan through new servlet

git-svn-id: http://svn.d4science-ii.research-infrastructures.eu/gcube/trunk/portlets/user/gcube-ckan-datacatalog@129484 82a268e6-3cf1-43bd-a215-b396298e98cf
This commit is contained in:
Francesco Mangiacrapa 2016-06-27 14:58:01 +00:00
parent 01da3f0a93
commit d7a7922126
5 changed files with 231 additions and 21 deletions

View File

@ -25,6 +25,11 @@ import org.gcube.portlets.widgets.ckandatapublisherwidget.client.ui.CreateDatase
import com.github.gwtbootstrap.client.ui.Modal;
import com.google.gwt.event.shared.HandlerManager;
import com.google.gwt.http.client.Request;
import com.google.gwt.http.client.RequestBuilder;
import com.google.gwt.http.client.RequestCallback;
import com.google.gwt.http.client.RequestException;
import com.google.gwt.http.client.Response;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
@ -173,7 +178,33 @@ public class CkanEventHandlerManager {
@Override
public void onLogout(NotifyLogoutEvent editMetadataEvent) {
GCubeCkanDataCatalog.service.logoutFromCkan(new AsyncCallback<Void>() {
// com.google.gwt.user.client.Window.open(GCubeCkanDataCatalog.CKAN_LOGUT_SERVICE, "_blank", "");
// com.google.gwt.user.client.Window.open("https://ckan-d-d4s.d4science.org:443/ckan-connector/gcube/service/disconnect?gcube-token=4620e6d0-2313-4f48-9d54-eb3efd01a810", "_blank", "");
RequestBuilder logutRequestBuilder = new RequestBuilder(RequestBuilder.GET, GCubeCkanDataCatalog.CKAN_LOGUT_SERVICE);
logutRequestBuilder.setCallback(new RequestCallback() {
@Override
public void onResponseReceived(Request request, Response response) {
// Window.alert("Logout: "+response.getHeadersAsString());
}
@Override
public void onError(Request request, Throwable exception) {
// TODO Auto-generated method stub
}
});
try {
logutRequestBuilder.send();
} catch ( RequestException e ) {
Window.alert("Error on logout");
}
/*GCubeCkanDataCatalog.service.logoutFromCkan(new AsyncCallback<Void>() {
@Override
public void onFailure(Throwable caught) {
@ -188,7 +219,7 @@ public class CkanEventHandlerManager {
// TODO Auto-generated method stub
}
});
});*/
}
});

View File

@ -5,7 +5,7 @@ import org.gcube.portlets.gcubeckan.gcubeckandatacatalog.client.event.NotifyLogo
import org.gcube.portlets.gcubeckan.gcubeckandatacatalog.client.view.GCubeCkanDataCatalogPanel;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.shared.GWT;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.Window.ClosingEvent;
import com.google.gwt.user.client.ui.RootPanel;
@ -21,6 +21,8 @@ public class GCubeCkanDataCatalog implements EntryPoint {
* service.
*/
public static final GcubeCkanDataCatalogServiceAsync service = GWT.create(GcubeCkanDataCatalogService.class);
public static final String CKAN_LOGUT_SERVICE = GWT.getModuleBaseURL() + "gcubeckanlogout";
private final String DIV_PORTLET_ID = "gCubeCkanDataCatalog";
private CkanEventHandlerManager eventManager = new CkanEventHandlerManager();
public static final String GET_PATH_PARAMETER = "path";

View File

@ -0,0 +1,147 @@
/**
*
*/
package org.gcube.portlets.gcubeckan.gcubeckandatacatalog.server;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.gcube.application.framework.core.session.ASLSession;
import org.gcube.application.framework.core.session.SessionManager;
import org.gcube.portlets.gcubeckan.gcubeckandatacatalog.shared.CkanConnectorAccessPoint;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import eu.trentorise.opendata.jackan.internal.org.apache.http.HttpStatus;
import eu.trentorise.opendata.traceprov.internal.org.apache.commons.io.IOUtils;
/**
*
* @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it
* Jun 27, 2016
*/
public class CkanLogout extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = 2793892309831716065L;
private static Logger logger = LoggerFactory.getLogger(CkanLogout.class);
/* (non-Javadoc)
* @see javax.servlet.http.HttpServlet#doDelete(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
logger.info("CkanLogout performing...");
HttpSession httpSession = req.getSession();
ASLSession session = getASLSession(httpSession);
String username = session.getUsername();
CkanConnectorAccessPoint ckanAP = SessionUtil.getCkanAccessPoint(req.getSession());
// String token = getGcubeSecurityToken();
logger.info("Logout from CKAN for: "+username +" by token: "+ckanAP.getGcubeTokenValue());
String ckanConnectorLogut = getServletContext().getInitParameter(GcubeCkanDataCatalogServiceImpl.CKANCONNECTORLOGOUT);
logger.debug(GcubeCkanDataCatalogServiceImpl.CKANCONNECTORLOGOUT + " is: "+ckanConnectorLogut);
CkanConnectorAccessPoint ckan = new CkanConnectorAccessPoint(ckanAP.getBaseUrl());
ckan.addPathInfo(ckanConnectorLogut);
ckan.addGubeToken(ckanAP.getGcubeTokenValue());
URL url;
try {
String deleteURI = ckan.buildURI();
logger.debug("Perfoming HTTP delete to URI: "+deleteURI);
url = new URL(deleteURI);
HttpURLConnection httpCon = (HttpURLConnection) url.openConnection();
// httpCon.setDoOutput(true);
// httpCon.setRequestProperty("Content-Type", "application/x-www-form-urlencoded" );
// httpCon.setRequestProperty(key, value);
httpCon.setRequestMethod("GET");
// httpCon.setRequestMethod("DELETE");
httpCon.connect();
HttpServletResponse response = resp;
if(httpCon.getResponseCode()==HttpStatus.SC_OK){
response.setContentLength(httpCon.getContentLength());
Map<String, List<String>> map = httpCon.getHeaderFields();
for (String key : map.keySet()) {
String hf = httpCon.getHeaderField(key);
logger.trace("key: "+key +", value: "+hf);
if(key==null){
logger.trace("skip key: "+key +", value: "+hf);
}else
response.setHeader(key,hf);
}
response.setContentLength(httpCon.getContentLength());
String encoding = httpCon.getContentEncoding();
encoding = encoding == null ? GcubeCkanDataCatalogServiceImpl.UTF_8 : encoding;
response.setCharacterEncoding(encoding);
response.setStatus(HttpStatus.SC_OK);
response.setContentType(httpCon.getContentType());
// Cookie cookie = new Cookie("user", null); // Not necessary, but saves bandwidth.
// cookie.setPath("/MyApplication");
// cookie.setHttpOnly(true);
// cookie.setMaxAge(0); // Don't set to -1 or it will become a session cookie!
// response.addCookie(cookie);
InputStream in = httpCon.getInputStream();
ServletOutputStream out = response.getOutputStream();
IOUtils.copy(in, out);
logger.info("Logout Completed, response code: "+HttpStatus.SC_OK);
}else{
logger.warn("An error occurred during perfoming CKAN logout, Response status is: "+httpCon.getResponseCode());
logger.warn(IOUtils.toString(httpCon.getErrorStream()));
}
}
catch (IOException e) {
logger.error("An error occured during performing Logout from CKAN for: "+username +" by token: "+ckanAP.getGcubeTokenValue(), e);
}
}
/**
* Gets the ASL session.
*
* @param httpSession the http session
* @return the ASL session
*/
protected ASLSession getASLSession(HttpSession httpSession)
{
String sessionID = httpSession.getId();
String user = (String) httpSession.getAttribute(GcubeCkanDataCatalogServiceImpl.USERNAME_ATTRIBUTE);
if (user == null) {
logger.warn("****** STARTING IN TEST MODE - NO USER FOUND *******");
//for test only
user = GcubeCkanDataCatalogServiceImpl.TEST_USER;
httpSession.setAttribute(GcubeCkanDataCatalogServiceImpl.USERNAME_ATTRIBUTE, user);
ASLSession session = SessionManager.getInstance().getASLSession(sessionID, user);
session.setScope(GcubeCkanDataCatalogServiceImpl.TEST_SCOPE);
session.setUserEmailAddress(GcubeCkanDataCatalogServiceImpl.TEST_MAIL);
//session.setScope("/gcube/devsec/devVRE");
return session;
} else logger.trace("user found in session "+user);
return SessionManager.getInstance().getASLSession(sessionID, user);
}
}

View File

@ -10,6 +10,8 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.commons.codec.binary.Base64;
@ -46,6 +48,10 @@ import eu.trentorise.opendata.traceprov.internal.org.apache.commons.io.IOUtils;
@SuppressWarnings("serial")
public class GcubeCkanDataCatalogServiceImpl extends RemoteServiceServlet implements GcubeCkanDataCatalogService {
/**
*
*/
public static final String UTF_8 = "UTF-8";
private static final String PORT_HTTP = ":80";
private static final String PORT_HTTPS = ":443";
private static final String HTTPS = "https";
@ -57,10 +63,10 @@ public class GcubeCkanDataCatalogServiceImpl extends RemoteServiceServlet implem
private static Logger logger = LoggerFactory.getLogger(GcubeCkanDataCatalogServiceImpl.class);
private final static String DEFAULT_ROLE = "OrganizationMember";
private final static String TEST_USER = "francesco.mangiacrapa";
private final static String TEST_SCOPE = "/gcube/devsec/devVRE";
private final static String TEST_MAIL = "francesco.mangiacrapa@isti.cnr.it";
private final static String TEST_SEC_TOKEN = "4620e6d0-2313-4f48-9d54-eb3efd01a810";
public final static String TEST_USER = "francesco.mangiacrapa";
public final static String TEST_SCOPE = "/gcube/devsec/devVRE";
public final static String TEST_MAIL = "francesco.mangiacrapa@isti.cnr.it";
public final static String TEST_SEC_TOKEN = "4620e6d0-2313-4f48-9d54-eb3efd01a810";
// private final static String TEST_SEC_TOKEN = "f539884c-8697-4ac0-9bbf-2f4d595281f5";
public static final String CKAN_TOKEN_KEY = "ckanToken";
@ -409,17 +415,31 @@ public class GcubeCkanDataCatalogServiceImpl extends RemoteServiceServlet implem
httpCon.setRequestMethod("DELETE");
httpCon.connect();
HttpServletResponse response = this.getThreadLocalResponse();
if(httpCon.getResponseCode()==HttpStatus.SC_OK){
response.setContentLength(httpCon.getContentLength());
Map<String, List<String>> map = httpCon.getHeaderFields();
for (String key : map.keySet()) {
logger.trace("key: "+key +", value: "+map.get(key));
String hf = httpCon.getHeaderField(key);
logger.trace("key: "+key +", value: "+hf);
if(key==null){
logger.trace("skyp key: "+key +", value: "+hf);
}else
response.setHeader(key,hf);
}
InputStream in = httpCon.getInputStream();
response.setContentLength(httpCon.getContentLength());
String encoding = httpCon.getContentEncoding();
encoding = encoding == null ? "UTF-8" : encoding;
String body = IOUtils.toString(in, encoding);
logger.debug("response: "+body);
encoding = encoding == null ? UTF_8 : encoding;
response.setCharacterEncoding(encoding);
response.setStatus(HttpStatus.SC_OK);
InputStream in = httpCon.getInputStream();
ServletOutputStream out = response.getOutputStream();
IOUtils.copy(in, out);
logger.info("Logout Completed, response code: "+HttpStatus.SC_OK);
}else{
logger.warn("An error occurred during perfoming CKAN logout, Response status is: "+httpCon.getResponseCode());
}
@ -427,10 +447,9 @@ public class GcubeCkanDataCatalogServiceImpl extends RemoteServiceServlet implem
catch (IOException e) {
logger.error("An error occured during performing Logout from CKAN for: "+username +" by token: "+ckanAP.getGcubeTokenValue(), e);
}
}
/*
public static void main(String[] args) {
URL url;
@ -462,6 +481,5 @@ public class GcubeCkanDataCatalogServiceImpl extends RemoteServiceServlet implem
catch (IOException e) {
logger.error("An error occured during performing Logout from CKAN", e);
}
}
}*/
}

View File

@ -10,11 +10,12 @@
<param-value>/gcube/service/connect</param-value>
</context-param>
<!-- <context-param> -->
<!-- <description>Used like GET parameter in order to hide header section of CKAN template from gCube Portal</description> -->
<!-- <param-name>CkanHideHeader</param-name> -->
<!-- <param-value>hh</param-value> -->
<!-- </context-param> -->
<!-- <context-param> -->
<!-- <description>Used like GET parameter in order to hide header section
of CKAN template from gCube Portal</description> -->
<!-- <param-name>CkanHideHeader</param-name> -->
<!-- <param-value>hh</param-value> -->
<!-- </context-param> -->
<context-param>
<description>ckan connector logout from CKAN</description>
@ -28,6 +29,12 @@
<servlet-class>org.gcube.portlets.gcubeckan.gcubeckandatacatalog.server.GcubeCkanDataCatalogServiceImpl</servlet-class>
</servlet>
<servlet>
<servlet-name>gcubeckanlogout</servlet-name>
<servlet-class>org.gcube.portlets.gcubeckan.gcubeckandatacatalog.server.CkanLogout</servlet-class>
</servlet>
<servlet>
<servlet-name>ckanpublisherservices</servlet-name>
<servlet-class>org.gcube.portlets.widgets.ckandatapublisherwidget.server.CKANPublisherServicesImpl</servlet-class>
@ -44,6 +51,11 @@
<url-pattern>/gCubeCkanDataCatalog/ckanservices</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>gcubeckanlogout</servlet-name>
<url-pattern>/gCubeCkanDataCatalog/gcubeckanlogout</url-pattern>
</servlet-mapping>
<!-- Default page to serve -->