Commit 626417c6 authored by daryl herzmann's avatar daryl herzmann Committed by GitHub

Merge pull request #685 from guusdk/OF-1227_Plugin-servlet-filter

OF-1227: Plugins should be able to have proper servlet filters.
parents 61a34e5d e828c22f
......@@ -29,6 +29,7 @@ import java.net.URLClassLoader;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import org.jivesoftware.openfire.XMPPServer;
import org.slf4j.Logger;
......
/*
* Copyright 2016 IgniteRealtime.org
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jivesoftware.openfire.container;
import javax.servlet.*;
import javax.servlet.descriptor.JspConfigDescriptor;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.*;
/**
* A Servlet Context to be used by Openfire plugins.
*
* This implementation is used do load resources from the plugin classpath. Other functionality is delegated to a proxy
* implementation.
*
* @author Guus der Kinderen, guus.der.kinderen@gmail.com
*/
public class PluginServletContext implements ServletContext
{
protected final ServletContext proxy;
private final PluginManager pluginManager;
private final Plugin plugin;
public PluginServletContext( ServletContext proxy, PluginManager pluginManager, Plugin plugin )
{
this.proxy = proxy;
this.pluginManager = pluginManager;
this.plugin = plugin;
}
/**
* The plugin classloader is an URL classloadeer, which will do lookups in directories with entries like these:
* jar:file:/home/guus/github/Openfire/target/openfire/plugins/oauthresourceserver/lib/plugin-oauthresourceserver.jar!/
* (note the trailing slash).
*
* To prevent lookup failures, strip any leading slash (which, when concatinated, would result "//").
*
* @param input A string (cannot be null)
* @return The string without the first leading slash.
*/
protected static String stripLeadingSlash( String input ) {
if (input.startsWith("/"))
{
return input.substring(1);
}
else{
return input;
}
}
@Override
public String getContextPath()
{
return proxy.getContextPath();
}
@Override
public ServletContext getContext( String s )
{
return proxy.getContext( s );
}
@Override
public int getMajorVersion()
{
return proxy.getMajorVersion();
}
@Override
public int getMinorVersion()
{
return proxy.getMinorVersion();
}
@Override
public int getEffectiveMajorVersion()
{
return proxy.getEffectiveMajorVersion();
}
@Override
public int getEffectiveMinorVersion()
{
return proxy.getEffectiveMinorVersion();
}
@Override
public String getMimeType( String s )
{
return proxy.getMimeType( s );
}
@Override
public Set<String> getResourcePaths( String s )
{
final String pluginPath = "/plugins/" + pluginManager.getName( plugin ) + "/";
final Set<String> proxyResults = proxy.getResourcePaths( pluginPath + s );
final Set<String> results = new HashSet<>();
for ( final String proxyResult : proxyResults )
{
results.add( proxyResult.replaceFirst( pluginPath, "" ) );
}
return results;
}
@Override
public URL getResource( String s ) throws MalformedURLException
{
return pluginManager.getPluginClassloader( plugin ).getResource( stripLeadingSlash( s ) );
}
@Override
public InputStream getResourceAsStream( String s )
{
return pluginManager.getPluginClassloader( plugin ).getResourceAsStream( stripLeadingSlash( s ) );
}
@Override
public RequestDispatcher getRequestDispatcher( String s )
{
return proxy.getRequestDispatcher( s );
}
@Override
public RequestDispatcher getNamedDispatcher( String s )
{
return proxy.getNamedDispatcher( s );
}
@Override
public Servlet getServlet( String s ) throws ServletException
{
return proxy.getServlet( s );
}
@Override
public Enumeration<Servlet> getServlets()
{
return proxy.getServlets();
}
@Override
public Enumeration<String> getServletNames()
{
return proxy.getServletNames();
}
@Override
public void log( String s )
{
proxy.log( s );
}
@Override
public void log( Exception e, String s )
{
proxy.log( e, s );
}
@Override
public void log( String s, Throwable throwable )
{
proxy.log( s, throwable );
}
@Override
public String getRealPath( String s )
{
return null;
}
@Override
public String getServerInfo()
{
return proxy.getServerInfo();
}
@Override
public String getInitParameter( String s )
{
return proxy.getInitParameter( s );
}
@Override
public Enumeration<String> getInitParameterNames()
{
return proxy.getInitParameterNames();
}
@Override
public boolean setInitParameter( String s, String s1 )
{
return proxy.setInitParameter( s, s1 );
}
@Override
public Object getAttribute( String s )
{
return proxy.getAttribute( s );
}
@Override
public Enumeration<String> getAttributeNames()
{
return proxy.getAttributeNames();
}
@Override
public void setAttribute( String s, Object o )
{
proxy.setAttribute( s, o );
}
@Override
public void removeAttribute( String s )
{
proxy.removeAttribute( s );
}
@Override
public String getServletContextName()
{
return proxy.getServletContextName();
}
@Override
public ServletRegistration.Dynamic addServlet( String s, String s1 )
{
return proxy.addServlet( s, s1 );
}
@Override
public ServletRegistration.Dynamic addServlet( String s, Servlet servlet )
{
return proxy.addServlet( s, servlet );
}
@Override
public ServletRegistration.Dynamic addServlet( String s, Class<? extends Servlet> aClass )
{
return proxy.addServlet( s, aClass );
}
@Override
public <T extends Servlet> T createServlet( Class<T> aClass ) throws ServletException
{
return proxy.createServlet( aClass );
}
@Override
public ServletRegistration getServletRegistration( String s )
{
return proxy.getServletRegistration( s );
}
@Override
public Map<String, ? extends ServletRegistration> getServletRegistrations()
{
return proxy.getServletRegistrations();
}
@Override
public FilterRegistration.Dynamic addFilter( String s, String s1 )
{
return proxy.addFilter( s, s1 );
}
@Override
public FilterRegistration.Dynamic addFilter( String s, Filter filter )
{
return proxy.addFilter( s, filter );
}
@Override
public FilterRegistration.Dynamic addFilter( String s, Class<? extends Filter> aClass )
{
return proxy.addFilter( s, aClass );
}
@Override
public <T extends Filter> T createFilter( Class<T> aClass ) throws ServletException
{
return proxy.createFilter( aClass );
}
@Override
public FilterRegistration getFilterRegistration( String s )
{
return proxy.getFilterRegistration( s );
}
@Override
public Map<String, ? extends FilterRegistration> getFilterRegistrations()
{
return proxy.getFilterRegistrations();
}
@Override
public SessionCookieConfig getSessionCookieConfig()
{
return proxy.getSessionCookieConfig();
}
@Override
public void setSessionTrackingModes( Set<SessionTrackingMode> set )
{
proxy.setSessionTrackingModes( set );
}
@Override
public Set<SessionTrackingMode> getDefaultSessionTrackingModes()
{
return proxy.getDefaultSessionTrackingModes();
}
@Override
public Set<SessionTrackingMode> getEffectiveSessionTrackingModes()
{
return proxy.getEffectiveSessionTrackingModes();
}
@Override
public void addListener( String s )
{
proxy.addListener( s );
}
@Override
public <T extends EventListener> void addListener( T t )
{
proxy.addListener( t );
}
@Override
public void addListener( Class<? extends EventListener> aClass )
{
proxy.addListener( aClass );
}
@Override
public <T extends EventListener> T createListener( Class<T> aClass ) throws ServletException
{
return proxy.createListener( aClass );
}
@Override
public JspConfigDescriptor getJspConfigDescriptor()
{
return proxy.getJspConfigDescriptor();
}
@Override
public ClassLoader getClassLoader()
{
return pluginManager.getPluginClassloader( plugin );
}
@Override
public void declareRoles( String... strings )
{
proxy.declareRoles( strings );
}
@Override
public String getVirtualServerName()
{
return proxy.getVirtualServerName();
}
}
This diff is collapsed.
This diff is collapsed.
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<display-name>Openfire</display-name>
<!-- OF-902 use HttpOnly for session cookie -->
<session-config>
<cookie-config>
<http-only>true</http-only>
</cookie-config>
</session-config>
<!-- prevent URL rewritting with jsessionid included, OF-669 -->
<context-param>
<param-name>org.eclipse.jetty.servlet.SessionIdPathParameterName</param-name>
<param-value>none</param-value>
</context-param>
<context-param>
<param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
<param-value>openfire_i18n</param-value>
</context-param>
<context-param>
<param-name>javax.servlet.jsp.jstl.fmt.locale</param-name>
<param-value>zh_CN</param-value>
</context-param>
<filter>
<filter-name>AuthCheck</filter-name>
<filter-class>org.jivesoftware.admin.AuthCheckFilter</filter-class>
<init-param>
<param-name>excludes</param-name>
<param-value>
login.jsp,index.jsp?logout=true,setup/index.jsp,setup/setup-*,.gif,.png,error-serverdown.jsp
</param-value>
</init-param>
</filter>
<filter>
<filter-name>PluginFilter</filter-name>
<filter-class>org.jivesoftware.admin.PluginFilter</filter-class>
</filter>
<filter>
<filter-name>Set Character Encoding</filter-name>
<filter-class>org.jivesoftware.util.SetCharacterEncodingFilter</filter-class>
</filter>
<filter>
<filter-name>LocaleFilter</filter-name>
<filter-class>org.jivesoftware.util.LocaleFilter</filter-class>
</filter>
<filter>
<filter-name>sitemesh</filter-name>
<filter-class>com.opensymphony.module.sitemesh.filter.PageFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>PluginFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>Set Character Encoding</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>LocaleFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
<url-pattern>foo.bar</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>PluginFilter</filter-name>
<servlet-name>PluginServlet</servlet-name>
</filter-mapping>
<filter-mapping>
<filter-name>sitemesh</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>AuthCheck</filter-name>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>test/*.jsp</url-pattern>
</filter-mapping>
<listener>
<listener-class>org.jivesoftware.openfire.XMPPContextListener</listener-class>
</listener>
<servlet>
<servlet-name>PluginServlet</servlet-name>
<servlet-class>org.jivesoftware.openfire.container.PluginServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>FaviconServlet</servlet-name>
<servlet-class>org.jivesoftware.util.FaviconServlet</servlet-class>
<init-param>
<param-name>thanks</param-name>
<param-value>fishes</param-value>
</init-param>
<init-param>
<param-name>answer</param-name>
<param-value>42</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>PluginIconServlet</servlet-name>
<servlet-class>org.jivesoftware.openfire.container.PluginIconServlet</servlet-class>
</servlet>
<!--<servlet>
<servlet-name>WebDAVLiteServlet</servlet-name>
<servlet-class>org.jivesoftware.openfire.webdav.WebDAVLiteServlet</servlet-class>
</servlet>-->
<!--@@JSPC-SERVLETS@@-->
<servlet-mapping>
<servlet-name>PluginServlet</servlet-name>
<url-pattern>/plugins/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>FaviconServlet</servlet-name>
<url-pattern>/getFavicon</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>PluginIconServlet</servlet-name>
<url-pattern>/geticon</url-pattern>
</servlet-mapping>
<!--<servlet-mapping>
<servlet-name>WebDAVLiteServlet</servlet-name>
<url-pattern>/webdav/*</url-pattern>
</servlet-mapping>-->
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
<url-pattern>/more-dwr/*</url-pattern>
</servlet-mapping>
</web-app>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment