Merge "Add a dedicated servlet for checking a user's authorization"
This commit is contained in:
		@@ -19,6 +19,7 @@ import static com.google.inject.Scopes.SINGLETON;
 | 
			
		||||
import com.google.common.base.Strings;
 | 
			
		||||
import com.google.gerrit.common.PageLinks;
 | 
			
		||||
import com.google.gerrit.extensions.client.AuthType;
 | 
			
		||||
import com.google.gerrit.httpd.raw.AuthorizationCheckServlet;
 | 
			
		||||
import com.google.gerrit.httpd.raw.CatServlet;
 | 
			
		||||
import com.google.gerrit.httpd.raw.SshInfoServlet;
 | 
			
		||||
import com.google.gerrit.httpd.raw.ToolServlet;
 | 
			
		||||
@@ -82,6 +83,9 @@ class UrlModule extends ServletModule {
 | 
			
		||||
 | 
			
		||||
    serveRegex("^/(?:a/)?tools/(.*)$").with(ToolServlet.class);
 | 
			
		||||
 | 
			
		||||
    // Serve auth check. Mainly used by PolyGerrit for checking if a user is still logged in.
 | 
			
		||||
    serveRegex("^/(?:a/)?auth-check$").with(AuthorizationCheckServlet.class);
 | 
			
		||||
 | 
			
		||||
    // Bind servlets for REST root collections.
 | 
			
		||||
    // The '/plugins/' root collection is already handled by HttpPluginServlet
 | 
			
		||||
    // which is bound in HttpPluginModule. We cannot bind it here again although
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,51 @@
 | 
			
		||||
// Copyright (C) 2018 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.raw;
 | 
			
		||||
 | 
			
		||||
import com.google.gerrit.server.CurrentUser;
 | 
			
		||||
import com.google.gerrit.util.http.CacheHeaders;
 | 
			
		||||
import com.google.inject.Inject;
 | 
			
		||||
import com.google.inject.Provider;
 | 
			
		||||
import com.google.inject.Singleton;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import javax.servlet.http.HttpServlet;
 | 
			
		||||
import javax.servlet.http.HttpServletRequest;
 | 
			
		||||
import javax.servlet.http.HttpServletResponse;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Offers a dedicated endpoint for checking if a user is still logged in. Returns {@code 204
 | 
			
		||||
 * NO_CONTENT} for logged-in users, {@code 403 FORBIDDEN} otherwise.
 | 
			
		||||
 *
 | 
			
		||||
 * <p>Mainly used by PolyGerrit to check if a user is still logged in.
 | 
			
		||||
 */
 | 
			
		||||
@Singleton
 | 
			
		||||
public class AuthorizationCheckServlet extends HttpServlet {
 | 
			
		||||
  private final Provider<CurrentUser> user;
 | 
			
		||||
 | 
			
		||||
  @Inject
 | 
			
		||||
  AuthorizationCheckServlet(Provider<CurrentUser> user) {
 | 
			
		||||
    this.user = user;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
  protected void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException {
 | 
			
		||||
    CacheHeaders.setNotCacheable(res);
 | 
			
		||||
    if (user.get().isIdentifiedUser()) {
 | 
			
		||||
      res.setStatus(HttpServletResponse.SC_NO_CONTENT);
 | 
			
		||||
    } else {
 | 
			
		||||
      res.setStatus(HttpServletResponse.SC_FORBIDDEN);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,35 @@
 | 
			
		||||
// Copyright (C) 2018 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.acceptance.rest.auth;
 | 
			
		||||
 | 
			
		||||
import com.google.gerrit.acceptance.AbstractDaemonTest;
 | 
			
		||||
import com.google.gerrit.acceptance.RestResponse;
 | 
			
		||||
import com.google.gerrit.acceptance.RestSession;
 | 
			
		||||
import org.junit.Test;
 | 
			
		||||
 | 
			
		||||
public class AuthenticationCheckIT extends AbstractDaemonTest {
 | 
			
		||||
  @Test
 | 
			
		||||
  public void authCheck_loggedInUser_returnsOk() throws Exception {
 | 
			
		||||
    RestResponse r = adminRestSession.get("/auth-check");
 | 
			
		||||
    r.assertNoContent();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Test
 | 
			
		||||
  public void authCheck_anonymousUser_returnsForbidden() throws Exception {
 | 
			
		||||
    RestSession anonymous = new RestSession(server, null);
 | 
			
		||||
    RestResponse r = anonymous.get("/auth-check");
 | 
			
		||||
    r.assertForbidden();
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										7
									
								
								javatests/com/google/gerrit/acceptance/rest/auth/BUILD
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								javatests/com/google/gerrit/acceptance/rest/auth/BUILD
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,7 @@
 | 
			
		||||
load("//javatests/com/google/gerrit/acceptance:tests.bzl", "acceptance_tests")
 | 
			
		||||
 | 
			
		||||
acceptance_tests(
 | 
			
		||||
    srcs = glob(["*IT.java"]),
 | 
			
		||||
    group = "auth",
 | 
			
		||||
    labels = ["rest"],
 | 
			
		||||
)
 | 
			
		||||
		Reference in New Issue
	
	Block a user