in src/main/kotlin/jetbrains/buildServer/notification/slackNotifier/auth/SlackOauthController.kt [46:95]
override fun doHandle(request: HttpServletRequest, response: HttpServletResponse): ModelAndView {
val state = Gson().fromJson<SlackOAuthState>(request.getParameter("state"))
val userId = state.userId.toLong()
val currentUser = SessionUser.getUser(request.session)
if (currentUser?.id != userId) {
return errorMessage(request, "User id '${userId}' does not match current user id")
}
val user = userModel.findUserById(userId)
?: return errorMessage(request, "Can't find user with id '$userId'")
val connectionId = state.connectionId
val connection = projectManager.projects.mapNotNull {
oAuthConnectionsManager.findConnectionById(it, connectionId)
}.firstOrNull()
?: return errorMessage(request, "Can't find connection with id '${connectionId}")
val code = request.getParameter("code")
?: return errorMessage(request, "Slack auth returned error: ${request.getParameter("error")}")
val redirectUrl = WebUtil.getRootUrl(request) + PATH
val clientId = connection.parameters["clientId"]
?: return errorMessage(request, "Can't find 'clientId' property in connection with id '${connectionId}'")
val clientSecret = connection.parameters["secure:clientSecret"]
?: return errorMessage(request, "Can't find 'secure:clientSecret' property in connection with id '${connectionId}'")
val oauthToken = slackApi.oauthAccess(
clientId = clientId,
clientSecret = clientSecret,
code = code,
redirectUrl = redirectUrl
)
if (!oauthToken.ok) {
return handleOAuthTokenError(request, oauthToken)
}
val userIdentity = slackApi.usersIdentity(oauthToken.accessToken)
if (!userIdentity.ok) {
return errorMessage(request, "Unexpected error: ${userIdentity.error}")
}
val slackUserId = userIdentity.user.id
user.setUserProperty(SlackProperties.channelProperty, slackUserId)
user.setUserProperty(SlackProperties.connectionProperty, connectionId)
user.setUserProperty(SlackProperties.displayNameProperty, userIdentity.user.displayName)
return redirectToNotifierSettings(request)
}