1616import com .uid2 .operator .vertx .OperatorShutdownHandler ;
1717import com .uid2 .operator .vertx .UIDOperatorVerticle ;
1818import com .uid2 .shared .Utils ;
19+ import com .uid2 .shared .audit .Audit ;
1920import com .uid2 .shared .audit .UidInstanceIdProvider ;
2021import com .uid2 .shared .auth .ClientKey ;
2122import com .uid2 .shared .auth .Keyset ;
4546import io .vertx .ext .web .client .WebClient ;
4647import io .vertx .junit5 .VertxExtension ;
4748import io .vertx .junit5 .VertxTestContext ;
49+ import org .checkerframework .checker .units .qual .C ;
4850import org .junit .jupiter .api .*;
4951import org .junit .jupiter .api .extension .ExtendWith ;
5052import org .junit .jupiter .params .ParameterizedTest ;
@@ -243,6 +245,10 @@ private String getUrlForEndpoint(String endpoint) {
243245 }
244246
245247 private void send (String apiVersion , Vertx vertx , String endpoint , boolean isV1Get , String v1GetParam , JsonObject postPayload , int expectedHttpCode , Handler <JsonObject > handler ) {
248+ send (apiVersion , vertx , endpoint , isV1Get , v1GetParam , postPayload , expectedHttpCode , handler , Collections .emptyMap ());
249+ }
250+
251+ private void send (String apiVersion , Vertx vertx , String endpoint , boolean isV1Get , String v1GetParam , JsonObject postPayload , int expectedHttpCode , Handler <JsonObject > handler , Map <String , String > additionalHeaders ) {
246252 if (apiVersion .equals ("v2" )) {
247253 ClientKey ck = (ClientKey ) clientKeyProvider .get ("" );
248254
@@ -262,19 +268,19 @@ private void send(String apiVersion, Vertx vertx, String endpoint, boolean isV1G
262268 } else {
263269 handler .handle (tryParseResponse (ar .result ()));
264270 }
265- });
271+ }, additionalHeaders );
266272 } else if (isV1Get ) {
267273 get (vertx , endpoint + (v1GetParam != null ? "?" + v1GetParam : "" ), ar -> {
268274 assertTrue (ar .succeeded ());
269275 assertEquals (expectedHttpCode , ar .result ().statusCode ());
270276 handler .handle (tryParseResponse (ar .result ()));
271- });
277+ }, additionalHeaders );
272278 } else {
273279 post (vertx , endpoint , postPayload , ar -> {
274280 assertTrue (ar .succeeded ());
275281 assertEquals (expectedHttpCode , ar .result ().statusCode ());
276282 handler .handle (tryParseResponse (ar .result ()));
277- });
283+ }, additionalHeaders );
278284 }
279285 }
280286
@@ -289,10 +295,10 @@ protected void sendTokenGenerate(String apiVersion, Vertx vertx, String v1GetPar
289295 }
290296
291297 private void sendTokenGenerate (String apiVersion , Vertx vertx , String v1GetParam , JsonObject v2PostPayload , int expectedHttpCode , String referer , Handler <JsonObject > handler , boolean additionalParams ) {
292- sendTokenGenerate (apiVersion , vertx , v1GetParam , v2PostPayload , expectedHttpCode , referer , handler , additionalParams , null , null );
298+ sendTokenGenerate (apiVersion , vertx , v1GetParam , v2PostPayload , expectedHttpCode , referer , handler , additionalParams , Collections . emptyMap () );
293299 }
294300
295- private void sendTokenGenerate (String apiVersion , Vertx vertx , String v1GetParam , JsonObject v2PostPayload , int expectedHttpCode , String referer , Handler <JsonObject > handler , boolean additionalParams , String headerName , String headerValue ) {
301+ private void sendTokenGenerate (String apiVersion , Vertx vertx , String v1GetParam , JsonObject v2PostPayload , int expectedHttpCode , String referer , Handler <JsonObject > handler , boolean additionalParams , Map < String , String > additionalHeaders ) {
296302 if (apiVersion .equals ("v2" )) {
297303 ClientKey ck = (ClientKey ) clientKeyProvider .get ("" );
298304
@@ -319,29 +325,31 @@ private void sendTokenGenerate(String apiVersion, Vertx vertx, String v1GetParam
319325 } else {
320326 handler .handle (tryParseResponse (ar .result ()));
321327 }
322- }, headerName , headerValue );
328+ }, additionalHeaders );
323329 } else {
324330 get (vertx , apiVersion + "/token/generate" + (v1GetParam != null ? "?" + v1GetParam : "" ), ar -> {
325331 assertTrue (ar .succeeded ());
326332 assertEquals (expectedHttpCode , ar .result ().statusCode ());
327333 handler .handle (tryParseResponse (ar .result ()));
328- }, headerName , headerValue );
334+ }, additionalHeaders );
329335 }
330336 }
331337
332338 private void sendTokenRefresh (String apiVersion , Vertx vertx , VertxTestContext testContext , String refreshToken , String v2RefreshDecryptSecret , int expectedHttpCode ,
333339 Handler <JsonObject > handler ) {
334- sendTokenRefresh (apiVersion , vertx , null , null , testContext , refreshToken , v2RefreshDecryptSecret , expectedHttpCode , handler );
340+ sendTokenRefresh (apiVersion , vertx , testContext , refreshToken , v2RefreshDecryptSecret , expectedHttpCode , handler , Collections . emptyMap () );
335341 }
336342
337- private void sendTokenRefresh (String apiVersion , Vertx vertx , String headerName , String headerValue , VertxTestContext testContext , String refreshToken , String v2RefreshDecryptSecret , int expectedHttpCode ,
338- Handler <JsonObject > handler ) {
343+ private void sendTokenRefresh (String apiVersion , Vertx vertx , VertxTestContext testContext , String refreshToken , String v2RefreshDecryptSecret , int expectedHttpCode ,
344+ Handler <JsonObject > handler , Map < String , String > additionalHeaders ) {
339345 if (apiVersion .equals ("v2" )) {
340346 WebClient client = WebClient .create (vertx );
341347 HttpRequest <Buffer > refreshHttpRequest = client .postAbs (getUrlForEndpoint ("v2/token/refresh" ));
342- if (headerName != null ) {
343- refreshHttpRequest .putHeader (headerName , headerValue );
348+
349+ for (Map .Entry <String , String > entry : additionalHeaders .entrySet ()) {
350+ refreshHttpRequest .putHeader (entry .getKey (), entry .getValue ());
344351 }
352+
345353 refreshHttpRequest
346354 .putHeader ("content-type" , "text/plain" )
347355 .sendBuffer (Buffer .buffer (refreshToken .getBytes (StandardCharsets .UTF_8 )), testContext .succeeding (response -> testContext .verify (() -> {
@@ -364,7 +372,7 @@ private void sendTokenRefresh(String apiVersion, Vertx vertx, String headerName,
364372 assertEquals (expectedHttpCode , response .statusCode ());
365373 JsonObject json = response .bodyAsJsonObject ();
366374 handler .handle (json );
367- })), headerName , headerValue );
375+ })), additionalHeaders );
368376 }
369377 }
370378
@@ -396,40 +404,42 @@ private JsonObject tryParseResponse(HttpResponse<Buffer> resp) {
396404 }
397405
398406 private void get (Vertx vertx , String endpoint , Handler <AsyncResult <HttpResponse <Buffer >>> handler ) {
399- WebClient client = WebClient .create (vertx );
400- ClientKey ck = clientKeyProvider .getClientKey ("" );
401- HttpRequest <Buffer > req = client .getAbs (getUrlForEndpoint (endpoint ));
402- if (ck != null )
403- req .putHeader ("Authorization" , "Bearer " + clientKey );
404- req .send (handler );
407+ get (vertx , endpoint , handler , Collections .emptyMap ());
405408 }
406409
407- private void get (Vertx vertx , String endpoint , Handler <AsyncResult <HttpResponse <Buffer >>> handler , String headerName , String headerValue ) {
410+ private void get (Vertx vertx , String endpoint , Handler <AsyncResult <HttpResponse <Buffer >>> handler , Map < String , String > additionalHeaders ) {
408411 WebClient client = WebClient .create (vertx );
409412 ClientKey ck = clientKeyProvider .getClientKey ("" );
410413 HttpRequest <Buffer > req = client .getAbs (getUrlForEndpoint (endpoint ));
411414 if (ck != null ) {
412415 req .putHeader ("Authorization" , "Bearer " + clientKey );
413416 }
414- if (headerName != null ) {
415- req .putHeader (headerName , headerValue );
417+
418+ for (Map .Entry <String , String > entry : additionalHeaders .entrySet ()) {
419+ req .putHeader (entry .getKey (), entry .getValue ());
416420 }
421+
417422 req .send (handler );
418423 }
419424
420- private void post (Vertx vertx , String endpoint , JsonObject body , Handler <AsyncResult <HttpResponse <Buffer >>> handler ) {
425+ private void post (Vertx vertx , String endpoint , JsonObject body , Handler <AsyncResult <HttpResponse <Buffer >>> handler , Map < String , String > additionalHeaders ) {
421426 WebClient client = WebClient .create (vertx );
422427 ClientKey ck = clientKeyProvider .getClientKey ("" );
423428 HttpRequest <Buffer > req = client .postAbs (getUrlForEndpoint (endpoint ));
424429 if (ck != null )
425430 req .putHeader ("Authorization" , "Bearer " + clientKey );
431+
432+ for (Map .Entry <String , String > entry : additionalHeaders .entrySet ()) {
433+ req .putHeader (entry .getKey (), entry .getValue ());
434+ }
435+
426436 req .sendJsonObject (body , handler );
427437 }
428438
429439 private void postV2 (ClientKey ck , Vertx vertx , String endpoint , JsonObject body , long nonce , String referer , Handler <AsyncResult <HttpResponse <Buffer >>> handler ) {
430- postV2 (ck , vertx , endpoint , body , nonce , referer , handler , null , null );
440+ postV2 (ck , vertx , endpoint , body , nonce , referer , handler , Collections . emptyMap () );
431441 }
432- private void postV2 (ClientKey ck , Vertx vertx , String endpoint , JsonObject body , long nonce , String referer , Handler <AsyncResult <HttpResponse <Buffer >>> handler , String headerName , String headerValue ) {
442+ private void postV2 (ClientKey ck , Vertx vertx , String endpoint , JsonObject body , long nonce , String referer , Handler <AsyncResult <HttpResponse <Buffer >>> handler , Map < String , String > additionalHeaders ) {
433443 WebClient client = WebClient .create (vertx );
434444
435445 Buffer b = Buffer .buffer ();
@@ -449,8 +459,9 @@ private void postV2(ClientKey ck, Vertx vertx, String endpoint, JsonObject body,
449459 HttpRequest <Buffer > request = client .postAbs (getUrlForEndpoint (endpoint ))
450460 .putHeader ("Authorization" , "Bearer " + apiKey )
451461 .putHeader ("content-type" , "text/plain" );
452- if (headerName != null ) {
453- request .putHeader (headerName , headerValue );
462+
463+ for (Map .Entry <String , String > entry : additionalHeaders .entrySet ()) {
464+ request .putHeader (entry .getKey (), entry .getValue ());
454465 }
455466
456467 if (referer != null ) {
@@ -626,14 +637,14 @@ protected void setupSiteKey(int siteId, int keyId, int keysetId) {
626637 }
627638
628639 private void generateTokens (String apiVersion , Vertx vertx , String inputType , String input , Handler <JsonObject > handler ) {
629- generateTokens (apiVersion , vertx , inputType , input , handler , null , null );
640+ generateTokens (apiVersion , vertx , inputType , input , handler , Collections . emptyMap () );
630641 }
631642
632- private void generateTokens (String apiVersion , Vertx vertx , String inputType , String input , Handler <JsonObject > handler , String headerName , String headerValue ) {
643+ private void generateTokens (String apiVersion , Vertx vertx , String inputType , String input , Handler <JsonObject > handler , Map < String , String > additionalHeaders ) {
633644 String v1Param = inputType + "=" + urlEncode (input );
634645 JsonObject v2Payload = new JsonObject ();
635646 v2Payload .put (inputType , input );
636- sendTokenGenerate (apiVersion , vertx , v1Param , v2Payload , 200 , null , handler , true , headerName , headerValue );
647+ sendTokenGenerate (apiVersion , vertx , v1Param , v2Payload , 200 , null , handler , true , additionalHeaders );
637648 }
638649
639650 private static void assertEqualsClose (Instant expected , Instant actual , int withinSeconds ) {
@@ -1453,7 +1464,7 @@ void tokenGenerateOptOutToken(String policyParameterKey, String identity, Identi
14531464 TokenResponseStatsCollector .ResponseStatus .Success ,
14541465 TokenResponseStatsCollector .PlatformType .Other );
14551466
1456- sendTokenRefresh ("v2" , vertx , ClientVersionHeader , tvosClientVersionHeaderValue , testContext , body .getString ("refresh_token" ), body .getString ("refresh_response_key" ), 200 , refreshRespJson ->
1467+ sendTokenRefresh ("v2" , vertx , testContext , body .getString ("refresh_token" ), body .getString ("refresh_response_key" ), 200 , refreshRespJson ->
14571468 {
14581469 assertEquals ("optout" , refreshRespJson .getString ("status" ));
14591470 JsonObject refreshBody = refreshRespJson .getJsonObject ("body" );
@@ -1464,7 +1475,7 @@ void tokenGenerateOptOutToken(String policyParameterKey, String identity, Identi
14641475 TokenResponseStatsCollector .ResponseStatus .OptOut ,
14651476 TokenResponseStatsCollector .PlatformType .InApp );
14661477 testContext .completeNow ();
1467- });
1478+ }, Map . of ( ClientVersionHeader , tvosClientVersionHeaderValue ) );
14681479 });
14691480 }
14701481
@@ -1604,6 +1615,8 @@ void tokenGenerateThenRefresh(String apiVersion, Vertx vertx, VertxTestContext t
16041615 setupSalts ();
16051616 setupKeys ();
16061617
1618+ Map <String , String > additionalHeaders = Map .of (ClientVersionHeader , iosClientVersionHeaderValue );
1619+
16071620 generateTokens (apiVersion , vertx , "email" , emailAddress , genRespJson -> {
16081621 assertEquals ("success" , genRespJson .getString ("status" ));
16091622 JsonObject bodyJson = genRespJson .getJsonObject ("body" );
@@ -1613,7 +1626,7 @@ void tokenGenerateThenRefresh(String apiVersion, Vertx vertx, VertxTestContext t
16131626
16141627 when (this .optOutStore .getLatestEntry (any ())).thenReturn (null );
16151628
1616- sendTokenRefresh (apiVersion , vertx , ClientVersionHeader , iosClientVersionHeaderValue , testContext , genRefreshToken , bodyJson .getString ("refresh_response_key" ), 200 , refreshRespJson ->
1629+ sendTokenRefresh (apiVersion , vertx , testContext , genRefreshToken , bodyJson .getString ("refresh_response_key" ), 200 , refreshRespJson ->
16171630 {
16181631 assertEquals ("success" , refreshRespJson .getString ("status" ));
16191632 JsonObject refreshBody = refreshRespJson .getJsonObject ("body" );
@@ -1649,8 +1662,8 @@ void tokenGenerateThenRefresh(String apiVersion, Vertx vertx, VertxTestContext t
16491662 TokenResponseStatsCollector .PlatformType .InApp );
16501663
16511664 testContext .completeNow ();
1652- });
1653- }, ClientVersionHeader , iosClientVersionHeaderValue );
1665+ }, additionalHeaders );
1666+ }, additionalHeaders );
16541667 }
16551668
16561669 @ ParameterizedTest
@@ -1663,6 +1676,8 @@ void tokenGenerateThenRefreshSaltsExpired(String apiVersion, Vertx vertx, VertxT
16631676 setupSalts ();
16641677 setupKeys ();
16651678
1679+ Map <String , String > additionalHeaders = Map .of (ClientVersionHeader , androidClientVersionHeaderValue );
1680+
16661681 generateTokens (apiVersion , vertx , "email" , emailAddress , genRespJson -> {
16671682 assertEquals ("success" , genRespJson .getString ("status" ));
16681683 JsonObject bodyJson = genRespJson .getJsonObject ("body" );
@@ -1672,7 +1687,7 @@ void tokenGenerateThenRefreshSaltsExpired(String apiVersion, Vertx vertx, VertxT
16721687
16731688 when (this .optOutStore .getLatestEntry (any ())).thenReturn (null );
16741689
1675- sendTokenRefresh (apiVersion , vertx , ClientVersionHeader , androidClientVersionHeaderValue , testContext , genRefreshToken , bodyJson .getString ("refresh_response_key" ), 200 , refreshRespJson ->
1690+ sendTokenRefresh (apiVersion , vertx , testContext , genRefreshToken , bodyJson .getString ("refresh_response_key" ), 200 , refreshRespJson ->
16761691 {
16771692 assertEquals ("success" , refreshRespJson .getString ("status" ));
16781693 JsonObject refreshBody = refreshRespJson .getJsonObject ("body" );
@@ -1710,8 +1725,8 @@ void tokenGenerateThenRefreshSaltsExpired(String apiVersion, Vertx vertx, VertxT
17101725 verify (shutdownHandler , atLeastOnce ()).handleSaltRetrievalResponse (true );
17111726
17121727 testContext .completeNow ();
1713- });
1714- }, ClientVersionHeader , androidClientVersionHeaderValue );
1728+ }, additionalHeaders );
1729+ }, additionalHeaders );
17151730 }
17161731
17171732 @ Test
@@ -1735,12 +1750,12 @@ void tokenGenerateThenRefreshNoActiveKey(Vertx vertx, VertxTestContext testConte
17351750 String genRefreshToken = bodyJson .getString ("refresh_token" );
17361751
17371752 setupKeys (true );
1738- sendTokenRefresh ("v2" , vertx , ClientVersionHeader , androidClientVersionHeaderValue , testContext , genRefreshToken , bodyJson .getString ("refresh_response_key" ), 500 , refreshRespJson ->
1753+ sendTokenRefresh ("v2" , vertx , testContext , genRefreshToken , bodyJson .getString ("refresh_response_key" ), 500 , refreshRespJson ->
17391754 {
17401755 assertFalse (refreshRespJson .containsKey ("body" ));
17411756 assertEquals ("No active encryption key available" , refreshRespJson .getString ("message" ));
17421757 testContext .completeNow ();
1743- });
1758+ }, Map . of ( ClientVersionHeader , androidClientVersionHeaderValue ) );
17441759 });
17451760 }
17461761
@@ -1939,7 +1954,7 @@ void tokenGenerateNoActiveKey(Vertx vertx, VertxTestContext testContext) {
19391954 void tokenRefreshNoToken (String apiVersion , Vertx vertx , VertxTestContext testContext ) {
19401955 final int clientSiteId = 201 ;
19411956 fakeAuth (clientSiteId , Role .GENERATOR );
1942- sendTokenRefresh (apiVersion , vertx , null , null , testContext , "" , "" , 400 , json -> {
1957+ sendTokenRefresh (apiVersion , vertx , testContext , "" , "" , 400 , json -> {
19431958 assertEquals ("invalid_token" , json .getString ("status" ));
19441959 assertTokenStatusMetrics (
19451960 clientSiteId ,
@@ -1956,21 +1971,21 @@ void tokenRefreshInvalidTokenAuthenticated(String apiVersion, String token, Vert
19561971 final int clientSiteId = 201 ;
19571972 fakeAuth (clientSiteId , Role .GENERATOR );
19581973
1959- sendTokenRefresh (apiVersion , vertx , ORIGIN_HEADER , "example.com" , testContext , token , "" , 400 , json -> {
1974+ sendTokenRefresh (apiVersion , vertx , testContext , token , "" , 400 , json -> {
19601975 assertEquals ("invalid_token" , json .getString ("status" ));
19611976 assertTokenStatusMetrics (
19621977 clientSiteId ,
19631978 apiVersion .equals ("v1" ) ? TokenResponseStatsCollector .Endpoint .RefreshV1 : TokenResponseStatsCollector .Endpoint .RefreshV2 ,
19641979 TokenResponseStatsCollector .ResponseStatus .InvalidToken ,
19651980 TokenResponseStatsCollector .PlatformType .HasOriginHeader );
19661981 testContext .completeNow ();
1967- });
1982+ }, Map . of ( ORIGIN_HEADER , "https://example.com" ) );
19681983 }
19691984
19701985 @ ParameterizedTest
19711986 @ ValueSource (strings = {"v1" , "v2" })
19721987 void tokenRefreshInvalidTokenUnauthenticated (String apiVersion , Vertx vertx , VertxTestContext testContext ) {
1973- sendTokenRefresh (apiVersion , vertx , null , null , testContext , "abcd" , "" , 400 , json -> {
1988+ sendTokenRefresh (apiVersion , vertx , testContext , "abcd" , "" , 400 , json -> {
19741989 assertEquals ("error" , json .getString ("status" ));
19751990 testContext .completeNow ();
19761991 });
@@ -2677,13 +2692,13 @@ void LogoutV2(Vertx vertx, VertxTestContext testContext) {
26772692 Handler <AsyncResult <Instant >> handler = invocation .getArgument (4 );
26782693 handler .handle (Future .succeededFuture (Instant .now ()));
26792694 return null ;
2680- }).when (this .optOutStore ).addEntry (any (), any (), any ( ), any ( ), any ());
2695+ }).when (this .optOutStore ).addEntry (any (), any (), eq ( "uid-trace-id" ), eq ( "test-instance-id" ), any ());
26812696
26822697 send ("v2" , vertx , "v2/token/logout" , false , null , req , 200 , respJson -> {
26832698 assertEquals ("success" , respJson .getString ("status" ));
26842699 assertEquals ("OK" , respJson .getJsonObject ("body" ).getString ("optout" ));
26852700 testContext .completeNow ();
2686- });
2701+ }, Map . of ( Audit . UID_TRACE_ID_HEADER , "uid-trace-id" ) );
26872702 }
26882703
26892704 @ Test
0 commit comments