21
21
import com .mongodb .MongoCommandException ;
22
22
import com .mongodb .MongoConfigurationException ;
23
23
import com .mongodb .MongoCredential ;
24
- import com .mongodb .MongoCredential .OidcCallbackResult ;
24
+ import com .mongodb .MongoCredential .OidcTokens ;
25
25
import com .mongodb .MongoException ;
26
26
import com .mongodb .MongoSecurityException ;
27
27
import com .mongodb .ServerAddress ;
@@ -192,7 +192,7 @@ private OidcCallback getRequestCallback() {
192
192
public static OidcCallback getTestCallback () {
193
193
return (context ) -> {
194
194
String accessToken = readTestTokenFromFile ();
195
- return new OidcCallbackResult (accessToken , Duration . ZERO );
195
+ return new OidcTokens (accessToken );
196
196
};
197
197
}
198
198
@@ -202,7 +202,7 @@ public static OidcCallback getAzureCallback(final MongoCredential credential) {
202
202
String resource = assertNotNull (credential .getMechanismProperty (TOKEN_RESOURCE_KEY , null ));
203
203
String objectId = credential .getUserName ();
204
204
CredentialInfo response = AzureCredentialHelper .fetchAzureCredentialInfo (resource , objectId );
205
- return new OidcCallbackResult (response .getAccessToken (), response .getExpiresIn ());
205
+ return new OidcTokens (response .getAccessToken (), response .getExpiresIn ());
206
206
};
207
207
}
208
208
@@ -211,7 +211,7 @@ public static OidcCallback getGcpCallback(final MongoCredential credential) {
211
211
return (context ) -> {
212
212
String resource = assertNotNull (credential .getMechanismProperty (TOKEN_RESOURCE_KEY , null ));
213
213
CredentialInfo response = GcpCredentialHelper .fetchGcpCredentialInfo (resource );
214
- return new OidcCallbackResult (response .getAccessToken (), response .getExpiresIn ());
214
+ return new OidcTokens (response .getAccessToken (), response .getExpiresIn ());
215
215
};
216
216
}
217
217
@@ -289,6 +289,7 @@ private byte[] evaluate(final byte[] challenge) {
289
289
String cachedAccessToken = validatedCachedAccessToken ();
290
290
OidcCallback requestCallback = getRequestCallback ();
291
291
boolean isHuman = isHumanCallback ();
292
+ String userName = getMongoCredentialWithCache ().getCredential ().getUserName ();
292
293
293
294
if (cachedAccessToken != null ) {
294
295
fallbackState = FallbackState .PHASE_1_CACHED_TOKEN ;
@@ -299,17 +300,17 @@ private byte[] evaluate(final byte[] challenge) {
299
300
assertNotNull (cachedIdpInfo );
300
301
// Invoke Callback using cached Refresh Token
301
302
fallbackState = FallbackState .PHASE_2_REFRESH_CALLBACK_TOKEN ;
302
- OidcCallbackResult result = requestCallback .onRequest (new OidcCallbackContextImpl (
303
- CALLBACK_TIMEOUT , cachedIdpInfo , cachedRefreshToken ));
303
+ OidcTokens result = requestCallback .onRequest (new OidcCallbackContextImpl (
304
+ CALLBACK_TIMEOUT , cachedIdpInfo , cachedRefreshToken , userName ));
304
305
jwt [0 ] = populateCacheWithCallbackResultAndPrepareJwt (cachedIdpInfo , result );
305
306
} else {
306
307
// cache is empty
307
308
308
309
if (!isHuman ) {
309
310
// no principal request
310
311
fallbackState = FallbackState .PHASE_3B_CALLBACK_TOKEN ;
311
- OidcCallbackResult result = requestCallback .onRequest (new OidcCallbackContextImpl (
312
- CALLBACK_TIMEOUT ));
312
+ OidcTokens result = requestCallback .onRequest (new OidcCallbackContextImpl (
313
+ CALLBACK_TIMEOUT , userName ));
313
314
jwt [0 ] = populateCacheWithCallbackResultAndPrepareJwt (null , result );
314
315
if (result .getRefreshToken () != null ) {
315
316
throw new MongoConfigurationException (
@@ -333,13 +334,13 @@ private byte[] evaluate(final byte[] challenge) {
333
334
if (!alreadyTriedPrincipal && idpInfoNotPresent ) {
334
335
// request for idp info, only in the human workflow
335
336
fallbackState = FallbackState .PHASE_3A_PRINCIPAL ;
336
- jwt [0 ] = prepareUsername (getMongoCredentialWithCache (). getCredential (). getUserName () );
337
+ jwt [0 ] = prepareUsername (userName );
337
338
} else {
338
339
IdpInfo idpInfo = toIdpInfo (challenge );
339
340
// there is no cached refresh token
340
341
fallbackState = FallbackState .PHASE_3B_CALLBACK_TOKEN ;
341
- OidcCallbackResult result = requestCallback .onRequest (new OidcCallbackContextImpl (
342
- CALLBACK_TIMEOUT , idpInfo , null ));
342
+ OidcTokens result = requestCallback .onRequest (new OidcCallbackContextImpl (
343
+ CALLBACK_TIMEOUT , idpInfo , null , userName ));
343
344
jwt [0 ] = populateCacheWithCallbackResultAndPrepareJwt (idpInfo , result );
344
345
}
345
346
}
@@ -499,14 +500,14 @@ private static String readTestTokenFromFile() {
499
500
500
501
private byte [] populateCacheWithCallbackResultAndPrepareJwt (
501
502
@ Nullable final IdpInfo serverInfo ,
502
- @ Nullable final OidcCallbackResult oidcCallbackResult ) {
503
- if (oidcCallbackResult == null ) {
503
+ @ Nullable final OidcTokens oidcTokens ) {
504
+ if (oidcTokens == null ) {
504
505
throw new MongoConfigurationException ("Result of callback must not be null" );
505
506
}
506
- OidcCacheEntry newEntry = new OidcCacheEntry (oidcCallbackResult .getAccessToken (),
507
- oidcCallbackResult .getRefreshToken (), serverInfo );
507
+ OidcCacheEntry newEntry = new OidcCacheEntry (oidcTokens .getAccessToken (),
508
+ oidcTokens .getRefreshToken (), serverInfo );
508
509
getMongoCredentialWithCache ().setOidcCacheEntry (newEntry );
509
- return prepareTokenAsJwt (oidcCallbackResult .getAccessToken ());
510
+ return prepareTokenAsJwt (oidcTokens .getAccessToken ());
510
511
}
511
512
512
513
private static byte [] prepareUsername (@ Nullable final String username ) {
@@ -663,20 +664,26 @@ static class OidcCallbackContextImpl implements OidcCallbackContext {
663
664
private final IdpInfo idpInfo ;
664
665
@ Nullable
665
666
private final String refreshToken ;
667
+ @ Nullable
668
+ private final String userName ;
666
669
667
- OidcCallbackContextImpl (final Duration timeout ) {
670
+ OidcCallbackContextImpl (final Duration timeout , @ Nullable final String userName ) {
668
671
this .timeout = assertNotNull (timeout );
669
672
this .idpInfo = null ;
670
673
this .refreshToken = null ;
674
+ this .userName = userName ;
671
675
}
672
676
673
- OidcCallbackContextImpl (final Duration timeout , final IdpInfo idpInfo , @ Nullable final String refreshToken ) {
677
+ OidcCallbackContextImpl (final Duration timeout , final IdpInfo idpInfo ,
678
+ @ Nullable final String refreshToken , @ Nullable final String userName ) {
674
679
this .timeout = assertNotNull (timeout );
675
680
this .idpInfo = assertNotNull (idpInfo );
676
681
this .refreshToken = refreshToken ;
682
+ this .userName = userName ;
677
683
}
678
684
679
685
@ Override
686
+ @ Nullable
680
687
public IdpInfo getIdpInfo () {
681
688
return idpInfo ;
682
689
}
@@ -692,9 +699,16 @@ public int getVersion() {
692
699
}
693
700
694
701
@ Override
702
+ @ Nullable
695
703
public String getRefreshToken () {
696
704
return refreshToken ;
697
705
}
706
+
707
+ @ Override
708
+ @ Nullable
709
+ public String getUserName () {
710
+ return userName ;
711
+ }
698
712
}
699
713
700
714
@ VisibleForTesting (otherwise = VisibleForTesting .AccessModifier .PRIVATE )
0 commit comments