Skip to content

Commit

Permalink
MODSIDECAR-66: handle X-Okapi-Token null value as absence of token (#136
Browse files Browse the repository at this point in the history
)
  • Loading branch information
mykolam-epm authored Nov 13, 2024
1 parent 41b2668 commit 8430f2d
Show file tree
Hide file tree
Showing 4 changed files with 54 additions and 4 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package org.folio.sidecar.service.routing;

import static org.folio.sidecar.model.ScRoutingEntry.GATEWAY_INTERFACE_ID;
import static org.folio.sidecar.utils.RoutingUtils.hasHeaderWithValue;
import static org.folio.sidecar.utils.RoutingUtils.hasUserIdHeader;

import io.vertx.core.AsyncResult;
import io.vertx.core.http.HttpServerRequest;
Expand Down Expand Up @@ -110,7 +112,7 @@ private void authenticateAndForwardRequest(RoutingContext rc, HttpServerRequest
}

private boolean requireSystemUserToken(RoutingContext rc) {
return !RoutingUtils.hasUserIdHeader(rc) || !RoutingUtils.hasHeader(rc, OkapiHeaders.TOKEN);
return !hasUserIdHeader(rc) || !hasHeaderWithValue(rc, OkapiHeaders.TOKEN, true);
}

private void forwardRequest(RoutingContext rc, HttpServerRequest rq, ScRoutingEntry routingEntry,
Expand Down
8 changes: 8 additions & 0 deletions src/main/java/org/folio/sidecar/utils/RoutingUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,14 @@ public static boolean hasHeader(RoutingContext rc, String header) {
return rc.request().headers().contains(header);
}

public static boolean hasHeaderWithValue(RoutingContext rc, String header, boolean ensureNonNullValue) {
if (!hasHeader(rc, header)) {
return false;
}
var headerValue = rc.request().headers().get(header);
return !StringUtils.isBlank(headerValue) && (!ensureNonNullValue || !headerValue.trim().equalsIgnoreCase("null"));
}

public static void setUserIdHeader(RoutingContext rc, String userId) {
rc.request().headers().set(USER_ID, userId);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,28 @@ void handle_positive() {
verify(requestForwardingService).forwardEgress(rc, absoluteUrl);
}

@Test
void handle_positive_okapiToken_null() {
prepareHttpRequest(false);
when(pathProcessor.cleanIngressRequestPath(fooEntitiesPath)).thenReturn(fooEntitiesPath);
when(testEgressFilter.filter(rc)).thenReturn(succeededFuture(rc));
when(request.headers()).thenReturn(requestHeaders);
when(request.getHeader(OkapiHeaders.TENANT)).thenReturn(TestConstants.TENANT_NAME);
when(requestHeaders.contains(OkapiHeaders.TOKEN)).thenReturn(true);
when(requestHeaders.get(OkapiHeaders.TOKEN)).thenReturn("null");
when(requestHeaders.contains(OkapiHeaders.USER_ID)).thenReturn(true);
when(tokenProvider.getServiceToken(any(RoutingContext.class))).thenReturn(succeededFuture(SERVICE_TOKEN));
when(systemUserService.getToken(anyString())).thenReturn(succeededFuture(USER_TOKEN));

egressRequestHandler.handle(rc, routingEntry());

verify(requestHeaders).set(OkapiHeaders.MODULE_ID, MODULE_ID);
verify(requestHeaders).set(OkapiHeaders.SYSTEM_TOKEN, SERVICE_TOKEN);
verify(requestHeaders).set(OkapiHeaders.TOKEN, USER_TOKEN);
verify(requestHeaders).remove(OkapiHeaders.USER_ID);
verify(requestForwardingService).forwardEgress(rc, absoluteUrl);
}

@Test
void handle_positive_hasUserId_and_token() {
prepareHttpRequest(false);
Expand All @@ -101,6 +123,7 @@ void handle_positive_hasUserId_and_token() {
when(request.headers()).thenReturn(requestHeaders);
when(requestHeaders.contains(OkapiHeaders.USER_ID)).thenReturn(true);
when(requestHeaders.contains(OkapiHeaders.TOKEN)).thenReturn(true);
when(requestHeaders.get(OkapiHeaders.TOKEN)).thenReturn("test");
when(tokenProvider.getServiceToken(any(RoutingContext.class))).thenReturn(succeededFuture(SERVICE_TOKEN));

egressRequestHandler.handle(rc, routingEntry());
Expand Down
23 changes: 20 additions & 3 deletions src/test/java/org/folio/sidecar/utils/RoutingUtilsTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@

import io.vertx.core.http.HttpMethod;
import io.vertx.core.http.HttpServerRequest;
import io.vertx.core.http.impl.headers.HeadersMultiMap;
import io.vertx.ext.web.RoutingContext;
import java.util.Map;
import org.folio.sidecar.integration.okapi.OkapiHeaders;
import org.folio.support.types.UnitTest;
import org.junit.jupiter.api.Test;
Expand All @@ -16,25 +18,40 @@ class RoutingUtilsTest {

@Test
void getRequestId_positive_newRequest() {
var routingContext = routingContext(null);
var routingContext = routingContext(null, null);
var actual = RoutingUtils.getRequestId(routingContext);
assertThat(actual).isNotNull().matches("\\d{6}/foo");
}

@Test
void getRequestId_positive_nextRequest() {
var routingContext = routingContext("111111/users");
var routingContext = routingContext("111111/users", null);
var actual = RoutingUtils.getRequestId(routingContext);
assertThat(actual).isNotNull().matches("111111/users;\\d{6}/foo");
}

private static RoutingContext routingContext(String requestId) {
@Test
void hasHeaderWithValue_positive_nullCheck() {
var routingContext = routingContext("111111/users", Map.of("X-Okapi-Token", "null"));
assertThat(RoutingUtils.hasHeaderWithValue(routingContext, "X-Okapi-Token", false)).isTrue();
assertThat(RoutingUtils.hasHeaderWithValue(routingContext, "X-Okapi-Token", true)).isFalse();
}

private static RoutingContext routingContext(String requestId, Map<String, String> headers) {
var routingContext = mock(RoutingContext.class);
var request = mock(HttpServerRequest.class);
when(routingContext.request()).thenReturn(request);
when(request.method()).thenReturn(HttpMethod.GET);
when(request.path()).thenReturn("/foo/entities");
when(request.getHeader(OkapiHeaders.REQUEST_ID)).thenReturn(requestId);
var headersMap = new HeadersMultiMap();
when(request.headers()).thenReturn(headersMap);
if (headers != null) {
for (Map.Entry<String, String> header : headers.entrySet()) {
headersMap.set(header.getKey(), header.getValue());
when(request.getHeader(header.getKey())).thenReturn(header.getValue());
}
}
return routingContext;
}
}

0 comments on commit 8430f2d

Please sign in to comment.