diff options
Diffstat (limited to 'java/com/google/gerrit/httpd/GetUserFilter.java')
-rw-r--r-- | java/com/google/gerrit/httpd/GetUserFilter.java | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/java/com/google/gerrit/httpd/GetUserFilter.java b/java/com/google/gerrit/httpd/GetUserFilter.java new file mode 100644 index 0000000000..2199411f20 --- /dev/null +++ b/java/com/google/gerrit/httpd/GetUserFilter.java @@ -0,0 +1,103 @@ +// Copyright (C) 2012 The Android Open Source Project +// +// 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.google.gerrit.httpd; + +import com.google.common.collect.ImmutableMap; +import com.google.gerrit.server.CurrentUser; +import com.google.gerrit.server.config.GerritServerConfig; +import com.google.inject.Inject; +import com.google.inject.Provider; +import com.google.inject.Singleton; +import com.google.inject.servlet.ServletModule; +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 javax.servlet.http.HttpServletResponse; +import org.eclipse.jgit.lib.Config; + +/** + * Stores user as a request attribute and/or response header, so servlets and reverse proxies can + * access it outside of the request/response scope. + */ +@Singleton +public class GetUserFilter implements Filter { + + public static final String USER_ATTR_KEY = "User"; + + public static class Module extends ServletModule { + + private final boolean reqEnabled; + private final boolean resEnabled; + + @Inject + Module(@GerritServerConfig Config cfg) { + reqEnabled = cfg.getBoolean("http", "addUserAsRequestAttribute", true); + resEnabled = cfg.getBoolean("http", "addUserAsResponseHeader", false); + } + + @Override + protected void configureServlets() { + if (resEnabled || reqEnabled) { + ImmutableMap.Builder<String, String> initParams = ImmutableMap.builder(); + if (reqEnabled) { + initParams.put("reqEnabled", ""); + } + if (resEnabled) { + initParams.put("resEnabled", ""); + } + filter("/*").through(GetUserFilter.class, initParams.build()); + } + } + } + + private final Provider<CurrentUser> userProvider; + + private boolean reqEnabled; + private boolean resEnabled; + + @Inject + GetUserFilter(Provider<CurrentUser> userProvider) { + this.userProvider = userProvider; + } + + @Override + public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) + throws IOException, ServletException { + CurrentUser user = userProvider.get(); + if (user != null && user.isIdentifiedUser()) { + String loggableName = user.asIdentifiedUser().getLoggableName(); + if (reqEnabled) { + req.setAttribute(USER_ATTR_KEY, loggableName); + } + if (resEnabled && resp instanceof HttpServletResponse) { + ((HttpServletResponse) resp).addHeader(USER_ATTR_KEY, loggableName); + } + } + chain.doFilter(req, resp); + } + + @Override + public void destroy() {} + + @Override + public void init(FilterConfig arg0) { + reqEnabled = arg0.getInitParameter("reqEnabled") != null ? true : false; + resEnabled = arg0.getInitParameter("resEnabled") != null ? true : false; + } +} |