Skip to content

Commit 0bfe765

Browse files
authored
Handle exceptions for adding request body audit log if rest request is invalid (opensearch-project#4232)
Signed-off-by: Aayush Singhal <siaayush@amazon.com>
1 parent cb34962 commit 0bfe765

File tree

2 files changed

+50
-1
lines changed

2 files changed

+50
-1
lines changed

src/main/java/org/opensearch/security/auditlog/impl/AuditMessage.java

+6-1
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
import com.google.common.annotations.VisibleForTesting;
2828
import org.apache.commons.codec.digest.DigestUtils;
2929
import org.apache.hc.core5.net.URIBuilder;
30+
import org.apache.logging.log4j.LogManager;
31+
import org.apache.logging.log4j.Logger;
3032

3133
import org.opensearch.ExceptionsHelper;
3234
import org.opensearch.cluster.service.ClusterService;
@@ -59,6 +61,8 @@
5961

6062
public final class AuditMessage {
6163

64+
private static final Logger log = LogManager.getLogger(AuditMessage.class);
65+
6266
// clustername and cluster uuid
6367
private static final WildcardMatcher AUTHORIZATION_HEADER = WildcardMatcher.from("Authorization", false);
6468
private static final String SENSITIVE_KEY = "password";
@@ -417,8 +421,9 @@ void addRestRequestInfo(final SecurityRequest request, final AuditConfig.Filter
417421
} else {
418422
auditInfo.put(REQUEST_BODY, requestBody);
419423
}
420-
} catch (IOException e) {
424+
} catch (Exception e) {
421425
auditInfo.put(REQUEST_BODY, "ERROR: Unable to generate request body");
426+
log.error("Error while generating request body for audit log", e);
422427
}
423428
}
424429
}

src/test/java/org/opensearch/security/auditlog/impl/AuditMessageTest.java

+44
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,16 @@
2626
import org.opensearch.cluster.service.ClusterService;
2727
import org.opensearch.common.collect.Tuple;
2828
import org.opensearch.common.xcontent.XContentType;
29+
import org.opensearch.core.common.bytes.BytesArray;
2930
import org.opensearch.core.common.bytes.BytesReference;
31+
import org.opensearch.core.xcontent.NamedXContentRegistry;
32+
import org.opensearch.http.HttpChannel;
33+
import org.opensearch.http.HttpRequest;
34+
import org.opensearch.rest.RestRequest;
3035
import org.opensearch.security.auditlog.AuditLog;
3136
import org.opensearch.security.auditlog.config.AuditConfig;
37+
import org.opensearch.security.filter.SecurityRequest;
38+
import org.opensearch.security.filter.SecurityRequestFactory;
3239
import org.opensearch.security.securityconf.impl.CType;
3340

3441
import static org.junit.Assert.assertEquals;
@@ -155,4 +162,41 @@ public void testBCryptHashIsRedacted() {
155162
message.addSecurityConfigTupleToRequestBody(new Tuple<>(XContentType.JSON, ref), internalUsersDocId);
156163
assertEquals("Hash in tuple is __HASH__", message.getAsMap().get(AuditMessage.REQUEST_BODY));
157164
}
165+
166+
@Test
167+
public void testRequestBodyLoggingWithInvalidSourceOrContentTypeParam() {
168+
when(auditConfig.getFilter().shouldLogRequestBody()).thenReturn(true);
169+
170+
HttpRequest httpRequest = mock(HttpRequest.class);
171+
172+
// No content or Source paramater
173+
when(httpRequest.uri()).thenReturn("");
174+
when(httpRequest.content()).thenReturn(new BytesArray(new byte[0]));
175+
176+
RestRequest restRequest = RestRequest.request(mock(NamedXContentRegistry.class), httpRequest, mock(HttpChannel.class));
177+
SecurityRequest request = SecurityRequestFactory.from(restRequest);
178+
179+
message.addRestRequestInfo(request, auditConfig.getFilter());
180+
assertNull(message.getAsMap().get(AuditMessage.REQUEST_BODY));
181+
182+
// No source parameter, content present but Invalid content-type header
183+
when(httpRequest.uri()).thenReturn("");
184+
when(httpRequest.content()).thenReturn(new BytesArray(new byte[1]));
185+
186+
restRequest = RestRequest.request(mock(NamedXContentRegistry.class), httpRequest, mock(HttpChannel.class));
187+
request = SecurityRequestFactory.from(restRequest);
188+
189+
message.addRestRequestInfo(request, auditConfig.getFilter());
190+
assertEquals("ERROR: Unable to generate request body", message.getAsMap().get(AuditMessage.REQUEST_BODY));
191+
192+
// No content, source parameter present but Invalid source-content-type parameter
193+
when(httpRequest.uri()).thenReturn("/aaaa?source=request_body");
194+
when(httpRequest.content()).thenReturn(new BytesArray(new byte[0]));
195+
196+
restRequest = RestRequest.request(mock(NamedXContentRegistry.class), httpRequest, mock(HttpChannel.class));
197+
request = SecurityRequestFactory.from(restRequest);
198+
199+
message.addRestRequestInfo(request, auditConfig.getFilter());
200+
assertEquals("ERROR: Unable to generate request body", message.getAsMap().get(AuditMessage.REQUEST_BODY));
201+
}
158202
}

0 commit comments

Comments
 (0)