diff --git a/server/src/main/java/org/cloudfoundry/identity/uaa/authentication/manager/ExternalLoginAuthenticationManager.java b/server/src/main/java/org/cloudfoundry/identity/uaa/authentication/manager/ExternalLoginAuthenticationManager.java index 4a48af5f324..676f5722ce2 100644 --- a/server/src/main/java/org/cloudfoundry/identity/uaa/authentication/manager/ExternalLoginAuthenticationManager.java +++ b/server/src/main/java/org/cloudfoundry/identity/uaa/authentication/manager/ExternalLoginAuthenticationManager.java @@ -245,8 +245,8 @@ protected UaaUser getUser(Authentication request, ExternalAuthenticationDetails } } - if (email == null) { - email = generateEmailIfNull(name); + if (StringUtils.isEmpty(email)) { + email = generateEmailIfNullOrEmpty(name); } String givenName = null; @@ -278,7 +278,7 @@ protected UaaUser getUser(Authentication request, ExternalAuthenticationDetails return new UaaUser(userPrototype); } - protected String generateEmailIfNull(String name) { + protected String generateEmailIfNullOrEmpty(String name) { String email; if (name != null) { if (name.contains("@")) { diff --git a/server/src/main/java/org/cloudfoundry/identity/uaa/provider/oauth/ExternalOAuthAuthenticationManager.java b/server/src/main/java/org/cloudfoundry/identity/uaa/provider/oauth/ExternalOAuthAuthenticationManager.java index a6d7dc4c53e..1b3e59d5e69 100644 --- a/server/src/main/java/org/cloudfoundry/identity/uaa/provider/oauth/ExternalOAuthAuthenticationManager.java +++ b/server/src/main/java/org/cloudfoundry/identity/uaa/provider/oauth/ExternalOAuthAuthenticationManager.java @@ -380,8 +380,8 @@ protected UaaUser getUser(Authentication request, AuthenticationData authenticat Object verifiedObj = claims.get(emailVerifiedClaim == null ? "email_verified" : emailVerifiedClaim); boolean verified = verifiedObj instanceof Boolean ? (Boolean)verifiedObj: false; - if (email == null) { - email = generateEmailIfNull(username); + if (!StringUtils.hasText(email)) { + email = generateEmailIfNullOrEmpty(username); } logger.debug(String.format("Returning user data for username:%s, email:%s", username, email)); diff --git a/server/src/test/java/org/cloudfoundry/identity/uaa/authentication/manager/ExternalLoginAuthenticationManagerTest.java b/server/src/test/java/org/cloudfoundry/identity/uaa/authentication/manager/ExternalLoginAuthenticationManagerTest.java index 45d2bf85f1c..911d221df7f 100644 --- a/server/src/test/java/org/cloudfoundry/identity/uaa/authentication/manager/ExternalLoginAuthenticationManagerTest.java +++ b/server/src/test/java/org/cloudfoundry/identity/uaa/authentication/manager/ExternalLoginAuthenticationManagerTest.java @@ -269,6 +269,38 @@ public void testAmpersandInEndOfName() { } + @Test + public void testEmptyEmail() { + String name = "filip"; + String actual = name + "@user.from."+origin+".cf"; + String email = ""; + userDetails = mock(UserDetails.class, withSettings().extraInterfaces(Mailable.class)); + when(((Mailable)userDetails).getEmailAddress()).thenReturn(email); + mockUserDetails(userDetails); + mockUaaWithUser(); + + when(userDetails.getUsername()).thenReturn(name); + when(user.getUsername()).thenReturn(name); + when(uaaUserDatabase.retrieveUserByName(eq(name),eq(origin))) + .thenReturn(null) + .thenReturn(user); + + Authentication result = manager.authenticate(inputAuth); + assertNotNull(result); + assertEquals(UaaAuthentication.class, result.getClass()); + UaaAuthentication uaaAuthentication = (UaaAuthentication)result; + assertEquals(name,uaaAuthentication.getPrincipal().getName()); + assertEquals(origin, uaaAuthentication.getPrincipal().getOrigin()); + assertEquals(userId, uaaAuthentication.getPrincipal().getId()); + + userArgumentCaptor = ArgumentCaptor.forClass(ApplicationEvent.class); + verify(applicationEventPublisher,times(2)).publishEvent(userArgumentCaptor.capture()); + assertEquals(2,userArgumentCaptor.getAllValues().size()); + NewUserAuthenticatedEvent event = (NewUserAuthenticatedEvent)userArgumentCaptor.getAllValues().get(0); + assertEquals(origin, event.getUser().getOrigin()); + assertEquals(actual, event.getUser().getEmail()); + } + @Test(expected = BadCredentialsException.class) public void testAuthenticateUserInsertFails() { when(uaaUserDatabase.retrieveUserByName(anyString(),anyString())).thenThrow(new UsernameNotFoundException(""));