Implement a more capable servlet auditing interface.
In order to facilitate action-specific auditing, the RestResource, RestView, and HttpServletRequest are incorporated into a new extended audit event class, supplementing all existing fields (some redundant) in HttpAuditEvent. Although the request is already available from the Guice injector, adding this high-value information as a field facilitates convenient access. Change-Id: I3ebd629c90921237bbcfbb00d9ea990740099104
This commit is contained in:
@@ -46,7 +46,7 @@ import com.google.common.io.BaseEncoding;
|
||||
import com.google.common.math.IntMath;
|
||||
import com.google.common.net.HttpHeaders;
|
||||
import com.google.gerrit.audit.AuditService;
|
||||
import com.google.gerrit.audit.HttpAuditEvent;
|
||||
import com.google.gerrit.audit.ExtendedHttpAuditEvent;
|
||||
import com.google.gerrit.common.Nullable;
|
||||
import com.google.gerrit.common.TimeUtil;
|
||||
import com.google.gerrit.extensions.registration.DynamicItem;
|
||||
@@ -204,6 +204,8 @@ public class RestApiServlet extends HttpServlet {
|
||||
Object result = null;
|
||||
Multimap<String, String> params = LinkedHashMultimap.create();
|
||||
Object inputRequestBody = null;
|
||||
RestResource rsrc = TopLevelResource.INSTANCE;
|
||||
ViewData viewData = null;
|
||||
|
||||
try {
|
||||
checkUserSession(req);
|
||||
@@ -213,8 +215,8 @@ public class RestApiServlet extends HttpServlet {
|
||||
CapabilityUtils.checkRequiresCapability(globals.currentUser,
|
||||
null, rc.getClass());
|
||||
|
||||
RestResource rsrc = TopLevelResource.INSTANCE;
|
||||
ViewData viewData = new ViewData(null, null);
|
||||
viewData = new ViewData(null, null);
|
||||
|
||||
if (path.isEmpty()) {
|
||||
if (isGetOrHead(req)) {
|
||||
viewData = new ViewData(null, rc.list());
|
||||
@@ -386,10 +388,10 @@ public class RestApiServlet extends HttpServlet {
|
||||
status = SC_INTERNAL_SERVER_ERROR;
|
||||
handleException(e, req, res);
|
||||
} finally {
|
||||
globals.auditService.dispatch(new HttpAuditEvent(globals.webSession.get()
|
||||
.getSessionId(), globals.currentUser.get(), req.getRequestURI(),
|
||||
auditStartTs, params, req.getMethod(), inputRequestBody, status,
|
||||
result));
|
||||
globals.auditService.dispatch(new ExtendedHttpAuditEvent(globals.webSession.get()
|
||||
.getSessionId(), globals.currentUser.get(), req,
|
||||
auditStartTs, params, inputRequestBody, status,
|
||||
result, rsrc, viewData.view));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
// 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.google.gerrit.audit;
|
||||
|
||||
import com.google.common.base.Preconditions;
|
||||
import com.google.common.collect.Multimap;
|
||||
import com.google.gerrit.extensions.restapi.RestResource;
|
||||
import com.google.gerrit.extensions.restapi.RestView;
|
||||
import com.google.gerrit.server.CurrentUser;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
|
||||
/**
|
||||
* Extended audit event. Adds request, resource and view data to HttpAuditEvent.
|
||||
*/
|
||||
public class ExtendedHttpAuditEvent extends HttpAuditEvent {
|
||||
public final HttpServletRequest httpRequest;
|
||||
public final RestResource resource;
|
||||
public final RestView<? extends RestResource> view;
|
||||
|
||||
/**
|
||||
* Creates a new audit event with results
|
||||
*
|
||||
* @param sessionId session id the event belongs to
|
||||
* @param who principal that has generated the event
|
||||
* @param httpRequest the HttpServletRequest
|
||||
* @param when time-stamp of when the event started
|
||||
* @param params parameters of the event
|
||||
* @param result result of the event
|
||||
* @param resource REST resource data
|
||||
* @param view view rendering object
|
||||
*/
|
||||
public ExtendedHttpAuditEvent(String sessionId, CurrentUser who,
|
||||
HttpServletRequest httpRequest, long when, Multimap<String, ?> params,
|
||||
Object input, int status, Object result, RestResource resource,
|
||||
RestView<RestResource> view) {
|
||||
super(sessionId, who, httpRequest.getRequestURI(), when, params, httpRequest.getMethod(),
|
||||
input, status, result);
|
||||
this.httpRequest = Preconditions.checkNotNull(httpRequest);
|
||||
this.resource = resource;
|
||||
this.view = view;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user