Pages enfant
  • Faire un lien direct vers une Iframe dans l'ENT

Le but de cette modification est de permettre le passage de paramètres à une iframe dans l'ENT plaçant ainsi l'utilisateur qu'il soit connecté ou non dans un contexte donné.

La modification permet de passer le(s) argument(s) à l'URL connue par le portail ; le lien communiqué aux utilisateurs est du type :
https://cas.univ.fr/cas?service=https://portail.univ.fr/uPortal/Login?uP_fname%3dIntranet%26uP_args%3darticle40

--- custom/uPortal/source/org/jasig/portal/channels/CInlineFrame.java.ori    2009-06-22 09:59:55.000000000 +0200
+++ custom/uPortal/source/org/jasig/portal/channels/CInlineFrame.java    2009-06-22 11:59:54.000000000 +0200
@@ -8,6 +8,8 @@
 import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.ParserConfigurationException;
 
+import java.util.Enumeration;
+
 import org.jasig.portal.ChannelCacheKey;
 import org.jasig.portal.GeneralRenderingException;
 import org.jasig.portal.ICacheable;
@@ -47,9 +49,24 @@
    *
    */
   public void renderXML (ContentHandler out) throws PortalException {
+    String targetArgs = "";
+    Enumeration runtimeEnu = runtimeData.getParameterNames();
+    while ( runtimeEnu.hasMoreElements() ) {
+           String runtimeP = runtimeEnu.nextElement();
+           if(runtimeP.equals("uP_args"))
{
\+               targetArgs \+= runtimeData.getParameter(runtimeP);
\+           }
+    }
+    String srcUrl = staticData.getParameter("url");
+
+    if ( srcUrl.matches(".http.?.*"))
{
\+    srcUrl \+= "&" + targetArgs;
\+    }
 else
{
\+    srcUrl \+= "?" + targetArgs; // the url for the IFrame content
\+    }
 
     // Obtain url and height, both static parameters
-    String srcUrl = staticData.getParameter("url"); // the url for the IFrame content
+    // String srcUrl = staticData.getParameter("url"); // the url for the IFrame content
     String frameHeight = staticData.getParameter("height"); // the height of the IFrame in pixels
     String iFrameName = staticData.getParameter("iFrameName"); // the name of the IFrame in pixels
  • Aucune étiquette

2 commentaires

  1. NB : ne fonctionne pas en portail 3.2.4 (CInlineFrame.java n'étant plus utilisé)

  2. Voici une solution similaire qui fonctionne en portail 3.2.4.
    Elle permet de passer des URLs du type :

    https://cas.univ.fr/cas/index.jsp?service=https://esup.univ.fr/Login?uP_fname=XXXX%26uP_args=https://glpi.univ.fr/index.php%3Fredirect%3Dticket_17227

    (nb : c'est une solution plus souple car permettant une variété d'url pour une application donnée, sans toucher à l'appli en question)

    Date:   Wed Jul 4 14:28:06 2012 +0200
    
        iframe channel: handle deep linking ( ...?uP_fname=foo&uP_args=http://foo/bar/param )
    
    diff --git a/Portail/uPortal_rel-3.2.4/uportal-impl/src/main/java/org/jasig/portal/portlets/iframe/IFramePortletController.java b/Portail/uPortal_rel-3.2.4/uportal-impl/src/main/java/org/jasig/portal/portlets/iframe/IFramePortletController.java
    index 375c49b..fe3e119 100644
    --- a/Portail/uPortal_rel-3.2.4/uportal-impl/src/main/java/org/jasig/portal/portlets/iframe/IFramePortletController.java
    +++ b/Portail/uPortal_rel-3.2.4/uportal-impl/src/main/java/org/jasig/portal/portlets/iframe/IFramePortletController.java
    @@ -26,6 +26,15 @@ import javax.portlet.PortletPreferences;
     import javax.portlet.RenderRequest;
     import javax.portlet.RenderResponse;
     
    +import java.net.URL;
    +import java.net.URLDecoder;
    +import java.net.URLEncoder;
    +import javax.portlet.PortletRequest;
    +import javax.servlet.http.HttpServletRequest;
    +import org.apache.commons.logging.Log;
    +import org.apache.commons.logging.LogFactory;
    +import org.jasig.portal.channels.portlet.PortletHttpServletRequestWrapper;
    +
     import org.springframework.web.portlet.ModelAndView;
     import org.springframework.web.portlet.mvc.AbstractController;
     
    @@ -42,6 +51,14 @@ import org.springframework.web.portlet.mvc.AbstractController;
      */
     public class IFramePortletController extends AbstractController {
     
    +	private static boolean automaticExternalURLStats() {
    +		return true;
    +	}
    +
    +	private static Class currentClass() {
    +		return IFramePortletController.class;
    +	}
    +
     	@Override
     	protected ModelAndView handleRenderRequestInternal(RenderRequest request,
     			RenderResponse response) throws Exception {
    @@ -51,10 +68,100 @@ public class IFramePortletController extends AbstractController {
     		// get the IFrame target URL and the configured height of the IFrame
     		// window from the portlet preferences
     		PortletPreferences preferences = request.getPreferences();
    -		model.put("url", preferences.getValue("url", null));
    +		model.put("url", computeUrl(preferences, request));
     		model.put("height", preferences.getValue("height", null));
     		
     		return new ModelAndView("/jsp/IFrame/iframePortlet", model);
     	}
     
    +	private static String computeUrl(PortletPreferences preferences, PortletRequest request) {
    +		String urlFromDB = preferences.getValue("url", null);
    +
    +		HttpServletRequest originalRequest = getPortletHttpRequest(request);
    +		String urlFromUrl = getParameter(originalRequest, "uP_args");
    +		String fname = getParameter(originalRequest, "uP_fname");
    +		if (urlFromUrl != null && fname != null && isUrlFromUrlValid(urlFromDB, urlFromUrl))
    +			return mayAddExternalURLStats(urlFromUrl, fname);
    +		else
    +			return urlFromDB;
    +        }
    +
    +	private static String mayAddExternalURLStats(String url, String fname) {
    +		return automaticExternalURLStats() ? addExternalURLStats(url, fname) : url;
    +	}
    +	private static String addExternalURLStats(String url, String fname) {
    +		return "/ExternalURLStats?fname=" + URLEncoder.encode(fname) + "&service=" + URLEncoder.encode(url);
    +	}
    +	private static String mayRemoveExternalURLStats(String url) {
    +		String query = removePrefixOrNull(url, "/ExternalURLStats?");
    +		return query == null ? url : getGETParameter(query, "service");
    +	}
    +
    +	// allowed: https://foo.bar/BOO and https://foo.bar/ZZZ 
    +	// disallowed: different protocol or different host or different port
    +	private static boolean isUrlFromUrlValid(String urlFromDB_, String urlFromUrl) {
    +		String urlFromDB = mayRemoveExternalURLStats(urlFromDB_);
    +		URL fromDB = urlRoot(urlFromDB);
    +		URL fromUrl = urlRoot(urlFromUrl);
    +		if (fromDB == null) {
    +			log().warn("Refusing iframe uP_args because urlFromDB " + urlFromDB + " is malformed");
    +			return false;
    +		} else if (fromUrl == null) {
    +			log().warn("Refusing iframe uP_args=" + urlFromUrl + " because given url is malformed");
    +			return false;
    +		} else {
    +			boolean isValid = fromDB.equals(fromUrl);
    +			if (!isValid) log().warn("Refusing iframe uP_args=" + urlFromUrl + " because " + fromDB + " != " + fromUrl);
    +			return isValid;
    +		}
    +	}
    +
    +	private static URL urlRoot(String url) {
    +		try {
    +			return new URL(new URL(url), "/");
    +		} catch (java.net.MalformedURLException e) {
    +			return null;
    +		}
    +	}
    +
    +	private static Log log() {
    +		return LogFactory.getLog(currentClass());
    +	}
    +
    +	// copied from PortalRequestUtilsImpl.java
    +	private static HttpServletRequest getPortletHttpRequest(PortletRequest portletRequest) {
    +		final HttpServletRequest portalRequest = (HttpServletRequest)portletRequest.getAttribute(PortletHttpServletRequestWrapper.ATTRIBUTE__HTTP_SERVLET_REQUEST);
    +		if (portalRequest != null) {
    +			return portalRequest;
    +		}
    +        
    +		throw new IllegalArgumentException("The orginal portlet HttpServletRequest is not available from the PortletRequest using attribute '" + PortletHttpServletRequestWrapper.ATTRIBUTE__HTTP_SERVLET_REQUEST + "'");
    +	}
    +
    +	private static String getParameter(HttpServletRequest request, String param) {
    +		String query = request.getQueryString();
    +		return query == null ? null : getGETParameter(query, param);
    +	}
    +
    +	// inspired from http://stackoverflow.com/questions/1667278/parsing-query-strings-in-java/1667624#1667624
    +	private static String getGETParameter(String query, String param) {
    +		for (String pairS : query.split("&")) {
    +			String pair[] = pairS.split("=");
    +			try {
    +				String key = URLDecoder.decode(pair[0], "UTF-8");
    +				if (key.equals(param)) 
    +					return pair.length > 1 ? URLDecoder.decode(pair[1], "UTF-8") : "";
    +			} catch (java.io.UnsupportedEncodingException e) {
    +				// ignore...
    +			}
    +		}
    +		return null;
    +	}
    +
    +	private static String removePrefixOrNull(String s, String prefix) {
    +		if (s.startsWith(prefix))
    +			return s.substring(prefix.length());
    +		else
    +			return null;
    +	}
     }