Replace LoginFilter by a login menu URL
This enables gitiles to return a rendered error page while the login menu URL
will perform login and redirect back to the same page.
Change-Id: I7c39ca13a16ce4050ac4e8a7fe6073f7d7da737c
Bug: https://github.com/google/gitiles/issues/145
Signed-off-by: Alon Bar-Lev <alon.barlev@gmail.com>
diff --git a/src/main/java/com/googlesource/gerrit/plugins/gitiles/HttpModule.java b/src/main/java/com/googlesource/gerrit/plugins/gitiles/HttpModule.java
index fc459c4..f1c34c6 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/gitiles/HttpModule.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/gitiles/HttpModule.java
@@ -90,7 +90,6 @@
protected void configureServlets() {
// Filter all paths so we can decode escaped entities in the URI
filter("/*").through(createPathFilter());
- filter("/*").through(new LoginFilter(userProvider, urls));
filter("/*").through(new MenuFilter(userProvider, urls));
// make this plugin's classloader the context classloader to prevent
diff --git a/src/main/java/com/googlesource/gerrit/plugins/gitiles/LoginFilter.java b/src/main/java/com/googlesource/gerrit/plugins/gitiles/LoginFilter.java
deleted file mode 100644
index 7009f1a..0000000
--- a/src/main/java/com/googlesource/gerrit/plugins/gitiles/LoginFilter.java
+++ /dev/null
@@ -1,93 +0,0 @@
-// Copyright (C) 2015 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.googlesource.gerrit.plugins.gitiles;
-
-import com.google.gerrit.extensions.restapi.Url;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gitiles.GitilesUrls;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-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.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpServletResponseWrapper;
-
-class LoginFilter implements Filter {
- private final Provider<CurrentUser> userProvider;
- private final GitilesUrls urls;
-
- @Inject
- LoginFilter(Provider<CurrentUser> userProvider, GitilesUrls urls) {
- this.userProvider = userProvider;
- this.urls = urls;
- }
-
- @Override
- public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
- throws IOException, ServletException {
- final HttpServletRequest req = (HttpServletRequest) request;
- HttpServletResponseWrapper rsp =
- new HttpServletResponseWrapper((HttpServletResponse) response) {
- @Override
- public void sendError(int sc) throws IOException {
- CurrentUser user = userProvider.get();
- if (sc == SC_UNAUTHORIZED && !(user instanceof IdentifiedUser)) {
- sendRedirect(getLoginRedirectUrl(req));
- return;
- }
- super.sendError(sc);
- }
-
- @Override
- public void sendError(int sc, String msg) throws IOException {
- CurrentUser user = userProvider.get();
- if (sc == SC_UNAUTHORIZED && !(user instanceof IdentifiedUser)) {
- sendRedirect(getLoginRedirectUrl(req));
- return;
- }
- super.sendError(sc, msg);
- }
- };
- chain.doFilter(request, rsp);
- }
-
- @Override
- public void init(FilterConfig filterConfig) throws ServletException {}
-
- @Override
- public void destroy() {}
-
- private String getLoginRedirectUrl(HttpServletRequest req) {
- String baseUrl = urls.getBaseGerritUrl(req);
- String loginUrl = baseUrl + "login/";
- String token = req.getRequestURL().toString();
- if (!baseUrl.isEmpty()) {
- token = token.substring(baseUrl.length());
- }
-
- String queryString = req.getQueryString();
- if (queryString != null && !queryString.isEmpty()) {
- token = token.concat("?" + queryString);
- }
- return (loginUrl + Url.encode(token));
- }
-}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/gitiles/MenuFilter.java b/src/main/java/com/googlesource/gerrit/plugins/gitiles/MenuFilter.java
index 058dd2b..1fd26e2 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/gitiles/MenuFilter.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/gitiles/MenuFilter.java
@@ -15,6 +15,7 @@
package com.googlesource.gerrit.plugins.gitiles;
import com.google.common.collect.Lists;
+import com.google.gerrit.extensions.restapi.Url;
import com.google.gerrit.server.CurrentUser;
import com.google.gerrit.server.IdentifiedUser;
import com.google.gitiles.BaseServlet;
@@ -52,7 +53,7 @@
entries.add(BaseServlet.menuEntry(((IdentifiedUser) user).getName(), null));
entries.add(BaseServlet.menuEntry("Sign Out", urls.getBaseGerritUrl(req) + "logout"));
} else {
- entries.add(BaseServlet.menuEntry("Sign In", urls.getBaseGerritUrl(req) + "login"));
+ entries.add(BaseServlet.menuEntry("Sign In", getLoginRedirectUrl(req)));
}
BaseServlet.putSoyData(req, "menuEntries", entries);
chain.doFilter(request, response);
@@ -63,4 +64,19 @@
@Override
public void destroy() {}
+
+ private String getLoginRedirectUrl(HttpServletRequest req) {
+ String baseUrl = urls.getBaseGerritUrl(req);
+ String loginUrl = baseUrl + "login/";
+ String token = req.getRequestURL().toString();
+ if (!baseUrl.isEmpty()) {
+ token = token.substring(baseUrl.length());
+ }
+
+ String queryString = req.getQueryString();
+ if (queryString != null && !queryString.isEmpty()) {
+ token = token.concat("?" + queryString);
+ }
+ return (loginUrl + Url.encode(token));
+ }
}