Skip to content

Commit 5bb5cdc

Browse files
committed
Add audit logging to optout
1 parent 38f7d2c commit 5bb5cdc

File tree

4 files changed

+85
-7
lines changed

4 files changed

+85
-7
lines changed

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
<vertx.version>4.5.13</vertx.version>
1717
<!-- check micrometer.version vertx-micrometer-metrics consumes before bumping up -->
1818
<micrometer.version>1.1.0</micrometer.version>
19-
<uid2-shared.version>9.4.11</uid2-shared.version>
19+
<uid2-shared.version>9.5.0</uid2-shared.version>
2020
<image.version>${project.version}</image.version>
2121
<junit-jupiter.version>5.10.1</junit-jupiter.version>
2222
<junit-vintage.version>5.10.1</junit-vintage.version>

src/main/java/com/uid2/optout/auth/InternalAuthMiddleware.java

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.uid2.optout.auth;
22

3+
import com.uid2.shared.audit.Audit;
4+
import com.uid2.shared.audit.AuditParams;
35
import com.uid2.shared.auth.OperatorKey;
46
import com.uid2.shared.middleware.AuthMiddleware;
57
import io.vertx.core.Handler;
@@ -48,15 +50,29 @@ public void handle(RoutingContext rc) {
4850
}
4951
}
5052
}
51-
53+
private final Audit audit;
5254
private final String internalApiToken;
5355

54-
public InternalAuthMiddleware(String internalApiToken) {
56+
private Handler<RoutingContext> logAndHandle(Handler<RoutingContext> handler, AuditParams auditParams) {
57+
return ctx -> {
58+
ctx.addBodyEndHandler(v -> this.audit.log(ctx, auditParams));
59+
handler.handle(ctx);
60+
};
61+
}
62+
63+
public InternalAuthMiddleware(String internalApiToken, String auditSource) {
5564
this.internalApiToken = internalApiToken;
65+
this.audit = new Audit(auditSource);
5666
}
5767

58-
public Handler<RoutingContext> handle(Handler<RoutingContext> handler) {
59-
final InternalAuthHandler h = new InternalAuthHandler(handler, this.internalApiToken);
68+
public Handler<RoutingContext> handleWithAudit(Handler<RoutingContext> handler, AuditParams auditParams, Boolean enableAuditLog) {
69+
InternalAuthHandler h;
70+
if (enableAuditLog) {
71+
final Handler<RoutingContext> loggedHandler = logAndHandle(handler, auditParams);
72+
h = new InternalAuthHandler(loggedHandler, this.internalApiToken);
73+
} else {
74+
h = new InternalAuthHandler(handler, this.internalApiToken);
75+
}
6076
return h::handle;
6177
}
6278
}

src/main/java/com/uid2/optout/vertx/OptOutServiceVerticle.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ public OptOutServiceVerticle(Vertx vertx,
105105
this.defaultDeliveryOptions.setSendTimeout(addEntryTimeoutMs);
106106

107107
this.internalApiKey = jsonConfig.getString(Const.Config.OptOutInternalApiTokenProp);
108-
this.internalAuth = new InternalAuthMiddleware(this.internalApiKey);
108+
this.internalAuth = new InternalAuthMiddleware(this.internalApiKey, "optout");
109109
this.enableOptOutPartnerMock = jsonConfig.getBoolean(Const.Config.OptOutPartnerEndpointMockProp);
110110
}
111111

@@ -170,7 +170,7 @@ private Router createRouter() {
170170
.allowedHeader("Content-Type"));
171171

172172
router.route(Endpoints.OPTOUT_WRITE.toString())
173-
.handler(internalAuth.handle(this::handleWrite));
173+
.handler(internalAuth.handleWithAudit(this::handleWrite, new AuditParams(), this.enableAuditLogging));
174174
router.route(Endpoints.OPTOUT_REPLICATE.toString())
175175
.handler(auth.handleWithAudit(this::handleReplicate, new AuditParams(), this.enableAuditLogging, Role.OPTOUT));
176176
router.route(Endpoints.OPTOUT_REFRESH.toString())
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package com.uid2.optout.auth;
2+
3+
import org.junit.jupiter.api.BeforeEach;
4+
import com.uid2.shared.audit.AuditParams;
5+
import com.uid2.shared.auth.Role;
6+
import io.vertx.core.Handler;
7+
import io.vertx.core.http.HttpServerRequest;
8+
import io.vertx.ext.web.RoutingContext;
9+
import org.junit.jupiter.api.BeforeEach;
10+
import org.junit.jupiter.api.Test;
11+
import org.junit.jupiter.api.extension.ExtendWith;
12+
import org.mockito.ArgumentMatchers;
13+
import org.mockito.Mock;
14+
import org.mockito.junit.jupiter.MockitoExtension;
15+
import org.mockito.junit.jupiter.MockitoSettings;import org.mockito.quality.Strictness;
16+
17+
import static org.mockito.Mockito.*;
18+
19+
@ExtendWith(MockitoExtension.class)
20+
@MockitoSettings(strictness = Strictness.LENIENT)
21+
public class InternalAuthMiddlewareTest {
22+
@Mock
23+
private RoutingContext routingContext;
24+
@Mock
25+
private HttpServerRequest request;
26+
@Mock
27+
private Handler<RoutingContext> nextHandler;
28+
private InternalAuthMiddleware internalAuth;
29+
30+
@BeforeEach
31+
public void setup(){
32+
internalAuth = new InternalAuthMiddleware("apiToken", "test");
33+
when(routingContext.request()).thenReturn(request);
34+
}
35+
36+
@Test
37+
public void internalAuthHandlerNoAuthorizationHeader() {
38+
Handler<RoutingContext> handler = internalAuth.handleWithAudit(nextHandler, new AuditParams(), true);
39+
handler.handle(routingContext);
40+
verifyNoInteractions(nextHandler);
41+
verify(routingContext).fail(401);
42+
verify(routingContext, times(0)).addBodyEndHandler(ArgumentMatchers.<Handler<Void>>any());
43+
}
44+
45+
@Test public void authHandlerInvalidAuthorizationHeader() {
46+
when(request.getHeader("Authorization")).thenReturn("Bogus Header Value");
47+
Handler<RoutingContext> handler = internalAuth.handleWithAudit(nextHandler, new AuditParams(), true);
48+
handler.handle(routingContext);
49+
verifyNoInteractions(nextHandler);
50+
verify(routingContext).fail(401);
51+
verify(routingContext, times(0)).addBodyEndHandler(ArgumentMatchers.<Handler<Void>>any());
52+
}
53+
54+
@Test public void authHandlerUnknownKey() {
55+
when(request.getHeader("Authorization")).thenReturn("Bearer unknown-key");
56+
Handler<RoutingContext> handler = internalAuth.handleWithAudit(nextHandler, new AuditParams(), true);
57+
handler.handle(routingContext);
58+
verifyNoInteractions(nextHandler);
59+
verify(routingContext).fail(401);
60+
verify(routingContext, times(0)).addBodyEndHandler(ArgumentMatchers.<Handler<Void>>any());
61+
}
62+
}

0 commit comments

Comments
 (0)