88import edu .harvard .iq .dataverse .authorization .providers .oauth2 .OAuth2Exception ;
99import edu .harvard .iq .dataverse .authorization .providers .oauth2 .OAuth2UserRecord ;
1010import edu .harvard .iq .dataverse .authorization .providers .oauth2 .oidc .OIDCAuthProvider ;
11+ import edu .harvard .iq .dataverse .authorization .providers .shib .ShibAuthenticationProvider ;
1112import edu .harvard .iq .dataverse .authorization .users .AuthenticatedUser ;
1213import edu .harvard .iq .dataverse .authorization .users .User ;
1314import edu .harvard .iq .dataverse .settings .JvmSettings ;
@@ -176,13 +177,47 @@ void testLookupUserByOIDCBearerToken_oneProvider_validToken_userIsPresentAsBuilt
176177 assertEquals ("testUsername" , userIdCaptor .getAllValues ().get (0 ));
177178 }
178179
180+ @ Test
181+ @ JvmSetting (key = JvmSettings .FEATURE_FLAG , value = "true" , varArgs = "api-bearer-auth-use-shib-user-on-id-match" )
182+ void testLookupUserByOIDCBearerToken_oneProvider_validToken_userIsPresentAsShibboleth_useShibUserOnIdMatchFeatureFlagEnabled () throws ParseException , IOException , AuthorizationException , OAuth2Exception {
183+ // Given a single OIDC provider that returns a valid user identifier
184+ setUpOIDCProviderWhichValidatesToken (true );
185+
186+ // Spy on the SUT to verify method calls
187+ AuthenticationServiceBean spySut = Mockito .spy (sut );
188+
189+ // Setting up an authenticated user is found
190+ AuthenticatedUser authenticatedUser = setupAuthenticatedUserByAuthPrvIDQueryWithResult (new AuthenticatedUser ());
191+
192+ // When invoking lookupUserByOIDCBearerToken
193+ User actualUser = spySut .lookupUserByOIDCBearerToken (TEST_BEARER_TOKEN );
194+
195+ // Then the actual user should match the expected authenticated user
196+ assertEquals (authenticatedUser , actualUser );
197+
198+ // Capture calls to lookupUser
199+ ArgumentCaptor <String > providerIdCaptor = ArgumentCaptor .forClass (String .class );
200+ ArgumentCaptor <String > userIdCaptor = ArgumentCaptor .forClass (String .class );
201+
202+ // Ensure lookupUser is called once
203+ Mockito .verify (spySut , Mockito .times (1 )).lookupUser (providerIdCaptor .capture (), userIdCaptor .capture ());
204+
205+ // Assert that lookupUser is called with expected parameters
206+ assertEquals (ShibAuthenticationProvider .PROVIDER_ID , providerIdCaptor .getAllValues ().get (0 ));
207+ assertEquals ("testIdp|testPersistentId" , userIdCaptor .getAllValues ().get (0 ));
208+ }
209+
179210 private void setupAuthenticatedUserQueryWithNoResult () {
180211 TypedQuery <AuthenticatedUserLookup > queryStub = Mockito .mock (TypedQuery .class );
181212 Mockito .when (queryStub .getSingleResult ()).thenThrow (new NoResultException ());
182213 Mockito .when (sut .em .createNamedQuery ("AuthenticatedUserLookup.findByAuthPrvID_PersUserId" , AuthenticatedUserLookup .class )).thenReturn (queryStub );
183214 }
184215
185216 private void setUpOIDCProviderWhichValidatesToken () throws ParseException , IOException , OAuth2Exception {
217+ setUpOIDCProviderWhichValidatesToken (false );
218+ }
219+
220+ private void setUpOIDCProviderWhichValidatesToken (boolean includeShibAttributes ) throws ParseException , IOException , OAuth2Exception {
186221 OIDCAuthProvider oidcAuthProviderStub = stubOIDCAuthProvider ("OIDC" );
187222
188223 BearerAccessToken token = BearerAccessToken .parse (TEST_BEARER_TOKEN );
@@ -193,6 +228,13 @@ private void setUpOIDCProviderWhichValidatesToken() throws ParseException, IOExc
193228
194229 // Stub OAuth2UserRecord and its associated UserRecordIdentifier
195230 OAuth2UserRecord oAuth2UserRecordStub = Mockito .mock (OAuth2UserRecord .class );
231+
232+ if (includeShibAttributes ) {
233+ Mockito .when (oAuth2UserRecordStub .hasShibAttributes ()).thenReturn (true );
234+ Mockito .when (oAuth2UserRecordStub .getShibIdp ()).thenReturn ("testIdp" );
235+ Mockito .when (oAuth2UserRecordStub .getShibUniquePersistentIdentifier ()).thenReturn ("testPersistentId" );
236+ }
237+
196238 UserRecordIdentifier userRecordIdentifierStub = Mockito .mock (UserRecordIdentifier .class );
197239 Mockito .when (userRecordIdentifierStub .getUserIdInRepo ()).thenReturn ("testUserId" );
198240 Mockito .when (userRecordIdentifierStub .getUserRepoId ()).thenReturn ("testRepoId" );
@@ -203,6 +245,7 @@ private void setUpOIDCProviderWhichValidatesToken() throws ParseException, IOExc
203245 Mockito .when (oidcAuthProviderStub .getUserRecord (userInfoStub )).thenReturn (oAuth2UserRecordStub );
204246 }
205247
248+
206249 private OIDCAuthProvider stubOIDCAuthProvider (String providerID ) {
207250 OIDCAuthProvider oidcAuthProviderStub = Mockito .mock (OIDCAuthProvider .class );
208251 Mockito .when (oidcAuthProviderStub .getId ()).thenReturn (providerID );
0 commit comments