Fix successful login redirection to keep parameters
Login screen accept a token to redirect to on successful login but if the token contained parameters, they were dropped. Encode/decode the token to fix this issue. When a URL has a pound sign, it is included in the token as well. This removes the hardcoded behaviour to include a pound sign in every redirect URL. Will now be able to use login redirection for URLs with no pound sign (e.g. GitWeb) Change-Id: If8a74a74ce11f79389895e4d036b06a1e81abbe5
This commit is contained in:
@@ -336,7 +336,15 @@ public class Gerrit implements EntryPoint {
|
||||
} else if (token.startsWith("/")) {
|
||||
token = token.substring(1);
|
||||
}
|
||||
return selfRedirect("/login/" + token);
|
||||
|
||||
UrlBuilder builder = new UrlBuilder();
|
||||
builder.setProtocol(Location.getProtocol());
|
||||
builder.setHost(Location.getHost());
|
||||
String port = Location.getPort();
|
||||
if (port != null && !port.isEmpty()) {
|
||||
builder.setPort(Integer.parseInt(port));
|
||||
}
|
||||
return builder.buildString() + ("/login/" + URL.encodePathSegment("#/" + token));
|
||||
}
|
||||
|
||||
public static String selfRedirect(String suffix) {
|
||||
|
@@ -14,20 +14,22 @@
|
||||
|
||||
package com.google.gerrit.httpd;
|
||||
|
||||
import com.google.common.base.CharMatcher;
|
||||
import com.google.common.base.Strings;
|
||||
import com.google.gerrit.common.PageLinks;
|
||||
import com.google.gerrit.extensions.restapi.Url;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
|
||||
public class LoginUrlToken {
|
||||
private static final String DEFAULT_TOKEN = '#' + PageLinks.MINE;
|
||||
|
||||
public static String getToken(HttpServletRequest req) {
|
||||
String token = req.getPathInfo();
|
||||
if (Strings.isNullOrEmpty(token)) {
|
||||
token = PageLinks.MINE;
|
||||
} else if (!token.startsWith("/")) {
|
||||
token = "/" + token;
|
||||
public static String getToken(final HttpServletRequest req){
|
||||
String encodedToken = req.getPathInfo();
|
||||
if (Strings.isNullOrEmpty(encodedToken)) {
|
||||
return DEFAULT_TOKEN;
|
||||
} else {
|
||||
return CharMatcher.is('/').trimLeadingFrom(Url.decode(encodedToken));
|
||||
}
|
||||
return token;
|
||||
}
|
||||
}
|
||||
|
@@ -21,6 +21,7 @@ import com.google.common.base.Strings;
|
||||
import com.google.gerrit.common.PageLinks;
|
||||
import com.google.gerrit.extensions.registration.DynamicItem;
|
||||
import com.google.gerrit.httpd.HtmlDomUtil;
|
||||
import com.google.gerrit.httpd.LoginUrlToken;
|
||||
import com.google.gerrit.httpd.WebSession;
|
||||
import com.google.gerrit.httpd.template.SiteHeaderFooter;
|
||||
import com.google.gerrit.reviewdb.client.Account;
|
||||
@@ -132,11 +133,12 @@ class BecomeAnyAccountLoginServlet extends HttpServlet {
|
||||
}
|
||||
rdr.append("gwt.codesvr=").append(req.getParameter("gwt.codesvr"));
|
||||
}
|
||||
rdr.append('#');
|
||||
|
||||
if (res.isNew()) {
|
||||
rdr.append(PageLinks.REGISTER);
|
||||
rdr.append('#' + PageLinks.REGISTER);
|
||||
} else {
|
||||
rdr.append(LoginUrlToken.getToken(req));
|
||||
}
|
||||
rdr.append(PageLinks.MINE);
|
||||
rsp.sendRedirect(rdr.toString());
|
||||
|
||||
} else {
|
||||
|
@@ -80,10 +80,6 @@ class HttpLoginServlet extends HttpServlet {
|
||||
protected void doGet(final HttpServletRequest req,
|
||||
final HttpServletResponse rsp) throws ServletException, IOException {
|
||||
final String token = LoginUrlToken.getToken(req);
|
||||
if ("/logout".equals(token) || "/signout".equals(token)) {
|
||||
req.getRequestDispatcher("/logout").forward(req, rsp);
|
||||
return;
|
||||
}
|
||||
|
||||
CacheHeaders.setNotCacheable(rsp);
|
||||
final String user = authFilter.getRemoteUser(req);
|
||||
@@ -131,9 +127,8 @@ class HttpLoginServlet extends HttpServlet {
|
||||
rdr.append(authConfig.getRegisterPageUrl());
|
||||
} else {
|
||||
rdr.append(urlProvider.get(req));
|
||||
rdr.append('#');
|
||||
if (arsp.isNew() && !token.startsWith(PageLinks.REGISTER + "/")) {
|
||||
rdr.append(PageLinks.REGISTER);
|
||||
rdr.append('#' + PageLinks.REGISTER);
|
||||
}
|
||||
rdr.append(token);
|
||||
}
|
||||
|
@@ -53,7 +53,6 @@ public class HttpsClientSslCertLoginServlet extends HttpServlet {
|
||||
final HttpServletResponse rsp) throws IOException {
|
||||
final StringBuilder rdr = new StringBuilder();
|
||||
rdr.append(urlProvider.get());
|
||||
rdr.append('#');
|
||||
rdr.append(LoginUrlToken.getToken(req));
|
||||
|
||||
CacheHeaders.setNotCacheable(rsp);
|
||||
|
@@ -73,10 +73,7 @@ class LdapLoginServlet extends HttpServlet {
|
||||
@Nullable String errorMessage) throws IOException {
|
||||
String self = req.getRequestURI();
|
||||
String cancel = Objects.firstNonNull(urlProvider.get(req), "/");
|
||||
String token = LoginUrlToken.getToken(req);
|
||||
if (!token.equals("/")) {
|
||||
cancel += "#" + token;
|
||||
}
|
||||
cancel += LoginUrlToken.getToken(req);
|
||||
|
||||
Document doc = headers.parse(LdapLoginServlet.class, "LoginForm.html");
|
||||
HtmlDomUtil.find(doc, "hostName").setTextContent(req.getServerName());
|
||||
@@ -144,7 +141,6 @@ class LdapLoginServlet extends HttpServlet {
|
||||
|
||||
StringBuilder dest = new StringBuilder();
|
||||
dest.append(urlProvider.get(req));
|
||||
dest.append('#');
|
||||
dest.append(LoginUrlToken.getToken(req));
|
||||
|
||||
CacheHeaders.setNotCacheable(res);
|
||||
|
@@ -221,10 +221,7 @@ class LoginForm extends HttpServlet {
|
||||
boolean link, @Nullable String errorMessage) throws IOException {
|
||||
String self = req.getRequestURI();
|
||||
String cancel = Objects.firstNonNull(urlProvider != null ? urlProvider.get() : "/", "/");
|
||||
String token = LoginUrlToken.getToken(req);
|
||||
if (!token.equals("/")) {
|
||||
cancel += "#" + token;
|
||||
}
|
||||
cancel += LoginUrlToken.getToken(req);
|
||||
|
||||
Document doc = header.parse(LoginForm.class, "LoginForm.html");
|
||||
HtmlDomUtil.find(doc, "hostName").setTextContent(req.getServerName());
|
||||
|
@@ -17,6 +17,7 @@ package com.google.gerrit.httpd.auth.openid;
|
||||
import com.google.gerrit.common.PageLinks;
|
||||
import com.google.gerrit.common.auth.openid.OpenIdUrls;
|
||||
import com.google.gerrit.extensions.registration.DynamicItem;
|
||||
import com.google.gerrit.extensions.restapi.Url;
|
||||
import com.google.gerrit.httpd.CanonicalWebUrl;
|
||||
import com.google.gerrit.httpd.WebSession;
|
||||
import com.google.gerrit.reviewdb.client.Account;
|
||||
@@ -483,11 +484,10 @@ class OpenIdServiceImpl {
|
||||
|
||||
final StringBuilder rdr = new StringBuilder();
|
||||
rdr.append(urlProvider.get(req));
|
||||
rdr.append('#');
|
||||
if (isNew && !token.startsWith(PageLinks.REGISTER + "/")) {
|
||||
rdr.append(PageLinks.REGISTER);
|
||||
rdr.append('#' + PageLinks.REGISTER);
|
||||
}
|
||||
rdr.append(token);
|
||||
rdr.append(Url.decode(token));
|
||||
rsp.sendRedirect(rdr.toString());
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user