public HttpAuthenticationResult processAuthenticationRequest()

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());
        }
    }