/** * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. */ package com.liferay.web.proxy.web.internal.portlet; import com.liferay.portal.kernel.log.Log; import com.liferay.portal.kernel.log.LogFactoryUtil; import com.liferay.portal.kernel.model.Release; import com.liferay.portal.kernel.servlet.BufferCacheServletResponse; import com.liferay.portal.kernel.util.ContentTypes; import com.liferay.portal.kernel.util.HashMapDictionary; import com.liferay.portal.kernel.util.StringPool; import com.liferay.portal.kernel.util.StringUtil; import com.liferay.portal.kernel.util.Validator; import com.liferay.portlet.RenderResponseImpl; import com.liferay.web.proxy.web.internal.constants.WebProxyPortletKeys; import java.io.IOException; import java.io.PrintWriter; import java.util.Dictionary; import javax.portlet.Portlet; import javax.portlet.PortletConfig; import javax.portlet.PortletContext; import javax.portlet.PortletException; import javax.portlet.PortletPreferences; import javax.portlet.PortletRequestDispatcher; import javax.portlet.RenderRequest; import javax.portlet.RenderResponse; import javax.servlet.Servlet; import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceRegistration; import org.osgi.service.component.ComponentContext; import org.osgi.service.component.annotations.Activate; import org.osgi.service.component.annotations.Component; import org.osgi.service.component.annotations.Deactivate; import org.osgi.service.component.annotations.Reference; import org.osgi.service.http.whiteboard.HttpWhiteboardConstants; import org.portletbridge.portlet.PortletBridgePortlet; import org.portletbridge.portlet.PortletBridgeServlet; /** * @author Brian Wing Shun Chan */ @Component( immediate = true, property = { "com.liferay.portlet.css-class-wrapper=portlet-web-proxy", "com.liferay.portlet.display-category=category.sample", "com.liferay.portlet.instanceable=true", "com.liferay.portlet.preferences-owned-by-group=true", "com.liferay.portlet.private-request-attributes=false", "com.liferay.portlet.private-session-attributes=false", "com.liferay.portlet.render-weight=50", "javax.portlet.display-name=Web Proxy", "javax.portlet.expiration-cache=0", "javax.portlet.init-param.authenticatorClassName=org.portletbridge.portlet.DefaultBridgeAuthenticator", "javax.portlet.init-param.cssRegex=(?:url\\((?:'|\")?(.*?)(?:'|\")?\\))|(?:@import\\s+[^url](?:'|\")?(.*?)(?:'|\")|;|\\s+|$)", "javax.portlet.init-param.editStylesheet=classpath:/org/portletbridge/xsl/pages/edit.xsl", "javax.portlet.init-param.errorStylesheet=classpath:/org/portletbridge/xsl/pages/error.xsl", "javax.portlet.init-param.helpStylesheet=classpath:/org/portletbridge/xsl/pages/help.xsl", "javax.portlet.init-param.idParamKey=id", "javax.portlet.init-param.jsRegex=open\\('([^']*)'|open\\(\"([^\\\"]*)\"", "javax.portlet.init-param.mementoSessionKey=mementoSessionKey", "javax.portlet.init-param.parserClassName=org.cyberneko.html.parsers.SAXParser", "javax.portlet.init-param.servletName=pbhs", "javax.portlet.init-param.stylesheetUrl=classpath:/org/portletbridge/xsl/default.xsl", "javax.portlet.name=" + WebProxyPortletKeys.WEB_PROXY, "javax.portlet.preferences=classpath:/META-INF/portlet-preferences/default-portlet-preferences.xml", "javax.portlet.resource-bundle=content.Language", "javax.portlet.security-role-ref=power-user,user" }, service = Portlet.class ) public class WebProxyPortlet extends PortletBridgePortlet { @Override public void destroy() { if (_serviceRegistration != null) { _serviceRegistration.unregister(); } super.destroy(); } @Override public void doView( RenderRequest renderRequest, RenderResponse renderResponse) throws IOException, PortletException { if (!_enabled) { printError(renderResponse); return; } PortletPreferences portletPreferences = renderRequest.getPreferences(); String initUrl = portletPreferences.getValue( "initUrl", StringPool.BLANK); if (Validator.isNull(initUrl)) { PortletContext portletContext = getPortletContext(); PortletRequestDispatcher portletRequestDispatcher = portletContext.getRequestDispatcher("/portlet_not_setup.jsp"); portletRequestDispatcher.include(renderRequest, renderResponse); } else { super.doView(renderRequest, renderResponse); RenderResponseImpl renderResponseImpl = (RenderResponseImpl)renderResponse; BufferCacheServletResponse bufferCacheServletResponse = (BufferCacheServletResponse) renderResponseImpl.getHttpServletResponse(); String output = bufferCacheServletResponse.getString(); output = StringUtil.replace( output, "//pbhs/", renderRequest.getContextPath() + "/pbhs/"); bufferCacheServletResponse.setString(output); } } @Override public void init() { try { super.init(); doInit(); _enabled = true; } catch (Exception e) { if (_log.isWarnEnabled()) { _log.warn(e.getMessage()); } } } @Activate protected void activate(ComponentContext componentContext) { _componentContext = componentContext; } @Deactivate protected void deactivate() { _componentContext = null; } protected void doInit() { BundleContext bundleContext = _componentContext.getBundleContext(); Dictionary<String, Object> properties = new HashMapDictionary<>(); PortletConfig portletConfig = getPortletConfig(); PortletContext portletContext = getPortletContext(); properties.put( HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, portletContext.getPortletContextName()); properties.put( HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_NAME, PortletBridgeServlet.class.getName()); properties.put( HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/pbhs/*"); properties.put( HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_INIT_PARAM_PREFIX + "cssRegex", portletConfig.getInitParameter("cssRegex")); properties.put( HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_INIT_PARAM_PREFIX + "ignorePostToGetRequestHeaders", "content-type,content-length"); properties.put( HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_INIT_PARAM_PREFIX + "ignoreRequestHeaders", "accept-encoding,connection,keep-alive"); properties.put( HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_INIT_PARAM_PREFIX + "jsRegex", portletConfig.getInitParameter("jsRegex")); properties.put( HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_INIT_PARAM_PREFIX + "mementoSessionKey", portletConfig.getInitParameter("mementoSessionKey")); _serviceRegistration = bundleContext.registerService( Servlet.class, new PortletBridgeServlet(), properties); } protected void printError(RenderResponse renderResponse) throws IOException { renderResponse.setContentType(ContentTypes.TEXT_HTML_UTF8); try (PrintWriter writer = renderResponse.getWriter()) { writer.print( "WebProxyPortlet will not be enabled unless Liferay's " + "serializer.jar and xalan.jar files are copied to the " + "JDK's endorsed directory"); } } @Reference( target = "(&(release.bundle.symbolic.name=com.liferay.web.proxy.web)(release.schema.version=1.0.0))", unbind = "-" ) protected void setRelease(Release release) { } private static final Log _log = LogFactoryUtil.getLog( WebProxyPortlet.class); private ComponentContext _componentContext; private boolean _enabled; private ServiceRegistration<?> _serviceRegistration; }