in plugin-oauth2/plugin/grails-app/controllers/grails/plugin/springsecurity/oauth2/SpringSecurityOAuth2Controller.groovy [160:197]
def linkAccount(OAuth2LinkAccountCommand command) {
OAuth2SpringToken oAuth2SpringToken = session[SPRING_SECURITY_OAUTH_TOKEN] as OAuth2SpringToken
if (!oAuth2SpringToken) {
log.warn "linkAccount: OAuthToken not found in session"
throw new OAuth2Exception('Authentication error')
}
if (request.post) {
if (!springSecurityOauth2BaseService.authenticationIsValid(command.username, command.password)) {
log.info "Authentication error for use ${command.username}"
command.errors.rejectValue("username", "OAuthLinkAccountCommand.authentication.error")
render view: 'ask', model: [linkAccountCommand: command]
return
}
def commandValid = command.validate()
def User = springSecurityOauth2BaseService.lookupUserClass()
boolean linked = commandValid && User.withTransaction { status ->
def user = User.findByUsername(command.username)
if (user) {
user.addTooAuthIDs(provider: oAuth2SpringToken.providerName, accessToken: oAuth2SpringToken.socialId, user: user)
if (user.validate() && user.save()) {
oAuth2SpringToken = springSecurityOauth2BaseService.updateOAuthToken(oAuth2SpringToken, user)
return true
} else {
return false
}
} else {
command.errors.rejectValue("username", "OAuthLinkAccountCommand.username.not.exists")
}
status.setRollbackOnly()
return false
}
if (linked) {
authenticateAndRedirect(oAuth2SpringToken, getDefaultTargetUrl())
return
}
}
render view: 'ask', model: [linkAccountCommand: command]
}