AuthInitializationService authInitService = initProviderProvider.get();
AuthInitialization authInit = authInitService.get();
AuthUser user = userServices.getUserFromEmailAddress(emailAddress);
ValidateEmailAddressResult result;
Map<String, IAuthService> authSources =
authSourceProvider.getAuthServices();
//If the returned user is null, the given email address is not known,
//so the result should indicate this and return the list of auth
//providers
if (user == null) {
//Save the email address the user validated against with in the auth
//initialization. This must match any imediately subsequent
//requests for regisration
authInit.setEmailAddress(a.getEmailAddress());
authInitService.save(authInit);
ArrayList<AuthSourceInfo> authSourceInfos =
new ArrayList<AuthSourceInfo>();
for (IAuthService authService : authSources.values()) {
authSourceInfos.add(authService.getInfo());
}
result = new ValidateEmailAddressResult(a.getEmailAddress(),
authSourceInfos);
} else {
//else the user needs to be redirected to the registered user's
//auth service's login url.
String serviceName = user.getAuthServiceName();
emailAddress = user.getSanitizedEmailAddress();
IAuthService authService = authSources.get(serviceName);
if (authService == null) {
throw new AuthException("The auth service that user: "
+ emailAddress + " used to "
+ "authenticate, " + serviceName + " "
+ "was not found in the list of auth sources");
}
authInit.setAuthServiceName(serviceName);
authInit.setEmailAddress(emailAddress);
authInit.setState(AuthInitializationState.authenticating);
authInit.setServiceSpecificUserId(user.getServiceSpecificUserId());
authInitService.save(authInit);
result = new ValidateEmailAddressResult(authService.getSignInUrl());
}