David Ostrovsky
2014-03-09 ec24568f14ee38b264c86133ce8ebcc35a39034b
Add http request filter extension point

To allow for integration of 3rd party server monitoring solutions,
Gitblit needs to expose an extension point for collecting http data.
2 files added
9 files modified
186 ■■■■■ changed files
src/main/java/WEB-INF/web.xml 11 ●●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/dagger/DaggerFilter.java 4 ●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/extensions/HttpRequestFilter.java 49 ●●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/servlet/AccessRestrictionFilter.java 5 ●●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/servlet/AuthenticationFilter.java 3 ●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/servlet/EnforceAuthenticationFilter.java 3 ●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/servlet/GitFilter.java 5 ●●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/servlet/ProxyFilter.java 76 ●●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/servlet/RpcFilter.java 5 ●●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/servlet/SyndicationFilter.java 5 ●●●●● patch | view | raw | blame | history
src/site/plugins_extensions.mkd 20 ●●●●● patch | view | raw | blame | history
src/main/java/WEB-INF/web.xml
@@ -214,6 +214,15 @@
        <url-pattern>/robots.txt</url-pattern>
    </servlet-mapping>
    <filter>
        <filter-name>ProxyFilter</filter-name>
        <filter-class>com.gitblit.servlet.ProxyFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>ProxyFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <!-- Git Access Restriction Filter
         <url-pattern> MUST match: 
            * GitServlet
