2017-02-22 10:14:37 +03:00
// Copyright 2017 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package models
import "github.com/markbates/goth"
// ExternalLoginUser makes the connecting between some existing user and additional external login sources
type ExternalLoginUser struct {
2017-05-02 11:41:44 +03:00
ExternalID string ` xorm:"pk NOT NULL" `
UserID int64 ` xorm:"INDEX NOT NULL" `
LoginSourceID int64 ` xorm:"pk NOT NULL" `
2017-02-22 10:14:37 +03:00
}
// GetExternalLogin checks if a externalID in loginSourceID scope already exists
func GetExternalLogin ( externalLoginUser * ExternalLoginUser ) ( bool , error ) {
return x . Get ( externalLoginUser )
}
// ListAccountLinks returns a map with the ExternalLoginUser and its LoginSource
func ListAccountLinks ( user * User ) ( [ ] * ExternalLoginUser , error ) {
externalAccounts := make ( [ ] * ExternalLoginUser , 0 , 5 )
err := x . Where ( "user_id=?" , user . ID ) .
Desc ( "login_source_id" ) .
Find ( & externalAccounts )
if err != nil {
return nil , err
}
return externalAccounts , nil
}
// LinkAccountToUser link the gothUser to the user
func LinkAccountToUser ( user * User , gothUser goth . User ) error {
loginSource , err := GetActiveOAuth2LoginSourceByName ( gothUser . Provider )
if err != nil {
return err
}
externalLoginUser := & ExternalLoginUser {
ExternalID : gothUser . UserID ,
UserID : user . ID ,
LoginSourceID : loginSource . ID ,
}
has , err := x . Get ( externalLoginUser )
if err != nil {
return err
} else if has {
return ErrExternalLoginUserAlreadyExist { gothUser . UserID , user . ID , loginSource . ID }
}
_ , err = x . Insert ( externalLoginUser )
return err
}
// RemoveAccountLink will remove all external login sources for the given user
func RemoveAccountLink ( user * User , loginSourceID int64 ) ( int64 , error ) {
deleted , err := x . Delete ( & ExternalLoginUser { UserID : user . ID , LoginSourceID : loginSourceID } )
if err != nil {
return deleted , err
}
if deleted < 1 {
return deleted , ErrExternalLoginUserNotExist { user . ID , loginSourceID }
}
return deleted , err
}
2017-03-20 17:13:52 +03:00
// removeAllAccountLinks will remove all external login sources for the given user
func removeAllAccountLinks ( e Engine , user * User ) error {
_ , err := e . Delete ( & ExternalLoginUser { UserID : user . ID } )
2017-02-22 10:14:37 +03:00
return err
}