diff --git a/models/user/external_login_user.go b/models/user/external_login_user.go index 422823b89c3ff..5f4938e620c2d 100644 --- a/models/user/external_login_user.go +++ b/models/user/external_login_user.go @@ -149,17 +149,23 @@ func GetUserIDByExternalUserID(provider, userID string) (int64, error) { } // UpdateExternalUserByExternalID updates an external user's information -func UpdateExternalUserByExternalID(external *ExternalLoginUser) error { +func UpdateExternalUserByExternalID(external *ExternalLoginUser, upsert bool) error { has, err := db.GetEngine(db.DefaultContext).Where("external_id=? AND login_source_id=?", external.ExternalID, external.LoginSourceID). NoAutoCondition(). Exist(external) if err != nil { return err - } else if !has { + } + + if !has && !upsert { return ErrExternalLoginUserNotExist{external.UserID, external.LoginSourceID} } - _, err = db.GetEngine(db.DefaultContext).Where("external_id=? AND login_source_id=?", external.ExternalID, external.LoginSourceID).AllCols().Update(external) + if has { + _, err = db.GetEngine(db.DefaultContext).Where("external_id=? AND login_source_id=?", external.ExternalID, external.LoginSourceID).AllCols().Update(external) + } else { + _, err = db.GetEngine(db.DefaultContext).Insert(external) + } return err } diff --git a/routers/web/auth/auth.go b/routers/web/auth/auth.go index 8a4c12d57b573..574697a807255 100644 --- a/routers/web/auth/auth.go +++ b/routers/web/auth/auth.go @@ -618,7 +618,7 @@ func handleUserCreated(ctx *context.Context, u *user_model.User, gothUser *goth. // update external user information if gothUser != nil { - if err := externalaccount.UpdateExternalUser(u, *gothUser); err != nil { + if err := externalaccount.UpdateExternalUser(u, *gothUser, true); err != nil { log.Error("UpdateExternalUser failed: %v", err) } } diff --git a/routers/web/auth/oauth.go b/routers/web/auth/oauth.go index e6112b4276dcf..0b2d668c36b68 100644 --- a/routers/web/auth/oauth.go +++ b/routers/web/auth/oauth.go @@ -1060,7 +1060,7 @@ func handleOAuth2SignIn(ctx *context.Context, source *auth.Source, u *user_model } // update external user information - if err := externalaccount.UpdateExternalUser(u, gothUser); err != nil { + if err := externalaccount.UpdateExternalUser(u, gothUser, false); err != nil { log.Error("UpdateExternalUser failed: %v", err) } diff --git a/services/externalaccount/user.go b/services/externalaccount/user.go index e5cd443770c08..63ed65a470d82 100644 --- a/services/externalaccount/user.go +++ b/services/externalaccount/user.go @@ -70,11 +70,11 @@ func LinkAccountToUser(user *user_model.User, gothUser goth.User) error { } // UpdateExternalUser updates external user's information -func UpdateExternalUser(user *user_model.User, gothUser goth.User) error { +func UpdateExternalUser(user *user_model.User, gothUser goth.User, upsert bool) error { externalLoginUser, err := toExternalLoginUser(user, gothUser) if err != nil { return err } - return user_model.UpdateExternalUserByExternalID(externalLoginUser) + return user_model.UpdateExternalUserByExternalID(externalLoginUser, upsert) }