@@ -353,4 +362,4 @@
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    
</web-app>
</web-app>
src/main/java/com/gitblit/dagger/DaggerFilter.java
@@ -36,10 +36,10 @@
    public final void init(FilterConfig filterConfig) throws ServletException {
        ServletContext context = filterConfig.getServletContext();
        ObjectGraph objectGraph = (ObjectGraph) context.getAttribute(DaggerContext.INJECTOR_NAME);
        inject(objectGraph);
        inject(objectGraph, filterConfig);
    }
    protected abstract void inject(ObjectGraph dagger);
    protected abstract void inject(ObjectGraph dagger, FilterConfig filterConfig) throws ServletException;
    @Override
    public void destroy() {
src/main/java/com/gitblit/extensions/HttpRequestFilter.java
New file
@@ -0,0 +1,49 @@
/*
 * Copyright 2014 gitblit.com.
 *
 * 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 com.gitblit.extensions;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import ro.fortsoft.pf4j.ExtensionPoint;
/**
 * Extension point to intercept HTTP requests passing through the server.
 *
 * @author David Ostrovsky
 * @since 1.6.0
 *
 */
public abstract class HttpRequestFilter implements Filter, ExtensionPoint {
    @Override
    public void init(FilterConfig config) throws ServletException {
    }
    @Override
    public void destroy() {
    }
    @Override
    public abstract void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException;
}
src/main/java/com/gitblit/servlet/AccessRestrictionFilter.java
@@ -19,6 +19,7 @@
import java.text.MessageFormat;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
@@ -54,8 +55,8 @@
    protected IRepositoryManager repositoryManager;
    @Override
    protected void inject(ObjectGraph dagger) {
        super.inject(dagger);
    protected void inject(ObjectGraph dagger, FilterConfig filterConfig) {
        super.inject(dagger, filterConfig);
        this.runtimeManager = dagger.get(IRuntimeManager.class);
        this.repositoryManager = dagger.get(IRepositoryManager.class);
    }
src/main/java/com/gitblit/servlet/AuthenticationFilter.java
@@ -24,6 +24,7 @@
import java.util.Map;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
@@ -64,7 +65,7 @@
    protected IAuthenticationManager authenticationManager;
    @Override
    protected void inject(ObjectGraph dagger) {
    protected void inject(ObjectGraph dagger, FilterConfig filterConfig) {
        this.authenticationManager = dagger.get(IAuthenticationManager.class);
    }
src/main/java/com/gitblit/servlet/EnforceAuthenticationFilter.java
@@ -19,6 +19,7 @@
import java.text.MessageFormat;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
@@ -53,7 +54,7 @@
    private IAuthenticationManager authenticationManager;
    @Override
    protected void inject(ObjectGraph dagger) {
    protected void inject(ObjectGraph dagger, FilterConfig filterConfig) {
        this.settings = dagger.get(IStoredSettings.class);
        this.authenticationManager = dagger.get(IAuthenticationManager.class);
    }
src/main/java/com/gitblit/servlet/GitFilter.java
@@ -17,6 +17,7 @@
import java.text.MessageFormat;
import javax.servlet.FilterConfig;
import javax.servlet.http.HttpServletRequest;
import com.gitblit.Constants.AccessRestrictionType;
@@ -53,8 +54,8 @@
    private IFederationManager federationManager;
    @Override
    protected void inject(ObjectGraph dagger) {
        super.inject(dagger);
    protected void inject(ObjectGraph dagger, FilterConfig filterConfig) {
        super.inject(dagger, filterConfig);
        this.settings = dagger.get(IStoredSettings.class);
        this.federationManager = dagger.get(IFederationManager.class);
    }
src/main/java/com/gitblit/servlet/ProxyFilter.java
New file
@@ -0,0 +1,76 @@
/*
 * Copyright 2014 gitblit.com.
 *
 * 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 com.gitblit.servlet;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import com.gitblit.dagger.DaggerFilter;
import com.gitblit.extensions.HttpRequestFilter;
import com.gitblit.manager.IPluginManager;
import dagger.ObjectGraph;
/**
 * A request filter than allows regsitered extension request filters to access
 * request data.  The intended purpose is for server monitoring plugins.
 *
 * @author David Ostrovsky
 * @since 1.6.0
 */
public class ProxyFilter extends DaggerFilter {
    private List<HttpRequestFilter> filters;
    @Override
    protected void inject(ObjectGraph dagger, FilterConfig filterConfig) throws ServletException {
        IPluginManager pluginManager = dagger.get(IPluginManager.class);
        filters = pluginManager.getExtensions(HttpRequestFilter.class);
        for (HttpRequestFilter f : filters) {
            f.init(filterConfig);
        }
    }
    @Override
    public void doFilter(ServletRequest req, ServletResponse res, final FilterChain last)
            throws IOException, ServletException {
        final Iterator<HttpRequestFilter> itr = filters.iterator();
        new FilterChain() {
            @Override
            public void doFilter(ServletRequest req, ServletResponse res) throws IOException,
                    ServletException {
                if (itr.hasNext()) {
                    itr.next().doFilter(req, res, this);
                } else {
                    last.doFilter(req, res);
                }
            }
        }.doFilter(req, res);
    }
    @Override
    public void destroy() {
        for (HttpRequestFilter f : filters) {
            f.destroy();
        }
    }
}
src/main/java/com/gitblit/servlet/RpcFilter.java
@@ -19,6 +19,7 @@
import java.text.MessageFormat;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
@@ -53,8 +54,8 @@
    private IRuntimeManager runtimeManager;
    @Override
    protected void inject(ObjectGraph dagger) {
        super.inject(dagger);
    protected void inject(ObjectGraph dagger, FilterConfig filterConfig) {
        super.inject(dagger, filterConfig);
        this.settings = dagger.get(IStoredSettings.class);
        this.runtimeManager = dagger.get(IRuntimeManager.class);
    }
src/main/java/com/gitblit/servlet/SyndicationFilter.java
@@ -19,6 +19,7 @@
import java.text.MessageFormat;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
@@ -50,8 +51,8 @@
    private IProjectManager projectManager;
    @Override
    protected void inject(ObjectGraph dagger) {
        super.inject(dagger);
    protected void inject(ObjectGraph dagger, FilterConfig filterConfig) {
        super.inject(dagger, filterConfig);
        this.runtimeManager = dagger.get(IRuntimeManager.class);
        this.repositoryManager = dagger.get(IRepositoryManager.class);
        this.projectManager = dagger.get(IProjectManager.class);
src/site/plugins_extensions.mkd
@@ -185,3 +185,23 @@
}
```
### Request Filter
*SINCE 1.6.0*
You can provide your own custom request filter by subclassing the *HttpRequestFilter* class.
```java
import com.gitblit.extensions.HttpRequestFilter;
import ro.fortsoft.pf4j.Extension;
@Extension
public class MyRequestFilter extends HttpRequestFilter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
    }
}
```