Skip to content

Commit 01d8898

Browse files
fix: Preserve response headers across context restore in SecurityInterceptor
Signed-off-by: Kishore Kumaar Natarajan <kkumaarn@amazon.com>
1 parent 3cd4e36 commit 01d8898

2 files changed

Lines changed: 639 additions & 5 deletions

File tree

src/main/java/org/opensearch/security/transport/SecurityInterceptor.java

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -178,8 +178,12 @@ public <T extends TransportResponse> void sendRequestDecorate(
178178
requestHeadersToCopy.removeAll(Task.REQUEST_HEADERS); // Special case where this header is preserved during stashContext.
179179
}
180180

181+
final Supplier<ThreadContext.StoredContext> restorableContextSupplier = getThreadContext().newRestorableContext(true);
181182
try (ThreadContext.StoredContext stashedContext = getThreadContext().stashContext()) {
182-
final TransportResponseHandler<T> restoringHandler = new RestoringTransportResponseHandler<T>(handler, stashedContext);
183+
final TransportResponseHandler<T> restoringHandler = new RestoringTransportResponseHandler<T>(
184+
handler,
185+
restorableContextSupplier
186+
);
183187
getThreadContext().putHeader("_opendistro_security_remotecn", cs.getClusterName().value());
184188

185189
final Map<String, String> headerMap = new HashMap<>(
@@ -377,10 +381,13 @@ private ThreadContext getThreadContext() {
377381
// which is private scoped
378382
private class RestoringTransportResponseHandler<T extends TransportResponse> implements TransportResponseHandler<T> {
379383

380-
private final ThreadContext.StoredContext contextToRestore;
384+
private final Supplier<ThreadContext.StoredContext> contextToRestore;
381385
private final TransportResponseHandler<T> innerHandler;
382386

383-
private RestoringTransportResponseHandler(TransportResponseHandler<T> innerHandler, ThreadContext.StoredContext contextToRestore) {
387+
private RestoringTransportResponseHandler(
388+
TransportResponseHandler<T> innerHandler,
389+
Supplier<ThreadContext.StoredContext> contextToRestore
390+
) {
384391
this.contextToRestore = contextToRestore;
385392
this.innerHandler = innerHandler;
386393
}
@@ -407,7 +414,7 @@ public void handleResponse(T response) {
407414
List<String> dlsResponseHeader = responseHeaders.get(ConfigConstants.OPENDISTRO_SECURITY_DLS_QUERY_HEADER);
408415
List<String> maskedFieldsResponseHeader = responseHeaders.get(ConfigConstants.OPENDISTRO_SECURITY_MASKED_FIELD_HEADER);
409416

410-
contextToRestore.restore();
417+
contextToRestore.get();
411418

412419
final boolean isDebugEnabled = log.isDebugEnabled();
413420
if (response instanceof ClusterSearchShardsResponse) {
@@ -438,7 +445,7 @@ public void handleResponse(T response) {
438445

439446
@Override
440447
public void handleException(TransportException e) {
441-
contextToRestore.restore();
448+
contextToRestore.get();
442449
innerHandler.handleException(e);
443450
}
444451

0 commit comments

Comments
 (0)