in src/main/java/org/jetbrains/teamcity/githubauth/GitHubOAuth.java [69:112]
public HttpAuthenticationResult processAuthenticationRequest(@NotNull HttpServletRequest request, @NotNull HttpServletResponse response, @NotNull Map<String, String> properties) throws IOException {
HttpAuthenticationResult result = validateRequest(request, response);
if (result != null) return result;
OAuthConnectionDescriptor connection = getSuitableConnection();
GitHubTokenResponse token = gitHubOAuthClient.exchangeCodeToToken(request.getParameter("code"),
connection.getParameters().get(GitHubConstants.CLIENT_ID_PARAM),
connection.getParameters().get(GitHubConstants.CLIENT_SECRET_PARAM),
buildRedirectUrl());
logger.debug("GitHub token response: " + token.describe(false));
if (token.error != null) {
if ("incorrect_client_credentials".equals(token.error)) {
logger.warn("GitHub login error: invalid Client ID or Client Secret parameters. " +
"Ensure that GitHub Connection parameters correspond to the GitHub application. Details: " + token.describe(false));
} else {
logger.warn("GitHub login error: " + token.describe(false));
}
return HttpAuthUtil.sendUnauthorized(request, response, "GitHub login error" +
(token.error_description != null ? ": " + token.error_description : " (see teamcity-auth.log for details)"), emptySet());
}
GitHubUser gitHubUser = gitHubOAuthClient.getUser(token.access_token);
logger.debug("GitHub user obtained: " + gitHubUser.describe(false));
UserSet<SUser> users = teamCityCore.findUserByPropertyValue(GITHUB_USER_ID_PROPERTY_KEY, gitHubUser.getId());
Iterator<SUser> iterator = users.getUsers().iterator();
if (iterator.hasNext()) {
final SUser found = iterator.next();
teamCityCore.rememberToken(connection, found, gitHubUser.getLogin(), token.access_token, token.scope);
logger.debug("Corresponding TeamCity user found for the GitHub user '" + gitHubUser.describe(false) + "': " + found.describe(true));
return authenticated(request, new ServerPrincipal(null, found.getUsername()));
}
try {
SUser created = teamCityCore.createUser(gitHubUser.getLogin(), gitHubUser.getEmail(), gitHubUser.getName(), singletonMap(GITHUB_USER_ID_PROPERTY_KEY, gitHubUser.getId()));
logger.debug("New TeamCity user created for the GitHub user '" + gitHubUser.describe(false) + "': " + created.describe(true));
teamCityCore.rememberToken(connection, created, gitHubUser.getLogin(), token.access_token, token.scope);
return authenticated(request, new ServerPrincipal(null, gitHubUser.getLogin()));
} catch (DuplicateUserAccountException e) {
logger.warn("GitHub login error: user with username '" + gitHubUser.getLogin() + "' already exist.");
return HttpAuthUtil.sendUnauthorized(request, response, "User with username '" + gitHubUser.getLogin() + "' already exist", emptySet());
}
}