I have been working with Openfire and the restAPI since about a month. So i am not comfortable with everything yet.
The plugin is working correctly but i would like to add a custom authentication filter (“Custom authentication filter classname - REST API authentication delegates to a custom filter implemented in some other plugin.” on the admin console). I have taken for example the AuthFilter allready existing in the plugin and written my own CustomAuthFilter and exported it to .jar.
I have tried to put it into :
$\Openfire\lib
$\Openfire\plugins\restapi\lib
but it seems “No custom auth filter found for restAPI plugin with name …” (error message from the admin console when i try to save changes).
I have looked the doc about restAPI but there’s nothing about custom authentication filter and i don’t know where to put my customAuthFilter so it is found by the JerseyWrapper.
(this is the part of the code where the error is caught) :
try {
if(customAuthFilterClassName != null) {
Class.forName(customAuthFilterClassName, false, JerseyWrapper.class.getClassLoader());
loadingStatusMessage = null;
}
} catch (ClassNotFoundException e) {
loadingStatusMessage = "No custom auth filter found for restAPI plugin with name " + customAuthFilterClassName;
}
I found that you have to put the .jar file into the $\Openfire\lib directory and you have to restart the server so the custom auth filter is found by the jerseywrapper.
When i save changes on the plugin properties page from the admin console, i get this error :
Exception:
java.lang.NoClassDefFoundError: com/sun/jersey/spi/container/ContainerRequestFilter
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$100(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at org.jivesoftware.openfire.plugin.rest.service.JerseyWrapper.tryLoadingAuthenticationFilter(JerseyWrapper.java:106)
at org.jivesoftware.openfire.plugin.rest.RESTServicePlugin.loadAuthenticationFilter(RESTServicePlugin.java:206)
at org.jivesoftware.openfire.plugin.restAPI.rest_002dapi_jsp._jspService(rest_002dapi_jsp.java:117)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at org.jivesoftware.openfire.container.PluginServlet.handleJSP(PluginServlet.java:382)
at org.jivesoftware.openfire.container.PluginServlet.service(PluginServlet.java:97)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:812)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1669)
at org.jivesoftware.admin.PluginFilter.doFilter(PluginFilter.java:226)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652)
at org.jivesoftware.admin.AuthCheckFilter.doFilter(AuthCheckFilter.java:215)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652)
at com.opensymphony.module.sitemesh.filter.PageFilter.parsePage(PageFilter.java:118)
at com.opensymphony.module.sitemesh.filter.PageFilter.doFilter(PageFilter.java:52)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652)
at org.jivesoftware.util.LocaleFilter.doFilter(LocaleFilter.java:73)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652)
at org.jivesoftware.util.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:49)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652)
at org.jivesoftware.admin.PluginFilter.doFilter(PluginFilter.java:226)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652)
at org.jivesoftware.admin.AuthCheckFilter.doFilter(AuthCheckFilter.java:215)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:585)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:577)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:223)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1127)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:515)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1061)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:215)
at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:110)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97)
at org.eclipse.jetty.server.Server.handle(Server.java:499)
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:311)
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:257)
at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:544)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635)
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.ClassNotFoundException: com.sun.jersey.spi.container.ContainerRequestFilter
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 59 more
I quite understand that it can’t resolve the dependency with the Jersey bundle library, but i don’t know how to correct this
I am actually using the jersey-bundle-1.18.jar library. (which is the same used in the restAPI plugin)
EDIT
It appears i was wrong and the .jar file have to be in the $\Openfire\plugins\restapi\lib diretory BUT I had to rebuild (with ant plugins) the plugin (refreshing it from the admin console was not working).
There’s no other ways of doing this ? Because everytime the restAPI plugin will be updated, i will have to rebuild it just for the custom authentication.
Maybe @Redeyes could provide some help with this, i would really appreciate it !
parentPlugin – the name of the parent plugin (given as “foo” for the “foo.jar” plugin). When a plugin has a parent plugin, the parent plugin’s class loader will be used instead of creating a new class loader. This lets plugins work together more closely. A child plugin will not function without its parent present.
Then, you need to reload the Jersey wrapper when initializing the new plugin: I used both unregisterServlets and registerServlets methods provided by the PluginServlet class.
Maybe @Redeyes could approve this approach!